From 171022529d05d87815dd3bbfd05728872b208739 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 6 Aug 2017 10:12:04 -0400 Subject: [PATCH 001/219] NES: Fix mapper 36 fixes #953 --- .../Consoles/Nintendo/NES/Boards/Mapper036.cs | 49 +++++++++++++++++-- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper036.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper036.cs index 3514bf1618..8c55044f87 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper036.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/Mapper036.cs @@ -1,17 +1,21 @@ using BizHawk.Common; +using BizHawk.Common.NumberExtensions; +using System; namespace BizHawk.Emulation.Cores.Nintendo.NES { // mapper036 // Strike Wolf (MGC-014) [!].nes - // like an oversize GxROM - // information from fceux + // Using https://wiki.nesdev.com/w/index.php/INES_Mapper_036 public sealed class Mapper036 : NES.NESBoardBase { int chr; int prg; int chr_mask; int prg_mask; + byte R; + bool M; + byte P; public override bool Configure(NES.EDetectionOrigin origin) { @@ -46,10 +50,44 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public override void WritePRG(int addr, byte value) { // either hack emulation of a weird bus conflict, or crappy pirate safeguard - if (addr >= 0x400 && addr <= 0x7ffe) + prg = (R >> 4) & prg_mask; + } + + public override byte ReadEXP(int addr) + { + return (byte)(R | (NES.DB & 0xCF)); + } + + public override void WriteEXP(int addr, byte value) + { + Console.WriteLine(addr); + Console.WriteLine(value); + if ((addr & 0xE200) == 0x200) { chr = value & 15 & chr_mask; - prg = value >> 4 & 15 & prg_mask; + } + switch (addr & 0xE103) + { + case 0x100: + if (!M) + { + R = P; + } + else + { + R++; + R &= 0x30; + } + + + break; + case 0x102: + P = (byte)(value & 0x30); + prg = (value >> 4) & prg_mask; + break; + case 0x103: + M = value.Bit(4); + break; } } @@ -58,6 +96,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES base.SyncState(ser); ser.Sync("chr", ref chr); ser.Sync("prg", ref prg); + ser.Sync("R", ref R); + ser.Sync("M", ref M); + ser.Sync("P", ref P); } } } From ffe051ab26c3fa4f6cc3851760e89750827ba411 Mon Sep 17 00:00:00 2001 From: Isotarge Date: Wed, 9 Aug 2017 01:23:44 +0930 Subject: [PATCH 002/219] N64: Fix minAnalogX and minAnalogY values D and L boolean inputs for the analog stick were one unit short of full range --- BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64Input.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64Input.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64Input.cs index 828f2f1a8e..ee927c10d0 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64Input.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64Input.cs @@ -73,9 +73,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64 } private const sbyte _maxAnalogX = 127; - private const sbyte _minAnalogX = -127; + private const sbyte _minAnalogX = -128; private const sbyte _maxAnalogY = 127; - private const sbyte _minAnalogY = -127; + private const sbyte _minAnalogY = -128; /// /// Translates controller input from EmuHawk into From d7032330f1ae26c36ba5811015418603e5ebb85f Mon Sep 17 00:00:00 2001 From: nattthebear Date: Tue, 8 Aug 2017 19:10:07 -0400 Subject: [PATCH 003/219] Remove console messages on swappable activate/deactivate, debugging cruft --- BizHawk.Emulation.Cores/Waterbox/Swappable.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Waterbox/Swappable.cs b/BizHawk.Emulation.Cores/Waterbox/Swappable.cs index 32bc1bf0f5..9b76314bc7 100644 --- a/BizHawk.Emulation.Cores/Waterbox/Swappable.cs +++ b/BizHawk.Emulation.Cores/Waterbox/Swappable.cs @@ -126,14 +126,12 @@ namespace BizHawk.Emulation.Cores.Waterbox private void DeactivateInternal() { - Console.WriteLine("Swappable DeactivateInternal {0}", GetHashCode()); foreach (var m in _memoryBlocks) m.Deactivate(); } private void ActivateInternal() { - Console.WriteLine("Swappable ActivateInternal {0}", GetHashCode()); foreach (var m in _memoryBlocks) m.Activate(); } From 5b97e5c7f63fadda8ee075a760643c1767485a27 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Fri, 11 Aug 2017 19:42:53 -0400 Subject: [PATCH 004/219] Add ICycleTiming interface plus one implementation so I can feel like I did something --- .../BizHawk.Emulation.Common.csproj | 1 + .../Interfaces/Services/ICycleTiming.cs | 20 +++++++++++++++++++ .../Consoles/Nintendo/Gameboy/Gambatte.cs | 5 +++-- 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 BizHawk.Emulation.Common/Interfaces/Services/ICycleTiming.cs diff --git a/BizHawk.Emulation.Common/BizHawk.Emulation.Common.csproj b/BizHawk.Emulation.Common/BizHawk.Emulation.Common.csproj index c9919ebed4..af786ec123 100644 --- a/BizHawk.Emulation.Common/BizHawk.Emulation.Common.csproj +++ b/BizHawk.Emulation.Common/BizHawk.Emulation.Common.csproj @@ -91,6 +91,7 @@ + diff --git a/BizHawk.Emulation.Common/Interfaces/Services/ICycleTiming.cs b/BizHawk.Emulation.Common/Interfaces/Services/ICycleTiming.cs new file mode 100644 index 0000000000..5fd648e9f7 --- /dev/null +++ b/BizHawk.Emulation.Common/Interfaces/Services/ICycleTiming.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BizHawk.Emulation.Common +{ + public interface ICycleTiming + { + /// + /// Total elapsed emulation time relative to + /// + long CycleCount { get; } + /// + /// Clock Rate in hz for + /// + double ClockRate { get; } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index 864cdd856d..3f67fa612e 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy [ServiceNotApplicable(typeof(IDriveLight), typeof(IDriveLight))] public partial class Gameboy : IEmulator, IVideoProvider, ISoundProvider, ISaveRam, IStatable, IInputPollable, ICodeDataLogger, IBoardInfo, IDebuggable, ISettable, - IGameboyCommon + IGameboyCommon, ICycleTiming { [CoreConstructor("GB", "GBC")] public Gameboy(CoreComm comm, GameInfo game, byte[] file, object settings, object syncSettings, bool deterministic) @@ -253,7 +253,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy /// number of extra cycles we overran in the last frame /// private uint frameOverflow = 0; - public ulong CycleCount => _cycleCount; + public long CycleCount => (long)_cycleCount; + public double ClockRate => TICKSPERSECOND; #endregion From 5e3cdba869ed1db3914068ec3165b5a54e9c2705 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Fri, 11 Aug 2017 19:45:45 -0400 Subject: [PATCH 005/219] Finally dump some old movie 1.0 cruft --- BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.IStatable.cs | 4 ---- .../Consoles/Nintendo/GBA/VBANext.IStatable.cs | 4 ---- .../Consoles/Nintendo/Gameboy/Gambatte.IStatable.cs | 4 ---- .../Consoles/Nintendo/Gameboy/GambatteLink.IStatable.cs | 4 ---- .../Consoles/Nintendo/N64/N64.IStatable.cs | 3 --- .../Consoles/Nintendo/QuickNES/QuickNES.IStatable.cs | 2 -- .../Consoles/Sega/gpgx64/GPGX.IStatable.cs | 2 -- BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs | 1 - 8 files changed, 24 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.IStatable.cs index ac1c1a41d0..e2c600f015 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.IStatable.cs @@ -22,10 +22,6 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx _ser.Serialize(writer, s); - // write extra copy of stuff we don't use - writer.WriteLine(); - writer.WriteLine("Frame {0}", Frame); - ////Console.WriteLine(BizHawk.Common.BufferExtensions.BufferExtensions.HashSHA1(SaveStateBinary())); } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.IStatable.cs index ed28391129..514b3850c8 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.IStatable.cs @@ -22,10 +22,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA ser.Serialize(writer, s); - // write extra copy of stuff we don't use - writer.WriteLine(); - writer.WriteLine("Frame {0}", Frame); - //Console.WriteLine(BizHawk.Common.BufferExtensions.BufferExtensions.HashSHA1(SaveStateBinary())); } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.IStatable.cs index f3d31aee93..5818d6634b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.IStatable.cs @@ -14,10 +14,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy { var s = SaveState(); ser.Serialize(writer, s); - - // write extra copy of stuff we don't use - writer.WriteLine(); - writer.WriteLine("Frame {0}", Frame); } public void LoadStateText(TextReader reader) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IStatable.cs index 44d477940f..ea6e8bf0ed 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IStatable.cs @@ -27,10 +27,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy cablediscosignal = _cablediscosignal }; ser.Serialize(writer, s); - // write extra copy of stuff we don't use - // is this needed anymore?? - writer.WriteLine(); - writer.WriteLine("Frame {0}", Frame); } public void LoadStateText(TextReader reader) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.IStatable.cs index 547e566477..31434f2b0c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.IStatable.cs @@ -17,9 +17,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64 { var temp = SaveStateBinary(); temp.SaveAsHexFast(writer); - - // write extra copy of stuff we don't use - writer.WriteLine("Frame {0}", Frame); } public void LoadStateText(TextReader reader) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.IStatable.cs index 2f834515b9..b2f38791ad 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.IStatable.cs @@ -15,8 +15,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES CheckDisposed(); var temp = SaveStateBinary(); temp.SaveAsHexFast(writer); - // write extra copy of stuff we don't use - writer.WriteLine("Frame {0}", Frame); } public void LoadStateText(System.IO.TextReader reader) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IStatable.cs index 312bc3e69c..7ea082d563 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IStatable.cs @@ -17,8 +17,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx { var temp = SaveStateBinary(); temp.SaveAsHexFast(writer); - // write extra copy of stuff we don't use - writer.WriteLine("Frame {0}", Frame); } public void LoadStateText(TextReader reader) diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs index fdf3057a1f..e1e42df4bf 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs @@ -1083,7 +1083,6 @@ namespace BizHawk.Emulation.Cores.Sony.PSX s.ExtraData.CurrentDiscIndexMounted = CurrentDiscIndexMounted; ser.Serialize(writer, s); - // TODO write extra copy of stuff we don't use (WHY?) } public void LoadStateText(TextReader reader) From 77a535a7d8f5b2137c9f8c417b064772355cf7d0 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Fri, 11 Aug 2017 19:59:10 -0400 Subject: [PATCH 006/219] Implement ICycleTiming on neshawk --- BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs | 8 +++++++- BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs index e8f52c27b2..18752340e5 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs @@ -9,7 +9,7 @@ using BizHawk.Emulation.Cores.Components.M6502; namespace BizHawk.Emulation.Cores.Nintendo.NES { - public partial class NES : IEmulator + public partial class NES : IEmulator, ICycleTiming { //hardware/state public MOS6502X cpu; @@ -216,6 +216,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES cpuclockrate = 1662607; cpu_sequence = cpu_sequence_PAL; _display_type = DisplayType.PAL; + ClockRate = 5320342.5; break; case Common.DisplayType.NTSC: apu = new APU(this, apu, false); @@ -224,6 +225,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES VsyncDen = 655171; cpuclockrate = 1789773; cpu_sequence = cpu_sequence_NTSC; + ClockRate = 5369318.1818181818181818181818182; break; // this is in bootgod, but not used at all case Common.DisplayType.Dendy: @@ -234,6 +236,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES cpuclockrate = 1773448; cpu_sequence = cpu_sequence_NTSC; _display_type = DisplayType.Dendy; + ClockRate = 5320342.5; break; default: throw new Exception("Unknown displaytype!"); @@ -296,6 +299,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } + public long CycleCount => ppu.TotalCycles; + public double ClockRate { get; private set; } + private int VsyncNum { get; set; } private int VsyncDen { get; set; } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs index 0b937975f8..4468e90dd2 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs @@ -203,6 +203,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public byte[] OAM; public byte[] PALRAM; + private long _totalCycles; + public long TotalCycles => _totalCycles; + public void SyncState(Serializer ser) { ser.Sync("cpu_step", ref cpu_step); @@ -248,6 +251,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES //don't sync framebuffer into binary (rewind) states if(ser.IsText) ser.Sync("xbuf", ref xbuf, false); + + ser.Sync("_totalCycles", ref _totalCycles); } public void Reset() @@ -345,6 +350,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES nes.Board.ClockPPU(); } } + _totalCycles += x; } } } From 36a84bd0ddc0f6d1a3881e0f043e8ea6ee3b507d Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sun, 13 Aug 2017 17:21:00 -0400 Subject: [PATCH 007/219] Fix savestate hash match issue with Saturnus --- .../Waterbox/LibWaterboxCore.cs | 2 +- output/dll/ss.wbx.gz | Bin 2445129 -> 2434483 bytes waterbox/emulibc/waterboxcore.h | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Waterbox/LibWaterboxCore.cs b/BizHawk.Emulation.Cores/Waterbox/LibWaterboxCore.cs index b1fd9ee0d6..0cacab7e64 100644 --- a/BizHawk.Emulation.Cores/Waterbox/LibWaterboxCore.cs +++ b/BizHawk.Emulation.Cores/Waterbox/LibWaterboxCore.cs @@ -48,7 +48,7 @@ namespace BizHawk.Emulation.Cores.Waterbox } [Flags] - public enum MemoryDomainFlags : int + public enum MemoryDomainFlags : long { None = 0, /// diff --git a/output/dll/ss.wbx.gz b/output/dll/ss.wbx.gz index 6b6cf9053961a6e7e70b79e0dbc86d4e166af8fc..aee1cbf775c93498f15d6a49a7c2ea211f315b44 100644 GIT binary patch literal 2434483 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 /// scanline. -1 = end of frame, -2 = RIGHT NOW void SetScanlineCallback(ScanlineCallback callback, int line); + + /// + /// Set up printer callback + /// + /// The callback to get the image. Setting this to non-null also "connects" the printer as the serial device. + void SetPrinterCallback(PrinterCallback callback); } public class GPUMemoryAreas : IMonitor diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs index 42aed349ae..0e33c042fe 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs @@ -30,14 +30,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy public long Time; public Buttons Keys; } - - [UnmanagedFunctionPointer(CC)] - public delegate void PrinterCallback(IntPtr image, - byte height, - byte top_margin, - byte bottom_margin, - byte exposure); - + [BizImport(CC)] public abstract bool Init(bool cgb, byte[] spc, int spclen); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index 69695f892f..5ae284dce9 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -339,5 +339,13 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy } } } + + private PrinterCallback _printerCallback; + + public void SetPrinterCallback(PrinterCallback callback) + { + _printerCallback = callback; + _core.SetPrinterCallback(callback); + } } } From 148e40b504dbfa899aa22cafbb68ab6dec28a0d0 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sun, 27 Aug 2017 12:58:19 -0400 Subject: [PATCH 137/219] Fix stack overflow in printer callback --- output/dll/sameboy.wbx.gz | Bin 59146 -> 59417 bytes waterbox/sameboy/printer.c | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/output/dll/sameboy.wbx.gz b/output/dll/sameboy.wbx.gz index b3bb90a8012cbc21ee9b446fdb0799f5097e1783..451322c7590e9ffa836329b8b55f8d870b31bb74 100644 GIT binary patch literal 59417 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�#{H51H842E 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�-`pSBp$Nl%3%vtN1*+*&p@Ma-DY_w{dg&lR3 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 literal 59146 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 diff --git a/waterbox/sameboy/printer.c b/waterbox/sameboy/printer.c index bc1d45ab47..e27d7d544d 100644 --- a/waterbox/sameboy/printer.c +++ b/waterbox/sameboy/printer.c @@ -1,4 +1,5 @@ #include "gb.h" +#include "../emulibc/emulibc.h" /* TODO: Emulation is VERY basic and assumes the ROM correctly uses the printer's interface. Incorrect usage is not correctly emulated, as it's not well documented, nor do I @@ -9,6 +10,9 @@ Also, field mask values are assumed. */ +// hackadoodle! we must not overflow the stack +static ECL_INVISIBLE uint32_t tmp_image[160 * 200]; + static void handle_command(GB_gameboy_t *gb) { @@ -21,7 +25,7 @@ static void handle_command(GB_gameboy_t *gb) case GB_PRINTER_START_COMMAND: if (gb->printer.command_length == 4) { gb->printer.status = 6; /* Printing */ - uint32_t image[gb->printer.image_offset]; + uint32_t *const image = tmp_image; uint8_t palette = gb->printer.command_data[2]; uint32_t colors[4] = {gb->rgb_encode_callback(gb, 0xff, 0xff, 0xff), gb->rgb_encode_callback(gb, 0xaa, 0xaa, 0xaa), From 200ab8f8d8981a68bfc939b22152c4557f3c033f Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sun, 27 Aug 2017 20:55:55 -0400 Subject: [PATCH 138/219] GB Printer support for Gambatte, output color improvements --- .../tools/GB/GBPrinterView.cs | 28 +- .../BizHawk.Emulation.Cores.csproj | 1 + .../Consoles/Nintendo/Gameboy/Gambatte.cs | 12 +- .../Nintendo/Gameboy/GambattePrinter.cs | 314 ++++++++++++++++++ .../Consoles/Nintendo/Gameboy/LibGambatte.cs | 14 + libgambatte/include/gambatte.h | 1 + libgambatte/src/cinterface.cpp | 5 + libgambatte/src/cpu.h | 4 + libgambatte/src/gambatte.cpp | 4 + libgambatte/src/memory.cpp | 3 + libgambatte/src/memory.h | 5 + output/dll/libgambatte.dll | Bin 189952 -> 380942 bytes 12 files changed, 383 insertions(+), 8 deletions(-) create mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambattePrinter.cs diff --git a/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs b/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs index f606bfe319..549df688ea 100644 --- a/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs +++ b/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs @@ -19,10 +19,10 @@ namespace BizHawk.Client.EmuHawk { const int PaperWidth = 160; - // the lightest color + // the bg color private static readonly uint PaperColor = (uint)Color.AntiqueWhite.ToArgb(); - // the darkest color - private static readonly uint InkColor = (uint)Color.DarkSlateGray.ToArgb(); + + private ColorMatrix PaperAdjustment; [RequiredService] public IGameboyCommon Gb { get; private set; } @@ -37,6 +37,15 @@ namespace BizHawk.Client.EmuHawk { InitializeComponent(); + // adjust the color of the printed output to be more papery + PaperAdjustment = new ColorMatrix(); + PaperAdjustment.Matrix00 = (0xFA - 0x10) / 255F; + PaperAdjustment.Matrix40 = 0x10 / 255F; + PaperAdjustment.Matrix11 = (0xEB - 0x10) / 255F; + PaperAdjustment.Matrix41 = 0x10 / 255F; + PaperAdjustment.Matrix22 = (0xD7 - 0x18) / 255F; + PaperAdjustment.Matrix42 = 0x18 / 255F; + paperView.ChangeBitmapSize(PaperWidth, PaperWidth); ClearPaper(); @@ -87,7 +96,6 @@ namespace BizHawk.Client.EmuHawk /// void OnPrint(IntPtr image, byte height, byte topMargin, byte bottomMargin, byte exposure) { - return; // In this implementation: // the bottom margin and top margin are just white lines at the top and bottom // exposure is ignored @@ -112,12 +120,18 @@ namespace BizHawk.Client.EmuHawk } } + page.UnlockBits(bmp); + // add it to the bottom of the history int oldHeight = printerHistory.Height; ResizeHistory(printerHistory.Height + page.Height + topMargin + bottomMargin); using (var g = Graphics.FromImage(printerHistory)) { - g.DrawImage(page, new Point(0, oldHeight + topMargin)); + // Make it brown + ImageAttributes a = new ImageAttributes(); + a.SetColorMatrix(PaperAdjustment); + + g.DrawImage(page, new Rectangle(0, oldHeight + topMargin, page.Width, page.Height), 0F, 0F, page.Width, page.Height, GraphicsUnit.Pixel, a); g.Flush(); } RefreshView(); @@ -159,7 +173,7 @@ namespace BizHawk.Client.EmuHawk printerHistory = newHistory; // Update scrollbar, viewport is a square - paperScroll.Maximum = Math.Max(0, PaperWidth - height); + paperScroll.Maximum = Math.Max(0, height); } void RefreshView() @@ -167,7 +181,7 @@ namespace BizHawk.Client.EmuHawk using (Graphics g = Graphics.FromImage(paperView.BMP)) { g.Clear(Color.FromArgb((int)PaperColor)); - g.DrawImage(printerHistory, new Point(0, paperScroll.Value)); + g.DrawImage(printerHistory, new Point(0, -paperScroll.Value)); g.Flush(); } diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 774d7fe180..2c4cc573ce 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -512,6 +512,7 @@ GambatteLink.cs + GambatteLink.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index 2f9caaf605..87a9c4272e 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -497,6 +497,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy } } + GambattePrinter printer; + /// /// set up Printer callback /// @@ -508,7 +510,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy return; // not sure how this is being reached. tried the debugger... } - // TODO: this + if (callback != null) + { + printer = new GambattePrinter(this, callback); + } + else + { + printer.Disconnect(); + printer = null; + } } LibGambatte.ScanlineCallback scanlinecb; diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambattePrinter.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambattePrinter.cs new file mode 100644 index 0000000000..2cc834e5ff --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambattePrinter.cs @@ -0,0 +1,314 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy; +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Nintendo.Gameboy +{ + /// + /// Emulate the gameboy printer in managed code + /// + public class GambattePrinter + { + // A loose c->c# port of SameBoy's printer code + + enum CommandState : byte + { + GB_PRINTER_COMMAND_MAGIC1, + GB_PRINTER_COMMAND_MAGIC2, + GB_PRINTER_COMMAND_ID, + GB_PRINTER_COMMAND_COMPRESSION, + GB_PRINTER_COMMAND_LENGTH_LOW, + GB_PRINTER_COMMAND_LENGTH_HIGH, + GB_PRINTER_COMMAND_DATA, + GB_PRINTER_COMMAND_CHECKSUM_LOW, + GB_PRINTER_COMMAND_CHECKSUM_HIGH, + GB_PRINTER_COMMAND_ACTIVE, + GB_PRINTER_COMMAND_STATUS, + } + enum CommandID : byte + { + GB_PRINTER_INIT_COMMAND = 1, + GB_PRINTER_START_COMMAND = 2, + GB_PRINTER_DATA_COMMAND = 4, + GB_PRINTER_NOP_COMMAND = 0xF, + } + + const int GB_PRINTER_MAX_COMMAND_LENGTH = 0x280; + const int GB_PRINTER_DATA_SIZE = 0x280; + + const ushort SerialIRQAddress = 0x58; + + Gameboy gb; + PrinterCallback callback; + LibGambatte.LinkCallback linkCallback; + + CommandState command_state; + CommandID command_id; + + bool compression; + ushort length_left; + byte[] command_data = new byte[GB_PRINTER_MAX_COMMAND_LENGTH]; + ushort command_length; + ushort checksum; + byte status; + + byte[] image = new byte[160 * 200]; + ushort image_offset; + + byte compression_run_lenth; + bool compression_run_is_compressed; + + public GambattePrinter(Gameboy gb, PrinterCallback callback) + { + this.gb = gb; + this.callback = callback; + + linkCallback = OnSerial; + LibGambatte.gambatte_setlinkcallback(gb.GambatteState, linkCallback); + + // connect the cable + LibGambatte.gambatte_linkstatus(gb.GambatteState, 259); + } + + public void Disconnect() + { + if (gb.GambatteState != IntPtr.Zero) + LibGambatte.gambatte_setlinkcallback(gb.GambatteState, null); + } + + void OnSerial() + { + if (LibGambatte.gambatte_linkstatus(gb.GambatteState, 256) != 0) // ClockTrigger + { + LibGambatte.gambatte_linkstatus(gb.GambatteState, 257); // ack + + byte output = HandleSerial((byte)LibGambatte.gambatte_linkstatus(gb.GambatteState, 258)); // GetOut + LibGambatte.gambatte_linkstatus(gb.GambatteState, output); // ShiftIn + } + } + + byte HandleSerial(byte byte_received) + { + byte byte_to_send = 0; + + switch (command_state) + { + case CommandState.GB_PRINTER_COMMAND_MAGIC1: + if (byte_received != 0x88) + { + return byte_to_send; + } + status &= 254; + command_length = 0; + checksum = 0; + break; + + case CommandState.GB_PRINTER_COMMAND_MAGIC2: + if (byte_received != 0x33) + { + if (byte_received != 0x88) + { + command_state = CommandState.GB_PRINTER_COMMAND_MAGIC1; + } + return byte_to_send; + } + break; + + case CommandState.GB_PRINTER_COMMAND_ID: + command_id = (CommandID)(byte_received & 0xF); + break; + + case CommandState.GB_PRINTER_COMMAND_COMPRESSION: + compression = (byte_received & 1) != 0; + break; + + case CommandState.GB_PRINTER_COMMAND_LENGTH_LOW: + length_left = byte_received; + break; + + case CommandState.GB_PRINTER_COMMAND_LENGTH_HIGH: + length_left |= (ushort)((byte_received & 3) << 8); + break; + + case CommandState.GB_PRINTER_COMMAND_DATA: + if (command_length != GB_PRINTER_MAX_COMMAND_LENGTH) + { + if (compression) + { + if (compression_run_lenth == 0) + { + compression_run_is_compressed = (byte_received & 0x80) != 0; + compression_run_lenth = (byte)((byte_received & 0x7F) + 1 + (compression_run_is_compressed ? 1 : 0)); + } + else if (compression_run_is_compressed) + { + while (compression_run_lenth > 0) + { + command_data[command_length++] = byte_received; + compression_run_lenth--; + if (command_length == GB_PRINTER_MAX_COMMAND_LENGTH) + { + compression_run_lenth = 0; + } + } + } + else + { + command_data[command_length++] = byte_received; + compression_run_lenth--; + } + } + else + { + command_data[command_length++] = byte_received; + } + } + length_left--; + break; + + case CommandState.GB_PRINTER_COMMAND_CHECKSUM_LOW: + checksum ^= byte_received; + break; + + case CommandState.GB_PRINTER_COMMAND_CHECKSUM_HIGH: + checksum ^= (ushort)(byte_received << 8); + if (checksum != 0) + { + status |= 1; /* Checksum error*/ + command_state = CommandState.GB_PRINTER_COMMAND_MAGIC1; + return byte_to_send; + } + break; + + case CommandState.GB_PRINTER_COMMAND_ACTIVE: + byte_to_send = 0x81; + break; + + case CommandState.GB_PRINTER_COMMAND_STATUS: + + if (((int)command_id & 0xF) == (byte)CommandID.GB_PRINTER_INIT_COMMAND) + { + /* Games expect INIT commands to return 0? */ + byte_to_send = 0; + } + else + { + byte_to_send = status; + } + + /* Printing is done instantly, but let the game recieve a 6 (Printing) status at least once, for compatibility */ + if (status == 6) + { + status = 4; /* Done */ + } + + command_state = CommandState.GB_PRINTER_COMMAND_MAGIC1; + HandleCommand(); + return byte_to_send; + } + + if (command_state >= CommandState.GB_PRINTER_COMMAND_ID && command_state < CommandState.GB_PRINTER_COMMAND_CHECKSUM_LOW) + { + checksum += byte_received; + } + + if (command_state != CommandState.GB_PRINTER_COMMAND_DATA) + { + command_state++; + } + + if (command_state == CommandState.GB_PRINTER_COMMAND_DATA) + { + if (length_left == 0) + { + command_state++; + } + } + + return byte_to_send; + } + + void HandleCommand() + { + switch (command_id) + { + case CommandID.GB_PRINTER_INIT_COMMAND: + status = 0; + image_offset = 0; + break; + + case CommandID.GB_PRINTER_START_COMMAND: + if (command_length == 4) + { + status = 6; /* Printing */ + uint[] outputImage = new uint[image_offset]; + + int palette = command_data[2]; + uint[] colors = new uint[] { + 0xFFFFFFFFU, + 0xFFAAAAAAU, + 0xFF555555U, + 0xFF000000U + }; + for (int i = 0; i < image_offset; i++) + { + outputImage[i] = colors[(palette >> (image[i] * 2)) & 3]; + } + + if (callback != null) + { + // The native-friendly callback almost seems silly now :P + unsafe + { + fixed (uint* imagePtr = outputImage) + { + callback((IntPtr)imagePtr, (byte)(image_offset / 160), + (byte)(command_data[1] >> 4), (byte)(command_data[1] & 7), + (byte)(command_data[3] & 0x7F)); + } + } + } + + image_offset = 0; + } + break; + + case CommandID.GB_PRINTER_DATA_COMMAND: + if (command_length == GB_PRINTER_DATA_SIZE) + { + image_offset %= (ushort)image.Length; + status = 8; /* Received 0x280 bytes */ + + int data_index = 0; + + for (int row = 2; row > 0; row--) + { + for (int tile_x = 0; tile_x < 160 / 8; tile_x++) + { + for (int y = 0; y < 8; y++, data_index += 2) + { + for (int x_pixel = 0; x_pixel < 8; x_pixel++) + { + image[image_offset + tile_x * 8 + x_pixel + y * 160] = + (byte)((command_data[data_index] >> 7) | ((command_data[data_index + 1] >> 7) << 1)); + command_data[data_index] <<= 1; + command_data[data_index + 1] <<= 1; + } + } + } + + image_offset += 8 * 160; + } + } + break; + + default: + break; + } + } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs index 06aaa58fa6..88c68bd3ed 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -264,6 +264,20 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy /// the callback [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void gambatte_setrtccallback(IntPtr core, RTCCallback callback); + + /// + /// type of the link data sent callback + /// + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void LinkCallback(); + + /// + /// sets the Link data sent callback. + /// + /// opaque state pointer + /// the callback + [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern void gambatte_setlinkcallback(IntPtr core, LinkCallback callback); /// /// Returns true if the currently loaded ROM image is treated as having CGB support. diff --git a/libgambatte/include/gambatte.h b/libgambatte/include/gambatte.h index 2265ffa6d9..08b3575a6a 100644 --- a/libgambatte/include/gambatte.h +++ b/libgambatte/include/gambatte.h @@ -110,6 +110,7 @@ public: void setTraceCallback(void (*callback)(void *)); void setScanlineCallback(void (*callback)(), int sl); void setRTCCallback(std::uint32_t (*callback)()); + void setLinkCallback(void (*callback)()); /** Returns true if the currently loaded ROM image is treated as having CGB support. */ bool isCgb() const; diff --git a/libgambatte/src/cinterface.cpp b/libgambatte/src/cinterface.cpp index 6549307c85..376b8c68f5 100644 --- a/libgambatte/src/cinterface.cpp +++ b/libgambatte/src/cinterface.cpp @@ -109,6 +109,11 @@ GBEXPORT void gambatte_setrtccallback(GB *g, unsigned int (*callback)()) g->setRTCCallback(callback); } +GBEXPORT void gambatte_setlinkcallback(GB *g, void (*callback)()) +{ + g->setLinkCallback(callback); +} + GBEXPORT int gambatte_iscgb(GB *g) { return g->isCgb(); diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h index 1310257e86..2c9e4547a4 100644 --- a/libgambatte/src/cpu.h +++ b/libgambatte/src/cpu.h @@ -96,6 +96,10 @@ public: memory.setRTCCallback(callback); } + void setLinkCallback(void (*callback)()) { + memory.setLinkCallback(callback); + } + void reset_bios(int setting) { memory.bios_reset(setting); } diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index c3843a862c..ee064c0743 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -141,6 +141,10 @@ void GB::setRTCCallback(std::uint32_t (*callback)()) { p_->cpu.setRTCCallback(callback); } +void GB::setLinkCallback(void(*callback)()) { + p_->cpu.setLinkCallback(callback); +} + int GB::load(const char *romfiledata, unsigned romfilelength, const char *biosfiledata, unsigned biosfilelength, const std::uint32_t now, const unsigned flags) { //if (p_->cpu.loaded()) // p_->cpu.saveSavedata(); diff --git a/libgambatte/src/memory.cpp b/libgambatte/src/memory.cpp index 79d9820e16..548e6705d2 100644 --- a/libgambatte/src/memory.cpp +++ b/libgambatte/src/memory.cpp @@ -29,6 +29,7 @@ Memory::Memory(const Interrupter &interrupter_in) writeCallback(0), execCallback(0), cdCallback(0), + linkCallback(0), getInput(0), divLastUpdate(0), lastOamDmaUpdate(DISABLED_TIME), @@ -123,6 +124,8 @@ void Memory::updateSerial(const unsigned long cc) { if (intreq.eventTime(SERIAL) <= cc) { linkClockTrigger = true; intreq.setEventTime(DISABLED_TIME); + if (linkCallback) + linkCallback(); } } } diff --git a/libgambatte/src/memory.h b/libgambatte/src/memory.h index 78a89a0ee4..3bfe8675c0 100644 --- a/libgambatte/src/memory.h +++ b/libgambatte/src/memory.h @@ -39,6 +39,7 @@ class Memory { void (*writeCallback)(unsigned); void (*execCallback)(unsigned); CDCallback cdCallback; + void (*linkCallback)(); unsigned (*getInput)(); unsigned long divLastUpdate; @@ -275,6 +276,10 @@ public: cart.setRTCCallback(callback); } + void setLinkCallback(void (*callback)()) { + this->linkCallback = callback; + } + void setEndtime(unsigned long cc, unsigned long inc); void setSoundBuffer(uint_least32_t *const buf) { sound.setBuffer(buf); } diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index 358af1d5dc0d0469830560d8ecc605615613823e..4bf168c395486e0e31bf6585c3da0280e679f115 100644 GIT binary patch literal 380942 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
!JcM$cNYh@(R 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 X^<~XcW=<e8SX3t5 z1adu$M!~mj@l|boVX+~A$|N8Oh!DUBTB`xA&NV90zXb$gzTe*G%rlcPp?>RI>tnHV z&pyw+_t|HkeIEDDgkRNZ*_x&~0g;HNHQ-7AeEhfjKL?OJVAz@g+6%|M_JamT>1#ij zH2vDy-kGy*xMtRs*Lf?hy#D$dD!o@-?VUB}dhfN@d;J$q^j>$v)T__v-@k9Jsyg@N zmeTSCe;F2qYx|rvY#Q*(fAILpSMl@FldtFJBPaispHG~8HJ&d8t{X<_z>HcW=7-EJ)g|dmLsZ+kt z88c-@<`KMV-$lO7o$~q4xMte5Q)g=$i^2mLQx>W>;h&G%oi%$_1>#tCkRj*WlP=%Y zGj2de&Ig%tz7IR)8$IoaQ1yGq$v#D~-L~h@@nVNaq5H}%rq;jw!wuN8H(X=&f^Rhw2 zw(!*9S=t(^+YqmYF9l)(+%_e&PB`%|?u?$1VJeYN(S2qu2-}t@Ypu0(nbP+Q8 zwfe0kch1DHu*>gvs9NF#8Up2mW1OmvQqfqN-!vgu`w$9D2-YpfLvPT0n&uuBpejY# zH@Y>*Aw2k-Wdwb$5;N?WW7|&DO|=rehE>-JO=p4?z9I#0NWnuXcuNZ2>d8u~udRQU z=C=Z2JYu3}rc`_P!34$Hch?72p&u1~k!wWAC|tN4Iox-Ll1mf)kcYXNQZ;wY&+}3x zmYn{l(>kR?|4Jc)60?Eps4OWFfl;Wfc*G{ZyS{F`4uQJsH-}ICp+l<c&k2=T*_6je8Y6eSl zy#|!cYXk>hfk`DYcsE6h^U>Xta=qc~M@f%m`Y({q1tMib3^CDF8tgxkqGU2vRMoT# zJ)k#$L@nY`dAzB4+BlCk-NAWKH!A9fOtPFLN$iYxP;VYsDZsFajej2vJ!=vYg1v48 zrQoMP@-uk(&q0f11+@4P8mWr|k-_Cj44wH%oT2Nf1W6#yPz6ODg`o>m^CU7APY*6fTY=bRLbDsQpXgzb2XgbGzUl z+2S2~NHLYFLS9Ly&yGHf&j`~Q3;Gfu2czJ>^e3Puzf5;pI=^0^g#t! zB}wN*79n|t7z2v}Z9u?7fl&wyfmT~^2MG5?2A{!&qpF>^Jgx~-DO0i}E~BU}BoS5Z z;?z6|fCcOYRZ(%-%S+N z1%I)go|>8|fkDb7IlKV5QaD6nB8#g3M6di7v^rt~cZeb0kw)g^XNgiwy7Pv3W;qSv zs&m&nj9`hQHrohZ?x+sU*-K50GRy;>Sr;2nA+He$8RwE0J8Sg5#$lCxB7;vX#QYAs ze!wVdoCW+i#`96@*RI*XzlICB1;}Z0fqcq{Xo(EI4I!%0XN=equK7NYM7pD+ko<-4 z$4|r9*N2dST!N&3iT1wo6u*1bW?eKIjp3Y9;cT1$r=s^*cfHfKUKiW#nICD|nJF_$ zQuzXu-=T}9Vrq=*Skf4Pk(&S~q}TXb=fL%TVXYt|Dt6d+9il0V%G=i*iTMOHw_qyK z-KzpGAfuHHD=b5Os~Vvv^c(h_bkg8~e3b=bc2QU*pnV3U1|KF3FDO-;HXnB|%F62l{Vv zcVK)w_BA;w`?4PuKK>-?qxBGc)P+KE^FRdYXgHAFWa+Nt9*Na=e!BXahNjln6qB6n z)>!#}{*1E5>4Br8g%@@zUn(}~RR_ocntdXsBrkHo@$l#7$`NK|8KP-D

~09ywg- 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 JJt3C^?RZFZ@ORQA`Yj`H(DZ)cn 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 From 56cdf329298a034a1604abe1f1c5c041d9d8b69f Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Wed, 30 Aug 2017 15:07:17 -0400 Subject: [PATCH 139/219] Make Gambatte show link status for printer connection --- .../BizHawk.Emulation.Cores.csproj | 7 +++++-- .../Nintendo/Gameboy/Gambatte.ILinkable.cs | 15 +++++++++++++++ .../Consoles/Nintendo/Gameboy/Gambatte.cs | 4 +++- 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ILinkable.cs diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 2c4cc573ce..7958b5be1a 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -365,7 +365,7 @@ - + @@ -463,6 +463,9 @@ Gambatte.cs + + Gambatte.cs + Gambatte.cs @@ -1311,4 +1314,4 @@ --> - + \ No newline at end of file diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ILinkable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ILinkable.cs new file mode 100644 index 0000000000..05066dfed8 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.ILinkable.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Nintendo.Gameboy +{ + public partial class Gameboy : ILinkable + { + public bool LinkConnected { get; private set; } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index 87a9c4272e..fcfa9a0486 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy [ServiceNotApplicable(typeof(IDriveLight), typeof(IDriveLight))] public partial class Gameboy : IEmulator, IVideoProvider, ISoundProvider, ISaveRam, IStatable, IInputPollable, ICodeDataLogger, IBoardInfo, IDebuggable, ISettable, - IGameboyCommon, ICycleTiming + IGameboyCommon, ICycleTiming, ILinkable { [CoreConstructor("GB", "GBC")] public Gameboy(CoreComm comm, GameInfo game, byte[] file, object settings, object syncSettings, bool deterministic) @@ -513,9 +513,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy if (callback != null) { printer = new GambattePrinter(this, callback); + LinkConnected = true; } else { + LinkConnected = false; printer.Disconnect(); printer = null; } From 1069a50219ffa843b7c8e82e8cf5bddbfe67ffb3 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Wed, 30 Aug 2017 23:02:36 -0400 Subject: [PATCH 140/219] Adds Sega Master System paddle support --- Assets/defctrl.json | 14 ++ BizHawk.Client.EmuHawk/MainForm.Designer.cs | 27 +++ BizHawk.Client.EmuHawk/MainForm.Events.cs | 16 ++ .../Consoles/Sega/SMS/SMS.IEmulator.cs | 8 +- .../Consoles/Sega/SMS/SMS.ISettable.cs | 1 + .../Consoles/Sega/SMS/SMS.IStatable.cs | 2 + .../Consoles/Sega/SMS/SMS.Input.cs | 174 ++++++++++++++++-- 7 files changed, 228 insertions(+), 14 deletions(-) diff --git a/Assets/defctrl.json b/Assets/defctrl.json index 65c84b7fdb..97a6a89116 100644 --- a/Assets/defctrl.json +++ b/Assets/defctrl.json @@ -743,6 +743,13 @@ "P2 B1": "", "P2 B2": "" }, + "SMS Paddle Controller": { + "P1 Left": "LeftArrow, J1 POV1L", + "P1 Right": "RightArrow, J1 POV1R", + "P1 B1": "Z, J1 B1, X1 X", + "Reset": "J1 B9, X1 Back", + "Pause": "J1 B10, X1 Start", + }, "GG Controller": { "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", "P1 Down": "DownArrow, J1 POV1D, X1 DpadDown, X1 LStickDown", @@ -1567,6 +1574,13 @@ "Mult": 1.0, "Deadzone": 0.1 } + }, + "SMS Paddle Controller": { + "P1 Paddle": { + "Value": "X1 LeftThumbX", + "Mult": 1.0, + "Deadzone": 0.1 + } } } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/MainForm.Designer.cs b/BizHawk.Client.EmuHawk/MainForm.Designer.cs index aef505d11b..82b6530b92 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Designer.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Designer.cs @@ -442,6 +442,9 @@ this.ShowMenuContextMenuSeparator = new System.Windows.Forms.ToolStripSeparator(); this.ShowMenuContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.timerMouseIdle = new System.Windows.Forms.Timer(this.components); + this.SMSControllerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSControllerStandardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSControllerPaddleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.MainformMenu.SuspendLayout(); this.MainStatusBar.SuspendLayout(); this.MainFormContextMenu.SuspendLayout(); @@ -2475,6 +2478,7 @@ this.SMSSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SMSregionToolStripMenuItem, this.SMSdisplayToolStripMenuItem, + this.SMSControllerToolStripMenuItem, this.SMStoolStripMenuItem2, this.SMSenableBIOSToolStripMenuItem, this.SMSEnableFMChipMenuItem, @@ -2542,6 +2546,26 @@ this.SMSdisplayNtscToolStripMenuItem.Text = "NTSC"; this.SMSdisplayNtscToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayNTSC_Click); // + // SMSControllerToolStripMenuItem + // + this.SMSControllerToolStripMenuItem.Name = "SMSControllerToolStripMenuItem"; + this.SMSControllerToolStripMenuItem.Text = "&Controller Type"; + this.SMSControllerToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SMSControllerStandardToolStripMenuItem, + this.SMSControllerPaddleToolStripMenuItem}); + // + // SMSControllerStandardToolStripMenuItem + // + this.SMSControllerStandardToolStripMenuItem.Name = "SMSControllerStandardToolStripMenuItem"; + this.SMSControllerStandardToolStripMenuItem.Text = "Standard"; + this.SMSControllerStandardToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerStandardToolStripMenuItem_Click); + // + // SMSControllerPaddleToolStripMenuItem + // + this.SMSControllerPaddleToolStripMenuItem.Name = "SMSControllerPaddleToolStripMenuItem"; + this.SMSControllerPaddleToolStripMenuItem.Text = "Paddle"; + this.SMSControllerPaddleToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerPaddleToolStripMenuItem_Click); + // // SMSdisplayPalToolStripMenuItem // this.SMSdisplayPalToolStripMenuItem.Name = "SMSdisplayPalToolStripMenuItem"; @@ -4368,5 +4392,8 @@ private System.Windows.Forms.ToolStripMenuItem SgbSameBoyMenuItem; private System.Windows.Forms.ToolStripMenuItem pCFXToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem preferencesToolStripMenuItem3; + private System.Windows.Forms.ToolStripMenuItem SMSControllerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem SMSControllerStandardToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem SMSControllerPaddleToolStripMenuItem; } } diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index 9cd33d7a3d..8d1abdce5c 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -1745,6 +1745,8 @@ namespace BizHawk.Client.EmuHawk SMSdisplayNtscToolStripMenuItem.Checked = ss.DisplayType == "NTSC"; SMSdisplayPalToolStripMenuItem.Checked = ss.DisplayType == "PAL"; SMSdisplayAutoToolStripMenuItem.Checked = ss.DisplayType == "Auto"; + SMSControllerStandardToolStripMenuItem.Checked = s.ControllerType == "Standard"; + SMSControllerPaddleToolStripMenuItem.Checked = s.ControllerType == "Paddle"; SMSenableBIOSToolStripMenuItem.Checked = ss.UseBIOS; SMSEnableFMChipMenuItem.Checked = ss.EnableFM; SMSOverclockMenuItem.Checked = ss.AllowOverlock; @@ -1899,6 +1901,20 @@ namespace BizHawk.Client.EmuHawk GlobalWin.Tools.Load(); } + private void SMSControllerStandardToolStripMenuItem_Click(object sender, EventArgs e) + { + var s = ((SMS)Emulator).GetSettings(); + s.ControllerType = "Standard"; + PutCoreSettings(s); + } + + private void SMSControllerPaddleToolStripMenuItem_Click(object sender, EventArgs e) + { + var s = ((SMS)Emulator).GetSettings(); + s.ControllerType = "Paddle"; + PutCoreSettings(s); + } + #endregion #region TI83 diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs index ae2dd35788..7b91f0bfba 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs @@ -15,7 +15,13 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem return GGController; } - return SmsController; + switch(Settings.ControllerType) + { + case "Paddle": + return SMSPaddleController; + default: + return SmsController; + } } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ISettable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ISettable.cs index 90331a7528..a69d726e37 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ISettable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ISettable.cs @@ -38,6 +38,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem public bool SpriteLimit = false; public bool Fix3D = true; public bool DisplayOverscan = false; + public string ControllerType = "Standard"; // GG settings public bool ShowClippedRegions = false; diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs index 961daa444b..219612fb00 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs @@ -71,6 +71,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem ser.Sync("Port02", ref Port02); ser.Sync("Port3E", ref Port3E); ser.Sync("Port3F", ref Port3F); + ser.Sync("Paddle1High", ref Paddle1High); + ser.Sync("Paddle2High", ref Paddle2High); if (SaveRAM != null) { diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs index 06fa88e9ea..d48e9b3d06 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs @@ -1,4 +1,6 @@ -using BizHawk.Emulation.Common; +using System; + +using BizHawk.Emulation.Common; namespace BizHawk.Emulation.Cores.Sega.MasterSystem { @@ -25,21 +27,123 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem } }; + public static readonly ControllerDefinition SMSPaddleController = new ControllerDefinition + { + Name = "SMS Paddle Controller", + BoolButtons = + { + "Reset", "Pause", + "P1 Left", "P1 Right", "P1 B1", + "P2 Left", "P2 Right", "P2 B1", + }, + FloatControls = + { + "P1 Paddle", + "P2 Paddle" + }, + FloatRanges = + { + new ControllerDefinition.FloatRange(0, 128, 255), + new ControllerDefinition.FloatRange(0, 128, 255) + } + }; + + // The paddles have a nibble select state + bool Paddle1High = false; + bool Paddle2High = false; + + const int PaddleMin = 0; + const int PaddleMax = 255; + private byte ReadControls1() { InputCallbacks.Call(); _lagged = false; byte value = 0xFF; - if (_controller.IsPressed("P1 Up")) value &= 0xFE; - if (_controller.IsPressed("P1 Down")) value &= 0xFD; - if (_controller.IsPressed("P1 Left")) value &= 0xFB; - if (_controller.IsPressed("P1 Right")) value &= 0xF7; - if (_controller.IsPressed("P1 B1")) value &= 0xEF; - if (_controller.IsPressed("P1 B2")) value &= 0xDF; + switch (Settings.ControllerType) + { + case "Paddle": + // use analog values from a controller, see http://www.smspower.org/Development/Paddle - if (_controller.IsPressed("P2 Up")) value &= 0xBF; - if (_controller.IsPressed("P2 Down")) value &= 0x7F; + int paddle1Pos; + if (_controller.IsPressed("P1 Left")) + paddle1Pos = PaddleMin; + else if (_controller.IsPressed("P1 Right")) + paddle1Pos = PaddleMax; + else + paddle1Pos = (int)_controller.GetFloat("P1 Paddle"); + + int paddle2Pos; + if (_controller.IsPressed("P2 Left")) + paddle2Pos = PaddleMin; + else if (_controller.IsPressed("P2 Right")) + paddle2Pos = PaddleMax; + else + paddle2Pos = (int)_controller.GetFloat("P2 Paddle"); + + // The 3F port's TH slot is also used on games in some games in Export BIOS to clock the paddle state + // Yes it's silly considering the paddle was never released outside Japan but the games think otherwise + if (_region != "Japan") + { + if ((Port3F & 0x02) == 0x00) + { + Paddle1High = (Port3F & 0x20) != 0; + } + if ((Port3F & 0x08) == 0x00) + { + Paddle2High = (Port3F & 0x80) != 0; + } + } + + if (Paddle1High) + { + if ((paddle1Pos & 0x10) == 0) value &= 0xFE; + if ((paddle1Pos & 0x20) == 0) value &= 0xFD; + if ((paddle1Pos & 0x40) == 0) value &= 0xFB; + if ((paddle1Pos & 0x80) == 0) value &= 0xF7; + } + else + { + if ((paddle1Pos & 0x01) == 0) value &= 0xFE; + if ((paddle1Pos & 0x02) == 0) value &= 0xFD; + if ((paddle1Pos & 0x04) == 0) value &= 0xFB; + if ((paddle1Pos & 0x08) == 0) value &= 0xF7; + } + + if (_controller.IsPressed("P1 B1")) value &= 0xEF; + if (!Paddle1High) value &= 0xDF; + + if (Paddle2High) + { + if ((paddle2Pos & 0x10) == 0) value &= 0xBF; + if ((paddle2Pos & 0x20) == 0) value &= 0x7F; + } + else + { + if ((paddle2Pos & 0x01) == 0) value &= 0xBF; + if ((paddle2Pos & 0x02) == 0) value &= 0x7F; + } + + // toggle state for Japanese region controllers + Paddle1High = !Paddle1High; + + break; + + default: + // Normal controller + + if (_controller.IsPressed("P1 Up")) value &= 0xFE; + if (_controller.IsPressed("P1 Down")) value &= 0xFD; + if (_controller.IsPressed("P1 Left")) value &= 0xFB; + if (_controller.IsPressed("P1 Right")) value &= 0xF7; + if (_controller.IsPressed("P1 B1")) value &= 0xEF; + if (_controller.IsPressed("P1 B2")) value &= 0xDF; + + if (_controller.IsPressed("P2 Up")) value &= 0xBF; + if (_controller.IsPressed("P2 Down")) value &= 0x7F; + break; + } return value; } @@ -50,10 +154,54 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem _lagged = false; byte value = 0xFF; - if (_controller.IsPressed("P2 Left")) value &= 0xFE; - if (_controller.IsPressed("P2 Right")) value &= 0xFD; - if (_controller.IsPressed("P2 B1")) value &= 0xFB; - if (_controller.IsPressed("P2 B2")) value &= 0xF7; + switch (Settings.ControllerType) + { + case "Paddle": + // use analog values from a controller, see http://www.smspower.org/Development/Paddle + + int paddle2Pos; + if (_controller.IsPressed("P2 Left")) + paddle2Pos = PaddleMin; + else if (_controller.IsPressed("P2 Right")) + paddle2Pos = PaddleMax; + else + paddle2Pos = (int)_controller.GetFloat("P2 Paddle"); + + if (_region != "Japan") + { + if ((Port3F & 0x08) == 0x00) + { + Paddle2High = (Port3F & 0x80) != 0; + } + } + + if (Paddle2High) + { + if ((paddle2Pos & 0x40) == 0) value &= 0xFE; + if ((paddle2Pos & 0x80) == 0) value &= 0xFD; + } + else + { + if ((paddle2Pos & 0x04) == 0) value &= 0xFE; + if ((paddle2Pos & 0x08) == 0) value &= 0xFD; + } + + if (_controller.IsPressed("P2 B1")) value &= 0xFB; + if (!Paddle2High) value &= 0xF7; + + Paddle2High = !Paddle2High; + + break; + + default: + // Normal controller + + if (_controller.IsPressed("P2 Left")) value &= 0xFE; + if (_controller.IsPressed("P2 Right")) value &= 0xFD; + if (_controller.IsPressed("P2 B1")) value &= 0xFB; + if (_controller.IsPressed("P2 B2")) value &= 0xF7; + break; + } if (_controller.IsPressed("Reset")) value &= 0xEF; From 6f021653aad8e3768e701708bae933f028356734 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Thu, 31 Aug 2017 11:14:49 -0400 Subject: [PATCH 141/219] Fixes Galactic Defender's P2 paddle (#988) --- BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs index d48e9b3d06..f2ec7ff6cd 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs @@ -89,6 +89,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem if ((Port3F & 0x02) == 0x00) { Paddle1High = (Port3F & 0x20) != 0; + Paddle2High = Paddle1High; } if ((Port3F & 0x08) == 0x00) { From 40ec613982313127f31e6bbc1a5cca07195eaadc Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 1 Sep 2017 22:11:41 -0400 Subject: [PATCH 142/219] NesHawk: Single Tick PPU Should allow for breaking out into a debugger. --- .../Consoles/Nintendo/NES/NES.Core.cs | 40 +- .../Consoles/Nintendo/NES/PPU.cs | 205 ++- .../Consoles/Nintendo/NES/PPU.run.cs | 1333 +++++++++-------- 3 files changed, 909 insertions(+), 669 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs index 18752340e5..1775dcd523 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs @@ -366,7 +366,43 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES VS_coin_inserted &= 1; } - ppu.FrameAdvance(); + FrameGo = true; + ppu.ppu_tick_counter = 0; + + if (ppu.ppudead > 0) + { + while (ppu.ppudead > 0) + { + ppu.NewDeadPPU(); + } + } + else + { + ppu.ppu_init_frame(); + + ppu.do_vbl = true; + ppu.do_active_sl = true; + ppu.do_pre_vbl = true; + + // do the vbl ticks seperate, that will save us a few checks that don't happen in active region + while (ppu.do_vbl) + { + ppu.TickPPU_VBL(); + } + + // now do the rest of the frame + while (ppu.do_active_sl) + { + ppu.TickPPU_active(); + } + + // now do the pre-NMI lines + while (ppu.do_pre_vbl) + { + ppu.TickPPU_preVBL(); + } + } + if (lagged) { _lagcount++; @@ -385,6 +421,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES num_cheats = 0; } + public bool FrameGo; + //PAL: //0 15 30 45 60 -> 12 27 42 57 -> 9 24 39 54 -> 6 21 36 51 -> 3 18 33 48 -> 0 //sequence of ppu clocks per cpu clock: 3,3,3,3,4 diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs index 4468e90dd2..14a40e2d5e 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs @@ -194,7 +194,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } //state - int ppudead; //measured in frames + public int ppudead; //measured in frames bool idleSynch; int NMI_PendingInstructions; byte PPUGenLatch; @@ -253,6 +253,51 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ser.Sync("xbuf", ref xbuf, false); ser.Sync("_totalCycles", ref _totalCycles); + + ser.Sync("do_vbl", ref do_vbl); + ser.Sync("do_active_sl", ref do_active_sl); + ser.Sync("do_pre_vbl", ref do_pre_vbl); + ser.Sync("ppu_tick_counter", ref ppu_tick_counter); + + ser.Sync("scanline_counter", ref scanline_counter); + ser.Sync("nmi_destiny", ref nmi_destiny); + ser.Sync("yp_shift", ref yp_shift); + ser.Sync("sprite_eval_cycle", ref sprite_eval_cycle); + ser.Sync("xt", ref xt); + ser.Sync("xp", ref xp); + ser.Sync("xstart", ref xstart); + ser.Sync("rasterpos", ref rasterpos); + ser.Sync("renderspritenow", ref renderspritenow); + ser.Sync("renderbgnow", ref renderbgnow); + ser.Sync("hit_pending", ref hit_pending); + ser.Sync("s", ref s); + ser.Sync("ppu_aux_index", ref ppu_aux_index); + ser.Sync("junksprite", ref junksprite); + ser.Sync("line", ref line); + ser.Sync("patternNumber", ref patternNumber); + ser.Sync("patternAddress", ref patternAddress); + ser.Sync("temp_addr", ref temp_addr); + ser.Sync("sl_sprites", ref sl_sprites, false); + + byte bg_byte; + for (int i = 0; i < 34; i++) + { + bg_byte = bgdata[i].at; ser.Sync("bgdata", ref bg_byte); bgdata[i].at = bg_byte; + bg_byte = bgdata[i].nt; ser.Sync("bgdata", ref bg_byte); bgdata[i].nt = bg_byte; + bg_byte = bgdata[i].pt_0; ser.Sync("bgdata", ref bg_byte); bgdata[i].pt_0 = bg_byte; + bg_byte = bgdata[i].pt_1; ser.Sync("bgdata", ref bg_byte); bgdata[i].pt_1 = bg_byte; + } + + byte oam_byte; + for (int i = 0; i < 64; i++) + { + oam_byte = t_oam[i].oam_y; ser.Sync("bgdata", ref oam_byte); t_oam[i].oam_y = oam_byte; + oam_byte = t_oam[i].oam_ind; ; ser.Sync("bgdata", ref oam_byte); t_oam[i].oam_ind = oam_byte; + oam_byte = t_oam[i].oam_attr; ser.Sync("bgdata", ref oam_byte); t_oam[i].oam_attr = oam_byte; + oam_byte = t_oam[i].oam_x; ser.Sync("bgdata", ref oam_byte); t_oam[i].oam_x = oam_byte; + oam_byte = t_oam[i].patterns_0; ser.Sync("bgdata", ref oam_byte); t_oam[i].patterns_0 = oam_byte; + oam_byte = t_oam[i].patterns_1; ser.Sync("bgdata", ref oam_byte); t_oam[i].patterns_1 = oam_byte; + } } public void Reset() @@ -264,93 +309,91 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ppu_open_bus_decay_timer = new int[8]; } - void runppu(int x) + void runppu() { //run one ppu cycle at a time so we can interact with the ppu and clockPPU at high granularity - for (int i = 0; i < x; i++) + + race_2006 = false; + if (install_2006>0) { - race_2006 = false; - if (install_2006>0) + install_2006--; + if (install_2006==0) { - install_2006--; - if (install_2006==0) - { - ppur.install_latches(); + ppur.install_latches(); - //nes.LogLine("addr wrote vt = {0}, ht = {1}", ppur._vt, ppur._ht); - //normally the address isnt observed by the board till it gets clocked by a read or write. - //but maybe thats just because a ppu read/write shoves it on the address bus - //apparently this shoves it on the address bus, too, or else blargg's mmc3 tests dont pass - //ONLY if the ppu is not rendering - if (ppur.status.sl == 241 || !PPUON) - nes.Board.AddressPPU(ppur.get_2007access()); + //nes.LogLine("addr wrote vt = {0}, ht = {1}", ppur._vt, ppur._ht); + //normally the address isnt observed by the board till it gets clocked by a read or write. + //but maybe thats just because a ppu read/write shoves it on the address bus + //apparently this shoves it on the address bus, too, or else blargg's mmc3 tests dont pass + //ONLY if the ppu is not rendering + if (ppur.status.sl == 241 || !PPUON) + nes.Board.AddressPPU(ppur.get_2007access()); - race_2006 = true; - } - } - - if (install_2001 > 0) - { - install_2001--; - if (install_2001 == 0) - { - show_bg_new = reg_2001.show_bg; - show_obj_new = reg_2001.show_obj; - } - } - - ppur.status.cycle++; - is_even_cycle = !is_even_cycle; - - if (PPUON && ppur.status.cycle >= 257 && ppur.status.cycle <= 320 && 0 <= ppur.status.sl && ppur.status.sl <= 240) - { - reg_2003 = 0; - } - - // Here we execute a CPU instruction if enough PPU cycles have passed - // also do other things that happen at instruction level granularity - cpu_stepcounter++; - if (cpu_stepcounter == nes.cpu_sequence[cpu_step]) - { - cpu_step++; - if (cpu_step == 5) cpu_step = 0; - cpu_stepcounter = 0; - - // this is where the CPU instruction is called - nes.RunCpuOne(); - - // decay the ppu bus, approximating real behaviour - PpuOpenBusDecay(DecayType.None); - - // Check for NMIs - if (NMI_PendingInstructions > 0) - { - NMI_PendingInstructions--; - if (NMI_PendingInstructions <= 0) - { - nes.cpu.NMI = true; - } - } - } - - if (Reg2002_vblank_active_pending) - { - Reg2002_vblank_active = 1; - Reg2002_vblank_active_pending = false; - } - - if (Reg2002_vblank_clear_pending) - { - Reg2002_vblank_active = 0; - Reg2002_vblank_clear_pending = false; - } - - if (HasClockPPU) - { - nes.Board.ClockPPU(); + race_2006 = true; } } - _totalCycles += x; - } + + if (install_2001 > 0) + { + install_2001--; + if (install_2001 == 0) + { + show_bg_new = reg_2001.show_bg; + show_obj_new = reg_2001.show_obj; + } + } + + ppur.status.cycle++; + is_even_cycle = !is_even_cycle; + + if (PPUON && ppur.status.cycle >= 257 && ppur.status.cycle <= 320 && 0 <= ppur.status.sl && ppur.status.sl <= 240) + { + reg_2003 = 0; + } + + // Here we execute a CPU instruction if enough PPU cycles have passed + // also do other things that happen at instruction level granularity + cpu_stepcounter++; + if (cpu_stepcounter == nes.cpu_sequence[cpu_step]) + { + cpu_step++; + if (cpu_step == 5) cpu_step = 0; + cpu_stepcounter = 0; + + // this is where the CPU instruction is called + nes.RunCpuOne(); + + // decay the ppu bus, approximating real behaviour + PpuOpenBusDecay(DecayType.None); + + // Check for NMIs + if (NMI_PendingInstructions > 0) + { + NMI_PendingInstructions--; + if (NMI_PendingInstructions <= 0) + { + nes.cpu.NMI = true; + } + } + } + + if (Reg2002_vblank_active_pending) + { + Reg2002_vblank_active = 1; + Reg2002_vblank_active_pending = false; + } + + if (Reg2002_vblank_clear_pending) + { + Reg2002_vblank_active = 0; + Reg2002_vblank_clear_pending = false; + } + + if (HasClockPPU) + { + nes.Board.ClockPPU(); + } + _totalCycles += 1; + } } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs index 894df6d75b..233aaec96b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs @@ -17,6 +17,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public byte pt_0, pt_1; }; + BGDataRecord[] bgdata = new BGDataRecord[34]; + public short[] xbuf = new short[256 * 240]; // values here are used in sprite evaluation @@ -40,7 +42,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public byte[] soam = new byte[512]; // in a real nes, this would only be 32, but we wish to allow more then 8 sprites per scanline public bool reg_2001_color_disable_latch; // the value used here is taken public bool ppu_was_on; - public byte[,] sl_sprites = new byte[3, 256]; + public unsafe byte[] sl_sprites = new byte[3 * 256]; // installing vram address is delayed after second write to 2006, set this up here public int install_2006; @@ -62,30 +64,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES TempOAM[] t_oam = new TempOAM[64]; int ppu_addr_temp; - void Read_bgdata(ref BGDataRecord bgdata) - { - for (int i = 0; i < 8; i++) - { - Read_bgdata(i, ref bgdata); - runppu(1); - - if (PPUON && i == 6) - { - ppu_was_on = true; - } - - if (PPUON && i == 7) - { - if (!race_2006) - ppur.increment_hsc(); - - if (ppur.status.cycle == 256 && !race_2006) - ppur.increment_vs(); - - ppu_was_on = false; - } - } - } // attempt to emulate graphics pipeline behaviour // experimental @@ -151,48 +129,77 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } //switch(cycle) } - public unsafe void FrameAdvance() - { - BGDataRecord* bgdata = stackalloc BGDataRecord[34]; //one at the end is junk, it can never be rendered + // these are states for the ppu incrementer + public bool do_vbl; + public bool do_active_sl; + public bool do_pre_vbl; + public int ppu_tick_counter; - //262 scanlines - if (ppudead != 0) - { - FrameAdvance_ppudead(); - return; - } + int scanline_counter; + bool nmi_destiny; + int yp_shift; + int sprite_eval_cycle; + int xt; + int xp; + int xstart; + int rasterpos; + bool renderspritenow; + bool renderbgnow; + bool hit_pending; + int s; + int ppu_aux_index; + bool junksprite; + int line; + int patternNumber; + int patternAddress; + int temp_addr; + + public void ppu_init_frame() + { + scanline_counter = 0; + ppu_tick_counter = 0; + + // These things happen at the start of every frame Reg2002_vblank_active_pending = true; ppuphase = PPUPHASE.VBL; ppur.status.sl = 241; + bgdata = new BGDataRecord[34]; + } - //Not sure if this is correct. According to Matt Conte and my own tests, it is. Timing is probably off, though. - //NOTE: Not having this here breaks a Super Donkey Kong game. - //if (PPUON) reg_2003 = 0; + public void TickPPU_VBL() + { + if (ppu_tick_counter == 3) + { + nmi_destiny = reg_2000.vblank_nmi_gen && Reg2002_vblank_active; + } + else if (ppu_tick_counter == 6) + { + if (nmi_destiny) { nes.cpu.NMI = true; } + nes.Board.AtVsyncNMI(); + } - //this was repeatedly finetuned from the fceux days thrugh the old cpu core and into the new one to pass 05-nmi_timing.nes - //note that there is still some leniency. for instance, 4,2 will pass in addition to 3,3 - const int delay = 6; - runppu(3); - bool nmi_destiny = reg_2000.vblank_nmi_gen && Reg2002_vblank_active; - runppu(3); - if (nmi_destiny) nes.cpu.NMI = true; + runppu(); + ppu_tick_counter++; - nes.Board.AtVsyncNMI(); - runppu(postNMIlines * kLineTime - delay); + if (ppu_tick_counter == postNMIlines * kLineTime) + { + Reg2002_objhit = Reg2002_objoverflow = 0; + Reg2002_vblank_clear_pending = true; + idleSynch ^= true; - //this seems to happen just before the dummy scanline begins - Reg2002_objhit = Reg2002_objoverflow = 0; - Reg2002_vblank_clear_pending = true; + do_vbl = false; + ppu_tick_counter = 0; + } + } - idleSynch ^= true; - - //render 241 scanlines (including 1 dummy at beginning) - for (int sl = 0; sl < 241; sl++) + public void TickPPU_active() + { + if (ppu_tick_counter == 0) { ppur.status.cycle = 0; - ppur.status.sl = sl; + ppur.status.sl = scanline_counter; spr_true_count = 0; soam_index = 0; @@ -206,12 +213,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES sprite_zero_in_range = false; - yp = sl - 1; + yp = scanline_counter - 1; ppuphase = PPUPHASE.BG; // "If PPUADDR is not less then 8 when rendering starts, the first 8 bytes in OAM are written to from // the current location of PPUADDR" - if (sl == 0 && PPUON && reg_2003 >= 8 && region == Region.NTSC) + if (scanline_counter == 0 && PPUON && reg_2003 >= 8 && region == Region.NTSC) { for (int i = 0; i < 8; i++) { @@ -222,504 +229,380 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES if (NTViewCallback != null && yp == NTViewCallback.Scanline) NTViewCallback.Callback(); if (PPUViewCallback != null && yp == PPUViewCallback.Scanline) PPUViewCallback.Callback(); - //ok, we're also going to draw here. - //unless we're on the first dummy scanline - if (sl != 0) + // set up intial values to use later + yp_shift = yp << 8; + xt = 0; + xp = 0; + + sprite_eval_cycle = 0; + + xstart = xt << 3; + target = yp_shift + xstart; + rasterpos = xstart; + + spriteHeight = reg_2000.obj_size_16 ? 16 : 8; + + //check all the conditions that can cause things to render in these 8px + renderspritenow = show_obj_new && (xt > 0 || reg_2001.show_obj_leftmost); + hit_pending = false; + + } + + if (ppu_tick_counter < 256) + { + if (scanline_counter != 0) { - //the main scanline rendering loop: - //32 times, we will fetch a tile and then render 8 pixels. - //two of those tiles were read in the last scanline. - int yp_shift = yp << 8; - for (int xt = 0; xt < 32; xt++) + ///////////////////////////////////////////// + // Sprite Evaluation End + ///////////////////////////////////////////// + + if (sprite_eval_cycle <= 63 && !is_even_cycle) { - int xstart = xt << 3; + // the first 64 cycles of each scanline are used to initialize sceondary OAM + // the actual effect setting a flag that always returns 0xFF from a OAM read + // this is a bit of a shortcut to save some instructions + // data is read from OAM as normal but never used + soam[soam_index] = 0xFF; + soam_index++; + } + if (sprite_eval_cycle == 64) + { + soam_index = 0; + oam_index = reg_2003; + } + + // otherwise, scan through OAM and test if sprites are in range + // if they are, they get copied to the secondary OAM + if (sprite_eval_cycle >= 64) + { + if (oam_index >= 256) + { + oam_index = 0; + sprite_eval_write = false; + } + + if (is_even_cycle && oam_index < 256) + { + if ((oam_index + soam_m_index) < 256) + read_value = OAM[oam_index + soam_m_index]; + else + read_value = OAM[oam_index + soam_m_index - 256]; + } + else if (!sprite_eval_write) + { + // if we don't write sprites anymore, just scan through the oam + read_value = soam[0]; + oam_index += 4; + } + else if (sprite_eval_write) + { + //look for sprites + if (spr_true_count == 0 && soam_index < 8) + { + soam[soam_index * 4] = read_value; + } + + if (soam_index < 8) + { + if (yp >= read_value && yp < read_value + spriteHeight && spr_true_count == 0) + { + //a flag gets set if sprite zero is in range + if (oam_index == reg_2003) + sprite_zero_in_range = true; + + spr_true_count++; + soam_m_index++; + } + else if (spr_true_count > 0 && spr_true_count < 4) + { + soam[soam_index * 4 + soam_m_index] = read_value; + + soam_m_index++; + + spr_true_count++; + if (spr_true_count == 4) + { + oam_index += 4; + soam_index++; + if (soam_index == 8) + { + // oam_index could be pathologically misaligned at this point, so we have to find the next + // nearest actual sprite to work on >8 sprites per scanline option + oam_index_aux = (oam_index % 4) * 4; + } + + soam_m_index = 0; + spr_true_count = 0; + } + } + else + { + oam_index += 4; + } + } + else if (soam_index >= 8) + { + if (yp >= read_value && yp < read_value + spriteHeight && PPUON) + { + hit_pending = true; + //Reg2002_objoverflow = true; + } + + if (yp >= read_value && yp < read_value + spriteHeight && spr_true_count == 0) + { + spr_true_count++; + soam_m_index++; + } + else if (spr_true_count > 0 && spr_true_count < 4) + { + soam_m_index++; + + spr_true_count++; + if (spr_true_count == 4) + { + oam_index += 4; + soam_index++; + soam_m_index = 0; + spr_true_count = 0; + } + } + else + { + oam_index += 4; + if (soam_index == 8) + { + soam_m_index++; // glitchy increment + soam_m_index &= 3; + } + + } + + read_value = soam[0]; //writes change to reads + } + } + } + + ///////////////////////////////////////////// + // Sprite Evaluation End + ///////////////////////////////////////////// + + //process the current clock's worth of bg data fetching + //this needs to be split into 8 pieces or else exact sprite 0 hitting wont work + // due to the cpu not running while the sprite renders below + if (PPUON) { Read_bgdata(xp, ref bgdata[xt + 2]); } + + runppu(); + + if (PPUON && xp == 6) + { + ppu_was_on = true; + } + + if (PPUON && xp == 7) + { + if (!race_2006) + ppur.increment_hsc(); + + if (ppur.status.cycle == 256 && !race_2006) + ppur.increment_vs(); + + ppu_was_on = false; + } + + if (hit_pending) + { + hit_pending = false; + Reg2002_objoverflow = true; + } + + renderbgnow = show_bg_new && (xt > 0 || reg_2001.show_bg_leftmost); + //bg pos is different from raster pos due to its offsetability. + //so adjust for that here + int bgpos = rasterpos + ppur.fh; + int bgpx = bgpos & 7; + int bgtile = bgpos >> 3; + + int pixel = 0, pixelcolor = PALRAM[pixel]; + + //according to qeed's doc, use palette 0 or $2006's value if it is & 0x3Fxx + //at one point I commented this out to fix bottom-left garbage in DW4. but it's needed for full_nes_palette. + //solution is to only run when PPU is actually OFF (left-suppression doesnt count) + if (!PPUON) + { + // if there's anything wrong with how we're doing this, someone please chime in + int addr = ppur.get_2007access(); + if ((addr & 0x3F00) == 0x3F00) + { + pixel = addr & 0x1F; + } + pixelcolor = PALRAM[pixel]; + pixelcolor |= 0x8000; //whats this? i think its a flag to indicate a hidden background to be used by the canvas filling logic later + } + + //generate the BG data + if (renderbgnow) + { + byte pt_0 = bgdata[bgtile].pt_0; + byte pt_1 = bgdata[bgtile].pt_1; + int sel = 7 - bgpx; + pixel = ((pt_0 >> sel) & 1) | (((pt_1 >> sel) & 1) << 1); + if (pixel != 0) + pixel |= bgdata[bgtile].at; + pixelcolor = PALRAM[pixel]; + } + + if (!nes.Settings.DispBackground) + pixelcolor = 0x8000; //whats this? i think its a flag to indicate a hidden background to be used by the canvas filling logic later + + //check if the pixel has a sprite in it + if (sl_sprites[256 + xt * 8 + xp] != 0 && renderspritenow) + { + int s = sl_sprites[xt * 8 + xp]; + int spixel = sl_sprites[256 + xt * 8 + xp]; + int temp_attr = sl_sprites[512 + xt * 8 + xp]; + + //TODO - make sure we dont trigger spritehit if the edges are masked for either BG or OBJ + //spritehit: + //1. is it sprite#0? + //2. is the bg pixel nonzero? + //then, it is spritehit. + Reg2002_objhit |= (sprite_zero_go && s == 0 && pixel != 0 && rasterpos < 255 && show_bg_new && show_obj_new); + + //priority handling, if in front of BG: + bool drawsprite = !(((temp_attr & 0x20) != 0) && ((pixel & 3) != 0)); + if (drawsprite && nes.Settings.DispSprites) + { + //bring in the palette bits and palettize + spixel |= (temp_attr & 3) << 2; + //save it for use in the framebuffer + pixelcolor = PALRAM[0x10 + spixel]; + } + } //oamcount loop + + + pipeline(pixelcolor, target, xt * 8 + xp); + target++; + + // clear out previous sprites from scanline buffer + //sl_sprites[xt * 8 + xp] = 0; + sl_sprites[256 + xt * 8 + xp] = 0; + //sl_sprites[512 + xt * 8 + xp] = 0; + + // end of visible part of the scanline + sprite_eval_cycle++; + xp++; + rasterpos++; + + if (xp == 8) + { + xp = 0; + xt++; + + xstart = xt << 3; target = yp_shift + xstart; - int rasterpos = xstart; + rasterpos = xstart; spriteHeight = reg_2000.obj_size_16 ? 16 : 8; //check all the conditions that can cause things to render in these 8px - bool renderspritenow = show_obj_new && (xt > 0 || reg_2001.show_obj_leftmost); - bool renderbgnow; - bool hit_pending = false; + renderspritenow = show_obj_new && (xt > 0 || reg_2001.show_obj_leftmost); + hit_pending = false; - for (int xp = 0; xp < 8; xp++, rasterpos++) - { - ////////////////////////////////////////////////// - //Sprite Evaluation Start - ////////////////////////////////////////////////// - if (ppur.status.cycle <= 63 && !is_even_cycle) - { - // the first 64 cycles of each scanline are used to initialize sceondary OAM - // the actual effect setting a flag that always returns 0xFF from a OAM read - // this is a bit of a shortcut to save some instructions - // data is read from OAM as normal but never used - soam[soam_index] = 0xFF; - soam_index++; - } - if (ppur.status.cycle == 64) - { - soam_index = 0; - oam_index = reg_2003; - } - - // otherwise, scan through OAM and test if sprites are in range - // if they are, they get copied to the secondary OAM - if (ppur.status.cycle >= 64) - { - if (oam_index >= 256) - { - oam_index = 0; - sprite_eval_write = false; - } - - if (is_even_cycle && oam_index < 256) - { - if ((oam_index + soam_m_index) < 256) - read_value = OAM[oam_index + soam_m_index]; - else - read_value = OAM[oam_index + soam_m_index - 256]; - } - else if (!sprite_eval_write) - { - // if we don't write sprites anymore, just scan through the oam - read_value = soam[0]; - oam_index += 4; - } - else if (sprite_eval_write) - { - //look for sprites - if (spr_true_count == 0 && soam_index < 8) - { - soam[soam_index * 4] = read_value; - } - - if (soam_index < 8) - { - if (yp >= read_value && yp < read_value + spriteHeight && spr_true_count == 0) - { - //a flag gets set if sprite zero is in range - if (oam_index == reg_2003) - sprite_zero_in_range = true; - - spr_true_count++; - soam_m_index++; - } - else if (spr_true_count > 0 && spr_true_count < 4) - { - soam[soam_index * 4 + soam_m_index] = read_value; - - soam_m_index++; - - spr_true_count++; - if (spr_true_count == 4) - { - oam_index += 4; - soam_index++; - if (soam_index == 8) - { - // oam_index could be pathologically misaligned at this point, so we have to find the next - // nearest actual sprite to work on >8 sprites per scanline option - oam_index_aux = (oam_index % 4) * 4; - } - - soam_m_index = 0; - spr_true_count = 0; - } - } - else - { - oam_index += 4; - } - } - else if (soam_index >= 8) - { - if (yp >= read_value && yp < read_value + spriteHeight && PPUON) - { - hit_pending = true; - //Reg2002_objoverflow = true; - } - - if (yp >= read_value && yp < read_value + spriteHeight && spr_true_count == 0) - { - spr_true_count++; - soam_m_index++; - } - else if (spr_true_count > 0 && spr_true_count < 4) - { - soam_m_index++; - - spr_true_count++; - if (spr_true_count == 4) - { - oam_index += 4; - soam_index++; - soam_m_index = 0; - spr_true_count = 0; - } - } - else - { - oam_index += 4; - if (soam_index == 8) - { - soam_m_index++; // glitchy increment - soam_m_index &= 3; - } - - } - - read_value = soam[0]; //writes change to reads - } - - } - - } - - ////////////////////////////////////////////////// - //Sprite Evaluation End - ////////////////////////////////////////////////// - - //process the current clock's worth of bg data fetching - //this needs to be split into 8 pieces or else exact sprite 0 hitting wont work due to the cpu not running while the sprite renders below - - - if (PPUON) - Read_bgdata(xp, ref bgdata[xt + 2]); - - runppu(1); - - if (PPUON && xp == 6) - { - ppu_was_on = true; - } - - if (PPUON && xp == 7) - { - if (!race_2006) - ppur.increment_hsc(); - - if (ppur.status.cycle == 256 && !race_2006) - ppur.increment_vs(); - - ppu_was_on = false; - } - - if (hit_pending) - { - hit_pending = false; - Reg2002_objoverflow = true; - } - - renderbgnow = show_bg_new && (xt > 0 || reg_2001.show_bg_leftmost); - //bg pos is different from raster pos due to its offsetability. - //so adjust for that here - int bgpos = rasterpos + ppur.fh; - int bgpx = bgpos & 7; - int bgtile = bgpos >> 3; - - int pixel = 0, pixelcolor = PALRAM[pixel]; - - //according to qeed's doc, use palette 0 or $2006's value if it is & 0x3Fxx - //at one point I commented this out to fix bottom-left garbage in DW4. but it's needed for full_nes_palette. - //solution is to only run when PPU is actually OFF (left-suppression doesnt count) - if (!PPUON) - { - // if there's anything wrong with how we're doing this, someone please chime in - int addr = ppur.get_2007access(); - if ((addr & 0x3F00) == 0x3F00) - { - pixel = addr & 0x1F; - } - pixelcolor = PALRAM[pixel]; - pixelcolor |= 0x8000; //whats this? i think its a flag to indicate a hidden background to be used by the canvas filling logic later - } - - //generate the BG data - if (renderbgnow) - { - byte pt_0 = bgdata[bgtile].pt_0; - byte pt_1 = bgdata[bgtile].pt_1; - int sel = 7 - bgpx; - pixel = ((pt_0 >> sel) & 1) | (((pt_1 >> sel) & 1) << 1); - if (pixel != 0) - pixel |= bgdata[bgtile].at; - pixelcolor = PALRAM[pixel]; - } - - if (!nes.Settings.DispBackground) - pixelcolor = 0x8000; //whats this? i think its a flag to indicate a hidden background to be used by the canvas filling logic later - - //check if the pixel has a sprite in it - if (sl_sprites[1, xt * 8 + xp] != 0 && renderspritenow) - { - int s = sl_sprites[0, xt * 8 + xp]; - int spixel = sl_sprites[1, xt * 8 + xp]; - int temp_attr = sl_sprites[2, xt * 8 + xp]; - - //TODO - make sure we dont trigger spritehit if the edges are masked for either BG or OBJ - //spritehit: - //1. is it sprite#0? - //2. is the bg pixel nonzero? - //then, it is spritehit. - Reg2002_objhit |= (sprite_zero_go && s == 0 && pixel != 0 && rasterpos < 255 && show_bg_new && show_obj_new); - - //priority handling, if in front of BG: - bool drawsprite = !(((temp_attr & 0x20) != 0) && ((pixel & 3) != 0)); - if (drawsprite && nes.Settings.DispSprites) - { - //bring in the palette bits and palettize - spixel |= (temp_attr & 3) << 2; - //save it for use in the framebuffer - pixelcolor = PALRAM[0x10 + spixel]; - } - } //oamcount loop - - - pipeline(pixelcolor, target, xt * 8 + xp); - target++; - - // clear out previous sprites from scanline buffer - sl_sprites[0, xt * 8 + xp] = 0; - sl_sprites[1, xt * 8 + xp] = 0; - sl_sprites[2, xt * 8 + xp] = 0; - - - } //loop across 8 pixels - } //loop across 32 tiles - } - else - for (int xt = 0; xt < 32; xt++) - Read_bgdata(ref bgdata[xt + 2]); - - // normally only 8 sprites are allowed, but with a particular setting we can have more then that - // this extra bit takes care of it quickly - soam_index_aux = 8; - - if (nes.Settings.AllowMoreThanEightSprites) - { - while (oam_index_aux < 64 && soam_index_aux < 64) - { - //look for sprites - soam[soam_index_aux * 4] = OAM[oam_index_aux * 4]; - read_value_aux = OAM[oam_index_aux * 4]; - if (yp >= read_value_aux && yp < read_value_aux + spriteHeight) - { - soam[soam_index_aux * 4 + 1] = OAM[oam_index_aux * 4 + 1]; - soam[soam_index_aux * 4 + 2] = OAM[oam_index_aux * 4 + 2]; - soam[soam_index_aux * 4 + 3] = OAM[oam_index_aux * 4 + 3]; - soam_index_aux++; - oam_index_aux++; - } - else - { - oam_index_aux++; - } } } - - soam_index_prev = soam_index_aux; - - if (soam_index_prev > 8 && !nes.Settings.AllowMoreThanEightSprites) - soam_index_prev = 8; - - ppuphase = PPUPHASE.OBJ; - - spriteHeight = reg_2000.obj_size_16 ? 16 : 8; - - for (int s = 0; s < 8; s++) + else { - bool junksprite = (!PPUON); + // if scanline is the pre-render line, we just read BG data + Read_bgdata(xp, ref bgdata[xt + 2]); + + runppu(); + + if (PPUON && xp == 6) + { + ppu_was_on = true; + } + + if (PPUON && xp == 7) + { + if (!race_2006) + ppur.increment_hsc(); + + if (ppur.status.cycle == 256 && !race_2006) + ppur.increment_vs(); + + ppu_was_on = false; + } + + xp++; + + if (xp == 8) + { + xp = 0; + xt++; + } + } + } + else if (ppu_tick_counter < 320) + { + // after we are done with the visible part of the frame, we reach sprite transfer to temp OAM tables and such + if (ppu_tick_counter == 256) + { + // do the more then 8 sprites stuff here where it is convenient + // normally only 8 sprites are allowed, but with a particular setting we can have more then that + // this extra bit takes care of it quickly + soam_index_aux = 8; + + if (nes.Settings.AllowMoreThanEightSprites) + { + while (oam_index_aux < 64 && soam_index_aux < 64) + { + //look for sprites + soam[soam_index_aux * 4] = OAM[oam_index_aux * 4]; + read_value_aux = OAM[oam_index_aux * 4]; + if (yp >= read_value_aux && yp < read_value_aux + spriteHeight) + { + soam[soam_index_aux * 4 + 1] = OAM[oam_index_aux * 4 + 1]; + soam[soam_index_aux * 4 + 2] = OAM[oam_index_aux * 4 + 2]; + soam[soam_index_aux * 4 + 3] = OAM[oam_index_aux * 4 + 3]; + soam_index_aux++; + oam_index_aux++; + } + else + { + oam_index_aux++; + } + } + } + + soam_index_prev = soam_index_aux; + + if (soam_index_prev > 8 && !nes.Settings.AllowMoreThanEightSprites) + soam_index_prev = 8; + + ppuphase = PPUPHASE.OBJ; + + spriteHeight = reg_2000.obj_size_16 ? 16 : 8; + + s = 0; + ppu_aux_index = 0; + + junksprite = (!PPUON); t_oam[s].oam_y = soam[s * 4]; t_oam[s].oam_ind = soam[s * 4 + 1]; t_oam[s].oam_attr = soam[s * 4 + 2]; t_oam[s].oam_x = soam[s * 4 + 3]; - int line = yp - t_oam[s].oam_y; + line = yp - t_oam[s].oam_y; if ((t_oam[s].oam_attr & 0x80) != 0) //vflip line = spriteHeight - line - 1; - int patternNumber = t_oam[s].oam_ind; - int patternAddress; + patternNumber = t_oam[s].oam_ind; + } - //8x16 sprite handling: - if (reg_2000.obj_size_16) - { - int bank = (patternNumber & 1) << 12; - patternNumber = patternNumber & ~1; - patternNumber |= (line >> 3) & 1; - patternAddress = (patternNumber << 4) | bank; - } - else - patternAddress = (patternNumber << 4) | (reg_2000.obj_pattern_hi << 12); - - //offset into the pattern for the current line. - //tricky: tall sprites have already had lines>8 taken care of by getting a new pattern number above. - //so we just need the line offset for the second pattern - patternAddress += line & 7; - - //garbage nametable fetches + scroll resets - int garbage_todo = 2; - - ppubus_read(ppur.get_ntread(), true, true); - - if (PPUON) - { - if (sl == 0 && ppur.status.cycle == 304) - { - - read_value = t_oam[s].oam_y; - runppu(1); - - if (PPUON) ppur.install_latches(); - - read_value = t_oam[s].oam_ind; - runppu(1); - - - garbage_todo = 0; - } - if ((sl != 0) && ppur.status.cycle == 256) - { - - read_value = t_oam[s].oam_y; - - runppu(1); - - if (target <= 61441 && target > 0 && s == 0) - { - pipeline(0, target, 256); - target++; - } - - //at 257: 3d world runner is ugly if we do this at 256 - if (PPUON) ppur.install_h_latches(); - read_value = t_oam[s].oam_ind; - runppu(1); - - if (target <= 61441 && target > 0 && s == 0) - { - pipeline(0, target, 257); // last pipeline call option 1 of 2 - } - garbage_todo = 0; - } - } - - for (int i = 0; i < garbage_todo; i++) - { - if (i == 0) - read_value = t_oam[s].oam_y; - else - read_value = t_oam[s].oam_ind; - - runppu(1); - - if (i == 0) - { - if (target <= 61441 && target > 0 && s == 0) - { - pipeline(0, target, 256); - target++; - } - } - else - { - if (target <= 61441 && target > 0 && s == 0) - { - pipeline(0, target, 257); // last pipeline call option 2 of 2 - } - } - } - - ppubus_read(ppur.get_atread(), true, true); //at or nt? - - read_value = t_oam[s].oam_attr; - runppu(1); - - read_value = t_oam[s].oam_x; - runppu(1); - - // if the PPU is off, we don't put anything on the bus - if (junksprite) - { - ppubus_read(patternAddress, true, false); - ppubus_read(patternAddress, true, false); - runppu(kFetchTime * 2); - } - else - { - int addr = patternAddress; - t_oam[s].patterns_0 = ppubus_read(addr, true, true); - read_value = t_oam[s].oam_x; - runppu(kFetchTime); - - addr += 8; - t_oam[s].patterns_1 = ppubus_read(addr, true, true); - read_value = t_oam[s].oam_x; - runppu(kFetchTime); - - // hflip - if ((t_oam[s].oam_attr & 0x40) == 0) - { - t_oam[s].patterns_0 = BitReverse.Byte8[t_oam[s].patterns_0]; - t_oam[s].patterns_1 = BitReverse.Byte8[t_oam[s].patterns_1]; - } - - // if the sprites attribute is 0xFF, then this indicates a non-existent sprite - // I think the logic here is that bits 2-4 in OAM are disabled, but soam is initialized with 0xFF - // so the only way a sprite could have an 0xFF attribute is if it is not in the scope of the scanline - if (t_oam[s].oam_attr == 0xFF) - { - t_oam[s].patterns_0 = 0; - t_oam[s].patterns_1 = 0; - } - - } - - // now that we have a sprite, we can fill in the next scnaline's sprite pixels with it - // this saves quite a bit of processing compared to checking each pixel - - if (s < soam_index_prev) - { - int temp_x = t_oam[s].oam_x; - for (int i = 0; (temp_x + i) < 256 && i < 8; i++) - { - if (sl_sprites[1, temp_x + i] == 0) - { - if (t_oam[s].patterns_0.Bit(i) || t_oam[s].patterns_1.Bit(i)) - { - int spixel = t_oam[s].patterns_0.Bit(i) ? 1 : 0; - spixel |= (t_oam[s].patterns_1.Bit(i) ? 2 : 0); - - sl_sprites[0, temp_x + i] = (byte)s; - sl_sprites[1, temp_x + i] = (byte)spixel; - sl_sprites[2, temp_x + i] = t_oam[s].oam_attr; - - } - } - } - } - - } // sprite pattern fetch loop - - //now do the same for extra sprites, but without any cycles run - if (soam_index_aux > 8) + switch (ppu_aux_index) { - for (int s = 8; s < soam_index_aux; s++) - { - t_oam[s].oam_y = soam[s * 4]; - t_oam[s].oam_ind = soam[s * 4 + 1]; - t_oam[s].oam_attr = soam[s * 4 + 2]; - t_oam[s].oam_x = soam[s * 4 + 3]; - - int line = yp - t_oam[s].oam_y; - if ((t_oam[s].oam_attr & 0x80) != 0) //vflip - line = spriteHeight - line - 1; - - int patternNumber = t_oam[s].oam_ind; - int patternAddress; - + case 0: //8x16 sprite handling: if (reg_2000.obj_size_16) { @@ -736,91 +619,367 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES //so we just need the line offset for the second pattern patternAddress += line & 7; - ppubus_read(ppur.get_ntread(), true, false); + ppubus_read(ppur.get_ntread(), true, true); - ppubus_read(ppur.get_atread(), true, false); //at or nt? - - int addr = patternAddress; - t_oam[s].patterns_0 = ppubus_read(addr, true, false); - - addr += 8; - t_oam[s].patterns_1 = ppubus_read(addr, true, false); - - // hflip - if ((t_oam[s].oam_attr & 0x40) == 0) + read_value = t_oam[s].oam_y; + runppu(); + break; + case 1: + if (PPUON && scanline_counter == 0 && ppur.status.cycle == 305) { - t_oam[s].patterns_0 = BitReverse.Byte8[t_oam[s].patterns_0]; - t_oam[s].patterns_1 = BitReverse.Byte8[t_oam[s].patterns_1]; - } + ppur.install_latches(); - // if the sprites attribute is 0xFF, then this indicates a non-existent sprite - // I think the logic here is that bits 2-4 in OAM are disabled, but soam is initialized with 0xFF - // so the only way a sprite could have an 0xFF attribute is if it is not in the scope of the scanline - if (t_oam[s].oam_attr == 0xFF) + read_value = t_oam[s].oam_ind; + runppu(); + + } + else if (PPUON && (scanline_counter != 0) && ppur.status.cycle == 257) { - t_oam[s].patterns_0 = 0; - t_oam[s].patterns_1 = 0; - } + if (target <= 61441 && target > 0 && s == 0) + { + pipeline(0, target, 256); + target++; + } + + //at 257: 3d world runner is ugly if we do this at 256 + if (PPUON) ppur.install_h_latches(); + read_value = t_oam[s].oam_ind; + runppu(); + + if (target <= 61441 && target > 0 && s == 0) + { + pipeline(0, target, 257); // last pipeline call option 1 of 2 + } + } + else + { + if (target <= 61441 && target > 0 && s == 0) + { + pipeline(0, target, 256); + target++; + } + + read_value = t_oam[s].oam_ind; + runppu(); + + if (target <= 61441 && target > 0 && s == 0) + { + pipeline(0, target, 257); // last pipeline call option 2 of 2 + } + } + break; + + case 2: + ppubus_read(ppur.get_atread(), true, true); //at or nt? + read_value = t_oam[s].oam_attr; + runppu(); + break; + + case 3: + read_value = t_oam[s].oam_x; + runppu(); + break; + + case 4: + // if the PPU is off, we don't put anything on the bus + if (junksprite) + { + ppubus_read(patternAddress, true, false); + runppu(); + } + else + { + temp_addr = patternAddress; + t_oam[s].patterns_0 = ppubus_read(temp_addr, true, true); + read_value = t_oam[s].oam_x; + runppu(); + } + break; + case 5: + // if the PPU is off, we don't put anything on the bus + if (junksprite) + { + runppu(); + } + else + { + runppu(); + } + break; + case 6: + // if the PPU is off, we don't put anything on the bus + if (junksprite) + { + ppubus_read(patternAddress, true, false); + runppu(); + } + else + { + temp_addr += 8; + t_oam[s].patterns_1 = ppubus_read(temp_addr, true, true); + read_value = t_oam[s].oam_x; + runppu(); + } + break; + case 7: + // if the PPU is off, we don't put anything on the bus + if (junksprite) + { + runppu(); + } + else + { + runppu(); + + // hflip + if ((t_oam[s].oam_attr & 0x40) == 0) + { + t_oam[s].patterns_0 = BitReverse.Byte8[t_oam[s].patterns_0]; + t_oam[s].patterns_1 = BitReverse.Byte8[t_oam[s].patterns_1]; + } + + // if the sprites attribute is 0xFF, then this indicates a non-existent sprite + // I think the logic here is that bits 2-4 in OAM are disabled, but soam is initialized with 0xFF + // so the only way a sprite could have an 0xFF attribute is if it is not in the scope of the scanline + if (t_oam[s].oam_attr == 0xFF) + { + t_oam[s].patterns_0 = 0; + t_oam[s].patterns_1 = 0; + } + + } + break; + } + + ppu_aux_index++; + if (ppu_aux_index == 8) + { + // now that we have a sprite, we can fill in the next scnaline's sprite pixels with it + // this saves quite a bit of processing compared to checking each pixel + + if (s < soam_index_prev) + { int temp_x = t_oam[s].oam_x; for (int i = 0; (temp_x + i) < 256 && i < 8; i++) { - if (sl_sprites[1, temp_x + i] == 0) + if (sl_sprites[256 + temp_x + i] == 0) { if (t_oam[s].patterns_0.Bit(i) || t_oam[s].patterns_1.Bit(i)) { int spixel = t_oam[s].patterns_0.Bit(i) ? 1 : 0; spixel |= (t_oam[s].patterns_1.Bit(i) ? 2 : 0); - sl_sprites[0, temp_x + i] = (byte)s; - sl_sprites[1, temp_x + i] = (byte)spixel; - sl_sprites[2, temp_x + i] = t_oam[s].oam_attr; + sl_sprites[temp_x + i] = (byte)s; + sl_sprites[256 + temp_x + i] = (byte)spixel; + sl_sprites[512 + temp_x + i] = t_oam[s].oam_attr; } } } - } // sprite pattern fetch loop + } + ppu_aux_index = 0; + s++; + + if (s < 8) + { + junksprite = (!PPUON); + + t_oam[s].oam_y = soam[s * 4]; + t_oam[s].oam_ind = soam[s * 4 + 1]; + t_oam[s].oam_attr = soam[s * 4 + 2]; + t_oam[s].oam_x = soam[s * 4 + 3]; + + line = yp - t_oam[s].oam_y; + if ((t_oam[s].oam_attr & 0x80) != 0) //vflip + line = spriteHeight - line - 1; + + patternNumber = t_oam[s].oam_ind; + } + else + { + // repeat all the above steps for more then 8 sprites but don't run any cycles + if (soam_index_aux > 8) + { + for (int s = 8; s < soam_index_aux; s++) + { + t_oam[s].oam_y = soam[s * 4]; + t_oam[s].oam_ind = soam[s * 4 + 1]; + t_oam[s].oam_attr = soam[s * 4 + 2]; + t_oam[s].oam_x = soam[s * 4 + 3]; + + int line = yp - t_oam[s].oam_y; + if ((t_oam[s].oam_attr & 0x80) != 0) //vflip + line = spriteHeight - line - 1; + + int patternNumber = t_oam[s].oam_ind; + int patternAddress; + + //8x16 sprite handling: + if (reg_2000.obj_size_16) + { + int bank = (patternNumber & 1) << 12; + patternNumber = patternNumber & ~1; + patternNumber |= (line >> 3) & 1; + patternAddress = (patternNumber << 4) | bank; + } + else + patternAddress = (patternNumber << 4) | (reg_2000.obj_pattern_hi << 12); + + //offset into the pattern for the current line. + //tricky: tall sprites have already had lines>8 taken care of by getting a new pattern number above. + //so we just need the line offset for the second pattern + patternAddress += line & 7; + + ppubus_read(ppur.get_ntread(), true, false); + + ppubus_read(ppur.get_atread(), true, false); //at or nt? + + int addr = patternAddress; + t_oam[s].patterns_0 = ppubus_read(addr, true, false); + + addr += 8; + t_oam[s].patterns_1 = ppubus_read(addr, true, false); + + // hflip + if ((t_oam[s].oam_attr & 0x40) == 0) + { + t_oam[s].patterns_0 = BitReverse.Byte8[t_oam[s].patterns_0]; + t_oam[s].patterns_1 = BitReverse.Byte8[t_oam[s].patterns_1]; + } + + // if the sprites attribute is 0xFF, then this indicates a non-existent sprite + // I think the logic here is that bits 2-4 in OAM are disabled, but soam is initialized with 0xFF + // so the only way a sprite could have an 0xFF attribute is if it is not in the scope of the scanline + if (t_oam[s].oam_attr == 0xFF) + { + t_oam[s].patterns_0 = 0; + t_oam[s].patterns_1 = 0; + } + + int temp_x = t_oam[s].oam_x; + for (int i = 0; (temp_x + i) < 256 && i < 8; i++) + { + if (sl_sprites[256 + temp_x + i] == 0) + { + if (t_oam[s].patterns_0.Bit(i) || t_oam[s].patterns_1.Bit(i)) + { + int spixel = t_oam[s].patterns_0.Bit(i) ? 1 : 0; + spixel |= (t_oam[s].patterns_1.Bit(i) ? 2 : 0); + + sl_sprites[temp_x + i] = (byte)s; + sl_sprites[256 + temp_x + i] = (byte)spixel; + sl_sprites[512 + temp_x + i] = t_oam[s].oam_attr; + + } + } + } + } + } + } } - - ppuphase = PPUPHASE.BG; - - // fetch BG: two tiles for next line - for (int xt = 0; xt < 2; xt++) + } + else + { + if (ppu_tick_counter == 320) { - Read_bgdata(ref bgdata[xt]); + ppuphase = PPUPHASE.BG; + xt = 0; + xp = 0; } - // this sequence is tuned to pass 10-even_odd_timing.nes - runppu(4); - bool evenOddDestiny = PPUON; + if (ppu_tick_counter < 336) + { + // if scanline is the pre-render line, we just read BG data + Read_bgdata(xp, ref bgdata[xt]); - // After memory access 170, the PPU simply rests for 4 cycles (or the - // equivelant of half a memory access cycle) before repeating the whole - // pixel/scanline rendering process. If the scanline being rendered is the very - // first one on every second frame, then this delay simply doesn't exist. - if (sl == 0 && idleSynch && evenOddDestiny && chopdot) - { } + runppu(); + + if (PPUON && xp == 6) + { + ppu_was_on = true; + } + + if (PPUON && xp == 7) + { + if (!race_2006) + ppur.increment_hsc(); + + if (ppur.status.cycle == 256 && !race_2006) + ppur.increment_vs(); + + ppu_was_on = false; + } + + xp++; + + if (xp == 8) + { + xp = 0; + xt++; + } + } + else if (ppu_tick_counter < 340) + { + runppu(); + } else - runppu(1); - } // scanline loop + { + bool evenOddDestiny = PPUON; - ppur.status.sl = 241; + // After memory access 170, the PPU simply rests for 4 cycles (or the + // equivelant of half a memory access cycle) before repeating the whole + // pixel/scanline rendering process. If the scanline being rendered is the very + // first one on every second frame, then this delay simply doesn't exist. + if (scanline_counter == 0 && idleSynch && evenOddDestiny && chopdot) + {} + else + { runppu(); } + } + } - //idle for pre NMI lines - runppu(preNMIlines * kLineTime); - } //FrameAdvance + ppu_tick_counter++; + if (ppu_tick_counter == 341) + { + ppu_tick_counter = 0; + scanline_counter++; - void FrameAdvance_ppudead() + if (scanline_counter == 241) + { + do_active_sl = false; + ppur.status.sl = 241; + } + } + } + + public void TickPPU_preVBL() { - //not quite emulating all the NES power up behavior - //since it is known that the NES ignores writes to some - //register before around a full frame, but no games - //should write to those regs during that time, it needs - //to wait for vblank + runppu(); - runppu(241 * kLineTime - 3);// -8*3); - ppudead--; + + ppu_tick_counter++; + if (ppu_tick_counter == preNMIlines * kLineTime) + { + ppu_tick_counter = 0; + do_pre_vbl = false; + } + } + + //not quite emulating all the NES power up behavior + //since it is known that the NES ignores writes to some + //register before around a full frame, but no games + //should write to those regs during that time, it needs + //to wait for vblank + public void NewDeadPPU() + { + runppu(); + + ppu_tick_counter++; + if (ppu_tick_counter == 241 * kLineTime - 3) + { + ppudead--; + } } } } From d0fdc75a1ef6219b4ac2680b152c57d8f6b46b2c Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Thu, 31 Aug 2017 12:58:27 -0400 Subject: [PATCH 143/219] SMS Light Phaser support --- Assets/defctrl.json | 19 +++++- BizHawk.Client.EmuHawk/MainForm.Designer.cs | 11 ++- BizHawk.Client.EmuHawk/MainForm.Events.cs | 8 +++ .../Consoles/Sega/SMS/SMS.IEmulator.cs | 5 ++ .../Consoles/Sega/SMS/SMS.IStatable.cs | 1 + .../Consoles/Sega/SMS/SMS.Input.cs | 68 +++++++++++++++++-- .../Consoles/Sega/SMS/SMS.cs | 6 +- .../Consoles/Sega/SMS/VDP.cs | 8 +++ 8 files changed, 117 insertions(+), 9 deletions(-) diff --git a/Assets/defctrl.json b/Assets/defctrl.json index 97a6a89116..b7454b80f0 100644 --- a/Assets/defctrl.json +++ b/Assets/defctrl.json @@ -748,7 +748,12 @@ "P1 Right": "RightArrow, J1 POV1R", "P1 B1": "Z, J1 B1, X1 X", "Reset": "J1 B9, X1 Back", - "Pause": "J1 B10, X1 Start", + "Pause": "J1 B10, X1 Start" + }, + "SMS Light Phaser Controller": { + "P1 Trigger": "Z, J1 B1, X1 X, WMouse L", + "Reset": "J1 B9, X1 Back", + "Pause": "J1 B10, X1 Start" }, "GG Controller": { "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", @@ -1581,6 +1586,18 @@ "Mult": 1.0, "Deadzone": 0.1 } + }, + "SMS Light Phaser Controller": { + "P1 X": { + "Value": "WMouse X", + "Mult": 1.0, + "Deadzone": 0.0 + }, + "P1 Y": { + "Value": "WMouse Y", + "Mult": 1.0, + "Deadzone": 0.0 + } } } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/MainForm.Designer.cs b/BizHawk.Client.EmuHawk/MainForm.Designer.cs index 82b6530b92..f497c44fca 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Designer.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Designer.cs @@ -445,6 +445,7 @@ this.SMSControllerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.SMSControllerStandardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.SMSControllerPaddleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSControllerLightPhaserToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.MainformMenu.SuspendLayout(); this.MainStatusBar.SuspendLayout(); this.MainFormContextMenu.SuspendLayout(); @@ -2552,7 +2553,8 @@ this.SMSControllerToolStripMenuItem.Text = "&Controller Type"; this.SMSControllerToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SMSControllerStandardToolStripMenuItem, - this.SMSControllerPaddleToolStripMenuItem}); + this.SMSControllerPaddleToolStripMenuItem, + this.SMSControllerLightPhaserToolStripMenuItem}); // // SMSControllerStandardToolStripMenuItem // @@ -2566,6 +2568,12 @@ this.SMSControllerPaddleToolStripMenuItem.Text = "Paddle"; this.SMSControllerPaddleToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerPaddleToolStripMenuItem_Click); // + // SMSControllerLightPhaserToolStripMenuItem + // + this.SMSControllerLightPhaserToolStripMenuItem.Name = "SMSControllerLightPhaserToolStripMenuItem"; + this.SMSControllerLightPhaserToolStripMenuItem.Text = "Light Phaser"; + this.SMSControllerLightPhaserToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerLightPhaserToolStripMenuItem_Click); + // // SMSdisplayPalToolStripMenuItem // this.SMSdisplayPalToolStripMenuItem.Name = "SMSdisplayPalToolStripMenuItem"; @@ -4395,5 +4403,6 @@ private System.Windows.Forms.ToolStripMenuItem SMSControllerToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem SMSControllerStandardToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem SMSControllerPaddleToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem SMSControllerLightPhaserToolStripMenuItem; } } diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index 8d1abdce5c..c5f4bc22dd 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -1747,6 +1747,7 @@ namespace BizHawk.Client.EmuHawk SMSdisplayAutoToolStripMenuItem.Checked = ss.DisplayType == "Auto"; SMSControllerStandardToolStripMenuItem.Checked = s.ControllerType == "Standard"; SMSControllerPaddleToolStripMenuItem.Checked = s.ControllerType == "Paddle"; + SMSControllerLightPhaserToolStripMenuItem.Checked = s.ControllerType == "Light Phaser"; SMSenableBIOSToolStripMenuItem.Checked = ss.UseBIOS; SMSEnableFMChipMenuItem.Checked = ss.EnableFM; SMSOverclockMenuItem.Checked = ss.AllowOverlock; @@ -1915,6 +1916,13 @@ namespace BizHawk.Client.EmuHawk PutCoreSettings(s); } + private void SMSControllerLightPhaserToolStripMenuItem_Click(object sender, EventArgs e) + { + var s = ((SMS)Emulator).GetSettings(); + s.ControllerType = "Light Phaser"; + PutCoreSettings(s); + } + #endregion #region TI83 diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs index 7b91f0bfba..86582d24ce 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs @@ -19,6 +19,11 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem { case "Paddle": return SMSPaddleController; + case "Light Phaser": + // scale the vertical to the display mode + SMSLightPhaserController.FloatRanges[1] = new ControllerDefinition.FloatRange(0, Vdp.FrameHeight / 2, Vdp.FrameHeight - 1); + + return SMSLightPhaserController; default: return SmsController; } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs index 219612fb00..72f703980d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs @@ -73,6 +73,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem ser.Sync("Port3F", ref Port3F); ser.Sync("Paddle1High", ref Paddle1High); ser.Sync("Paddle2High", ref Paddle2High); + ser.Sync("LatchLightPhaser", ref LatchLightPhaser); if (SaveRAM != null) { diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs index f2ec7ff6cd..fda3dcaa68 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs @@ -7,15 +7,15 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem public partial class SMS { public static readonly ControllerDefinition SmsController = new ControllerDefinition - { - Name = "SMS Controller", - BoolButtons = + { + Name = "SMS Controller", + BoolButtons = { "Reset", "Pause", "P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 B1", "P1 B2", "P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 B1", "P2 B2" } - }; + }; public static readonly ControllerDefinition GGController = new ControllerDefinition { @@ -48,6 +48,25 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem } }; + public static readonly ControllerDefinition SMSLightPhaserController = new ControllerDefinition + { + Name = "SMS Light Phaser Controller", + BoolButtons = + { + "Reset", "Pause", + "P1 Trigger", + }, + FloatControls = + { + "P1 X", "P1 Y", + }, + FloatRanges = + { + new ControllerDefinition.FloatRange(0, 64, 127), + new ControllerDefinition.FloatRange(0, 500, 1000) + } + }; + // The paddles have a nibble select state bool Paddle1High = false; bool Paddle2High = false; @@ -55,6 +74,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem const int PaddleMin = 0; const int PaddleMax = 255; + bool LatchLightPhaser = false; + private byte ReadControls1() { InputCallbacks.Call(); @@ -131,6 +152,10 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem break; + case "Light Phaser": + if (_controller.IsPressed("P1 Trigger")) value &= 0xEF; + break; + default: // Normal controller @@ -194,6 +219,14 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem break; + case "Light Phaser": + if (LatchLightPhaser) + { + value &= 0xBF; + LatchLightPhaser = false; + } + break; + default: // Normal controller @@ -224,6 +257,33 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem return value; } + internal void ProcessLineControls() + { + const int phaserRadius = 4; + + // specifically lightgun needs to do things on a per-line basis + if (Settings.ControllerType == "Light Phaser") + { + byte phaserX = (byte)(_controller.GetFloat("P1 X") + 20); + int phaserY = (int)_controller.GetFloat("P1 Y"); + int scanline = Vdp.ScanLine; + + if (!LatchLightPhaser && phaserY >= scanline - phaserRadius && phaserY <= scanline + phaserRadius) + { + if (scanline >= Vdp.FrameHeight) + return; + + // latch HCounter via TH + Vdp.HCounter = phaserX; + LatchLightPhaser = true; + } + else + { + LatchLightPhaser = false; + } + } + } + byte ReadPort0() { if (IsGameGear == false) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs index 974c0f73b3..b3f51ba047 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs @@ -8,9 +8,9 @@ using BizHawk.Emulation.Cores.Components.Z80; /***************************************************** TODO: - + HCounter + + HCounter (Manually set for light phaser emulation... should be only case it's polled) + Try to clean up the organization of the source code. - + Lightgun/Paddle/etc if I get really bored + + Lightgun/Paddle/etc if I get really bored (first 2 done!) + Mode 1 not implemented in VDP TMS modes. (I dont have a test case in SG1000 or Coleco) **********************************************************/ @@ -281,7 +281,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem if ((port & 1) == 0) return Vdp.ReadVLineCounter(); else - return 0x50; // TODO Vdp.ReadHLineCounter(); + return Vdp.ReadHLineCounter(); } if (port < 0xC0) // VDP data/control ports { diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs index 75d6d33625..7dcf21971b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs @@ -47,6 +47,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem public int FrameHeight = 192; public int ScanLine; + public byte HCounter = 0x90; public int[] FrameBuffer = new int[256 * 192]; public int[] GameGearFrameBuffer = new int[160 * 144]; public int[] OverscanFrameBuffer = null; @@ -136,6 +137,11 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem } } + public byte ReadHLineCounter() + { + return HCounter; + } + public void WriteVdpControl(byte value) { if (VdpWaitingForLatchByte) @@ -375,6 +381,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem ProcessFrameInterrupt(); ProcessLineInterrupt(); + Sms.ProcessLineControls(); Cpu.ExecuteCycles(IPeriod); @@ -428,6 +435,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem ser.Sync("Registers", ref Registers, false); ser.Sync("CRAM", ref CRAM, false); ser.Sync("VRAM", ref VRAM, false); + ser.Sync("HCounter", ref HCounter); ser.EndSection(); if (ser.IsReader) From 874d06797f562af48293c546a97c0183c9ecda8d Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 2 Sep 2017 10:48:23 -0400 Subject: [PATCH 144/219] NESHawk: Code Clean up remove redundancies, fix scanline count --- .../Consoles/Nintendo/NES/NES.Core.cs | 1 - .../Consoles/Nintendo/NES/PPU.cs | 8 +- .../Consoles/Nintendo/NES/PPU.regs.cs | 8 +- .../Consoles/Nintendo/NES/PPU.run.cs | 86 +++++++++---------- 4 files changed, 49 insertions(+), 54 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs index 1775dcd523..bea02f1504 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs @@ -367,7 +367,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } FrameGo = true; - ppu.ppu_tick_counter = 0; if (ppu.ppudead > 0) { diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs index 14a40e2d5e..1a23d7432d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs @@ -135,7 +135,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES //when the ppu issues a write it goes through here and into the game board public void ppubus_write(int addr, byte value) { - if (ppur.status.sl == 241 || !PPUON) + if (ppur.status.sl >= 241 || !PPUON) nes.Board.AddressPPU(addr); nes.Board.WritePPU(addr, value); @@ -257,9 +257,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ser.Sync("do_vbl", ref do_vbl); ser.Sync("do_active_sl", ref do_active_sl); ser.Sync("do_pre_vbl", ref do_pre_vbl); - ser.Sync("ppu_tick_counter", ref ppu_tick_counter); - ser.Sync("scanline_counter", ref scanline_counter); ser.Sync("nmi_destiny", ref nmi_destiny); ser.Sync("yp_shift", ref yp_shift); ser.Sync("sprite_eval_cycle", ref sprite_eval_cycle); @@ -326,7 +324,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES //but maybe thats just because a ppu read/write shoves it on the address bus //apparently this shoves it on the address bus, too, or else blargg's mmc3 tests dont pass //ONLY if the ppu is not rendering - if (ppur.status.sl == 241 || !PPUON) + if (ppur.status.sl >= 241 || !PPUON) nes.Board.AddressPPU(ppur.get_2007access()); race_2006 = true; @@ -346,7 +344,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ppur.status.cycle++; is_even_cycle = !is_even_cycle; - if (PPUON && ppur.status.cycle >= 257 && ppur.status.cycle <= 320 && 0 <= ppur.status.sl && ppur.status.sl <= 240) + if (PPUON && ppur.status.cycle >= 257 && ppur.status.cycle <= 320 && ppur.status.sl <= 240) { reg_2003 = 0; } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs index 332e4ab220..28b54729da 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs @@ -148,7 +148,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES fh = 0; _fv = _v = _h = _vt = _ht = 0; status.cycle = 0; - status.sl = 241; + status.sl = 0; } public void install_latches() @@ -433,7 +433,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES //otherwise we just write this value and move on to the next oam byte value &= 0xE3; } - if (0 <= ppur.status.sl && ppur.status.sl <= 240) + if (ppur.status.rendering) { // don't write to OAM if the screen is on and we are in the active display area // this impacts sprite evaluation @@ -587,7 +587,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ppur.increment2007(ppur.status.rendering && PPUON, reg_2000.vram_incr32 != 0); //see comments in $2006 - if (ppur.status.sl == 241 || !PPUON) + if (ppur.status.sl >= 241 || !PPUON) nes.Board.AddressPPU(ppur.get_2007access()); } byte read_2007() @@ -611,7 +611,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ppur.increment2007(ppur.status.rendering && PPUON, reg_2000.vram_incr32 != 0); //see comments in $2006 - if (ppur.status.sl == 241 || !PPUON) + if (ppur.status.sl >= 241 || !PPUON) nes.Board.AddressPPU(ppur.get_2007access()); // update open bus here diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs index 233aaec96b..402f9ef6a4 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs @@ -133,9 +133,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public bool do_vbl; public bool do_active_sl; public bool do_pre_vbl; - public int ppu_tick_counter; - int scanline_counter; bool nmi_destiny; int yp_shift; int sprite_eval_cycle; @@ -156,51 +154,52 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public void ppu_init_frame() { - scanline_counter = 0; - ppu_tick_counter = 0; + ppur.status.sl = 241 + preNMIlines; + ppur.status.cycle = 0; // These things happen at the start of every frame Reg2002_vblank_active_pending = true; ppuphase = PPUPHASE.VBL; - ppur.status.sl = 241; bgdata = new BGDataRecord[34]; } public void TickPPU_VBL() { - if (ppu_tick_counter == 3) + if (ppur.status.cycle == 3 && ppur.status.sl == 241 + preNMIlines) { nmi_destiny = reg_2000.vblank_nmi_gen && Reg2002_vblank_active; } - else if (ppu_tick_counter == 6) + else if (ppur.status.cycle == 6 && ppur.status.sl == 241 + preNMIlines) { if (nmi_destiny) { nes.cpu.NMI = true; } nes.Board.AtVsyncNMI(); } - runppu(); - ppu_tick_counter++; + runppu(); // note cycle ticks inside runppu - if (ppu_tick_counter == postNMIlines * kLineTime) + if (ppur.status.cycle == 341) { - Reg2002_objhit = Reg2002_objoverflow = 0; - Reg2002_vblank_clear_pending = true; - idleSynch ^= true; + ppur.status.cycle = 0; + ppur.status.sl++; + if (ppur.status.sl == 241 + preNMIlines + postNMIlines) + { + Reg2002_objhit = Reg2002_objoverflow = 0; + Reg2002_vblank_clear_pending = true; + idleSynch ^= true; - do_vbl = false; - ppu_tick_counter = 0; + do_vbl = false; + ppur.status.sl = 0; + } } } public void TickPPU_active() { - if (ppu_tick_counter == 0) + if (ppur.status.cycle == 0) { ppur.status.cycle = 0; - ppur.status.sl = scanline_counter; - spr_true_count = 0; soam_index = 0; soam_m_index = 0; @@ -213,12 +212,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES sprite_zero_in_range = false; - yp = scanline_counter - 1; + yp = ppur.status.sl - 1; ppuphase = PPUPHASE.BG; // "If PPUADDR is not less then 8 when rendering starts, the first 8 bytes in OAM are written to from // the current location of PPUADDR" - if (scanline_counter == 0 && PPUON && reg_2003 >= 8 && region == Region.NTSC) + if (ppur.status.sl == 0 && PPUON && reg_2003 >= 8 && region == Region.NTSC) { for (int i = 0; i < 8; i++) { @@ -248,9 +247,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } - if (ppu_tick_counter < 256) + if (ppur.status.cycle < 256) { - if (scanline_counter != 0) + if (ppur.status.sl != 0) { ///////////////////////////////////////////// // Sprite Evaluation End @@ -542,10 +541,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } } } - else if (ppu_tick_counter < 320) + else if (ppur.status.cycle < 320) { // after we are done with the visible part of the frame, we reach sprite transfer to temp OAM tables and such - if (ppu_tick_counter == 256) + if (ppur.status.cycle == 256) { // do the more then 8 sprites stuff here where it is convenient // normally only 8 sprites are allowed, but with a particular setting we can have more then that @@ -625,7 +624,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES runppu(); break; case 1: - if (PPUON && scanline_counter == 0 && ppur.status.cycle == 305) + if (PPUON && ppur.status.sl == 0 && ppur.status.cycle == 305) { ppur.install_latches(); @@ -633,7 +632,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES runppu(); } - else if (PPUON && (scanline_counter != 0) && ppur.status.cycle == 257) + else if (PPUON && (ppur.status.sl != 0) && ppur.status.cycle == 257) { if (target <= 61441 && target > 0 && s == 0) @@ -882,14 +881,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } else { - if (ppu_tick_counter == 320) + if (ppur.status.cycle == 320) { ppuphase = PPUPHASE.BG; xt = 0; xp = 0; } - if (ppu_tick_counter < 336) + if (ppur.status.cycle < 336) { // if scanline is the pre-render line, we just read BG data Read_bgdata(xp, ref bgdata[xt]); @@ -920,7 +919,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES xt++; } } - else if (ppu_tick_counter < 340) + else if (ppur.status.cycle < 340) { runppu(); } @@ -932,23 +931,21 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES // equivelant of half a memory access cycle) before repeating the whole // pixel/scanline rendering process. If the scanline being rendered is the very // first one on every second frame, then this delay simply doesn't exist. - if (scanline_counter == 0 && idleSynch && evenOddDestiny && chopdot) - {} + if (ppur.status.sl == 0 && idleSynch && evenOddDestiny && chopdot) + { ppur.status.cycle++; } // increment cycle without running ppu else { runppu(); } } } - ppu_tick_counter++; - if (ppu_tick_counter == 341) + if (ppur.status.cycle == 341) { - ppu_tick_counter = 0; - scanline_counter++; + ppur.status.cycle = 0; + ppur.status.sl++; - if (scanline_counter == 241) + if (ppur.status.sl == 241) { do_active_sl = false; - ppur.status.sl = 241; } } } @@ -957,12 +954,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { runppu(); - - ppu_tick_counter++; - if (ppu_tick_counter == preNMIlines * kLineTime) + if (ppur.status.cycle == 341) { - ppu_tick_counter = 0; - do_pre_vbl = false; + ppur.status.cycle = 0; + ppur.status.sl++; + if (ppur.status.sl == 241 + preNMIlines) + { + do_pre_vbl = false; + } } } @@ -975,8 +974,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { runppu(); - ppu_tick_counter++; - if (ppu_tick_counter == 241 * kLineTime - 3) + if (ppur.status.cycle == 241 * kLineTime - 3) { ppudead--; } From 4f8559f637ff1ddbdb82b16eef01e4a0088aee08 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 5 Sep 2017 20:53:09 -0400 Subject: [PATCH 145/219] NESHawk: Fix state errors --- .../Consoles/Nintendo/NES/PPU.cs | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs index 1a23d7432d..a8484758c0 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs @@ -280,21 +280,31 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES byte bg_byte; for (int i = 0; i < 34; i++) { - bg_byte = bgdata[i].at; ser.Sync("bgdata", ref bg_byte); bgdata[i].at = bg_byte; - bg_byte = bgdata[i].nt; ser.Sync("bgdata", ref bg_byte); bgdata[i].nt = bg_byte; - bg_byte = bgdata[i].pt_0; ser.Sync("bgdata", ref bg_byte); bgdata[i].pt_0 = bg_byte; - bg_byte = bgdata[i].pt_1; ser.Sync("bgdata", ref bg_byte); bgdata[i].pt_1 = bg_byte; + string str = "bgdata" + i.ToString() + "at"; + bg_byte = bgdata[i].at; ser.Sync(str, ref bg_byte); bgdata[i].at = bg_byte; + str = "bgdata" + i.ToString() + "nt"; + bg_byte = bgdata[i].nt; ser.Sync(str, ref bg_byte); bgdata[i].nt = bg_byte; + str = "bgdata" + i.ToString() + "pt0"; + bg_byte = bgdata[i].pt_0; ser.Sync(str, ref bg_byte); bgdata[i].pt_0 = bg_byte; + str = "bgdata" + i.ToString() + "pt1"; + bg_byte = bgdata[i].pt_1; ser.Sync(str, ref bg_byte); bgdata[i].pt_1 = bg_byte; } byte oam_byte; for (int i = 0; i < 64; i++) { - oam_byte = t_oam[i].oam_y; ser.Sync("bgdata", ref oam_byte); t_oam[i].oam_y = oam_byte; - oam_byte = t_oam[i].oam_ind; ; ser.Sync("bgdata", ref oam_byte); t_oam[i].oam_ind = oam_byte; - oam_byte = t_oam[i].oam_attr; ser.Sync("bgdata", ref oam_byte); t_oam[i].oam_attr = oam_byte; - oam_byte = t_oam[i].oam_x; ser.Sync("bgdata", ref oam_byte); t_oam[i].oam_x = oam_byte; - oam_byte = t_oam[i].patterns_0; ser.Sync("bgdata", ref oam_byte); t_oam[i].patterns_0 = oam_byte; - oam_byte = t_oam[i].patterns_1; ser.Sync("bgdata", ref oam_byte); t_oam[i].patterns_1 = oam_byte; + string str = "oamdata" + i.ToString() + "y"; + oam_byte = t_oam[i].oam_y; ser.Sync(str, ref oam_byte); t_oam[i].oam_y = oam_byte; + str = "oamdata" + i.ToString() + "ind"; + oam_byte = t_oam[i].oam_ind; ; ser.Sync(str, ref oam_byte); t_oam[i].oam_ind = oam_byte; + str = "oamdata" + i.ToString() + "attr"; + oam_byte = t_oam[i].oam_attr; ser.Sync(str, ref oam_byte); t_oam[i].oam_attr = oam_byte; + str = "oamdata" + i.ToString() + "x"; + oam_byte = t_oam[i].oam_x; ser.Sync(str, ref oam_byte); t_oam[i].oam_x = oam_byte; + str = "oamdata" + i.ToString() + "p0"; + oam_byte = t_oam[i].patterns_0; ser.Sync(str, ref oam_byte); t_oam[i].patterns_0 = oam_byte; + str = "oamdata" + i.ToString() + "p1"; + oam_byte = t_oam[i].patterns_1; ser.Sync(str, ref oam_byte); t_oam[i].patterns_1 = oam_byte; } } From e66e70534a4fea240387238716b1a970c8d243ec Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 7 Sep 2017 10:26:27 -0400 Subject: [PATCH 146/219] NESHawk: Audio slider --- .../config/NES/NESSoundConfig.Designer.cs | 307 +++++------------- .../config/NES/NESSoundConfig.cs | 42 +-- 2 files changed, 84 insertions(+), 265 deletions(-) diff --git a/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.Designer.cs b/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.Designer.cs index 3eeacc6191..22e5372ca6 100644 --- a/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.Designer.cs +++ b/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.Designer.cs @@ -28,220 +28,87 @@ ///

private void InitializeComponent() { - this.OK = new System.Windows.Forms.Button(); - this.Cancel = new System.Windows.Forms.Button(); - this.trackBar1 = new System.Windows.Forms.TrackBar(); - this.trackBar2 = new System.Windows.Forms.TrackBar(); - this.trackBar3 = new System.Windows.Forms.TrackBar(); - this.trackBar4 = new System.Windows.Forms.TrackBar(); - this.trackBar5 = new System.Windows.Forms.TrackBar(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.label6 = new System.Windows.Forms.Label(); - this.label7 = new System.Windows.Forms.Label(); - this.label8 = new System.Windows.Forms.Label(); - this.label9 = new System.Windows.Forms.Label(); - this.label10 = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar4)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar5)).BeginInit(); - this.SuspendLayout(); - // - // OK - // - this.OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.OK.Location = new System.Drawing.Point(41, 262); - this.OK.Name = "OK"; - this.OK.Size = new System.Drawing.Size(75, 23); - this.OK.TabIndex = 0; - this.OK.Text = "&OK"; - this.OK.UseVisualStyleBackColor = true; - this.OK.Click += new System.EventHandler(this.Ok_Click); - // - // Cancel - // - this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.Cancel.Location = new System.Drawing.Point(122, 262); - this.Cancel.Name = "Cancel"; - this.Cancel.Size = new System.Drawing.Size(75, 23); - this.Cancel.TabIndex = 1; - this.Cancel.Text = "&Cancel"; - this.Cancel.UseVisualStyleBackColor = true; - this.Cancel.Click += new System.EventHandler(this.Cancel_Click); - // - // trackBar1 - // - this.trackBar1.Location = new System.Drawing.Point(12, 12); - this.trackBar1.Name = "trackBar1"; - this.trackBar1.Size = new System.Drawing.Size(104, 45); - this.trackBar1.TabIndex = 2; - this.trackBar1.ValueChanged += new System.EventHandler(this.TrackBar1_ValueChanged); - // - // trackBar2 - // - this.trackBar2.Location = new System.Drawing.Point(12, 60); - this.trackBar2.Name = "trackBar2"; - this.trackBar2.Size = new System.Drawing.Size(104, 45); - this.trackBar2.TabIndex = 3; - this.trackBar2.ValueChanged += new System.EventHandler(this.TrackBar2_ValueChanged); - // - // trackBar3 - // - this.trackBar3.Location = new System.Drawing.Point(12, 108); - this.trackBar3.Name = "trackBar3"; - this.trackBar3.Size = new System.Drawing.Size(104, 45); - this.trackBar3.TabIndex = 4; - this.trackBar3.ValueChanged += new System.EventHandler(this.TrackBar3_ValueChanged); - // - // trackBar4 - // - this.trackBar4.Location = new System.Drawing.Point(12, 156); - this.trackBar4.Name = "trackBar4"; - this.trackBar4.Size = new System.Drawing.Size(104, 45); - this.trackBar4.TabIndex = 5; - this.trackBar4.ValueChanged += new System.EventHandler(this.TrackBar4_ValueChanged); - // - // trackBar5 - // - this.trackBar5.Location = new System.Drawing.Point(12, 204); - this.trackBar5.Name = "trackBar5"; - this.trackBar5.Size = new System.Drawing.Size(104, 45); - this.trackBar5.TabIndex = 6; - this.trackBar5.ValueChanged += new System.EventHandler(this.TrackBar5_ValueChanged); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(122, 12); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(50, 13); - this.label1.TabIndex = 7; - this.label1.Text = "Square 1"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(122, 60); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(50, 13); - this.label2.TabIndex = 8; - this.label2.Text = "Square 2"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(122, 108); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(45, 13); - this.label3.TabIndex = 9; - this.label3.Text = "Triangle"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(122, 156); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(34, 13); - this.label4.TabIndex = 10; - this.label4.Text = "Noise"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(122, 204); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(31, 13); - this.label5.TabIndex = 11; - this.label5.Text = "DMC"; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(122, 25); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(13, 13); - this.label6.TabIndex = 12; - this.label6.Text = "0"; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(122, 73); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(13, 13); - this.label7.TabIndex = 13; - this.label7.Text = "0"; - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(122, 121); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(13, 13); - this.label8.TabIndex = 14; - this.label8.Text = "0"; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(122, 169); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(13, 13); - this.label9.TabIndex = 15; - this.label9.Text = "0"; - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(122, 217); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(13, 13); - this.label10.TabIndex = 16; - this.label10.Text = "0"; - // - // NESSoundConfig - // - this.AcceptButton = this.OK; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.Cancel; - this.ClientSize = new System.Drawing.Size(209, 297); - this.Controls.Add(this.label10); - this.Controls.Add(this.label9); - this.Controls.Add(this.label8); - this.Controls.Add(this.label7); - this.Controls.Add(this.label6); - this.Controls.Add(this.label5); - this.Controls.Add(this.label4); - this.Controls.Add(this.label3); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Controls.Add(this.trackBar5); - this.Controls.Add(this.trackBar4); - this.Controls.Add(this.trackBar3); - this.Controls.Add(this.trackBar2); - this.Controls.Add(this.trackBar1); - this.Controls.Add(this.Cancel); - this.Controls.Add(this.OK); - this.MaximizeBox = false; - this.Name = "NESSoundConfig"; - this.ShowIcon = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "NES Sound Channels"; - this.Load += new System.EventHandler(this.NESSoundConfig_Load); - ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar4)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.trackBar5)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); + this.OK = new System.Windows.Forms.Button(); + this.Cancel = new System.Windows.Forms.Button(); + this.trackBar1 = new System.Windows.Forms.TrackBar(); + this.label1 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit(); + this.SuspendLayout(); + // + // OK + // + this.OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.OK.Location = new System.Drawing.Point(41, 117); + this.OK.Name = "OK"; + this.OK.Size = new System.Drawing.Size(75, 23); + this.OK.TabIndex = 0; + this.OK.Text = "&OK"; + this.OK.UseVisualStyleBackColor = true; + this.OK.Click += new System.EventHandler(this.Ok_Click); + // + // Cancel + // + this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Cancel.Location = new System.Drawing.Point(122, 117); + this.Cancel.Name = "Cancel"; + this.Cancel.Size = new System.Drawing.Size(75, 23); + this.Cancel.TabIndex = 1; + this.Cancel.Text = "&Cancel"; + this.Cancel.UseVisualStyleBackColor = true; + this.Cancel.Click += new System.EventHandler(this.Cancel_Click); + // + // trackBar1 + // + this.trackBar1.LargeChange = 1; + this.trackBar1.Location = new System.Drawing.Point(12, 12); + this.trackBar1.Minimum = 1; + this.trackBar1.Name = "trackBar1"; + this.trackBar1.Size = new System.Drawing.Size(104, 45); + this.trackBar1.TabIndex = 2; + this.trackBar1.Value = 1; + this.trackBar1.ValueChanged += new System.EventHandler(this.TrackBar1_ValueChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(122, 12); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(67, 13); + this.label1.TabIndex = 7; + this.label1.Text = "APU Volume"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(122, 25); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(13, 13); + this.label6.TabIndex = 12; + this.label6.Text = "0"; + // + // NESSoundConfig + // + this.AcceptButton = this.OK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.Cancel; + this.ClientSize = new System.Drawing.Size(209, 152); + this.Controls.Add(this.label6); + this.Controls.Add(this.label1); + this.Controls.Add(this.trackBar1); + this.Controls.Add(this.Cancel); + this.Controls.Add(this.OK); + this.MaximizeBox = false; + this.Name = "NESSoundConfig"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "NES Sound Channels"; + this.Load += new System.EventHandler(this.NESSoundConfig_Load); + ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); } @@ -250,19 +117,7 @@ private System.Windows.Forms.Button OK; private System.Windows.Forms.Button Cancel; private System.Windows.Forms.TrackBar trackBar1; - private System.Windows.Forms.TrackBar trackBar2; - private System.Windows.Forms.TrackBar trackBar3; - private System.Windows.Forms.TrackBar trackBar4; - private System.Windows.Forms.TrackBar trackBar5; private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Label label5; private System.Windows.Forms.Label label6; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.Label label8; - private System.Windows.Forms.Label label9; - private System.Windows.Forms.Label label10; } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.cs b/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.cs index 725f4ba2c4..ac3a8f198f 100644 --- a/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.cs +++ b/BizHawk.Client.EmuHawk/config/NES/NESSoundConfig.cs @@ -38,11 +38,7 @@ namespace BizHawk.Client.EmuHawk // get baseline maxes from a default config object var d = new NES.NESSettings(); - trackBar1.Maximum = d.Square1; - trackBar2.Maximum = d.Square2; - trackBar3.Maximum = d.Triangle; - trackBar4.Maximum = d.Noise; - trackBar5.Maximum = d.DMC; + trackBar1.Minimum = d.APU_vol; } private void NESSoundConfig_Load(object sender, EventArgs e) @@ -50,11 +46,7 @@ namespace BizHawk.Client.EmuHawk _oldSettings = NES.GetSettings(); _settings = _oldSettings.Clone(); - trackBar1.Value = _settings.Square1; - trackBar2.Value = _settings.Square2; - trackBar3.Value = _settings.Triangle; - trackBar4.Value = _settings.Noise; - trackBar5.Value = _settings.DMC; + trackBar1.Value = _settings.APU_vol; } private void Ok_Click(object sender, EventArgs e) @@ -72,35 +64,7 @@ namespace BizHawk.Client.EmuHawk private void TrackBar1_ValueChanged(object sender, EventArgs e) { label6.Text = trackBar1.Value.ToString(); - _settings.Square1 = trackBar1.Value; - NES.PutSettings(_settings); - } - - private void TrackBar2_ValueChanged(object sender, EventArgs e) - { - label7.Text = trackBar2.Value.ToString(); - _settings.Square2 = trackBar2.Value; - NES.PutSettings(_settings); - } - - private void TrackBar3_ValueChanged(object sender, EventArgs e) - { - label8.Text = trackBar3.Value.ToString(); - _settings.Triangle = trackBar3.Value; - NES.PutSettings(_settings); - } - - private void TrackBar4_ValueChanged(object sender, EventArgs e) - { - label9.Text = trackBar4.Value.ToString(); - _settings.Noise = trackBar4.Value; - NES.PutSettings(_settings); - } - - private void TrackBar5_ValueChanged(object sender, EventArgs e) - { - label10.Text = trackBar5.Value.ToString(); - _settings.DMC = trackBar5.Value; + _settings.APU_vol = trackBar1.Value; NES.PutSettings(_settings); } } From 7c1522cffed164609be0be38f909d86afa899fcf Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 7 Sep 2017 10:27:36 -0400 Subject: [PATCH 147/219] NESHawk: Audio Slider --- .../Consoles/Nintendo/NES/APU.cs | 14 +++----------- .../Consoles/Nintendo/NES/NES.Core.cs | 6 +----- .../Consoles/Nintendo/NES/NES.ISettable.cs | 12 ++---------- 3 files changed, 6 insertions(+), 26 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/APU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/APU.cs index f45b8719a1..2b755f983c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/APU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/APU.cs @@ -22,11 +22,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { public static bool CFG_DECLICK = true; - public int Square1V = 376; - public int Square2V = 376; - public int TriangleV = 426; - public int NoiseV = 247; - public int DMCV = 167; + public int m_vol = 1; public int dmc_dma_countdown = -1; public bool call_from_write; @@ -53,11 +49,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES pulse[1] = new PulseUnit(this, 1); if (old != null) { - Square1V = old.Square1V; - Square2V = old.Square2V; - TriangleV = old.TriangleV; - NoiseV = old.NoiseV; - DMCV = old.DMCV; + m_vol = old.m_vol; } } @@ -1419,7 +1411,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES float output = pulse_out + tnd_out; // output = output * 2 - 1; // this needs to leave enough headroom for straying DC bias due to the DMC unit getting stuck outputs. smb3 is bad about that. - int mix = (int)(20000 * output); + int mix = (int)(20000 * output * (1 + m_vol/5)); dlist.Add(new Delta(sampleclock, mix - oldmix)); oldmix = mix; diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs index bea02f1504..67617348eb 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs @@ -62,11 +62,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES private DisplayType _display_type = DisplayType.NTSC; //Sound config - public void SetSquare1(int v) { apu.Square1V = v; } - public void SetSquare2(int v) { apu.Square2V = v; } - public void SetTriangle(int v) { apu.TriangleV = v; } - public void SetNoise(int v) { apu.NoiseV = v; } - public void SetDMC(int v) { apu.DMCV = v; } + public void SetVol1(int v) { apu.m_vol = v; } ///
/// for debugging only! diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.ISettable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.ISettable.cs index 784b3b6fa5..40a8878a69 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.ISettable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.ISettable.cs @@ -39,11 +39,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES SetPalette(Settings.Palette); - apu.Square1V = Settings.Square1; - apu.Square2V = Settings.Square2; - apu.TriangleV = Settings.Triangle; - apu.NoiseV = Settings.Noise; - apu.DMCV = Settings.DMC; + apu.m_vol = Settings.APU_vol; return false; } @@ -157,11 +153,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public byte[,] Palette; - public int Square1 = 376; - public int Square2 = 376; - public int Triangle = 426; - public int Noise = 247; - public int DMC = 167; + public int APU_vol = 1; public NESSettings Clone() { From 8d04dc32a97c529e55dbf216513429b497063655 Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 7 Sep 2017 22:39:06 -0500 Subject: [PATCH 148/219] discsystem: add a utility method for my own use, no interest to anybody else --- BizHawk.Emulation.DiscSystem/Disc.cs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/BizHawk.Emulation.DiscSystem/Disc.cs b/BizHawk.Emulation.DiscSystem/Disc.cs index ea971e56e9..88b38540ae 100644 --- a/BizHawk.Emulation.DiscSystem/Disc.cs +++ b/BizHawk.Emulation.DiscSystem/Disc.cs @@ -74,12 +74,36 @@ namespace BizHawk.Emulation.DiscSystem } } + /// + /// Easily extracts a mode1 sector range (suitable for extracting ISO FS data files) + /// + public byte[] Easy_Extract_Mode1(int lba_start, int lba_count, int byteLength = -1) + { + int totsize = lba_count * 2048; + byte[] ret = new byte[totsize]; + var dsr = new DiscSectorReader(this); + dsr.Policy.DeterministicClearBuffer = false; + for (int i = 0; i < lba_count; i++) + { + dsr.ReadLBA_2048(lba_start + i, ret, i*2048); + } + if (byteLength != -1 && byteLength != totsize) + { + byte[] newret = new byte[byteLength]; + Array.Copy(ret, newret, byteLength); + return newret; + } + return ret; + } + /// /// The DiscMountPolicy used to mount the disc. Consider this read-only. /// NOT SURE WE NEED THIS /// //public DiscMountPolicy DiscMountPolicy; + + //---------------------------------------------------------------------------- /// From b34c9a5dd8e54484d07d380e88833d13be9b1c04 Mon Sep 17 00:00:00 2001 From: zeromus Date: Tue, 12 Sep 2017 00:49:14 -0500 Subject: [PATCH 149/219] straighten out building of glide64mk2 dll. fixes #1003 --- .../msvc10/mupen64plus-video-glide64mk2.sln | 10 +- .../mupen64plus-video-glide64mk2.vcxproj | 180 ++++++++++++++++++ output/dll/mupen64plus-video-glide64mk2.dll | Bin 946176 -> 944640 bytes 3 files changed, 188 insertions(+), 2 deletions(-) diff --git a/libmupen64plus/mupen64plus-video-glide64mk2/projects/msvc10/mupen64plus-video-glide64mk2.sln b/libmupen64plus/mupen64plus-video-glide64mk2/projects/msvc10/mupen64plus-video-glide64mk2.sln index 7ef3faea38..ba5b475069 100644 --- a/libmupen64plus/mupen64plus-video-glide64mk2/projects/msvc10/mupen64plus-video-glide64mk2.sln +++ b/libmupen64plus/mupen64plus-video-glide64mk2/projects/msvc10/mupen64plus-video-glide64mk2.sln @@ -6,13 +6,19 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A4D13408-A794-4199-8FC7-4A9A32505005}.Debug|Win32.ActiveCfg = Debug|Win32 - {A4D13408-A794-4199-8FC7-4A9A32505005}.Debug|Win32.Build.0 = Debug|Win32 + {A4D13408-A794-4199-8FC7-4A9A32505005}.Debug|Win32.ActiveCfg = Debug|x64 + {A4D13408-A794-4199-8FC7-4A9A32505005}.Debug|Win32.Build.0 = Debug|x64 + {A4D13408-A794-4199-8FC7-4A9A32505005}.Debug|x64.ActiveCfg = Debug|x64 + {A4D13408-A794-4199-8FC7-4A9A32505005}.Debug|x64.Build.0 = Debug|x64 {A4D13408-A794-4199-8FC7-4A9A32505005}.Release|Win32.ActiveCfg = Release|Win32 {A4D13408-A794-4199-8FC7-4A9A32505005}.Release|Win32.Build.0 = Release|Win32 + {A4D13408-A794-4199-8FC7-4A9A32505005}.Release|x64.ActiveCfg = Release|x64 + {A4D13408-A794-4199-8FC7-4A9A32505005}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/libmupen64plus/mupen64plus-video-glide64mk2/projects/msvc10/mupen64plus-video-glide64mk2.vcxproj b/libmupen64plus/mupen64plus-video-glide64mk2/projects/msvc10/mupen64plus-video-glide64mk2.vcxproj index 35d3025ae6..26e5fdb29a 100644 --- a/libmupen64plus/mupen64plus-video-glide64mk2/projects/msvc10/mupen64plus-video-glide64mk2.vcxproj +++ b/libmupen64plus/mupen64plus-video-glide64mk2/projects/msvc10/mupen64plus-video-glide64mk2.vcxproj @@ -5,10 +5,18 @@ Debug Win32 + + Debug + x64 + Release Win32 + + Release + x64 + {A4D13408-A794-4199-8FC7-4A9A32505005} @@ -23,34 +31,64 @@ true v100 + + DynamicLibrary + false + MultiByte + true + v100 + DynamicLibrary false MultiByte v100 + + DynamicLibrary + false + MultiByte + v100 + + + + + + + + + <_ProjectFileVersion>10.0.40219.1 $(SolutionDir)..\..\..\..\output\dll\ + $(SolutionDir)..\..\..\..\output\dll\ $(Configuration)\ + $(Configuration)\ true + true $(SolutionDir)..\..\..\..\output\dll\ + $(SolutionDir)..\..\..\..\output\dll\ $(Configuration)\ + $(Configuration)\ false + false true + true F:\Code\Third Party\boost;$(IncludePath) + F:\Code\Third Party\boost;$(IncludePath) F:\Code\Third Party\boost\stage\lib;$(LibraryPath) + F:\Code\Third Party\boost\stage\lib;$(LibraryPath) @@ -98,6 +136,50 @@ .\Debug/n64Glide.bsc + + + _DEBUG;%(PreprocessorDefinitions) + true + true + .\Debug/n64Glide.tlb + + + + + Disabled + ..\..\..\mupen64plus-win32-deps\boost-1.57.0\;..\..\..\mupen64plus-core\src\api;..\..\src\Glide64;..\..\src\Glide64\inc;..\..\src\GlideHQ;..\..\src\GlideHQ\tc-1.1+;..\..\src\Glitch64;..\..\src\Glitch64\inc;..\..\..\mupen64plus-win32-deps\SDL-1.2.15\include;..\..\..\mupen64plus-win32-deps\zlib-1.2.8\include;..\..\..\mupen64plus-win32-deps\libpng-1.6.18\include;%(AdditionalIncludeDirectories) + _DEBUG;NO_ASM;_GLIBCXX_HAVE_BROKEN_VSWPRINTF;NO_FILTER_THREAD;_VARIADIC_MAX=10;_CRT_SECURE_NO_WARNINGS;__MSC__;WIN32;%(PreprocessorDefinitions) + Async + EnableFastChecks + MultiThreadedDebugDLL + .\Debug/n64Glide.pch + .\Debug/ + .\Debug/ + .\Debug/ + Level3 + true + ProgramDatabase + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + + + SDL.lib;zlib.lib;libpng16.lib;opengl32.lib;winmm.lib;comctl32.lib;rpcrt4.lib;wsock32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\deps\libs;..\..\..\mupen64plus-win32-deps\libpng-1.6.18\lib\x64;..\..\..\mupen64plus-win32-deps\zlib-1.2.8\lib\x64;..\..\..\mupen64plus-win32-deps\SDL-1.2.15\lib\x64;%(AdditionalLibraryDirectories) + false + true + $(TargetDir)$(TargetName).pdb + .\Debug/Glide64.lib + + + true + .\Debug/n64Glide.bsc + + NDEBUG;%(PreprocessorDefinitions) @@ -157,122 +239,220 @@ copy ..\..\data\* "$(OutDir)" + + + NDEBUG;%(PreprocessorDefinitions) + true + true + .\Release/n64Glide.tlb + + + + + MaxSpeed + OnlyExplicitInline + true + Speed + false + ..\..\..\mupen64plus-win32-deps\boost-1.57.0\;..\..\..\mupen64plus-core\src\api;..\..\src\Glide64;..\..\src\Glide64\inc;..\..\src\GlideHQ;..\..\src\GlideHQ\tc-1.1+;..\..\src\Glitch64;..\..\src\Glitch64\inc;..\..\..\mupen64plus-win32-deps\SDL-1.2.15\include;..\..\..\mupen64plus-win32-deps\zlib-1.2.8\include;..\..\..\mupen64plus-win32-deps\libpng-1.6.18\include;%(AdditionalIncludeDirectories) + NO_ASM;_GLIBCXX_HAVE_BROKEN_VSWPRINTF;NO_FILTER_THREAD;_VARIADIC_MAX=10;_CRT_SECURE_NO_WARNINGS;__MSC__;WIN32;__VISUALC__;%(PreprocessorDefinitions) + true + Async + MultiThreadedDLL + true + NotSet + .\Release/n64Glide.pch + .\Release/ + .\Release/ + .\Release/ + Level3 + true + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + SDL.lib;zlib.lib;libpng16.lib;opengl32.lib;winmm.lib;comctl32.lib;rpcrt4.lib;wsock32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + true + ..\..\..\deps\libs;..\..\..\mupen64plus-win32-deps\libpng-1.6.18\lib\x64;..\..\..\mupen64plus-win32-deps\zlib-1.2.8\lib\x64;..\..\..\mupen64plus-win32-deps\SDL-1.2.15\lib\x64;%(AdditionalLibraryDirectories) + $(TargetDir)$(TargetName).pdb + + + Windows + true + /pdbaltpath:%_PDB% %(AdditionalOptions) + + + true + .\Release/n64Glide.bsc + + + true + + + Copying shared data and libraries to build directory... + copy ..\..\data\* "$(OutDir)" + + false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false false + false .\Release/%(Filename)1.obj + .\Release/%(Filename)1.obj $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.xdc false + false false + false diff --git a/output/dll/mupen64plus-video-glide64mk2.dll b/output/dll/mupen64plus-video-glide64mk2.dll index da44f015149a13f612934e15740b9b1a533f7ba5..36989cb4d329ca115d6cd123e3bbe7ba3fe65263 100644 GIT binary patch delta 213646 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

;Df5KTyQW(p*jEy@;O9FH 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 ngvYxm(h*`jkD!~a~z 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�{1nygj`$^*b1n%Pr+H7iPSD^UR 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 Date: Thu, 14 Sep 2017 16:04:53 -0400 Subject: [PATCH 150/219] N64: Tracelog now includes delay slot execution. Fixes #789 --- .../mupen64plus-core/src/r4300/pure_interp.c | 1 + .../mupen64plus-core/src/r4300/r4300.c | 2 ++ output/dll/mupen64plus.dll | Bin 459264 -> 473088 bytes 3 files changed, 3 insertions(+) diff --git a/libmupen64plus/mupen64plus-core/src/r4300/pure_interp.c b/libmupen64plus/mupen64plus-core/src/r4300/pure_interp.c index c9b7e8ef81..e93b90600e 100644 --- a/libmupen64plus/mupen64plus-core/src/r4300/pure_interp.c +++ b/libmupen64plus/mupen64plus-core/src/r4300/pure_interp.c @@ -60,6 +60,7 @@ static void prefetch(void); interp_PC.addr += 4; \ delay_slot=1; \ prefetch(); \ + TRACECB(); \ PC->ops(); \ update_count(); \ delay_slot=0; \ diff --git a/libmupen64plus/mupen64plus-core/src/r4300/r4300.c b/libmupen64plus/mupen64plus-core/src/r4300/r4300.c index f881ce0e0d..832829ec87 100644 --- a/libmupen64plus/mupen64plus-core/src/r4300/r4300.c +++ b/libmupen64plus/mupen64plus-core/src/r4300/r4300.c @@ -94,6 +94,7 @@ int rounding_mode = 0x33F, trunc_mode = 0xF3F, round_mode = 0x33F, PC++; \ delay_slot=1; \ UPDATE_DEBUGGER(); \ + TRACECB(); \ PC->ops(); \ update_count(); \ delay_slot=0; \ @@ -126,6 +127,7 @@ int rounding_mode = 0x33F, trunc_mode = 0xF3F, round_mode = 0x33F, PC++; \ delay_slot=1; \ UPDATE_DEBUGGER(); \ + TRACECB(); \ PC->ops(); \ update_count(); \ delay_slot=0; \ diff --git a/output/dll/mupen64plus.dll b/output/dll/mupen64plus.dll index d4f49ceb974604235056bee5feaf91735b03793a..a7c7facbda2556be237bdfdc2a4a9ca6b666a5bd 100644 GIT binary patch literal 473088 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

YZhCgejTpTU`L@Rdj1b>K$v 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

TATb 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

X@VkOv zubF1kD*V2~FA+9%KYn`KM^AtMQr%JBUN2z{sv>*MHrVUO4q>me=R$t6S20F$T5FR& zPGycOP}`(QUhT=nP9}_k%EI+P;t$1%=?-a&f}+8`P%{AxN)83vK%!vkw7vsQK{l{n zvL<^ru!aXSv(kSVVE$Al?TXQox>UKLYoo#PD+9C={puf}1LqcfD_ z49PK1aI9|GN=$jSFT{HX%u4Su=(!aEV*DG*sg2;2(-k7&g?zzZ5BkVS0OTMAbYk% z1W*ZWKr+oDfWQ(=>0Co+_6oC@ELmJi4`J~G0#Mt>Avu)>3Zt}#9PP(Fh_p^?5hcNS zRly-B``0;bbLs}Q$ow;~QIoqkR@5M;`kPa4CyL7Vc83l*l$fCa%)g=HZx61`HDb%_ zTR#pVY+dTsH+ekWR>&0hteyo8BI_f}gzIX>0Merjn#8M*`XYW%`K_irTq%p5yzaxL zP_$uG&9Y^9Rr5;E*sITkl_?G8;FUL%DL%KpN4W*=Rwh%lw^~oSkJ#U5JCyz`6<~8( zpHCAgRe?k>LhcD^_~A&I2Z|}Dj%5qBoWTFuGqle6%_78$a^kKAKR+@u!ym>27m#zd zOFcU`ASK1H_}pDpFYMJ+~yl%fZ*sGHN-X?+w)Q7v8Sgg0q8vv;8`5vBtkWer8cA1=G2Czqgp^PRpY19^`^ zW8kxAPNnz^oE5;Q58MKuv<$*$#UMXEXHpp-DjO||i_fXHg-`?#8872Aj`O>_^8CJ= z8OZMx+#6BlyKz>tXexf||4AHZ0ULbQsw@T%40TPFn$JYZPw$s`MENGX_r6#p!o(s3m!C!w?(jvIZ8dy@IM(HBeTIGA+-qIr~^ zk8+*CiguFHU?MG>hbfWJLo9JuLjbN{YC_+Zz=eq)KY`aowTL_?*>g`JYG9kNGl_|U z3mi+*?IW%MqQZ>Ro8YpiILkr|6`+Ro#w@xMZt=Vg3!#|#pzjQ>WQ*1?wC;h+F`epY zWQH3{@~$+tEWp_sN-@x{Lkx5%p<1S=K||ETp=`dJpi+~NRGN@v$>ilsjt(JfN;pEA zpZ7g!qG4Aa#`O+m0>|~v2xVm|_F+f47n45;Av=^dMDQpZKxhn0cB-5FQMB|#O??wy z>>Z_;#g=oD^6CV_+`Kpvc^Rn?TI5!lf!{E9ami&8AI*MmVfJDutz#DSYLjTcjj6P0vbUAnvQayp_*B#1KO65`dgDlV$ z4G(2T$2)L2DDLxus$7en)?k5!h^7JGWX|r}X#uUslpRXEAgBk+5h9tey&U1!yGU~N zwQ__nn6M&*kbkBS7l%8PElhsaPxdH_;U+y${zQ~`yR7uS5G!%;DLM<)r1U`P?=o3O(K zns%_%y4{2ke`(e2RLSs>v;%^G`@Vl&%$1T1Dc5^Fqr#g%zd}xA_iJ)_HK_j1LoU+&7I|s`n$VJ17UK zuu2;jYKiistGam6PgBzC(5UIS_`vUlzf%u83=wzfP(7%WiCcXw=ZK zRUkn*`%C|)^6wCw|H%I`|Dsy|l>T=I=|B9x%s>5~%D+Q!{-ggQf4SeFd^H(ky|^j& zU_!Ec29C*ldOA$*(z-rR*=LULFn_=25uS&+x^2s?hcO(yG!+XpeI+TkV^UU#@m(h{ zp@ET8nFl7`&b?_wseIW17VbZeI1$;2W3po?U+bR_!`KD{YoCtC+Sh=INGA!1^{>A^v(fKdLm5Nh!>WjW%wy>-iuIEtat zB5;J5@wu4l=fN$emeV`m@Igv!k*j;5qh=jJqS4C_qev8S!m$?zIhEcB(v;69;)qhv z%MUFOp{QhC$dRu={|z`EAm(vlV8D0}&6Icxw11ftg!Wl@L(u-TlSF&pa2@U1VBz)H z1=q#7?&U_yD2Z zA2EUU@DD3RoA7RmSioDLU0xkmb0S5b2Hw{)Ckqw|XHb9H@1Wyc(6VF`1=fh+-sYIAFQ zl*i!}aMJ{(! z5vm`(+p`nJqA%;{!ws^3#4*@EQj^xg{^4f(@8BXV@~et#D9Bfb;zme=z8cUFtOQQfTE{)taqBI^rR4xs-jZ0%YJy9BcK@p|# z8Una9dQxi9EVKhL*}CsODvfps)k~w(2NjhD)sJw*((A`n*tK377vUDAQPR#|8n=_+ z)MN-Vk2TIfxO^Ie}Mt`zX3O4D)>Lo{C@>w@c$O1%K48I{P(0(!2fOo|K3LaDa?Nf^MCR$`R5D% z_g2LJA`D2E{~X+Y`A@gH;VV-<9)M;`T|TK5q%LjNhoQN!>n!mZ#O9SUwx@9RPf@@PWV@ANNB-SnOwBsed=pACud70W#xz zw?V$%M)^`89~dtIW0DF-o$=K`NQ6(0rc6OZyVlS{do6aYn@3ZIMw(53XNr4QFEPZ9 z^xoDHZ-mna3TckvP-^Nj)9O-St(?q|`S+EBc0<>bBfZ_3*k^3vjr#Cxdn4PQJ0 z$xkJRO3sZI%YX0K0Nx|u_T$~RCGZx4YjJBxUbgr2s<8KbL_{t0AV=gnOu2#^H@qX; zVXw)P%JV6> z{pC5wkpBV7=cYBUQxw7;mAX>(j<;$76nh=nN90=XlNVx>}@bBB&bnNmm38|7J3 z=3SytzM6Fivcw)>FXV*r7K*c=kaKH=<~a=|T2M&4sl@U&Vp$~1bI+)NK0Dy{>+@EN z0G?NnnNgoJV}kYZzK3tB1Z=Y+J>I`v*Mn<^UY==&{JR?SZ*9o`iIDuqh3237Kjz=L zlKl6KH0Td^K>y~1t9lbMm1|$lj3)ipiIUhhIWP*-!T5` zOz6pV;-K+LxIzA__ZZ~=C4uBux z$Rp5xaD9IXJoWL!S|fiK^Zy31^CxKf??Kv?^C#r#G!o9DYWF-0?L%0I&au> zcgee?Gx+8=Z%{`>b8r*C4<7zwMl@7_~SQlV9|Fbs0$5eMYYZt`6mg zj-gsHUQRnP+jQ_C&2Xm&LD^$J?2KjC?$`{A-O(v*}{XO9~phEe^ zvqTAu-(dFDA>RZ`+sJ7^Z&%L%dYj>9^r}@Po!(w89~QvxDY*Uk&1oX=J4~X4%C{L2 z%i~wnO&})ad!K!N`KANCI4KjM7b9hLC=X#ttsHu~d>4lXGgv0V?+dxl?wC{`@u4))hCq zT>i^N7PRi5JWwwG+(7>Gp4IbT^bqAgP3Dj8tgT2#O=0aKZW?Qla^YxE!e-XXt(&jn z457p+JRo9z^W_NU;w{B0mprYYcje+K+rPm9`+Ep(zx|DBME0j_f>u<%H0xXodN9K8 zB#R;?4d=7^2834#qCj{9F7M|v5*u+xzDHTvn-PYFeMLH>hBPTfhE#^A_~Fy)~%{L*Gb&T|f22^DImJbT(_Y~ZI{pQ38{SHGXUB4Zm2kUpFi(kK2Sb2kf z?+T*OukaaNzkL%)zxU7`Qa23!9uevOLcgid?|YlBUrK8(Ez<8WLRr6C{h^`y{byi6 zzc=9a>-T&^(SH02or3Bo&Cibxu53K?c3Jq}8V|jC2L_fy3vr6zHlBOYW~4)Tpp|H1 zc;7r|JaqByfc)p+_RD{|0k?k@$sYqnjqQu3lwJCJa{qR_kQ>u9DK{@Kyq#2DZoLH9 zzB(A>zs)FroRD9c3{f#}+kMwxtv{XlmIhvFA~XMhPWJx;0{9$++mFw#`oex|GXF7u z$v;e-OFMg;Zd%6rZ{Yusk^d;>zX>`)eqX=8lD~=IKd&PGwG8~L8TsF+N9$Xq-C_8= zzLkNT^qRO7+2!C%aX4Ab>svU35*1k9dSZoM-G<&zmaIl0EuHMGczG*ai1%GfS(d!K zCFfI9`v>rS2yQ>VqaYtRZ-UI_>d%F~q4qcZkH2Ssk9HDA2qL}x@RM zC_%Q5|DfRY@%|fd`{jQ=R@ld{&f_`b{{7OnT2lNlKpO6Hib1nwsPgEGw6K<>-wI9 z+pq6wYe3(Y$jrE&5rbSw2VGz9xrPQMIWxI@6IgHiuDMY=-Cm{|@_)#f|0qNLuS0ob z{>%D>!xA{j77L8}$9q=I08@uc;xw`o{cJ%1=`X*K+NTEt~9Vomi9N zg^!)Wwl$^kuYa!{s*43nI={*7(1=1F)*Nq2AO$y{vi-alrlsRG0&c%O_N_(oD=$DN z*uif-E9g(wen!KXS%SHL7^9n)t9sky=OnC zd~ONJhs*mV@YLmBYvk_|{MB!$>bR_JAwLyEx%DPlrF_;eT8W{5D+HL)p8BkNIRL9p zx8Kg=a=EnhR1@9g^3?_)8CIPh^^^4WCfp$3)m}#ZqlJBRC;39>)A^YQG^{sKi3*w8 zu}q16Ascf*T@gcHbXw4vg`!2LnQ-%*;R1n5OVErE-S@w^){>Uj1x%A3OSE`dJf zDp5*E=r)v+JCxkUe~qqg4;N9iy1eJ$_RD*^rjWNy zMe-wGS zQGtH07Q$pmzk3n4TzNbq=%PGk7U=rr4I%v|-{D_Hx>Y1K>L*vpM7i=J+4{D+c9-i1 zv~wbqwL9w%6%9P=Hx)Ld>qqwF*Kbrcq2DH|3bOpJcCSFcx0?I)n}@jN^m7Ti&~L3n z*KY$Bpl~J+oh4lf?SB)|FV2xa}k{hqhSQ2nR%u^1?7H}to-@A&(_Hx7F`fzIYnmg6vb!HMRA{p*QFA!u2QJ72&39fM8j z@*jlTFaNG6A%D$^Psf|3*QHqs@^>;Za@(AAp6U z&FkUfqs>l4;iJt9BJ`upC+gDC=IVFS(dJyl#L?!t%R-MfW74x3fa~{H&f)u(yMkSk zl1l8w&E~g}1ZjA|v^9b>WouWEgKjpjiU<|ow`|0x7jg>0rxS#I-}xF&pvmAvb}~C6dd!I7Q;~Qys#`2|kR^lW;LU4FOWv0{FdUHJ z7TF9$=KE4#0B5={^%;8deW@Cp^1jrDh?k@^B?j`o)M^O9eW~la0849C5cFfh>eC^| zgkf(s2&3aE?d>3p6!)LE)bZQ_zrb@Bf^h#i_y*&-1`#T}FV&CdDTt(5zo=af&*ww% z9Dytd6WmjW$liNm1)kS&WFqip#}Y6Tcs4=4z;iA!Cp_bjnDM-Ygy;Kwaq?8)`3I^A z_=cA)Z0)+d|~j5#uwuZ@&xQx1V#1!<1@S=bJ{uh6LFcdk3;FSRpQ!UR6yoy@{ z3HewA5};tp7P}O4}Na{5QO#*9E0m?2}-C! zy!`bwiFC3yheVaNf0lxU&{f>Qy|KAoXa9%>X0O&3nAvX_F*^yFM4f#Ec>}bABqM?L zAQCfZW8ji?_O2Vi3TiWblG9(zmZ5{W+1oZba&=f6*_DF4lzK1vf`W?%&zXBtZ#R)p}F7tDk7uOvO|Ffb&2TDkP?D@o5f z+!B&LJUBhuH_WdT)f2i#Y4se+H#MLq-hXVuR_t9EE$lb(iqU>|Ab}V}ZiWNjKZ5ze zd^P1IB=#s7NXtgt6)tL79VtmyV8h~bQ(M}S(bcA^txQFH+tXNWWvQ2t3a!HtN6L!JkjrVE z&lHcc2o#dtsmz5dHxb`QZw`U&cOK8Fttoq|qsHOtgJf0r;%X9=OgibN2Wt- z5YmZ&i-=YtCe;L_Zy!kCh@6zZp&@;YF}+!){{vD`df49uIO&TGY`=EhfP2_KJ1fqL zAE{=rdc=2E8vmS#zab?4vP$D$74aW4#)m%R5FdEp&9DAZ*;-h(jYE+bwS&r8@_i!5}Ko@wjMFIfuq7 zz<|~}z~eLmks6<%FlA!Y)m?Bht+AC|&K_Tw?Nr`pI?4pEm6_I*B|DVYt0EJS))Hy_ zL0mL-9(Ews!?2ZbeX72yaWDhly;EjU?9jzBIiE-Vqk{8Kr~Eq}(@eIq^Bs?6Xe2_1 zAQ8&iJCs|AC!s>QE47G@`+5vQJna`EQwVV>s+Jc{w%jQK2tlW9nEr|i_ZeoeJyYA$Mc|o z+#8>5-mkgoB6T>jG2Xbp=`3fCMcaj^SPb0J_tL$i&k5V>4O1%F?G(&l6))<6~@qvcoN<)!Cjw|sQ z+5tP+#>Gg)*N$?~3GG0Jc8tWwZ$E@Pg5QZOapPCK9V)xSeoo)KR;FB{JI$OTkOxT zmdLM2#0lhw_FywuQU6KbCgR4!93#5VXGI=??sFlf4HONmU9>+_M0)C(gPc-BZ@qbW4B}DwAurg{N_4pkF z@!zi~{)-{;CI2$Oj&F#}3r>RiHU;s?F!?)w^hqc9Vhvx&x=SR%2eatUp`;o)(D=8) z^oB2FS%TA>jOn4@1r)blemZ_;#_tO(h6R@x;=6<5$Jn{VgmSNxi_i9`xX7f?o^!h% zW={^!r8BiXC+pVyUJqL9r9PRuUWalIajKwwME*9JzYVWFV8NVAL-th(p#mU&Ooj2e zulfV4SwRXS{+T4kBbYz;ReLLlzqx|=4tKoXeJ%@10{;1x#b=Smg~lIHS$r0$eNcQ& zS=*AD!3GqHBYB4!!&lrGy;k2zg`LtZyCb5~wd|;fbjyc>qN3bqRClq8Z$2YUIxaSi zs#<+NC>c@FPE~{ z-fMI0_h-T^1z*5q(zKmzzJ@PND`-=Ur~9`WZf}h{FIyIF1$Bb{y<#M4JNEY~VYzc{ z+TvXsO7`LNqUeZfAUsio-{LN*k?%I)E;9tRq@bLtY5NL9qA-8zRGU^HQfIkVJyui& zb8avRw{0_Fq}<$ey)kZ1tUb?X?H3b{%bOP8*zkLuFsH4XpHFEFUfmL*w5Ai0;e4!{ zF1OFaVlTKG_a`F1HYbIOhoy>Msp8Lg+Fe`df%s6CG<_YB{36cLMb!4A-z5cwHo3JB zUy=F=mH&o*lcWC^`bD(y>oyd+WoxJVx>glJfxeSYb?R&WEK57+b*&A<h9~>MZh9zFK0p0Avk+E7bks=XF{aSU0lQFK2w8Y zAE($K^)+8Z@w(RgFu~~SdW8xhA*`?YyS}dX$<`?1QHtn3T7r0aXTq{v?^Dr0$VHaz zl!~I9peRaBD0K7}w^!|J{yoe5`-Eoh)Vv?UNJuhY%kCo+Y|d~J>U((IXCcMElgP|T zzVmpRPuiS~TQVV{u6wHP}P(>)Map$$^ zQ!R~C>4I8eciOjPc>^6Yx|wqN>X!1?#++X>P}s?~Zn<^r`PcC7smbD?Ti12l#)3l? zS9;$dW`g*91|DM26E=(+Zfwu+bG+}F-6|Y zb77`K-X8Qn_>cN8P3@V0R`g5{Z@+7Frf4_Ty7az@`#0-b&0(ubI-+U46O+`QwZxp) z?Nr)vP{(6VwLJp2#{-L_-XygK!pkn0tr0{&=(Kv9;TF%|@NsX4GSZ)CnH>u=FMSEYQsYABS@NI#i%`SdJHeAu;Geqs1{aD-Kg;AQ}P?9|4+@3-4GA6Gpm+lFD6w)}A7?G2&Dcu>m3fpRsKex8R`S^eM?76-tW?(fB9^AAV} zrGB_yDwUz7CVFqZgA}t$#ezm5hV=-S@-!CZK1em0UIvGM?E_z@^0MHk4o3Dg^Qn%D zV?U`YmlNXJBGeg|k5rCgOYWF$XctVD#Bd8fcW-w&^Wd|)mea%1(w1jQOxs{-nY9$u zci`Uue(={>XkF<{X#G@2 z4&72-{s|V4Qwz~oBf8_D56eQ{LEl3PP5I$RD@(0%y0^d_V=uThZ4APDkk0vcsGt|s`ntW5)PF#J@^po&6H6JocMV(W!0 z$E&BCFpoIqadVtMAL6kaRKeqBCsO@qE32;aFt#B2`kJaCjXmF8h|<;8OoWPBzMT|x zs#8F56h*j;!##>xlUe0|hj{qXyCY@Dj{;3CD-lR~)$a&KwL38bzCSRURq6ZhYD)zA z@I4%BJRBLC@;>Si7G;x^Z7S7ieCg7W^4bsJhE`w=(>%&L(2y0X-*UKen}W|2IFg1( zX+<=o!8j(>?mk<^PBQ}QzId@_T-HEv#`nJwRbREccWPkOE`UHle!b5s0EPvBaronLsPdjlIm}-Ar|`fJ5t{G9=x3DI;P<68c7B6}6;ZREAdJ*U5jj~^bd4WI1YP6Drj*wh_`OK!tanf*)S`Ap3R-7$ zS`#?PsoaVn%$w_Dl|1N*I5Q#?l^nQX_$sv@zdqnvF@Ehq(eeAFdMJK%NM}EOpA-xH zZXzS#H}pFrekBML_!Ywe`^k-y0L}nYX+IOcWBVD-G!GUkbqMcR;$RC zRF`1c3<;C1+hYY|eBTW*b&V4q)in;(9daS<0Fm}5vOuz@b5(VF`kaHD%2x=&x+(Yu z+ta&)2H(`N{)#G(?3d$KaTE|5yY(4`Pju>ybK5kM=Cv6t^pjOS|z<4WR?=ii}$6!`&o6 zuRqD}ZRdblk}?xKSg8A0D5vrOg0OC61v%&xQ#v9Pm8_}M-WDRKO7X1)ri||@qrD9w zWf@;PlKb&Be=YFsB!pL7-x%?2j6i{J9XMcbZ&Hn;o^VqY(uM8q84kpEFc8T0_B32< zZ+YM7_BI}2mDt-hs0({5sV&j&kElR<_@qkFMtwHg+jKCf6pwIls{oIlBpKt;10cJ@`HSl12`$IS5vIw%b zeB=^rZ=WH;U)ft-9yA0rIFCVXuK zb_)Upuy4TuLrY_clax&4p&MFj4)iGP5XjiJfQt>SF6Am3wyWk!4ec)Co~-26k}&^- zsDSzW#PTo)*;iepI&*qvifw4RQOW3P}uiCIfY?Q?S*K3K0$tueFu^!DTPSIV!WYO(YFwU z^B>?FY)MW;!1*m>%fkGb~_Fr#aB06eEx^{Sq#=C(jApp58!MB@LGk+QOdNMN4>B zBP#4^!-R712Deupq$_Vv!;xCp(|V&ly+DGnJuO8tzxsW?6zb1L7}WpbxKaHF5Gd3i z4TtuBSi27JD5@=-HW13Pp{xQL2)#rQh=qVr0;n50SZIO>iUJA`NJLN}Awd|&Rf-Li zjx-eo6aht&fG$m{`Y2DTB_WDZly2UC&Y8J8yV>YUWoVb^xXWoOyciXr@CT0-Q5f-b z4EDwN6ipkDnETNWMe}&=KWHWK)JJIOT0dmryCD?<<0%mpg2xl~e`0*uSzh*k;=5f# zIotYrsyjn_02$fP(eDZv{E{tx&W#<=sc}KtHs<-txIIJ$LAzM1oq5LyS!Jy(%qLyp zLE4YDwf_#>S+1}BHY^3 z;EQ?IY&bj_qh_-6)$GDeIPKm&DchN~0)|eJYmv;PkH1CKdA0lgjNo2?8`1Lsm0CI3 zykzaOFFXwR1~NhH`)^dhBlBrwCKpyj>Pe)qhbnp`iHp~w0Ebw^(<#4y1AN`}6JnQ& zyjuR%2s8ALAeDw~bRC}~q566!Px&^uzh0_SWEqgD4B&zmhHDAhgL68XBKN8i^cI?u zAUywKO3<~*$V+rpEH4suZ47=}7b?#VM4$0}Mq1hLT_A>PzeRTYrICKv{|z!oEsz@k zD4+eR?`8XSL?-OF=xe+EZX-3=em5ayIC9Yu#eSQwuv)n2|M+XNpJRzxgy;WJ1VLEx zn2S^zZq`r6F>m5z2*u;{qs5*hyC*sQg}8I z1jRpfMJvR&i}10Bq*;XPKNN|73NM-QeHe*i;yVGr6yIJ%tIt!hB$zwWr)Vni{f>&~ zCCE#3H7{d%>J9w1JoVPYex6eH+YWxA+Rrb(U)#&}OMnd1e(8Yn*{{_uw%;&h!hW0g z*zNZq8HMfF2`R&Iyqu-h_ZO}B{$>xyx7RH4YFkkx_S=XQ#rF~%^A==rd`B|SOw^|M zo`$2(YCoA4iq|HY@VaA!iK}ZPk(cPWT-vhQBlvAu?XmuTR#V|e=bLFj^^b3JzF!5< z@mh5yDhj_jzDpy^(569>e|(=n#1|Le@sJ|^k+Hi|BJMfSz&)q9z`nAZ9W(2Ka?DR4 z;B(CUuh=nrkqO7d@3uQ;12V-itBJHL#q9O*T1UXizI2=jjwiDT*`#RIp7 zL@|Ng2f!5Arx2z-7qutB9N5RtTY{g-%Z6n@P}96ev8OLkUqc>@cWS3H9x~IBNz**X z7$gjr1N2#=7*nInq;LY)U1y`Y1m9Zw!?N7ZNTqeqW532RZ&wCQ@f^(<=1WvAXlA%R z#}O>)Ll@5i2y4W14)|L0L-Ts0 z10eDKgNVTLO)C;XOHfJ3!utRWb$Xt}7~j|2#(?ni6Tn^C|qcTy&;)Fc+zK zz5&2N;@NIJzj!{igRS=xB$)Ah07O+hzq*y<`3vMBo@?w-#zXvlh)j;>B}f>qB+zG# z+5k&T*POt0R~;$wYV}bfmb(!tisvXC^9sjvJP%-)KMx*8&j3x1W8mz2%Hm`Ta0Ww}o7ZHf(p(KLh`6*=K{ipE2 zcuqlupz#dzOk;dJ?}+_>tGeZiM=lsfqa+)4uwCIO|MjI-GRJnytup7vX}$Q?;LL6~ z0LP0hfys*K=1oxB$jv-jI`cwl=j1jK$n-d3O4HWm8O<(7Vz1Mj!lSgs^+Vg>IX(7^ z7;D#L-kDb>w6-0w-$6N5Z$j01n_;epH49|mkp?VwW8}ex%+58Dcn~xikAKphZ#*xy z!Spv_e%u-W^EEO6^M-=?gkWNdfw|s5twd(!9Ksl2Pjo#_weA1b~r_``valc z3Y2Cs0v2f{51vQ5>&Pf12@X3nZ7R%xrIfaSUW2kZKWvW$>K* zmhO6Cuz4|--r^9;bPEK#Q^3BqVu1E^&&h8FFrXC!_N)mO83=Y74@7|3WPh-R1Qu2t zSW^>h4LwX@?{

td$*XJ%C8dLVBz`z;8Cw9V{=}4h+QXCYV1`WLl*!e8sFh-v&C!JlvTZmo}C6yF~9xACnz7E>jU zV@%Vpc=Y^rGgQ%Idw~vXMEl1dL|#~GX}9z9NP3ILw~}C=|3F^fP~_bv@=7<0jiAwb zg2>A&Ym+zBlDF}%F%2hZ4O-N1`z?%!m3nC!6)KhRBfp#^-)KK38N^WX6Yt1e)XCYWIddtSgMq6I@a z?WdK3hi#O;j%P|6$_S;q?I^bsN@^QHu%F)wV)00m$MGiG>aI#=6F7JbP_U(ZX42JM zYFWxXD5$N;!)m;I_Rqhyx9)h5DtR0YAdn0<7w`}l4RI=-Ui@p3h@^_eNusGp2F)cf zf%y3c#k%TjUdjt>tK!@ zPuXKwaj0%1$b2UWwaxhZ4$h|d!)-YnQ$!uWsZm0 zrObF()DU)L|5YcUDjt;o-lYbf*tf4-#={1(xNioDJuD`nmhSrRMm&qRCTxn$tp!9!)GLgHqwqXd2P10}Ju{2H{(sr#7QLFb8?M>&eggldzuH zNK!oKLe(kSx+t4YWb}gGzBr9NbP4tF94A-OT{odUcbHc<9gSaxtGgSJF=?+e>n^}k zs5w9B8o~3Ua{P7}dbr~uv@Lvf(|{)VFjv8bh_FtcO!A|_58`)<%t=mf8RndHm3ofd zulQK$cAsBg{KaQBXVz|1PX00sK7XigOFC;lyvatozL5SkQhNCq$n+yU7#T$RMW7g^ z=_G^BnsE%j3W+w>ZqTxzIwQs&xOllxcO{^SQ5x^qF{X(oDpf_%KMK)}Kl@a%hp0~% zt9$z5weJP)Pn|&KFZ$E1sHM9me+I5t&p#1i^Q>@v5=H-rYvp3NniCb(-#ZsRu8L_4!SfZH)-5Vt=e-EH`x$t1oiq2Vb2JKBvV z+M+=v%a+~&<2IxVAIu4K$1?yhtv#S= zMU2%>H1q{mOCGD8lWGu*ysFST?L62=S5$vC0pE0s@OI`TfAthO+Cb1VYb1lzU8+Ck2I+LVH^M;lQ7OcKLYM z$F5YSiB&ET>(UxgDvq%T$tWkYLR{Bah)oD_nLlE46LB2?{5-JKM5K4%0OtHe=+SB! z(>r?Q)o{AFxgghDy7m(?DBwo~BK0?sa4U?F)(8?U-!anbgyaGe&VSUFhu{oGGZ{%g zxDJJZ9lz)#&DQBR{9x+?G)XJc;qh)p#d1+$L-6+={?6d<&hk-VQ}K5Ye{~VBbdvO& zFWr8+*gg?tzElRa&G{0I;kZ^9iN6LkSGpIzl9T`cPSeT%Htah|C;#b}$&mT`*iqKy zZ0uUpL0`$>LVT|bmBl*d6zRf85&<-}8BV-bis{C&XnHS5gpkoav7-c~wTZF`jr>qn znJDiH3OOAsqy=}0lRdF5nCVN@OxJ$D((ZCcZ z6NPrD?sF;6p~H&0)Hd%vc_P52+{QjZV}E66o?oZ?R=L%9_AGLXnd@5f2VDPBC0zgB zXkP!WCS_xzE$(y?_agGbQnBYUU2=Q1&4&H^cl&#ack(U8a3+_^ULM0?s70A?dgkbe%Ml5^Q(S@2$P5+2kNd*K7#sU1SEz2#_t z+Gek{bW;8E5GX>Q9X}VRPydrXeI7*Gr;mGefIdHcAo`e*m`>1^LU4DSsS(d9KSkYt zq|v}5f2EPqr<~|>rQk2Gr+$DUxc+CpG_Fqi-Rdo5awb^)pAyVD{1*hx_h+AiT<4k& zwXoB8>CB7KsdWqPz^i+68=J4)<-K;5XuIw~HLvy@0BM}U9m#m@(6@9SG+guMAxPRb z)U|EMkj?2k#9$8s1Nq5DRJu+BPbswLPf+j&#qh}D>3kWR5!3R5sb#O&LnuK2x2uJB zXJeg{f5$KeMjK9EE^KSOH1Ub5G=1Dwc+73I!@lVm$L_+bxw@kUgyB8m^ouo}FZ>`a zDk~lKU}-2Hs|N^eX@kkxUAp7UPt(KmF~Xq2O(u04%{F_rQrw8C9vBQ~2%?Rbz1@p|j)Xiop!;abo4Cz@L1)osaD zUqe+<*WJj`62-6)QJ@bwC^H-_EYuz4D0?NcArMy?L??{tglj+lXwvxgYuqI7a62Ju ztr@vn4A(U(#k;;lt-SYdVX@=~6TaSha&4=3rjpbwt^ zAjV5!3+&B|(nRgE<7D!I?~2Ls403!TGky})y;=w4(?54cK{gKg^C^vJp+}KZD;xdeZv!75(aO{qoYUZq~02^b5C@Bp9;`3!S=y z>o@gkU!V-K!wPCc=+Oq2&Q}^HJ^cBe z*Y9L#*ONnHSMH6#ZrB^2sY;(h%qh6O(0hJg<_S!9-bRpve;l4tPpjtDrr{?K;+X8v zMp|(X=Z}B?N?}Syb~b8dChb^0kseeX3OH(p?@xUKE79{cZhkj+{2!0M2?-BvLZHS}9~g1e|+iPXs;Pj#uD*SqAa^ zrpRvO#gC0PyqEz5yr5f;&=a)>k21QhZ9r87*_XFbkXdTk9=EVP-w&2Qk^I;Uvk<46uveG&Z1#Ga2z#|wfHUni8TdYXB`;=sjY1~uwSB4GUj2|M_PUQaIr7nM z*jzvFmLW=ad@EUA?EtdGSi6vtR{^q@lCkh=$$QAkThf=hkt>>^=Ad1oo}6j=Ae&|C(YhJ13v@omA=eoubqq8UQYtdwAVW5=d;)7g>0`y$b`MFzGJu7E65ak zO(L5(ZjkPY_g{gA@W81&TC%)aIb?~k!jY0_KJ$(l&4<52G#}{2(cFrmb|a1x9fSX8 zTIefOKs0~bqBsj-d_on(Ge`3*w6>yoI?^1?`cf6m-x4d=lhjuznn$3iM00P+(zS<> zWoSPh3XJBKsIV#j&VXpP?*GC!&oZsK6X}Dnc z9o>b!L-X|fpO%0j*3INS40CvHLPqjx+jl4jRfPzjgZ9p62Sp+i4ti*j-9e`y4GsdW z?@2M&IEbUOMZESL;N%&;rxpQUcRg$td9_DSB%bPt6hHoW8xpq1AEWRd#!8`5?cgoYX!tL}xpMKE#{VRT3PxPH_1{YgbExt=w znZH7j8(5K#(ITjQ=Rt_gzOUh@&%Tovi+$xecGJFJEoA!+10uBq`L$5RXWvot*uD#q z3Hx4IV7KqfWHh#K7E*?zx~XEkb|c`Z2V^EW2w!&;B9uvcuNICXvG4h9urHotKZ0Z4 z!3XF$cC9r7?LlpNj(sbRKC6%MV*bknY;0ddD8*CA#|l*Yax)ep`P1qDg>XtsbN7TL7kpYZBV{_ZPPB zCt74d9B`ZWG?rXJ!X+t+lL~t?^dL!x2(i5@4X(}TO16u5VfhdyoICBs$^ra>MJI^ z?ig$0;`>j?!}m|VwX8Y}zb&hdxT%O$@eVX9Sm&2kfFZk4Z)t%v_m)NrRBw42q77Gh zlyGlxihT5zi|8K6!uMbvP6WCk!qr#^A!vVcz$By&bmngAhevUND{CGYsV!BE} z9@bNPLK|5k=z%GD`5Yr$kAN5Qz{78KU>`EFfn}R8WB*GVet!%90mgSMCIpY`4P;}* zvKDA_4UYG4%sdvE+7l~Gt?(CHxHato zcSbJJ^=b#lMTFf|nk?cv0WSF3iCK_C1?9M4n_t0FD!})<&|)POU>$^V=*GUZMZud? zU=1|pk=DD;Yqc#Mu)k?_QwLgt%6G6HT7R^}5_ne>VGXJcR_VK86IFMau0|BT_*Z35 zicx-RUiZPc2cMylO-T!CzscN>EEf(!R$LnJ*CS0fV*K~#upj>fFz|mxQStaA1%D^% z2I3F2;rFrQcNY9Pg8#~2;!hL&;X&{tZ1|VHw(*ta2gv+J#OjC=BF9m8>6_!YAuxTQZTvHrMzjuRu>d@BCz z0gjfvJJ|UqfiDET3=Cq~%-laVnf4DGiHdH&{lj`bQ?h-xx~>fmgU+S%8sp-PH*=+( zToEH>Z94ex5ib0v@AL705or}K&%e$5cM{b={wq<@pZ^Pj)BZiRopqJ{y^t0}6Eptz`0U>S zX=VQ;;?Km5Se^LdJ{ES<<^9MEBe|g6nh{UMKA7zt2)GoiDP5v^HXV-rZ4YFCh zU$y09tu}o8gdZ2)n_G5i=eT1p_YTg6<|jYy^!fWR((LbV-k^Tss*h&4=W{(I%l_k8 z*>um1T#n!Hcvd#uQ)Cf;K#!sx7kwvMGT`rVrVRG?QzXZX=XC(E>pOq9zrJ~?xQ6n@ za!@@-nk1ChMSg@${-v*M{{H24pZvrC`LzP&hyA_$(-7q6byI)HL}%dn!#KPAr$|1& zH-TnF#-sVWNdLF_CO_S;cN?Fv?+tCj$dZk#V{l){HZJwyjWID6Bv|atrETB*XNQmf zdZbleq{cy%|$2JIhCF_U*3AE}0nU8riakl1IS4Zn{a zzq8=a5&TzBR(9GwPjK7s0!j zqIpZRdGPTn7ws(ntv4|^e%}WU{P!nhVBY;JipY%^k!d@M8*{~NQMuGz3tbmJ2*)PC zY1Q#7ve0!>eqrz8hfEr@cX2nQaXS*TUhN%#vZd@3C9ziv8=uB@KC!}QIPtNc-=Z-; z>Q3xz^COCYLf0UnQC~3o)2K_s}d$;=dZbMq}-7uZ`RtU!TG%6P58z~IyihX~7pV?nWzXm&HEAxIPL$Ypn zq)qEChWdZU7SFHA^^c8jbvs{&@a<2g42*~5pnUHWh9=*;1NhQb=I^f&j%3~WNSopM z2jD{GJ8Fy1zC)2#_U$)~?Yn}g1@fJSibd_a@IAJu$@ew+rR+;vnP2_b7rm#EHtl=Q zKj53|_3>SgwBq~zRO$ajEs*aqR4mH(?7McpKgch|m$owRY;q*~CY#*R+g^u^zqhaT zyoEN5D0yNZ0tuR_VdAt2L5ERjl!%PQuzfG;pb$fqRrmlG^1jgn%UD-;PaL|8uQEUQ znJm3!)O+tEWyElcl(llMyh9Q5R}S=i}8CtdKm7W<2%Ds8`z5*|&Vs+bS%o z@A1t(eGek7^!>`i`qrSProLs1=o`l>rIAN}mqMGqkv@H6N?RVi?f`i-%BSxJZub}Z zj)K0otP0fk1vE4Dy&i?qvn^u`u?maoduEeQ-;+oyeZPB&`*TxjYVXgyKlzu%&BuOy zykzsSpYWuEvuE~Mx3jTaE7C^g=<*BU3hDClsDYY~wXpGTZ08><{D-4q5&qp#(QP~b z;^+ zM&J61NcXL;(6#em=kOe7UphbBgipQDs-14i*d+Sawq(%#4^swTpE_*%_C_1KzR8eE zI#~MVRrlDG6k+Ca6RRkaop$Y1|A*_Xc$tN?iWko$pS=%&m|cF(=K=B;zZ8P}SAe3d zYss%|lV9B~-(i#AJ3#*Ybri2rUYoDiU`wXFYIYjR*HK>aGu+G`DDBU~>hR~a*FW|7 z`(>or-;=V~-`|28{M`VOWj!qlOD~qMqp~eO!_6#XA*z$EwnYi?cMD4f{N31;!TydV zIc9thL2J9cSFZKxo7dE^+nU$XObuCbBU3U@t}NZ?DDqdW_xXD{(#qenGkx;&LCh|{ zxn2JH7ynZJGPJdM*~h@t-zLAYU4AUdHyp!RbinEBp1ENc^=GXo)x}TodGcv%DRj zZzfyd!Pb{6+3?HS@vmkueiy;N>r?;rIvQ(ey^cnNyff`tPECI~rvKqei~n+@75~|c z?>GgSSP#1k{3#lXtcRIhuF&;d|_(V)#ydi;e2zJ3%rOUtT2p zagooy2az`Idvhp!SHZE$|41vovnQ~9PeF$we47`?_bB$-!@6jFW#3(r;o=NgBx`9h zBX_1Nd%~42v%IP-)$cT;rl$k zjEF8qe0!j75x)JnocRvL+w;QrKVIV7f2mq`yBrSUBuE~WN^(LZFdXiQ6 zwN+?NY0U8-F=px82Wh2m=W(p>9BO6idvZk(eP_R>^c{t|Mf821%URzS&szFU{etuz zk8>*t$K}ZF+_ZRoX%X&&If43yTPkJLn~p+%eZPk`_DQ7ZI|?ys={po@rEkBnJYKAz zR`&6N*56LQk4)S7+0e$^U$S}Ih*!h0m^$2?x8VXy=504YdNx}`ExV}+sPJEfn6vmV zM_Tcp{S5Oz1)YlU-?Or~`R51sl}wK%*veGtan|{xH31z28UczBt7zU08q?%^QC@Wa zl>=`}K(ukbZQp+-HVse6%0@{}v{PU5-8PceS{#>Q28=HEr>ZA!k@+Jsc>|K~kidH_ zqY%6NUP~HeSnsv;lT5t-gG^WzZ)rVlJkAVbvivAJF@@kJFOLXspl)R?WaWv_Um#%I{R$hzx+(&0H zR3o%YbZlH^DqJ5GpzzIMMHEJ_euSyX{wvS71_8ry@;yBNtNk|1qHz$vQGj-Jq`{ zlMU)Y0`XK^c*kq?SQXib%psXxEe4rl(^5!DJe?nD#nZu=#m3Xkgr2AkSZZ3ui>fg1 z?mw^obv&Ji`tKnR>T7t?!?!=w8^~n!Uq-@k z)P0xv#cK^9LE@>RWO=nJ$P(SlA|>&3`9Een{q!c{>3AKEr*;f=09_~1F=C0S@VBS{ zg^yePZ?IC>SmU!1z}HrWM z;l4RU_{Z~1R0#ULb`{Tuz%pn&&n_;W-+PKZ(g7mLScvC0fZ>bh?n61ACz5>(?a-6T zC5Y#zkSXyz2r0vLaj_LzxDM8o9BQMbvz0iv1;rMO2Xw=1EE>iLQ7J!4qv)y|0Kwic3aMI4J zm4^gU3Zc^*2r8bd4B>db8+kC^oMFm%h`(mYyxACX@5sZYZc6VLZ-`_>8P#Xs)4lM=U`mpYP@%fzy40(2mz` zg9vN-SVJJ)Rvb=YQnE9@-GQJ>Ebj2j z{b~W`0l$`!Z*LV z9hn?&O_4ynZKAG6AI16d6<@rqkW8<(5}9J+B}hrUz4^E;-kw1=$J@=MZ}52A48;*| zzt1)e^bp#>+K-(JYHgga?DOr(Xk64D)c{e{9{q`#*rOYoDSMQAlyrm+SZBb_q;%#s>jyErv z($xJm2vLN#vwE5%41O1tIhI=`EkDf2{e4?>-huue7zT$uyp)m z%F;MrZ$M@;&p%fabyo`bC9|zN0!}7TcMv}IzcP!k{}qbF=Jk8H}L3!B!26>6Dj&E7NSK_yIKKl4Hyj5f} ziV;$szYl?Skn^|Qn(sjwb^c!QC|k1=gpiUrf6oMh3fuc1;jo>AJQ(vZ9*ppX?SGKT zVf#1|hU+TzEehK(Q>o0P(}UQQC#1xy{b*R0{2x+j50bvIIY_b{{{xltR$s>3a&PUjqPeO zi=!{Tt5O+{|7a=kJ>LrGMaW8YHGP9?;5+yDY1wY(FE-mDzW0EY72oFkv=3n7wE+T) z`0hZk6yKeZWoZ9>Juto-p+eC3#!G4=fuBNeQsXt0I0L)SwyC=BxQ-XcwVo^)JKI{H zt80slY#7G(fCbt&57Pc5x4%BHeMGSKr@<{y{v~ezUzE5Fn|!iw5&0{neY6oxD55~- zv6`k1GXgQj`(cp&#k3b4?h9;xXJGs0#k3b4DhIaz6TQ%h=09{G>)Jt$(&Q%EiO{9v!&!9@?M*{5l zL%6Y{4-P(j^pEbyK+iJ!m)q)Kce(c+mv>ihLIq0}>eni^{z<8S1s1f`KaHQk@h?gJ z9sc!msJ^_JkYc3csoTO7V~Ut5#_jx|B3@URgDP(NVC#iAx31-pX9wjXH6Hms-N@q9 z|BK*}is^)CL<6ilfjK|e;{$v{0X7K)r2Absf5#Fgw(>TjCv8n_k5se~HuL<&PJ^-m zcmW>79^Vim*@@pUrYZ0VHq z`{TD82a=5~*l#B8ZeyRZCncvKF2(u5-p3pc?WyPPdV1by6df!qM2{&bb)Z z9(<|a##Xez+8bM?;DE99ZetI)Z$Vsb>m=IlhgzhPJ9101k&{Au%0=RtStxysRqYhH zKN&U3ZRs3&06tlbz`#d#%7eT;qQ(E(Y?RX3kQg8Wlc;~uS72tk&tF78cv_0#etg13 zvJr&V%RU1r=I~vSsW_OS_Y3yqlZPCP#q9N#sN?gxHQLMbL+DenLF6awB~cWEU~mp0 zMWieS2tkn#!7U*ePCHg~8-Q_I!ax_i{(eU=>-BrxQ~M&_10QZGzYg zi1v?gd$-IcD#in+O;v914s4$gw0$jZ--hLzqoun}MH$M%16x4eX}Hj5ii+-XEK%z3 zK^dv37@~eoK>Y+;{rN%aPYbAT;-7~bVlapd_iKXl&m+jdd=r7ufnz3-epP+GvfCR* z=S(zdZ8bp_{Xr?*$=YGidw?SGwM&RrATHPRPA$No3W_z#pIOYLt9_}&f8$4AA zh_XyQz$YA8#GmKeR)ARN(xb2VI~?`*AggG7^IZC2(fad));G_k=|$_03{pQcCr+K- zJKLLpPjYefO-iu=^(z)v-=y@*%Qlq_t&ay5%h3L7=Hj)WDVg}H_0gI*d3GL_eM>v% z#;E9aMyKegcFxc5kB-hc=Eynf(6!spt{paeh%QrZ3rgBYV<#-mL)G#*$0E(#ijiB* zR3(+FiqtmUk@pf1P`iq+b~RO}I;EuEX4JF%N%3Mh79$7W-OgJvh@Szz!Q^gtyy<^4 zzOI6-q0K-uqeH`Z2fp1Dz9&C2N7vFND`Bth$Ux@0ICP6WdGU^ikbnMkr0aev--a;~ z$Gp2l+|jqMsv{ z^rK7P&&JXeJX~9fX2{UBcaed0Wc*wjl^Tmab#SNEr<%>9=c{UDNJlDYn0fSSX40tc zG;`NdslE0z{!i2NF( zi8n{3F=fa|`L`YBOBM6|z|5p-)IMztT0TlGr#ykPcxFzN?)c>y$jGCwY8hGziV9;g zla6+q7#3mfv6(bF9c-OhKalzH{SQ>h9M>!?6?b>FMp%FJba)2u2k?+!Xm0|HPqnDIXzU%x9*j~q1E*|$YXfhh> zh$b(5o;=ch6Y?IGJoEBKjb-F>>-trTCsCf*&n8p~H`+ABM5a8wC5=;XUhgq@$_B6S z#^Dl5L#_6R1Gj-m&TeE!?as`k z2}!!3VEBx3)IG3)-cBR*LuAO0DF11;v=6<(L05t2yO``*PAh zrd8gY5Zzz&-fwiH++%)*T{mr)qi3l`~}B>=XJ7*J92k=tFTn33HxPMGqIKD3SV6V zf%H=b3#?~0OaF|Ug{9v5Wkk68(a?a$VFJqmHWROpAkw??_I18eNcVnVd$Y2*z~*~O z()g8`6y6!8b52Ubpn`9Ir=stDkEP*B+0Lwi$ZC)8k|IxxP9Ge?!x zEZH$dkH$WmMKZBkr*$ft+YJ0}MK-RgzzCZ%z$JDx9n)g13M$Zkkkm~@h*ZqT3Bz)a z?k;aQPLC!Q`Ka&`@1~a5Z7}P8fbtF3HXPc=)2sH@iyERoz6f8w4K7+rxg*PFCavyB zgO2Vfk0Ce>mTmVe4Ldb6$2Oxetki&sVF<+>YmhWjZi?&>V-7#;8F$9dZ<5Ij?RWz$ z`6O(1>sfWvk>gx{thzIkwxy(1Wc}^BQ<3cCd8lsG-JWhS7+f%MaAr*pA1wczHM3Ao zK)G&XTW3$-XncU$z2_pxy0JZn?)G%RJS{gOS#Ng^7hRdhP>B7!qLNXVfy@gjh1=3{ zJ9%!b+u7LjX&jISJ8QPb-7IXCimTVcY=P_S>48^c2r?2fqLPhQ^>oxt*4ti4)_YuW z7j94c3hz`gS=hBM6}l64bK6d+5fimsRrFh(h$$Hi_s^s=0M~Hz^GPB9uFj70{m&Ll0q1M@T zYvlInwu2;UV=(pT2hIvk2{WBIl2+d2)R0aPitRmBK%Vkg$Yb+(u0|Rw^+0C`Xs-wKJ0@xanLMldv~= zZ5Zrb=qkiL=Ymp&uF_Ayl6pMt8$wkp`D%Pecct}VIOlhaqoT5fu7mWTh&~Kw-Hy%7 zEU#oWa~sY=*LwbOvpdrp?JnHuoRo@F0}rBZgT`XtNs9ZS^&iboq7iE!rDOKEJ_^=> zKMTgt6-o~17+AA{rrn@&Hw0;$HaPCb-%ZO4Bm7mxUmX4#qBGp$ zF5H6t=t=q#4?nFVcj&ItBO=0yNz$1ob0zQWyU-0^?M=?aX&K}A1Wa_WKOda#)xH`Y z5nfTFrRD8Nd9~Rv3+;5{)ixr9#4Q2iPbdAQvJ~GK#>z^3Bep5V(VUR?@w_*sx>0H{QV+41mPpa2Jow%WQg9(=(6^`*wUxYQ@Fhk1I&46A zs`;BM;hu@;*p4eNy-JTrWahS^k+NJ)=22(b^PYA!Eq^#0qQi4PcYCI%gMzbBa=No& zhpEm+DN~&d+s?!9dHDSyet(GH+4!A}-@Ea9H+~<*@1ywr8-D*r=3fCsXQOar#ULvN zRpL-34!@h>ce8?W$!oJQLCD+Q72)jF+|Nx9FJCik5t4T!87;}SNM?f!a_>d5jU?Mk zlIm_n@;9n$?CWG;1lbN%T~IZ7{T0-Ok1YL+WNb5-6622CZzTWLDRPUEe2&%^lP_TU zLVrPA0z*p(Y?1Kc?QYB3sdSMc|EF-Qb^u}Bq@euZzQ|9!WQK(Hu

Up%iSR5u{I6|(m%-*y+A7j^uR~IM)H0n36EJ9j-4Lfd;jTd7i*D}K zZb0fvVb}v+&86x&k*XWE)Z^94AQkpuxjP`?%rn!&H#&{qk^I${{F#%?u@)%QxX}G| zRH%XE7t7m{Rq7x)pmVPWk?e-#G~w6}$%h}@`IT@)*-OBIEyx%;lCPh7Ck4qDe925s za)q@>p1(YMCn|jGORh(9SMPJWGYn($@jHndO=T)z^1TCp2pLNs8^#QQtxfPe5U7r6wH*lp9QbR%VB#rPj ze*(?P^*GOgY#S&AAeo(clIWam0_C+nL(>@TCe(5#R!x02F?J8m%*c5WT?=bMcupTh zX>H8;Zer}yKu)D4gdwN^E1*tZ{X59f+9!9)UFL|w-T0M)^1_(J*bLyMdh=@kfeT!1 zH$n#%_~kRKTku#HuI;%KHhR=U%NO!Kob@i1H6M(z;;CyIEzcb2M0bjEHg-8Rry@DuCOaFoNk@=OMZ%3}YCDf|5KbLFq#VRk+ic1~Ky}znIf$sXM=9qh zg%;)Td3P~I6qz({B+btaZ78}m?r2dKt=4E*#VM%hT;pf~)eNm6{-4sR?k##G_NaLb z2KBgBBBu0qQE1wLntF_R#8PjED?%*|Wk_PnfDcevZ&%gOmUH4p6h4FLA`0WEo+Pmz zq>Yj!Ca2m6Nn#SJJt@gHNDh&t8_B_v?1tnZN%lf=fFuVX*-w&BAlXNf|3R{+Bx#xJ zeokhxVGXT|{F*`v7@Avt(FG-bwUu9T6>9bP$E^9nzdRq>m9~PS#@v)v9OTQ$|MH%2 z-i6tkjbpvS(6(X#&G{sg8DW5DEslPSFAT!Xf%obj;cv zdq%+xn6T$uEQdyeUgJhtXoO(I^E0@4?!u~jiU*(k*Kyrw@ENW6B>VA65I*NR{R@2N z4z>7fXv%!%09ElhFp%xDlMaSfFxaxs%8_>aL<*lr{|!D)#ixnzsbJ@mB7E)?K7$mW zT7G=?y~_Uj8tW@1_Sb|VmVIV7Vf%~+sG%@0DtZ$7n$^k7juhj&N<)816#S-wpDFkNu1LV> zzaGu|CSrlQv94`SDS^Ha3k@DYkHmPA`!EhXo~(VFLv0A4X<^+gU!cnK%5r&%S)Rc} z9TQc#JD!c!h{~z|Q^6ote>z|vEx1wQDS5a(o@UHu&~sP|DY5_NN*{uyHZ+$04^$Q3 z2l_Lgopdm?)nG4tRz79fcQSDi`#xF{KCmz8FY@|}ypBpW1M=gIoc=-qY{p-8` z1^Z0EsaWhYy8+v0JW!Q=*7arkte}IT4TIYxKBf(|;^U2Zs(-XE2_K1%6p?qQ$ct3+ zY6X+`b^8+NFY*rb5&zS{(B6XC&G;V@M88K%E^mm)>o4*Wl)Pjmuk?In&vWfctl!1n ztlud*V15I$ihg^Zu=H!-lb2O;dAi6OFY+>#yhoJ0F+O=!N-nRO$g3doZcy@0KW^za zW|6YzqP8Wr=dxaG&pC9!`2ubfduAwkUZ1>MN-i%^9`TGbt2jG0+sl(&JaG@R=d)1wEJDi?pHI3fK2HgsE_OcpgKVGibTG6Npe6Qs z#E(y9;Zx<`;ImQ2NZ9AQT5O-sv8JKybMXP@bBYcazZIW7kJ{~%AbhgWvc&eeS@G#C ze45(%3=uy4h0h6?N$ivC$7i4LIfuoR67!iWV=T>o;@CcOfU4|s;C{BxPC6J`U&UwT zAiI4=OaFTG-{9j^e3}TK3U)pz!skxmvkztx`_%H|Q+YA>udkE-1^Y~pF%$NgU6buI z9;nJb>+WOwte^w-^;LYP4Yb>5pYUn_Z}9n5##Hce2%l4T*!VOOJ~f2T446sm6Yj@n z^%AzvM`&5%_<30IdAn-TnA1 z6h2Y^2A>b)902=#btBtnMJt$K)t9Z@nZ`VI^8OLjCN#t4c ziJGDl{E>76`=bU>)%em|_;e9IGgN#u_v6z}__E{}_ZuvL(9FZ7>eXdqzK8J6!*{7QDsUUm| z3^UT7PxrO+StxuKp=F8f(^c_#O89iK^U*u8ea6!P>sttG;qwUb@n{Dh8 zz@F2Su{Yj|mA1^J+v`$|1l0JkV?=mscl0Qy(WZRsEu*6|v#+#oy@l867plg4gxEwh zmcBrD8L(cp4vjH>ub_jWWlDXlKThkz`n2lBGCQIf414YRJm0|5r66o&^*Jfco<*|~>GOVlOP^?^PnX_o ztD2(E8?`Nc?g5u#{If~vvr>p1PYBSbn&?wO^jRqN;h)pJ#6KeQT{J6^KHt@|^y#K3 z%@ORbz(%}zYgzg{ol>kmyfMvJr10FKim6c5})EPH=QUCBjYU* zx?gsw9Nj8APPfW(Q}krKor#C-FU0W4vV1NcJx|WLP%h^}spNFrv({5$>ejq_N^-5_ zDamm-FP7r27Bv+Oag%x*pZH$nfrZY zdWb%!ZfAWa0Gr1D>Xtr>+ZLV;cYIfag`vEg_7?|L*LcOVX@d zN%cwM(S!UGBO+)%*pl`6AfEMUp!E4RxmbO+qg#qGjtQ|*XzZuYGBl>~pALrhtkj1- z8QoZ)@el)5CcK1Uj}K0T{h{wYN`{Lsx#gcg|~{fCe*bA!5bAiUW(w&g4Yd4ONBR(wrbS1 z6S(YwKWc}Lckxcvw-4jx(GS+Q5^dF~Ycm9IFY-gwcbVW-XS_ERUasJ^6TFF`7nBd5xk*{*Gu6Y7raQpYa2RVHNjhs@zrodE4)>-HL|X)#$_1ncjk_e z_1%i9(03f;t)(9vFB55NXk8m5cndg@{gY`Wlc%ubx74k!j7hUi!VMH<<&nUcAv^71( zKfxOqI$omSt!KQ33UA=+jJFS$J_9#J{ZXe)_@s)*i}unSz&#{1Ek>DR`|I zZ;Ha(EBq1!Z&c`bDS{{VYpL)SyutiV;Iat%)(#!-Vj}A+_RFImtna8d8E=N*?L~fw z`Ysc^aqN#b6<*t!jMq-^CWemJTku*jo?GEnn#Fi$aoGfYTZE2RM({4-3}HAfw6yd+ zE_e$C?>O>9)OQ_0;C*|>TdMF@y~X_Q6TIo6;|&qKag5hX;Z1y-@gfDUZRmK_1g{n2 zMJv3vvl(wS7G+?+Gq;DV?^aZWzL#(sF&t~@2gggLIgB?*@D_xQH&*c0Gu{&l@3`Pq z7Q7yz<24ezag0}0;jNm>{5D~c1NugUj(6ZT*0&YoZJ{5m@5FhGH(KykAwR@;(FN}k z&O{jh6kd<{j8{kS28NE8D0u4`uc5-Ly@2ud;W7sLRtg<2|5nzQ&Jc!UKmA~RTXbc- zOu@@Veu(rQ6!W(!$Rl+cB zIC?3(i4QWrNWp6xI$kxwqY)kRKZVz$C*!TYk?nV;MacSYMOEm#it*Oc5001Gy%=wh z;4KIpZ>-==WV|O7-WkEGEO{bxftOLM^%NF+nf1q!XgZff1%?YXwLdhXS^-+ zL;6P_#v3hotB@aJyy${Aknx^Tcmw+~ULC<37&=~};I&}9h6=C6LyWf%iyAckg^ris zjP-4d5fkGd{a}3~`Y~Rn;N>DeM15xp9*w{l{}f)X;3Wv&sL=6J1aB`!I9&fKyovpp z-w7;w(D)ZR-o=~6zsxU>ez3kR9%j55g0~m>A?mwK@Om)bn+h*N@Y)I9#L)423!d1| zt?>2=-r1_GZ;R0J$_Sp=??O{c-vt9$--UvA9Qh&YyN)0XZ94m7slpre2;!+F#ajL z9&&wtq6+Ie;9{mt~&Ff#m+l%}V^<5@-Wf|{Hg*VW={uR85q2u)y zyyY0SF#l6{ErzlE&Q@l9TZE2RM({>4-i1b%zGnn)q2L`yekl6le%(4$#r?V!gk)$2 z2AC9`?$=FgNnd@z?YT?z{%EAU8P^{0xHX3xb#&WK9%Tt~zYh1l_R`I`zq)T{-KaYT zLqj5D6rQ6muxLjs`Bw13ubS|yAp8;(ztgwd`PC7Ai_rF8=9jGaJuLj%`12dvknJ}d z2iUJK1}3pzcRzmZgkRLZ&u=~gLF~8jEZc8hMZ5j90}ViIkZUI$3~eC>61rc4PbzyH zD{jLr9lHH$Y=bN57AG8sk7MBuE58x^Pwr^Kf4_>3agcA_Gr|47-Xgz?$bZ%@zv;g# z-zjgC&WrJrf1tkTPY1lufq})R|E>S3{#`|WoK3!=JxFprj?7>27Czt5j&+`1je@xmYz{>vb{EAZ_=_tgyZakukzaeK3y`MBF|^KrLqzUyCwqKq3a5C${Q z*mpY+_wO8A(HeX&!LB~OQTticW2lWjf*OCvcSV@RH-{X=BIh1tkT~J{<`s+Yy~Xo= zPBoq`3{E)w_|pA<;ycJyL1+&{1H>;n@97qDfB6s#eHZOYbU*gHLZVCeW2=e?bm$sK z7`rR5>Hhy^OQEOh6nlSpAABwMW9NUzjVt*nMEC#E82a2v2lPj&4}EHhK4nGbq4Fiv z$D#BYpeXGW>-0yNLYz zl>Fu*f0ocLD02<+7h|*&`I`$^{yRYNDKGL5)D->cfbSQ8hN*v3)_nr)~ zMSi^?@_UQ?E+T)BlHXk9_YwOSL|=>kYNXnHQuGH(5&dh3{&c|eXrN*0--PvVb(~{v z*tN*7ujIEE`SpUx?=AAXi2Tt?eshsuUE~*(z83w};Iuhk^an~2{bNOcI$(SP4O9P{ z{Pe#T`Sq3j_9DMt5c$1DeixCSspK~o`F%|NOI?fpYB1ZJC;9`$Pk%%E_D1OKaYP>F z`3qgL*yk^XwnoZN1TRPbokIGK7Cc=WNDm>#(w%-tj_wJq66N?Q2Oj? z#QJQLW(Jy-NS_UVSo-84l4aCw`Xih8X3=NK8B3oB!KIkzdl#z4(}dWW$N+sBi9R(% zpG>Kb`BAv&Q(a_!ie@F!=a=6teVQps;|2R+U}Jvt-_w>pFH|d5p8|9XF~%{`r*@z| zz0nx))`bpOUw~RN{xomM{uwGV3nF~_gna&8EGH90*5>b}{{zJr9On72D$CzV2fWXu zzRzLMWw+UgXycBEPrD?;`Tw!ok#EqLJ#;C&M%e`P(^|HVA+!^5scetjjsy~wW@M1F6P-$mqa!ok#E&bseI>uW$gdYfes7WAMdUBU z!PH;mm;FWb$K}mG*Ix}jn~#eAKq;bs715s#c-~yeUs;FsANs5K|61hNSMuA7{CYv; z_ZInGME-UhO#Mavw$q|NE{FcP{y1*}jK;qsqCZfI=wDg%rvtu!qvWrw&H9%;Bl=&9 zd^&H7{PrThUJ&`cMSd5NzYhm#l5y?|eLt-+(a^O5td@kVzqPu^*H;%Sv3{rMfalc} ze)t8(-&Tw9jcdlADfll7e!RlZxXk!N1wa0p@e>8Vso-zILF{u(@XHGRb}YVJn|%&c z6#vr!>n#d@WFhlk9>?|>cFp)>1%J5U_f`0N1iypem%C>CYJy+ECDuhiJ6Y!|8i=GpQW&e;g35&yqNgcFT2mC(78y z@AM*in@FqMh$BAz2ZC5cCpzjTNe(Tko38}LSnCHr%E<_LQ6l{ZEP43#U%YQnjpQ5J zL3CU^|3W|b{?@?otA&I04rL+z1GK_>3m05`#|KXjeD9RIKV^vj0sH{}opiway-H-o zPsRT=#Q(s!Ci}U@3h;8~_XPc5ek~#uKW8An_NYZ%nO`C`8RTjzFo$q}`C#daM9ia& z)A;SP?YKM&nV)6f7vy9Iltl;GyOV(8XJ6Q7T?LlEf)22cl0Pk$<(GA_{EpWmzm$?+ zSLADf^5Ne^5gdVm1^0jH2itE!X=T4%xRmnqZxm{Y{m}lRgNe7`_IdP!+xIA^+P@Om zeluz*`>&%Wc>hgc3_zRx%gO!g#Tz+3IszkP`}@Xc*-tZIe+=Wm-3fbTe-&eN`3>Q? z5fDE*I_DHNGHH!%dFTd#@nz11h{Ej1FWrN-xIO=8?n~gKDzd#h%S{4F(-CP!2PC6G zgP;b3ni$Z&=?>h64n$d%Ei-XJhxcTlTTnq0JCWQeT5-S;l~Gi5P*Krg5D+0vAPZ|) zWRWc_$_+t{h!EEM{m-fHq(PmT?>(LG^C#(lom;o+RMn|d=Tz0L>gm>khvWRca=$Fb z%^40?An#6`otsYQ_ioRqG3|?RS~cD2ivz7QadPp4g*ei9y-}WlHs>>%FS_wU6B|wY z8?oVcY$cO%Haza<@QA96%|@SZ>CPG4b#cVsYwICoXe&(ti<=B>S$-s98!E zcSsgo0k;G987JX}G0;r=^~_6rLo4Czpey4*r%OAklu;A||7m)!0Ytr* zWL2ClJ@Mp&sJig^$)aC^R)~AG+BtB3b7FK<%z7<&09OZH>hCq_AnI1n>4r{sp2j}i zeiI@{;Z+u%HTAw}D9RR0dbsqv(|rj>mWj~X0k{lqz<%sCg`*w51R8t*X{!(Xtx@9Z6J!u-w+KM^D)=20ekd;>AI7Sx*oYd3fv9Ez1GeY_?9SP0t>*!;KQ78NaU!-1>Ln3W}Ie5sh|mn1JAvps!VG;(kzAg-m{=I??K!6Mt! z36K_!G{@$rODqC(dUcAtL#qp?Vk-T#w>!`9e5!#L$IsrSd{JZ&Jo7q=CB+GEOzLSqjmli`E{7r;}ldlUnebB(3Zyue1I=Bt8%17 zQt=Wi!|+RV1yShz;+5!T7Tf{^so@Nasi#mm&Ln@;*{;rnm?p7L3!>_Z&q!Whq0Ict zxE{f4SIO(x5U&Cyg2WXcW-jy+jz%JZ>_WI1;vPWcjE5;L5A)N*Sf4~J@;i|4=9X&> z=E4DFRDZgOWYvDn$S6yFA3QUz*lV$@GcM)7R{9(HpQd|K69x_*GE^O;4pxV#bk#tn zcsL0cM&t^k>%++M3*0vl{5sm->+-!&VygHKif*;SimsGwa67xCC z_k%!<#RRE8-f4Sg6&~gUVzXFt7Z;;#adBhMqF%4&eAe*^bX_YK@db8g@snl1GlZk_uR_t4GW#Eg}lxr453xC&~r+E@oaBBD8P z(>MzBVEZ$s)Xi>DvXTdjU_Gu1g&-?_457vQL(Kv+3+<5=+uE0iN8@-nj%}@pOSQs{ zZj8FBe+sUU3&fV?irlkkw-3H8M#~0mGs``J9&VIfS6P*GpluF0I0^hY`a;%kH!@BIhD24Qfd{|mUm3eK0EmeC}$cx=6aLp zr+k8vH85#Hj4F<4B1+3v9*3s%D*p3PKBi?WHE0xE7?Q126KDl+7{J$_5^GcZL;@$$ z8i|ZomZKLnOTSsA`m18q>|-nxDlRO+vw;1`WoJxV=^@-N>4Kn;IAt%Bop9QR2)J+` z1z5*Ex9?h^IzqORGa=&ynJIy!#V{QXe}E|(GMRF}K*ebK4a*x)jeXPf@#!wqrbmYp zXg?MOCNDKUMO>tL93iCnSEMN*y=IkJo!vC0kkZ$0cnYtxNk)c>%!E=uyc4Nkoa`%< ztYX}UWX-AuY}5%-EZ_ac%@}zhBv0TuPO!ply2gT1T)}z5-|IDw;WUyt2CV9}E>We5 z&yCU7LJpOC@P?*OfCYtHL-G;OCuB-%%C;j49h@ww8YBTr3K#Zds-x9W>PU6O=usnw zSMdFv0_q7#1gryan=A>C*)9l9zO#TR60~eXHax1BtY-=_RIj}(nj&L9-17C7rp$yb<;BPXpivusq zz%~v9WMC5qiez9N2PVis6$c)Wft4J%M+Q1_;XE?Xo&$Hvz@;3xSq9p0ptB6L;y`;D zh~)sz9-)$&ob-7JH3FwO@SP0&zyWL_qbH3V*e(MN99Sa*Uvc0w8Tbf|gga$rU_J-l zl!17T_7@q5<^XP9qNLApw8=8i#DPa-;Cl|x^{j~Y4F?9xz+;>MF1ev6UJhi-z#|;E zQ3f97z;9*Xeh##gfdUT1%K*u{t>iR%CQ|zg2fmhp=Q&U(1JgLLMFysFpi%~&<^c76 zBw*#F=gU9>2VRqb7!Led2F~+4r7~~|0qQ8s0=)os((63{b`a*5k%0u`ois@SGDm5K3EQqYDX+|!z2b}X> zLg_~%mWG z60&RA4Vu_ScaPd~_TZX9OH{jKyf+h5ZA~~{6pWY`JA5jikz(Zx6MJy zURz(}L9fELjLB?JaGPmNW^=q7BQyN1CN`;A^PiRPxy3Zj9q-l3_o{KJd?>3&UkE4R zYv&FW5w)*gl2L#h>pwxDIr~20?8P>t|H(6E-@=))fTvC0W*miUj}p1lzQcxCQ&-DJER-sZo=wqtNEm-Y}`h zroxW)rl!cI)(Ur`kvFvg?}6Aos0@f$ML++tbmGn8?HzGnrMqzEGmX^3r%msTYN*)$ z`dDYyv~+InE0DzJGKnuRKi8a!Z?&heqHmzbYI=tHyOq+WNvBq!&fAbcRH_Bo3I8}n zlIPB@nK%~B#&Nw@IJ4$IGY8K}LP~C>-1_RSAX>VwJ~l`aBIDiIudqb&h$@DJ)Ivf+ z@4?)xr1v!4wMj}yFf)`r@_KY;I1LgJmQmC-vsC{gRSNE+P464%NqX@@d0}S67UQZP zE|!O-@CKspCImRCCjK9)*A2A z#E!7WorG%J4-(q)^a%_CviV4Uua_6{hUXt4fn22K5vyd=B#cfZeTUqIbm4btBLs!o zmNM#B7@I+juH`{;iQq0SFGoIk*};ivS|IiXirlxb9R!ByVMPRmQcLL~-lKK>3X?LB z;0AhM6)Wp$kOv@5up-~(_J7qUvw4!ku05cEUQFDJkamK`)^cKK*mz*;NP70)Z z=%g68XsnRFqN}Vi!@w6AW}NT@I=7=_NrHM^*&0J_z~`YPr}#5XuZvhPD{$E`jPl@Q46+*yoN0)+2gGWHJB)n7n4HyPXRCULX;h4S$(QU@ zqha)e&5a(2ox`}AV^_e@WPRYwT6hOlgb!D#PsAmK8w{+6nNI&QrdqVZMyKB6S`S@w zjl>svU#DEf7S!7(^csmQ>h>gYi+4NYFf07L`rR3`o-WD`n+sw6{iFJb-5;)x)~&cc zE(PIV)JM)w)Q5*>DrJ2*2uIe(2xu3o6dp}3tc`XY_n*`TJ_Y(GwEX+&kg48cnEd;4wmbVb3e)$IoE&AmQ^vijYTw6&k3s4XYU^i2NFe%ee2(@ya zh$ztK-$|X50)CrF-^d4HeIr95eZw{4))$^dlom;PCEGpPXHHhr_EWfBLrlJ}7}x=sSA zk|xLG-Nr=pbYcH!4+h#A^cVy0XK%u&v_{zHf(RTh)_h7VW4{X#f*@3X%2K2JxrM+| zqdeb2V5w2cS_mvP)~7&NEJvjs7?tv}=AI-TZ6((u4@k}BxGENvJgyN^(+?z4SovDv z+PuIgR9~2C34j-iC+1jQVVsKb#a6n4$^?BlAN|;Zg}f(Qm_t5v9n* zi&Tn~f5pER=mWlIe@OL6%u`B8ne{ft!XFhttgi2OvHt!!`OA;_AIjfJT70p0$L!;e znD+Z;^7rERBrEpDuP>CpEg|`XhwuW) zUtSEfdRAFY%9CMmvE{A5HW3+PS0HV%ka$qt;=fSunYYfkh=A zpdQnuo0+kTCj)SK_F~H!7^vkF`;b2>)@E7z;RVf>YaNPYG+lFGw?-LY*6bIluwEM$ zzP6L9Y<9#)M2<)?w`kBIqW2@#@iTnipue$>9ez_j-?B%mt+-i0FDRL1ZIyS{a<-0Hs)@T6j=+W zF{ffH*+{7f>y+)tEPIWul%~qSLT9ibtA#4!>K1w9;!8D$2d(gG4qk0Av_h*7z@sZ~ z;0Kc@t*pe7H8kW3YbsJg z)JJz|7}WKWif~CoRx{7)EaA$$tkI;3d*lc@OfT>>idYfKXoTI_)sg*0(;sp`1bQKY zEFVoLVgDFsh4}>-P#XRZbo~4I)3BgWHzCeTH+x%aS<9G3?^q32MVPRiP9;p1cwHA&fE03xT{#6i*@GLJ{$ZFRLORgeSj_T}0)k(gV2W6CX z+tNB|u!RDw^9z%%3^Q<115qAz5eae{s@No(WZ+X+GYRE}7TIc0XS0@KPEc3+;VxOa&)hBKBn z2sXP|;VD4s@Cjt}z)7E++CDrV1f%hm;Mvn=#;#_=5FJD`!cn)C>>!cNn#nUMwo+Q$ zf^5Z5fx>QYHO*ZW;Q{-Z%xrjuw&c68{fPFEK4Tsn%uwaqN?N1vZZR`tjJ9--aC(K) z*v|~L0aR#c%CDuJcZbu(x^AR$=&R4}PT62ir#sbD{S5GjCCd7v+*xuCqq8`WAkW01 zMBPE4-rns3`O-)HoPW&oaW1hIDzZf$Q55#OHR>;z&tPu7eIxrzxcJR3^#!gp>0`_Y zIWVlSqfN3wLl9rtjw!uxMW7>eLjP>8ke`-+_ySxd5NDoeAk%&Tra?p1?}d&2qpDB! z1d>?xX?_4NbPvnFK6|BX%UbdUVsC~oaPv%SjnGf5=Ev4D2U0Sd%&J$Cc z3;7M)y*yXHcafVKX61BGR(oGt)IQnotggPnf&sY_Ig6-f@q51bXsqP{yb`Te=ES}p z=##82xs)F1ISMGP6jkJWj6mxL5V?&W3tDn&uBdPaaxQrQ>0jyXSZNU|wz;VOU|jkB zn4%g5xy6-fXGCjVJ4<`NFarUzJ7MxBsHB`qSMvD^cc{J0wYE|>Dv`P>_D-OjEput? zzhL~%s4+f&~is!wH zhjL@z1k=nY_xF01h#1(PI(kVI7KV~7-)rw7m<|Jgms%w4UCKViYZuCcNL^R%!e1Ij z>$OMN6?o_5^HI2ugPy5r;qleqYZHdbC@+N8UWN$%$I~rdE6oGd7Fz;+C+P`vCB*rI zSeDUfx!((NOy6#LLTDGPWAH%iB^jax=BGNS8j6pWqg@bj;H)T%ma$6HOBbLqGIn_i zv0nb2meujdr_h09wsqKrY96$&_8)xU(uth7$TbhRyt>RIG#Tl84e zZN8+U$D-T%;)))Nad><7yp5?vOm#4|t@qlV4qItCUPJu0wo>c_0E)g1HUXoUB3tPj zK&sf_(U+ytvXI_!6V$CszhxA7$`$8L`}!}4`6i60PGS>FPHBNY@g5=LYa&2}(K6N< zUevi(yow5|jv75`_{fSpEY$Goj^RL;wJnOz6P4ieR`rvpTx=%%quazr)S*%CO@`Yn zZyx__i~5?jML19X?&z|db7g(cBbx6>gR`f@*Hir@n%=yP-|Q3P4jR#T)wU@AoNZBp z7I4ItX{T(9v@>P-XF)t&rkyU!KSS^DZivaf86p|41w5&aTv3VgRP2W|h(3@}Y@|{? zlOYTuBj8Qz%0FbdeU&R!i@GNFL6F{+q!f@m`g`lY1?e?ON&_kX{O+Z*K$8 zMaC=8HfV=xe{h-ql%1wu?XUg-Tdpu@TT~LAW>YL;+S4ic(PGw^`^9$bTdl*8k|4I| z9R~via?B+?k%YSVX8g^rQfpE3x>Cb6xP)EjH-NDHH_#k{^A?*vYt_aW>=qz()Es zEMwRf#b#)M;ZbF-3=@U@RtxkuA@EQS?kL|0bi9vmqrf1tLXhlygm7vKs^o2;2Xr+F z+x!0tSf;kYEbQ}NSuB-GAEa(E)DCB8jTQHSc~aA{fBrGVas?a;>g`!TV^e3?a`X&@ zDMT2TcE&7I67e!9Pk`bPl}pGceV|G?z86U%>2K-Rcr=cds+7?(Y5}5hJYy8-(7YRS zOHA+GCe{@2FRn6ofu*4k9JkMjve=T9DEvI2=R)w61i-S~m9{Rq3mR0!*sF4kD*S|E zYyb?$=!Dvsjj*QYF2Fn-ke<63Z_Sj^mw}@jz#f?2duy1Zb(m8U)^{a&BgigMgY9tj z37stvFKn~KUp2Tt*_Bugeo7G!p#)bVR(q}E5ORqi9*LkDtV`xs@Tx13cpr?X;rHu6 z3vw0UnK2A`dIGr+WBY$KGvWjh`*2n*Du%`?f2sHYZLx}38Ek6Zj1fN%@j-Hl>X7Y( z?R_b-Zlk#*wR^aLgSjL@E=e2WbyzaY`I!E3D(_Xk0X0WXEIrKiUY;2$z9btcM zcT^N7=)(Hj%HWZNmMS|y0wAkwGGfUpTZxqafJCUs0!cuLDaUtl#gAy_Z9JtNunz|T z-TvlXM)wt@p4P&Pb#2TjFSFJxEVk4?PrEw<_SG3+iS(C|jn@`a;p(5nqv?;eRxEz} zgU=B~|I>er=nuAfVmuBF$Fzw8!!d?o8je>@N5OeGE<#!v$YT&p(tvgP0op=#5?fqh zqh%Vsu+tAZpdIyd`VwLa9vic+qgvU4*vorRC$BJuEIngp^-8WOM$$WMr7vPw_2_d` zu_pt+%TkdSjh(iV^>~0(`dx|4MK!*&*i61h9Y6bs#$wjdOFDriO<$Nwqp1gbCTr>a zfU>x{7=v@Kckm-Nh5QLk$GC!xvHGNBjDQ%rChfq#I{Y*6uMz*6G;@s)#Flvar1qev z;9na4L47HsV8w*|_lS5un_kVoNH4D_Ppn!B!9Xc`(foubaKjmR(WX6j6P4tauc}Z} zR3W=!FBU&Teu@TV%h=%bq zHWB9a?XK3QZ#)d_Sl`!Lz?GVw7wDgw7wDaWcn@)M*gNUMK0x~uSn0?x{Y}xntD(7j zUxU&mQ0W3mm6~u>Cb;$9nI8R*3H6)7G2YI=+hA}B%q@$%s&@*0EXD(vp{jqEA}}Yn zAx@}$Bl*Ex@u_&?XHe=mTA<5+hRWkjTS8WYY5y(Nt*AzZ?U6I0U?&fLCutb(>homo zU*6o3yU~c5ocbQ}!LoE&NAo|WG;O7@`-s~;h)-F)z+_)5wXAoS`Y8FzrqHv;))k*giK;AqJ*p4Ffj*I?`(d3vV6U{z5B@eExNHJRyeQYKOrq}B7DzJR@VWa_U|>NwRcRQ$W~jO?)%d7|_ad|zLfe&Pk`$8-AE z*T2d=-hNqR`YNSg+MNFNKT7{m$-k`qOYs=~bY%5V{X?En|6QZ%dm6NY? z1s2=#MALpd*4F}BZPBS#6JxujH?#?8uN9qAfQL3jFEBN;q9-QSXkEv)$kU@hGpow? z$F{C6BkVV$$A7Asl^7t9s{efQ_<4@ZY+qqufQIkGHc(EU)B^OpXDcwnsOLiMXiycN z)G;1R`QW=8PhbqpKhl7#`KlagmgHn?M45t^lQM0Ka5y9P*Wv{1Mn(s6c=V45Hl#pA zFS#kA)XQj635Li?m~Jiz^;HVlsUULOa}vNZs0Lcj?RBQbJ}bW&9fbt zuZF+x@AX5FiZ&YK?(t2iGbpWrYwB=^fwZ)OPun&~!se*oTkEp7Texf1NM0Z9~(;m;=zv&Ii___!#6mA1tX zIrm0kCo&qUjp28azh~`%SMhlyc6S+B{N_ej4yJuDF-6lB*uX|*O6M|R8!6L5YXFhu z^Pg&Eo4Ow@O5d?iWoKKLyjP5+)EdzIz3zKA3XiOBgXDdZORI@q3qYjpEn|xBEK+vw z@}cM0=VMndDGuo!Dr-2V)zhm*Vw&lbYqDGKd87F3MgLlZVL7M2^;Ib6W zgbHbe^xnX;h7aJsr*?t8>`8@fhR+*NDsrekBLkOxELZCF(!+wkp6AT^8}PEanBQjMGVP1e5WR?CD{X8|3=T@o$7W)r$EA7+k2^zj zil)Sy)&AKSC}${_|lb!8s| zhpv3V01Hi@wV4Ti@^xh~gF(1|jlnRiK`|JiEAKEU(3QCi?!&wjgE6}DGJ~vQXEGkicpl@y zjOR1XW4wTIE@S$3R#&o)QeN~CkFIoQOq&nEkCpf-XZ#rBRgC}081jNR4>5+Q0dHaq za~rsZFMCxs}im#nABuJ@9t)JYukO~%krcE>fe1wT#IcL|++xQOw=dX{L$yBL=--okhqc_4a5{A5k~TL+3n#vfOajn^6SD`3!ZhgDSO(Cq zrj;IsWnhS?`h{yC+yWMd#pnaYh&mqzj2d{JrUjaFzE{q-{KC0!49g#KuXztz$3F}e z4IW1DkJY;4dFY^lH5li`$`$a0EuqdZ92G(POMhX0!nJ|!XJj!yBci}haYO3)r%YXW z^$VyDXNj)7#Gnl8Ck&?P%5w~+>&l-P%*2?*V3w{FF_^6@PcWFHD~~dmt1EwGFi%&; zGMKL`4-%NLK)>bpOj$@P48s{N)|DX)mSJs>K{@1;!75$p!=PGMau}@Bm0k>LA%_gM z;;vo>J9Onn2D^2o3xhgcNo8JI$uDN}diXK$JMg>csC>TU!Ml|kz+a(-E+?#Itp zW$FR^94=E23a6o~hlKN}t{TGGsH;bX^SG`y3TKn99tU5#+C&?preP@=dk%A7Ew;e> zz7(s+$1prEMnNp0)nk!Zy4i=#{z~yq6hljENYt%uP!^-rU3k-pZStN}D3({Yk_ad0 z%J^2@pnj5|oBoO^`9WRC_O|EZU2%7sTWr+r`&VP7%sv68Jm$NNjB%D`S7*i5Y_NOa z9xm&C&SWkcGQ;NlLwFkUFUfQr7A!62-sG8m>SB@7C5B{2_#^{QV!C0IZ#9$J1UJO~< zlXay(fsh&8n{f#m9b*n-X$IfQcpB4hWIUbmwTz`1d==waOuvlrY{qRE&tV+LcrN4f z(Uh+=n@=#t=zx4r?Ilx$&&0jDsXZmKw(hOe1cn8y0GL~lW zQpR;m|DcZYI>h*G#?lNv5kn)d2#WQwoBU*VSq@U@&~CdavoaZkpVF?KL+!&n-?ag3z_eBMHJB@N&cjPp7E zH;kpR`vAuu#`IB)M=&13xPWng#`iJq&3FvsI~b2;d@JK|z{0w@oZN>rrbx3mh4Cbg z*&f)mpCD!ApUjl2_fcCH0YgJCW74HWa#qt(3Pq^p1P-n%#Xuazu$C-W2cDeROA+gI z4U>y$5XfiC3qOC}Q_>t{CLR9@K z_EXqiNrsZs-{7jVAW!hI<(vP6{Tv=|DgRcKf3y8O<1@COlTf2%354zESQ#d(AWA~A zpU>~%SY$t+k&x`?CJD)Y{y{>rpN|2u{k$nUWIwM1Kptd2uVxyw?_2Ni>vMi=Kd)a$Ce5YG|6kb8r(Pp|F0h|R!Qx{3`5p#k7+V=k!`RAT zI>uH8GcmR@n1!*G!EB7J4CX*@Gnk9{83yxor5l6!x^f+XKP=F1xSA;o#d=-&4a3FI z-wc+)_hL{E-;2R2U5RH(w?Z`gib1Rki@gzV?|^=v<<(9eI)e$IN8 z?B_3~{X9tfvHiTYf`sdXPs8@JYYm0pK=}V#`&pUMY(Iaz@@MR46>Sl+pEoRp{almF z_Oq@O)Q~_V=*n&9yGqmf^z*PWg%bZ~{9s!ADq0_+Q@^n2ll?Ji!z!#>_!>0G2V#mg zbZA4?1^ea1kl3#FKcJTycVCIGa{HsnA5B0s-&ZhUKS6_wyV7*~5b)7}wF%`dqG)Nl z)dfmut%AR&!#7%sF=k@5vE{4@T6b{__b34{juEMPM(aS=s1~|os=IGaTK8G!>_5MWkZC7eqw(=%c-g!MB`f{uX zYz47fc$!|Ltt7~VHXbO0uA}Mo`Kd)9h-%S@_5Y8Eqb83qXyFFu7%1_`EHuS_pUfu) z`CwNXmT#K5>WqkAHAe(nMkeC2b5RAW6wGbFl)5cB-j+N7Rc62ad8lFdKI!UW2P(+c z1q(g4F4$LTOYW0`I0#@nBvA?s2iyy^V`|uySx)(&)Z0=+IovOE7>gW4AD5Wuz?M+7 z?xMxC5Mdo%74D$47P5otSD(wi4cP$qERLr9f7uDFumOO!H_Bc{g$7Vq4sTF^liBB|j<-e)N^eKVO#h?r}7X#?~(F~yP?_~geKbQgZ zeLe%|`+f|d?|TEd#DjBPdgnWtHcwY>C-BI8{f1izj9#F3Oy@@n#ahg3FoecWWdM!e zi2*eJl?KLx5(nm#jj{C09V3#G`DBpq=|n zM%e%~F_mI#*e_g3!ZDS+M}+!NDW^_H0CP=SU|vm?F5^JPvzXqGv2+=ojOQ>toAF%6 z8H}aN*p;z#8LwfCu7mV{!&thEmokRI4f>mmrOWsV<8r3YV7!X4U|h|3D&uvGpJH6g zcp_uzVm`un2h$5TQ@NyzIULwHP>33uTE`FH=7)zEzsgwpnSUYt9Q&EpKQp}%aZUs= z%uVH>bTyx1+{CX>WGr3HM}XG%@)N;moQhB#+YsZgPB;;ar9d(TQZO$^@4T3R z2FD&|eqXwtLm4L%T^T_5IdVP4N`Ku`x-|!clFgIiY)g&!hFJVfuq{21FrLD#INTcH zRvb>^u=Rvu#XI2r8#Mlj$!q?#cK$#?l3z%2>L< zPcbH4i1RBMOBeVNVAFm-G_`4e5P!wge8dsfYd)r$8ObrFQ#_dQFis(l@d(DbjHOfD zi?MWyZvi&#*Pv&Ksbe_ibKg-tkZX*IsHYLYTriWUZ>x)Yu)vIG3VFyF;xPZq!Abo7 zXvUKn4`od5F=T;p3FAJD%NXCucpBr|7*A(>6XThTuVXxmaVKC5^<-zwc@IE^b@cy{4fYcUZy8~>Too&GK1lvut#3TK`2E(11QBO89*s!F@RF+ z!2n9}CI(Q7*8><;_)ZKtwEYm@iPGU(7Kg?7J7}R*|Bm-Bp~2t;&P5ymq^_XzFX3F5 zpf=Hv1CqqhWS1Bk>k^|AY>R@}w|wEwF-q2kre&m6g6I$(iZFzr(= z7fc7#$_3Ltb#lRUK%-nRr3J$_5K1bl*lyU7r@z++&lFRWc6J`SA=;yNcF+&@vC)na z@3o83VUTw(eDD_f`0HJvlzu?k<`Mig9?mjNvhA%kL1+&9ALz+ln1Nq!+E2b^vB=kH zHyl-RXlk7H<&hyxQ{!aD)71DICHO5~MRqLCo1KIOOgWWt!Z>gTJ)=!lq2r-2`~PGf*~_-l znJ6O66o<)0ElFK~Ur%6K>H;zbVg6$)I*6zUL`vsKAg1vKnOs@`SPOaz(G5>;O3~Mw z_CGfcV0=3a{##h`x4_CbuE*g7u+g&#zdDriQEqAtGkr*0pnohaNpykfvz#iu;qtH@ ze{CY|UfW2fd?KD=$D#LH&HrgK#qz>mTWhQuM5P;8fPG<^=D;*ww3sxP3^1x=t_9Tb z9e&Dhb}H4ATMTdS786jn2g8T^vA;$24KLjzYVd6uC0dQz$2!WJ@J(v8>q@NPStEQlDTTtBr`C#{e1 zQHz&x5x#swuCU0Rd5B9f#tdm$$~m6E9uC#pcbA72YZl-oPF~6$1f`{bA$h^(z0gui z$76o-uk6<`?^x>jGr!$LJ{^7Vv8xr%wVsBGkhMXM7&3DOa$>O0i=%GDsV=czn`zIa zV8C93HyTEo_AUrwPi%V8sZPGjizcUb7rx|BZ=lbrnXPQ=3d9CInyWg3PW!z;M?-O0 zLh+IO%Xk6bKrBH&u^4~dM0-&28Y+|%wI3r4+AGF^sy;Ik(RuUh5owZ5twRZWW+lXX1T$339QXnwNWq(H1w> z=(qF)y&-;?o7|-5}un-=%Pwv1t;7U@-(n?v%ZZ*w=6Q5ET8E zzw+N#=qY_~jky!qA~c)Qkr~+KeHH6^h=47ynfTYitnu9rmW)Mo8kSfqnoN5IV)Bty zM8}m2VfuSSAHm&Zt?>XFfTlelt}}=ZH!SqYGqriRKi*@2+cR&`O6B{+sKCca_CAMc zd*DB~gR+oc@4>|(0mT^`?xV)Mc2pC%_#(6+Hf1!n?{-B#E*^_iMxuo@VgVL}LcjdpL>FG70L`9YVaA_ILRW zY;1p>0g670f%OWM@B&sBfK?tmSfA1MRSlg5ZF?sS;LzkzI#YHoNw-jS4B?b;T7jI$ zIT_bn7qc(r`J&xcN?aCT&OrW&JBcy#O`!=VYwO@6I12pp+JhsfqOd*eg69)1lNi z^xg?n&aRrkJuQQoi0@oI0FZ)n3Q9gOF3>O5c%vq^HwuTTo#f`6_%X#u}LLVU!fjFgbB8o5`(RG}=cfG6SXhP%8Nq~knX20euG4uedg z%w^D1D6cVa;QL7isN5GAAjRnnaPop+kS~#o#`n%w#Y|D9I1JPNqU zpuiu6@(=UHgg}jhQ4k;A!!N8vIs8Bi_qMRoQ<#Gm-h0>M) zub&I0HRBSk1<)BLfOu^9pjCR z+cU0W+<~#=Glj9_GnKLAGmWw2vm4{r_}z5IXRu8|=WPSH+nI4D(;FD~WPFgZgYhoL zWUL5f3uBG(TE-s66^!#4XLDXOLxQ_B84qLJl`#eg(63=!!1yBhP91#A-1nxF7nD7@SaJQjZ6!>pU;BNB*6TD2|Zu1u=6f%Lk&5KO9n+e=) zW-&o!0(YC2n2^o{?lv!j0Fi%%=^a4V{j(XjV?2j(5^#90gww#eViXS8>nCCs*m+ba zMW4~kz*^neD3nRSy7RbDCNO9c%6~IB%L|GXa(#k6+W3_g2rNYw!zjksS6pEM2Aem7 z+Z8G3Ps9OCgG6TH*W2Kl3=8^!5C_2EV8ME-pUBLA@%53&{Soy=R95BmGHx|FSz;eM zI|zFq2J|CD_g4&q5wHNkgA^o-$+;MzJqU%iP&msG{+yob&T7ET62h`pHcGeyaGiv8 z0_T9-5UrDVyv5)s9=-;Iw;>jPWg4Vm7J~?BxR*BAI({{Aa9E6;PoX|Y930db*SrGD zF0wIx)%~H!)3^uuLx0bP-Bnx>E4ldVdszF$X3#JryyckJ&wl;=#x+l}eBAy4mS#{b z=;Bf^x=X@z>MFXQPJluarV>$i76JZN!ZN_CB%BWT8wqCtwwG`Ypk2awfNdotS+hw< zf|ev9$yh51Nyg$NBpHj5kYvmvVIAPP_n937@U)~h0uGqZ)TWcl^LP&a@!=iza#>;x zB@Lwr*!xoi2sx@-c7IIQ{i6H(!~GAL8xKvfSWYVOAx<<*sgV)xqus%eUI%|rIrK7% zLITx%zRH+xOmnmk=+1RyhHen*I^Buw!D?-p z6B~ooO=Zr{>A^OkZq=RGBdqQyb7EVty0gr=2R~nwIrqBCChQaHZrzD}!fIWa^ALXa zmpQ-0&w(=MSNJ(t<~%IaL)4d5gA}}al=`sRNP1m8PQ0p3B)qg;_&zBnK57?uKs z)wFK_S1G+bk4XKJbxdz7|Fs8eiOvL}r2mlyjU>Z0nF`+@#}nWyULD^V^X<}K;e11U zo^L#f`L@N>kTmPdjvOW=$&sT;GIj|uNp{6Jgo{^^&lsMC411H2=Rwj;3r=RGE6j?I z$~2U{c~KWSnD+Uw3UYDW1+EOG%@ms>yu0zS4LxbG6y9A+dx&W1-@&WH_URn>ckuME zg&J>4|888fe+L(G2vSGWc7kDR{C@vwQx#_51M>Px%jE`PUmS(YQ9dOaHerhg7vZ_R z^J25-_O^uNxxFbNd2Vwggy(ktA2bTXb34T#9p4u-famrtgG`JA4B)wa$-p6$ItK9E zb}>MT+Ze!e+r%Ir`d|^I49~3-1M=MLKq1eqHDHV9b`~!Mjj-qT4Tr*>+aXS{Kq&hd zz;pY8!5EA=49Ih<0)jb3p4&3OX3yGG4%O&MqYSLdM4#OV8~n<7G@g#JC(7b+#P=GC^1IqZ))FJ+~zY zU*NgTV?u=I_97D^Jhx|<5aGG`m=NK)-N%Fo&ut(RB0RSoCPa8{-I);Kxuq~6!gI4R zA;NPz|94_N!gKqY2@#&#r_yuV33}Lb+r(IUZZ(W|bG>}_F~zB4{13*57%N+eE$1uK&@mR)g#?Ydu zH_5-3vE+Y}jPnt-*JK%oagmI}xP)LXn=^`3240MtW{v zGa`bNf_!ZodaT?77{` zcn%lwZeZAW%Mb`Hn3I9-02Q0t$#q-(Ay(#>lc&UH`cee3^SqKhxQ`H^{pW0)%tHVp z*bfiU@O_pxqQjmtp7dhn%!EdASg@15lHDx1ogHzPAe+#xcGz8k4g$6pULq^^*Y&=P z31k>lggl>{%gMos@V3?-(8jQ^L4F043*FEE9b4btU z&A@-!|JwOS(i#(=i}b%bzWV>p|8j#LG|tjFu#Y4Cua6{w?1~ouYc3I`|Mj|r z#(`6Ug|#yZ0p)^^FyV{A3$q^I*frWySgH4m71o7?P~KSI3-n7eR{b|R#p+0RYR&KE zo&$1`u;&0fL;jGCeFwP2rxP%7rrE7s$MP!HH~I!TYIa)Og05J|QY z__!yya%l)8^N~+agT;uU_dENa7_rb_j9dQ;g_pYEq_Tc?gygy|=MEI0 zcKuIvpm}2>xVbZun?;v_8>~yPlrm*zNxJSapfL};h4!B*yYQU`$)&g#la0lQ93F`pYN@xI9OV|jwT0#tf z59-+W6q8Z@{d>4Kfv|Hjo?9UVP`X7_9?V;!%m_)(@8h@0wj!;JIZnpX+k1oYET+HA zSbBSZW;}=Ke_}kB@zac@xA!<>NIcRU&v*gjhZ#$6?=)lBR)}+qvGn$iFfM2M0miEs z?`2%gcpKw&j5jc@Wn9U4E90eaQMq<7{+O|JjiNbD9n()U{Sf10jHPSz4dbIs|B7)V zns<_ zCuX>=6d&swE80^7#!oL$q((k{Vy4n%VbCpMnbj8sgMXQ5HBJi*j1!VhT)%5daj2Tmtcv=R&!Y1=hUYV&0pbwDkSaoC9GeWgsEA;LJ3Ka6-Y>WY@~!u zEi>8oLPOAbqQC5XcKCB2jK9W956IyF7`z{RgGw3UPThkYx4-y$RyhA;431Y&{sH^L zn5NMJLhgtSZ}%M$-jDqYmp}5no|oGz+BlYm%{e#1vU&MH*s{sP zp2v3Ip2g{w*r@a7hli*%x0kuqBGom94jiDae%ZW{Xp{<;J(~*oA z+CPTx?I+LO7p8%4uPNUh=SL)%`xNr-?K zy5fZfT!*7P&C<+UVClX&#OOpXzJeF=bnJfoh-%&eM!UySkuuUVI^=P>M#2TTx z4QjMi7(W-8kN95jXZEkYIq6^TU&TZ@mD#jEi^!oulaYBRn3F~(617Jx^QRx|0P-TlyL&QtsHh8E(#q{j0Kk!rJ2= zd|j|Bpq}?PMNPZ{J=i%6eV=xg`7@)ROpx0_hgaafi?)bKCsC$*W3fprku6r;dVCnp z&>S$I%r4pm=*<$={UFIriQYEYn0OU-`5Ak#yRxAzp@aA!t|5WYJ3HX?K&xQ$-ep`* z%56iDH#8KE6_tA?uL8j(DwZaqg?M{g0BO^n$xBT80V-XUG7%K|uS)q{Ga4R3IDWv- zySvw|^FSp8?03}Rn3yQUuAl$*>6Xh~AhPoLjr2U4o=>~zdCPuCH*J{w!nEIueu9%g zLz|n|qUKHeGmnC&>?&_NUPvyY_2l`gC^ynTRe(!6*>s1mWxt_|4#0O| zcQ{;!L9{a+JB{gz5=|V1V2;7H2KY#t?jpE`x&yvLL2enFP5bP}kfNT;pOSV27jr=m zXi>(pw@%CRX^__#zUKq^n)ZN<&TddwoQZ2t8ncKPus@GiCHGI!%Tz59FWavKx0=W^ zFmZ<(#W}(Bme@)yyQhGA?hQDzzL65e`Qb9jQO!wqqaXcR z1rZ9^vt>a%qQYpLd)mZxh!M=>8K{tVAY-VIyYU0{VcLTbDlyXG61kb003+ZvqZ~Er zz`soVOUIo_SjbAFg3*Fj0)BB0Fo|N}S{!tNjoHsI4~?a}p1e`yX&zC2a;K-TCeY8c zeVC_dg`1$LVg{$v{s6b0?2g%#7r;s(WFE(v$_(*}X?L)6O9J)_W2e7qk7XM4@NX!K z=6dSLWb}w0UheSW#*+FdAN{kUJNgKHxQv2eAAP|7wEP00o*Jg(>Nspq62ER9G*E`Dol;4G|{|P?Tx$;-ILtxCySJ`FkW>_>xo9 z6U)r_UI}Njl9b$Y9g<_M;rm_vcJO8VZ8%*ZL3{+Pe#%qeCZ%$two5pot>i<*W69k` zvzW*(5s@gh;rHN_TV$$<3Tls{$=Lggll7x~KUBtMj+jox?AgiUI|*NEOtGbx0oj`} zsAatr_Zyx<5j!JS7ryd|f%pp`10kUVAB3(e$G4{Vi>p#GWW_*Z)G z#c2ZBcXgZa^YLZ+-8lU#DE)sCU#5@vq5GtY9&3wcvi}gk?S&<;qRm`F?SKg&S9ZD0 z|1834aTER)jgRkzpYrif7C)8>kTSuCBDf%0cctQMv#xh_&`{vwmGrHg8dIwlms2I! zmLBP(>NB4vCSBQT%J@x1k6mK%-cET?ctZO0f9ri>I{f~XIC~nZ7ks+YgxbxOU2Wry zx@z$$<};D`v^_lwq2kBViC3Fn;79U{tkZGlpell0?@9xk#4xe$idm@^2Z?DFAI)|` z(}lQpcN@R9=&>s--oBKhE8E>|f+J%8!v95jvJ{kFsP0Lg$UenPK6veg0n#$jUDPW* zA7QTp_pN+3k*=^Ix@}Rd|8%Z5#ecf5H`#wW-*;J{xUoyj0`!Blia_zWe$6mF3|DLRn%s2)QRR?2B7}OZn2Urc%lbCqK5q#-wLb+nl&xb~cCX*zdY|7e(IQki! z4}w){8Fbc>qj5om$jc-F9Of3EXExvt zuDZPJ!+ExxvrA%Q$s#U(m`n!p+-)UvITPLLo}w-@%PHwIFi;nLF@| z1u@*>xI4QF>nv`uD$myEq`T`0t!t&$i&B0xeg*wB;9|?OUC(PGH-(CVPv!D5>8mmA*$pbR2O{bSk9}A5-ULx-dO}TQG^1kX_~L6Buv~SL2n|JlR7ttIe9C zp6&B}_M*w{qx$*U;3rz~#p5R?&Kr;Hp4!!5)e28(G3U8HeXa7cPuiZo6GH>pDXjGh z*i7<1MBW?up3_9{aQpR_?YElL5w+iHEqgV!AJbie=~P5&Ka5VH_S=S`>ECI;IN5&j z7q%ZN6E-%r-`SS-E1>(eVUB+CAT=J%e9|S*_%sdjd@;9GlH1>)d9$l*rFA6KVUGD3 zacnE4^$QxC3J{&H89LrXvoy9+no5eK?+($)T*^XpTPYcR6k}ZI%_F!54R!E%T3EbGCVELR63y=y7pK{B z_rObPh=zb6@i88Z?`dTCheeGfs=FnP8jn6Wdi+> zM-4ocNw+KrksKh+WX!iX!g~PWdm@zLj0P9%iGXq(K~?Pb==T?qX2P_z7u^mI3s_OP z^!v+lQ5HoLo4l>CQoe8pW(wmnYD~UMs|iyb(@{CNV6S);u||D`Zp48TiEg)@zOTf5 z7Q}s7DlK;y_u~Uud6$K)142uDaCmr_s=1E{VF*8 z;g{+Bwdo`de?iwE?l>~Z0%VEA1Du*u@K`>y2 zkUcNOjH6Hz^tPSerV3MohZ0<^_yt^r6;1}+eWi-Z(()>3JkmTP0ItQ&YfFub*Y%8BR=n0JunqHbh>AuxbW z!JHh52Fa3XxX{5d~I?|zoxG7KFLFK*C^%ZVNEm=hhK!Nl4zyn zLPkJ2^xRsiY$J;g$dL3<+)yK+w4qW{k$3!GOK9((ZHEpQNN6HUD0NX(cSA>6$&h!n z$G*t+pcr)23-wu;d^^zZYd!elf>gT}h`q#<-DG?EThvDBE?eng{JKSzN1sxSQN^Kk z4K7JRJfxv%U00$!^RWL1)1YCK_G84S;WC}?i=;D+F(IG0*1z9oE1iO8ydE%JwWXo6 zq~Y#xdEH1}pr{BBZC!GTKz88toW2xC!|^#ebBKcTbNVhI3J%c8fpn)iaDq->)O?zT zBXsEgk-oThq{jC)D4~?aT3eTB(36cD-bm2K9X>E#J-mmaU;nGfoswxii0CRPsw*kNAd4}3fqK>gUiqoX0@Jo5DDnH`>@6oG!i-XcAQRkpi|6dimeac zNSylX?$mR)7%L-lrm_>`?>7@g?wz4Jq3reCzZuVmo`L)cSVMj3xgXL)RNLyWWi8;@ zr!=T=VhchhL`;|Pfh({hMuM@C z-8F5E!! zcS%V8nmb$EZzSSGwrW3CsSsD1lQr`gB6C#X#wD%CnaOiJ0XF~BEcPLZ`4os^jx>X)!b2vzD|f z!HOS^LqoT5NuZ&mJAV5w5UtPER=poCa6OjeKnr*K)yH$t&RtDqqQ(^IBg(|2Lh0hL ztrj1fypRgST$E%~RjC4je6Fg!I${Uiar%mLUHz^u1QS`VF%4q5r>uQVn0s!DNQ6->G@$<|M9L8cYJgh8miQ zjg#5HRnt@%IB^>`o!YR$M|^b6*B#6S6DKVdFXDeS&7myEQ|=wQgLd|LhW;0EMN>sC z*qD3AZVDv!cLM;}7>Pp|B%p@78y_zH<{omxpt(h}H$$iUrS*J|Ib}z4;QbY7GoTmQ zU#5UC@e^aktdGA_A0MlW6}w_{PHioVxwUlcdKq3aT1>|-+8n2q4+CUqAI%^IX*S46 zY)K@O$PU-fsog|k=EQ%0e1;zKXXilkG32K*q5UO>{?lwX+%!r8E9wz$6I*IHG$Gmg zVJi$Tz$a?Yjo(S@L^P=po$-&jgf5BOQBUSXp~(}&c)=0|nrR8+Fl;f}L7*&RF*weS z-}#7ejO10Hcr*_~uZgU_losK9jLk4qN=Ay{^9)bbok!qx3UAk+#@p!B-hzK*5g{{+ zI1>ToSN-rPJecX|vSDYHB;{(N_F}#QvBFpgYx$@>$1&s#T=NUjLn`W zGlo2=cjIAHs}n6!3dQ@Es>pG?IiU|20wiYIsSoR&S4~ps zm0_xzHe=lwktpE4l=jYjVV(<47TwoG+QeJ3W)9Wd!_%5VrK+h6U|tCKb1@ZGeKDC9 zTNmV2?AZMS2pC%kWA_(BgxI=%C~_1nIwsq$VS3DvVlsddf~S_6568B2>THhP&xI&< zKb5oCAhqgRqhkEMMU^C$oE|&=zfFa5HKBg2rkOkR@$+^4SnawAb=pld&HZ;I7JY!)F;w$)62=Eb zAa`%&#nChN-^*;%wpi(m()_fA(1lS`tg#pyPz_I2oT9!J^Elt8h(@Q!IW6E6Z*-!Q zoUIe9>d4mFLJ}#6$0-4`v1t`~*p0-X6$P5qT~75|IW0Pr@~pMHvdwUO;dkKc`Z@GF zsry5Nw>gz#7mejSam^i7_Rep?{0r9Qs*!Mh{3O|pQcUAz_xwDeH-TBG7cv>rUnD=?`OVA1?pqWQ2((^PVjMdwy>rl6(b`s%>nLhma1%!Q*CEqwvlM{=?M zWdpMBw$41y2*v@(!hFiHWKj@h5rqz=RKp$I!a-wE_$Q$-Tn*0T>FJ9#hG2mA51+m&+|``zi4EyvTA zf7X_9dxBqFIoJj9GG04eF<0JU&;GT6P>;WNJGQae4!cHd8yj5;tPX2mv|~bObFlC0 z$7H+Pl?#IJrwG1d62SJ}lJU-JP;^JAQfyar_)C>f(=M3*^_ZO;;>GpRycC zTi%|s+yYC-1*+|CyQ)Hx^aF?R{1cvocn;%v1<$*9oN&Jcj}MP3IQ`FNo76okWu0A6 zkYmp+D43SVgs`7pkY7+>!!y~>CK^fgta(-JJG@VgHl)qLhBUf_w{nl;p{5IHALk~N zM(jKELL*Se+C9l9qo}f9jGXNmTATD_AI2gqyL;t6U8+dY?(n6? zScj~5k@v2?;fWukdqAe)6Cq!Q>ft;=Qyzu=TU_FtEXvnmM=qVP9tfJtKlCJ@0ongy zvVUKvMf{`Vp|fDQmo1;xmXUKQJ{2}>x`Wd$cKWeNj|sa9*cSX0As@I2;d|qc(yXK# zo!CF3G*INKshDHq39SWjugAQf8T(_nP*W7p*T?*m>{sOdeFc=9*)QN?=Ww;-AxE;P z_Zq66Bl(^rR`uQs9X~$bQ}xnTH0lw2`{bc@h%`PYS>(}FsLy`ysd{@GYA`r^7QDpM zYrn+eaYk57fje87dIx0en(Sx zbmq~uKc7qclOq61?t?t3hbh{DN)64evZ)!LVUVSz&yB|lEzYu@Ry1u)5_d*O>KX5!$kSyAS0EaxI1Mf`V zmb0+@_{<^CHwWIa8w+_3{O{D&|oP&ShN@^=P-Qw2_-Tkef&?*Jt!?+@zo0d5{-dn|Wr^OWU0rv1X25 z3exwTg9C^x^<#37@E$&<83|VWIlW(#db^#TwtvMAY+48?a(h4rbw>}p-&u9|b|+4K zAjIWZI=}I7)!`lXp-r~qS=leb3)4Tq$_4gR^(}gek+2Ca*zv;cf6asyzKiZnQ!xSaatQhhmf1!m&yt1iHee$G0lV}9XkesvkJU8`-&Ve8el z)v&!*+xlR89bQ>nd{khlP{A}}f9-smDu7hDx_eXN;w5zQAbIH>u;65(xKWi)@gH1u zj2y5<8MbKLhT-#o0lH+-?Z^$!7vZ?SH*bOyixrb^n>xjb<$VP)% zi&V+ATwmqus)nM%E7i%O4#+4p>sXKMcQJcUtgrz5V}*rgC_~qRy~~EcT0xN<oa^p~py&h1qHltRn#s$PMencS zRQxl#+blDs;*kg)xhXUs! zxE>*c3kQx5WpErhB~ooP_Xj4cuYH57eq4g|am8P+jgMoa=L@oI zHS}5M@tF_@GvaWj)9c8s*Wr(H3p&4^UWbaV{-Gte&IyaoA9KJDvM7>0_>AoU)lrzw z{47QqMa`hcp$*(`O*MTY5qg&n6%7^jvHdS0YvOs>4L)OlB>rz0e^C?ixEq1R?5*>- zAW-nnkj+rhCTsBDfJfGoV>E{1odO-$OJ8owddxj<3HlN@bF}HkZ7;6L$1#~0EU>^; zR7a7)eG?Z^o*>dA_V+H<8NzvR0tPeT*Mnw4!q>ur94X-!<2@tcQH9%eoeAY_p$4^+ zbSg*GA~-1_LT6LP|n=KNMQ$2#5m$N&rTabLlKEk1bl z0$%Fk!+QRyvN&=swGK%vG(NoJ^;Dr1f7p?VonUeAa1QE0@Mcw}tt*3LtO%LMPj!Ej zhdP6+zI_3w0hQ&60)G>qWfawMPc87v5fQjl3(V(BK3ZNHuF$C>Fs9asMgPLplq?aa zrOY6`n-617zM7*H!=RF~;MDlAzP@liVv_0)C5lqw?*ii~P7>=}l7qfy3HGcj~(J%AhW zoQo>41Qc~uk3~v6LqW9iYw~_!gJF#b!4>`$7RjPd!$5mb`*=b%7bB0lsz)NzlB36NgiW%j5dC#Z$W2t& zx9GIwTWGMa(HuH)f>hJaVyv)whOUTFP-x#Yv}tJ95YW(}VY7x#f+722HeJ!6Ef;8* ztKCYp=@JcRGhAT+l12YQBF5|&lN~B6YL~a&M*~P(;(E+g=_L*0Gw59&p-e01Ib3}A z2i_{u`5_<7C|ODI)qBhTfwBn^q6uK07e%6Cw1o?FXihms7w6dj!9{UJ>eH>Pi#!t~uLFl<(J%|c zwKt|4b>br)Lq(S(e)u#M?qK>JUho~QqJP2*w<3wQo2ipoIGZ_qb^?b~QXt3D`b&+p z!6o}ZF=CAGzg8g)h6?i?IKVix3Gvd(h*-u8e_l<3UCC_i12EugZ`%oCM2J+{l84(* zKgSOCAUm9Q1HfA~9J#12?#Zi*qmCLCJ+F)T^5~!{dapRY%uEY!1a-3LQIa9PY7H~G z;z|O1HVz+H8^gR4#t7I&h*D9X9)Eh`KF9|-aDf}WIe2y>S@b3|+CX~GZ_gx)DpwHi z_dK|>$-*r9b5G@>pIm*1LY+2L^uc$Lo>@qa#H=n(&qv^rELz4qXn?@;Ehz0gjgV?j z(U2mM?qS+9nbv+I47kw(siRY9sIZP~aIX{+>NE$luh_Eh?BU+C+*iRXp)LYshs^W&~(G1N);+cq?zoi!MHp=Oj%yyAmk{ z{VedtFgIMCH|~I$zOxd`rJ|O<{~oC8vAswpU9#ez$)n0-H!R$h;k@W&!snUglks8I zzl};8SXSPa7q6Lt?-98jt5H~n*3I^0AE5(mmwMyBbj3%#3m%^^|A$*la;EbEV;5$G zo{0X%ZG-puHF@Y@c(N0&1t%T5`XL?ChWd*%b$?2xvG~Vd()AbJuYewx{jYCA)(Sq) zTw2%m0&Qe_7QLNX9N?G>3C#N2z1y9GK*&);@9w@C<6lqSF*vm;4n3})OjzZL%2K6La>-xG;@)dP(LF6PF)+N!)MRq z=%>QpJ$pIL+#LE7LO-+v+4@{$29Zs(gqdflp{2aj)a(AeHXM(>?Lq{&U<@&~nK9mp z4UHHx;6!xM@BWcD(_iv^y_p^b#lC{xhgP+TRXOP`zc*pfj$z<(SbUc(^k#b6TmLbCB!>X`*XbsLv>s|D{2u^m;x|O&NdAhC zm3U}%B`ZFBpc4{%Vms#%V#gnil>p|zfCvx(Rb;5!X?6Pz0`Z}EVXQ6hm=mYLkag<(zIypwXWmBg9 zq~Yql`jdv&?9-n#T#X5!x_zJ?)t@w^y_a>PFpu*m4d>TkA13Z|F*(Lpw>ak89Hpxb zkYNYQHRT{PV6KL_9A+QP^zK6|)I!YyGQ_o?5+pIxpom~b@-EI=QnXpKX=(o6d87oB ze=3j51L+IOxjA1?d1ui1A>L17)bWNK)F&_0;R9@RJ{T?7z{;~}J~4jnriv4;{l0bC zIoM8y?=4}1PVa?s4|UAOsBG68ltS^wO>m}LQK1NnDt|l!@_etkEWR=G+C(7DAd1)wdRMF(Kjh_Pg}&s2%LzvgNVk$ zj$J>3BXk}ckQ+DAp*=p5^k}ltiK{$N!9B)P0)q!B$uRCk7Zz0q7Aj40oWg3v#-;J& z1<6JaHZex9FL9h4UEHK0tlA-0(i{7+6AThr2sZ5q7i`jdGV$uWrfnYBODg?(GRucy ziK58k@@i^UJkkr^!8-`}fG!s9rCl;c%+j9n<(gSKd4;vGA6 z?)4@{`aszL#S_(s5A^{xSEymGxZ|79X0BHpwQrMFPSD4zSRWfVVW-FlZ=#^Mcw+aH zQpD~j#fsgZM+y?Vf0SI1)LK(Lm0OI69jS;4hm$aBufy&IR5;j1aTKIOYs*G>hlW80 zkD>3qP8R*gV&a(~W_n-8h@#EI*aI*IyN*~Vlu*BpROilCrgq24mF})UYqHx#TY9;_ zXvfD1ZozWA)^Q=q*F*&qi1OpuoI;h95Y5m;g&JmRaF|}ODeo3+)@DJVTd_{37-F56 zdtvKXXR$DY216Y8?z*|VUFVq`STgLdF{6boM&_%Le!VFDiYZ{>dx^L5ASEF!npcO+ zkVmR7Lu;KpUK!`~m9RYv27QRuZr5cx1`9MS)Ue2uhT?M>3d|)QoF|PxM)z%?e_*Bt zZ3)0`fJL|r#a4$M?yq<%@2B)O`!7%7-9xA6o{Zg3MGD$btijO0#pF2YKCaV3kpsa1 z`5ECAce+l@6N^*R61#sG|51-@89YdNmKSZUy#IZ?L_dXr>+(%_a~*gc(L~$$4AvK@ z9Yj02t{b4Zj?*koRpN9Pa_%=v)(ci-aKXtuEcrOvz#qO_$n6R5RQWJ!9 zhzk!wb%CLd5A{*0T$yE$kn49noiwQ`S^%vchfA>7z9A7}`lKs6%&z#;^EjJv2|h3`nb*I_~FA)Kv%gA-<3S< zuKEUx_xa68N_RX?2D9#qA0(4^i1%ut#>6S-is!0EM)=EQaKYrVbo5!R7?w-#K0L0C0Uz*EmibGjY(c1Wb)W$z>Iez+Q>{F&@<7~YZ5qfPIC?{*bwuV-mE+sa|~;K5;pYr_fIltA-v zA0s5UGA>Rr#?dMA@7}$=c(-eg=6H^VbFGYviG%&;R3nm*IUR$K=9wwMh7Rm0`x51c z+wqHka}BM|sp1BFYd-HrJ=Tx@JnE8HLGU2eqTXyyAgrp|uoWoLjl*emLv>jmcuq8v zVen861v%TbpTms*n#gM5QlEWXi=bHI84Is2x1J@P^gx~2|7SDF07M9 zSI;N)a_rhc_5CS5Mo&C(yb#@;y7;TEsz)PP@dP}Qv?%K+ALxn>9-2v`GJTwC-NfTm zrMx*@TQ=e(K@@ZPy4zi^ySHD*w~Ejw#kTA>Nlo3Puve2b`#A_64&?Cmi6;}iOiP`= zZ=@VOIeg;v$;7qnc4qgG3mvd{(~}(B1hLUxBM$s2 zb4(CWy^Q{FW<@5oV!FNNF7vhM%Tqn%S#ZEdH35cOx!5N1LSiXIgygHu#Fw7?dD?nG zMuc*;H9CDdtK8@!QAPC{pRS^rN3#`_@u0bhk#_K0i|ad1YB4zcTnhgI_@sP0#<{~> zv2nP1A#uG&+lW)WvA$8%?L}73zj%UF^N^8?qbmB0dPUA`1)M}mCzoOBK-h?$t zdf7R>b~1Cvt{2jA%aTZRiPJ-;I;|Hc>T7uJI7o5iJ6Lo!Vz}|73n!zL3ga*sr$AyZ z`-nzA9`$QDWQ3GhYbGl?)s%L>*4C)=Xki;qY{wR2cmxzRl;A zrb?fQ^9yU#EN9Gr>AgqV7iCS>y_2cufClSkf8zC26 z!Gh~AN0J+{@e1SZ6S}hlsZX>2s~VfVcm?AG_cN$#QJ{CF8?v6w#Xzgqo^{>S}&9!f5_hHO-HM~ThLvZkmYezltO6;?_n99sE^R(*(b!*C1YL z8#D&`Ixh24RCcUxaDLDvI<2V?y%U|gbTTCyv4X$&R=WMIpar;f!X%+tso$SOG0BS(o z@uK?>K*fu-yPo^(6el+NddM+jKcA6 z;fM%C%dntuJ>GHOBd1BxH88-gitX&2^@YpWum=RORi9#aFQ!^C+gC#Qk2WQU6vXkf zbo%KxOMkwq@SWeGBaF`9A!o#v7BhaPtxs|SzN{lhOLi)`o1T2svaE7UQG zwrQMK2|sXf)x)sD&{{7>d0=&5dX5^V47~AJEsR_@dNH?%jg<$^25n*;wqYRR(|B^~ zm-CT5KYSO~^O!BoE641A^ByHCy<{wBPR*q?w61v_GY z1aH)x8?iqvZ`@t;Y#9c_!pF$xNRBNF6lwc-;cLGo#@-ymw4@DWFPoO|XrBiO6VPi! zY&j(>qEmW+I)aH@{DUp_nDLfUvgc^FPv>anLD2H}5sv2wf=?`i2a+BmfBQc}dWvVM z#PcdLLl+2Q_B@bdzu!qSZV9~UxV<57rnnThKfw;yZI*jtvvCi2VIwppu}n)0+4Oz} z&)}+yO3;ytE_;wU>_auh$8$Y{7h6`I zgdeYeje;&&bPoIFJj2F9O!Z^C&xf!({#l()*I;^Y50dp;O#SM)6cSO#3wN{4Z^WjW zecnr^_z@~g)ilGsJaHEM(^>&-e@YhZU~2nD5)n4l*dL{Bs$io7dj9**`9YgqCK*774}s1C+wqGj3lbsHpP|BU0}_`I`=P=Y>HQqMr&k6&aV%-k3MA(GV*SP5Sc`%C z++;ex0@J1mZ~XOL&pCEo0ST}s^gb!8<4Xp~bHp7_#_X@Xr&Pcb&nZEzj&$_oQAK$u z;;0xN_c(r3c<`b-RP;4`WPo=l#O*(Znd&yjfeS#Nn1|#!_V?h1{M`qqWYN2G$dEvt zr!ORh!jvdNoIu#gZ}uU~ z_f^lXb^LS_8lBsXoi{R@>hdphcmDsURF?>g*uNK-maaO!l;&HeSp>~`8JOx4*>b^Y+V-^|F zO~VB{Xd9_8JJCI;LQ|xo=#gKHfXscMvVUIAj}4u-?TaMTsvv-__~4BlS@=EzZF{MD zDTImJRMJ`UVd%UK+MnlR_)C_23j!od?#6%AWr4TQoXmh|$&y>yzMKDlhW~eB6K=BP z8h&4h{}i8keALVnf1)n_Y@!g}EHRPg=?({J)z2ujcSUY9cd@*-tffgOYy-+IZgdoQ5ofx~fB)&gsP_cT911PLoJZOCC(S52d zzhik@xMwUfW2DwVa#2Azo|`y^3f~kX6`@poAZ^9tcPvNek&Yzb^fasdQ=XwOmV(2v zNbLvcLFxB?*9T_Cq5L+@b5fchTO;3hJoiPg!pj2xYX61if37pZXtU-kCOIJcRU4neEd9B$NHQ<4U2v9J0UD&gLgf z^D%9Hn9T6{|NlNo3aq#jV*>oH5j6e&KCbQa?$Y>>m@gCaT*0Tr{!PKBzoO~?Ao!u+ zXTPfL+XdGPE*CssaHgOs$8W!^{mtE@ahYJh@Let#68ras{%$e9^1rmdy@H<+Gz5psQ!q#H-60+B8-fYJ-wTckJ|_4R!S4v(Ex227t6;m} zrv!b1YXnycE)`rTXb8?0%oTiJ^zRM9gy8Q5eo;IQC+!8at`-xbWcTgQ8*V6mVf zc!}goshEEte7+_4b-|$Et%5rR_XwK$HB-vlhhNa)z9x9jE^WR~aKGRY!J~q&2#yPW zC^%F2oFjON;1a=VL7(7f1S5hw1-~Nr_kuqV+%I@Ua7^%=jQZo6-8vqh5sV0q3$_Y< zP;jTgaQ$p~0!TSXF3!3~eB}Tsi%t}kkVdzR}Mm~JE=$@(+6{S0oyKg;FtTYj!_v_a!i2@jtYdAlc(13)~>Bx?>089F+Nr6b-UPKU2h~1>h*UUfl#O~w8H4{cXbEa ziE(#d+ZLlI8VU3pUA;zIXTTq6_6LLA+nf14TuS{j^~wCV2f721K(oKQTl@Z`{=5$$b@boKQb+x%gp4Us{DwFWxC#psG$8aDjla9>-OKLYEXzV>K$ zfC;;LyCPlw?yg${=$9&&x1rYMzCn1_nQq8!@J$6E%p=>n+C;*-^)(yneXgdu)!tgj z;;S>Z20~$Y3PXg*wm<+`)z=g3>kafqAPI@oOBP^^RFlX6>el-s;PCHw5cNxWQ;- z5{^b!7`nB&i{iE&R2;I%L#e!G!^ZXC(9}ty6N{8ArQ!KTI2dT_>gYn!`pF^E)fVmc zhmh`p9%EZ)7bK-j>Fq-tqwDSv`w}p_Cy_>0!_>B&f7f#Qn+J^Nm?+P<+obJ8h zu5cvK+eYy;f}y_6NLA!dd!WoPe4)NpXfgycTBDn>k!!+FQnIA;3D_15g`fyVI09{C{yy)=v=M>m5u zrEsA@BpT}F)a~#`%xVEX8*gZAs;y7?3vWl*J!yZGnHEjyH5%Ps14%`xla_p;R4?GS zaed=PpKn7$Q!Vm(jai_G4e19(B^(U~`$81M(yjoqf{GW}w?@0VBgVF_NT<;rK+0_n zgisS*-+-F0x#I31he{;aB*J}EDJGwS|{NatgVgJ@ZdrhamcXI%h z<_h)#F67P;vQ!Kgs?+!j2Xw8|i;`(vS`xmLeY2XM*57shP#0C1+7Fju7dW9+2}eSt z$5Ns%WCf9br;%e4evK5xN!gu-k6Gz#ogg1)S4o#CjP}1a5b;rsgxa1`u#W2mRI>q8 z0DZkgJ1L#EY}D!I@%OeP5v0O7Eq@M+YQIyGdGc_CCwNO^nyRu4jt(gqW!NcluIcXc zPadO*@k!BrWQ?ZpcbXXK44=Z^$Bx-V|Ev4@(85oaQIpeY+tX##3PRwNYV3U6|M zA3ItZ`Q69`X7ZR#mX2xqkBZ?$In(~8j-gT|U3fZ_YLd9F@pp&KCVnb@A3x?)rY!xU zPV^<(-Dneh{z#`%tI>T~=i5-XzNxXf-nFTD{l@y$wGBomDgtywQ2C<4L_e|JY}e|f zhtUfAEnMNCw6q8MP4}h{wdtr(LujSJV?BB>{b)S>XuT|cO8TYXmiL#GFW*F=v>W53-v_;RtK>U^at9|rEOQMedzX-gcbEC$Y*O?A9@Q)-As?aTeSvmQLViJg?jT= zcHbOfL=O_Ft`uPu81AMoYiT4iDj7ESg}PKf{ll+2+NIk1g5~rM#I_#BC4v=%2(O#5 zH=q&W(n~ACC2W^~84*x-dpDkt>I+t&x337V5X31(HeX5D-HHeK)x8b$+sGV+8PB#5 zo~R1LJq-6S+{17WgKrpo!*Fk-93&nPpnDr_RAOYgVP?6zyW1g$xV5)wHzZ^jsTvkP zK(+_6pKx0{!q9$z+Kv1mAj*$&gcJ_pJ>)05trRZXBZjco=8&K9<`Cx>{%e}W;6}8I zIV8Mq4^yW?u@0FuNTKldUe5QPj!w>_o`_&acOUWUiD+yW0f^@kgx@X#09k;ZXm^C^ zfyfrs-nEq;dR6V>$Os##49iSN1jtf)m^K`3Re1OvI;8p#Bj}In#Y16V0qtR=v_X(~ zn3nW`!xBdA#E8NcW|7SS+%gtm+6esN(eKc2;*Oa+>d3I-vf&q(nlGZjoiBoialj*$u`*^>-}m4Xuf zVhMjSg-`C3!Gse2VhX=)YoshJDDF!n{3R4VxuZBUQqsWx5($5agug_>Un1czk?@yD z_)8@GB_@9fe+h?Q)}h+UqP<`ZgfcNk`K7I_j|&Cd1^al6L}udARu(1}z~0Sd0kimn zneEvdyK8#(#%9V)iZ{u`^7KR~x{Bh;@$89EG*w4WgrZ5vSq-FUl9}}w$mImc^#G7q zk~^^_WEtn(8VFH^FwY-RTan>gk=cHrpAZS|N9YllBQQr`CTSwb_y{tcBq1rna1X;h z4EHeH!*CD7Jq-6S+(|-`ZVTwPfNtLApqdvBsxa*5q1d&RL+L1t?$!{=2HZvkf$hPM z5j+_wT(}b$njR8J6Hh4`lyjLqV|Li|_2KiMxu+!@9HQt`i3{4W*%OU3_E@xN63 zQ{74auMq!Ni2p0Z{}tl@3h{r1_`gE@FBAXE#Q!q!zfAnod>iqnx|C7;FBAV)ihrt4 z$^A<4f2H`pQv6eW%I@%2Q;w;jO^gk$^=>lPu5W6%!Mg#>@JpM)RGVuytZ%B_)Wk+| z_qo>A*1HdY*u4sAacC z?Tg=QTpJrut*Kk9tw}zwHx(-T!FQc%Jl+i{e{43x?MMF%Q;`vJ zCHYww36YjO4FLQ0K#=~M$*5MGU|##7r|+rT2j+~itohQ{tNo1y7A z&=f#(t&R!i2+*}fe><#{+28E#3sRfH^+m~|#pU6W@IrFucM<|Wwpv)ib&JIeDsiJ1 z{J5ThZ(=~yC5x78cFfUY*5o=2kdu)rvUKb3wXGa1+R%?_V})s#m!1yOtY2E& z7MHXkOgOV5nSADTXqiFJ_HE+cCT8MC4(&pK{u7(gpJFTtmr+t^xro_9&5`-1%wjo# z4hAxpboZ5(gy+-4=63yN%10?BB$_^z{tJ;k{i>UL3h8uVOX6$Nm2`HQyqQ1Q6A^n) zyQJtP2UBK*pUPA)SbjpU6RZ?;3wi|e-jVeL!P$bvf^!88!FhtEf(r%91(ymg7hEY= zE$9~X2zmv5f=z;(1aA^-5o{Oi6zmoZ3PuF`1$PJz2<{ZzEtq&i$A4V#q~QC4>aW^8 zM=(#&DOfCM2$l+#3oaL|7IX`G1$}~>1X~0<1%rb9f&+rP1@{QvBe+-aJA(HK?i1WE zI4pQX@F~Gj!RG~!3jS7bOz;)Kgy5@!m zv7jM1PjI2&Qo)siZb7eLli*E)?SkEc5y2gTI|c6&yjw6Lde|>GAh=U-x8NSZdj$6i z-Y572!3P9?CU`_}RPdmv7jMXDp)Rfm(&Ay3*IaE9l;+6J|Orr!AAt25`13pw}P(-zAE^p;QN9( z@9KJChM-fhSkMqG6)YEAE?6z-5%dXe5^NFd6buUX3l0eG7ThCvkKkUx`vmt1?iU;u zJR&$McvNsqFd;ZDcv4WkC-tJBQ?OXj5G)le7hEn_E$9*S32qW>5$qHU3ifBQrn13L+UvM~s z&h-C3jWf_kx5-0q19<=M{CxWr@8hZdsYaimX`Tu{F5OiAr?Maa$wYZfx~amO%HH(X zGDUoXVn1%WXQYGaf53DX91|SPus7+al85ss8~?NLAOnwl_vpp>crE`ho6~<>LLF5gZe2>5_0dG#Z;V`UD3A$AoV9X6@dxMdO%Y@OL^Lg1^_;@{-1V zCXR{uWsS~&_CGGD{vh`MF8GSZpy0rNX!F1yHIAA1pV~Z{&{%#<@J|{I$)|nmb$I(W zXx!`5sIC=k&^T`5Cb9pN;Eftv1cNtebMVs|oqyKh`Cikw=Pw$^1NyPePZ6TOxtIgTdvXe&MP%$ntkiE{iwKSnybCq zeR#RXO!L5#Qg4{`z38_g_3`j;wfmlsgcH`dC!$f&FB?x59vc}Z{`{DoZo_I_Ky|3i zs#A4ghs74G)b*%d)u)2$7KQa~6;V;O6>E6?YP-5sEmliZg<7hvP|MVnYPqUZ<*HDf ztMb%zWvE4JmAX-VTHSxGmTVgA>ErmRbZI|0B{!8(y z{4e>MDvFn>1?+UMDz%V!EbsI>KV@E+dYkyN4EjSlb*VaEU7!qgp}I(2tmdf_bqNS7 z@RUvT@QF;9LwC!?M~BaE3Zl%~G>*jP@*bwklS0)H%@Z zx$3-BSl-mz|5smH)eY)XDCak!q<=;=s}_ZIaMh$Xs_WGCY7^>`26e64pnR%MU8CyN zI<;P{Kz*jasJFtz-IGLf{ zn#ql}NR|X4hxz*`|9;w$j7{n$6W*`YOxycTVZ|&zieEdnAAS;!AH{ESZgdjh)VPv> zAH{Df`7$}Kj&5FI?pZc?7kYc^=4Rf{4{JIefn0FYK6vbrZlrDgdIviDV|yHXfKx+& zPJz_*cJ!6bH_xo_9(r>_Xo@#-vAGL$X3lBM2+T4zQ8%*UvF}y!q($&4t7bQkg%X~k*R;c#3iY|D8o z(D4R-7HOh=L!(awooIhuS9?J7y{2!wQIBJ2bZ%iyw7WZuBRYXzoKv^hH%72ALw;6! zpP!?|E>?RwylKh)7ae?(E&~1$1;UG$<1nCkDbSp$;JHq z;Q+NB(H>1=_2&-IIi#uG*Z9K`V@+RZn?ICFZ>#^cI4}~%{_QOYoX@M^a7-kuC0Ua? z??;E8(6r$=3p<-9ROHl&*(EdW}od-Y?DcZ!`uXd}^va z(Ba3vz_7_t%YigVol;A2E-72m@ezDiq|P|u*bvc|O&-w3APOuWb}>)388}Rs3hDI1 z^EpfKHZu=s(a%W|Eq(sO8i-CPI{MYk+1cLLduaqGE9qnqj%y(T6O)uuh|W=M32YB< z$6+g+A_+saS@-F5R{$Gq{Sn$Jtkk;J_EfpB>VKwx)cI|lln&-;!H!fRx*YwKc0N6Z zQ;Px74=Z15dCTPM-%3oaQdth2Wy)tMZy9`W9)^zDP0h$EkF|Ve@bR~A_4l@!oM`Ko z7RLxniM8^XtUPD%3k8so`q1CRgtzi(AR@{P{4)F_SfuV|1L>VtBti+N)nU4q-m1NkZUfVOzoafw(uFYm@wCQ|n2kPd`cuiJcXYfnwZ|imgM`4T(I**I9o~WZK z4+3UIZ;kI7rg5?An+;6{-yjq@m1>)bB{vK>R2hl%LER>#zqQ>!dlJTB+bu?bS_ku} z-_%voY3M&u6?7Utr>%0P_ILU!W@>-wETMvzS*1+vZ}K8HHT~p8Y-;+`7pbZJO z^_0-H3`L?r8sOqWhu+AdKraqETh8z$w67F3J(~{|NM~0&mdwn>!Z22Zm%TO!M1}tb* z+khoF{k%0$(nevHgf-GT^{u%Jt&a_AbAzj1jA}z~Beymfmjt{0+fUQ4{A4{!)cxti zGP_k1`jeUbK5kEvVuf`2c>T%DKvF%)%>JX2}`0aEy}I=;|=& zwCF;k50zMGTNefux)<6`^cx!8I(CR3TzpYz7LHs8LMWqj8XCUK7aBEuurt$PF?fay z_ja64?`kvjbOR3mv!^BGgv%GuC^amtC@-(IbX+As8J8j%dV+id3Ey}E6Ag$-_lBvuEEtQxDQ2-M~$WRtBpW^(2tuLaM1=7 z5zT4amNN96w-cM*KpUOoM~%TvTOS%oY9+&p`w~3no22$P{2i1$bmCPv4C$K$T+v7$ z>pu+@Q%rFGhs;iK4~P>bJ(tF^GO@gm(bk`lwazaoxXWgHTp)0RFq78q4G@Z(p4^E z0rg4uGxcpGR7~S;*-iLqh{sf<$p`M29i&Ht1nUpJk>HZofRu z4>dL}i$I=nZ%Ef7)SuNg%T)51omNW&9)=$E`h(;b7mU!ADgSLDX}mE(JT;X(jZneM zYioU!-87|y%Px8s>5dtgnDU?v`|qXNDFT`D_$@hx>kvHDGBqj?g`^_ zZfB8xWgw)nF%O`%BA{$>Q>HK%M*RfKT^w3MvmK{4o@${9Z9UJ!M)@YB$?RJ(^GA1$ zboB(gdAnDi^rK_g@c=1Tnf4q34=_iQ?l9xJxlmo?0`u?%KuV(Q+y6Qh`^a+lN zy&>i?F?Wi;ahu*BP@Sc5>^1GbMa<5>XtVQejpO3(%awfxLN|O;yAQmnQRQp*Qn?o` zDCS^+wl@T|7U8_#Mja3Jy7q7S%fw81jK5A!pD9l!pQ+5lB8QothQzmAaIauydY;V4 zhha1QO`IYhMl<|n$~9H~?Y>T@*Z*HrnpInWyjb+x6&Q+&q~GPSD@mlFm2 zJ!bxzW}10`b?R<5eG!#XH*Q$#UDNbw%*9fNkZVcvPBofa4Pb;72sF`EP~Bavn5fyV ztNls*p(oeV)r*C+(|J=6gNm+u3%4UmSOB2=`mFBhrVNuufdCKP(sA#=c(W{` z&$wss#a(i^^`H$msQKGy;)$*rOttr$ySe8YXu?@s3=cRi^lt-N=e6GSg(|n(M0OMKR@z{jE2DDtJr7+SSavp{a((1T+eu%Dy&$Thw~cwbu)4E4V#I z7n1HOtStjBev7tcUIv-!Bf z#kgvfv6Mu}B;!coA1)q5j~;7}=7Nei=zGGh=b3o2s$(sV1lF$M;k>HHd1Kwz)gEw* z9F17qUZ?=sh`GV-(>4uAt?s_`d?Cz~RjRSGZ(Gfp)p{Ij;dosab?u{JEl0b$uIu`) z_DH8`R1Ijab@)qIfJRzc#zj6<8mKQveL-?qvzjOguctL~AmYjsl&hm19f1%n9ur+_ zsBa7Un!La#x6xIlw1_VJqoT}roaq9KId&}jGWmvR1nb|#1iuNBBUWzO8S_M1HXhem z-T4m1QcRa%s>S>_-&koZDZ^e5EGF^n1dk1j9*hy`7`h+%x&c?*v6CS)7lwH{T?hDI z2yY36$MNIa+P2b~ryfO68lWFS3G3=|``b`W1X4Mo!*g|c1HBeIQ*X=_S0!USk?mz1_1LCO7dJQ6NMjm=Go78Q(gUbYSdd6P+2Yn+~lx9A&I3FjUC*-Hq zmyRy#!QMy+n{8-x$d!TEBgA!BE=!f0G@Y)(NGsEJyuQ*552=V^zMRadgb@AY1?x{N zx7C-(=k99=2Wz&snL{WupUjnS2@l4P6IzDer+umPgkmf0Akp_c>LIv4645g_P-EPa zg;oqb??6bGFIv}S#gm&MO=48oO+27Chqb*XVILPmX-;YWE-eN6@j58&TR3YEsqr!9 zGiVZ0t_p*HKW!oqi8DB0Y;Fmk7mkdH;Y%`;9D0Mrsqwg>FN)Gc158XFa8bkflFBvo ziQ9Y{ey8G7ho-AK)m_FtTXcPA<}i#Vef7LC#wvjjU52O$Qx5fOYRVyzZdqwY2d%eW z$m?BXX^M;nG<0ZiLzwTu4VxiV-<09c?AX`Q?P)1GBn#$Wn!KwK2H9U_&}A!@-zj_| zq3yZ@Bh6(Ettw^k>%|0Oxt@(NS#6a4Ao(|8$LEYrudx?+|qnQxggJWC*LW^I+?1SZg{-ez{LB)EYM)r@Tl)7^P-U5X`Zi7?mDR2XgnBqD*56 zsvv}();DNaVW#8SzP@(4pjFR8VIJD@PBiuIE7+-~p@!-P^ZIU8M;k;b5b=n9nn67s z7%{(%sSeCiB6Jw)TWL0(UILr_xFlTPkAhBK+m;5(sa4EVx|I|Li&pRNjiNtKeRkaP zy`HiK6%FK>U@ye*Q3Ev&b+vB}G}Cp?7JDq#qv{YT(ci4m0a7~f@)8LQ|7$mR-L>m$ zZ>Z(aG4GG~v~fpNYe0{_e;c)PxC}ap{cdJWOgUvB@p-bbm9{l z4(aQ8k*Zkiz&Hpi<#a3NDRi50j~dXrzENJ0U*wG{*<_S#!ZOz6 z;ejH9LqnhgLYxw=)Pma8>O~J^jHT=JFh_}b@iJJ@oG{5jzcsW@N$V8aXzBMDKI&@I zJ(=V*xtuhStrz{Q@zp(i&2S2TJO;4JOY^+g`ZYy3w6=uR2UHu_8(oKso{(*$$&3}!!(Y}o?sSeZLTi#y8B_KUcXMNVLq{vco z((cp|FmSs*x?p;+ou;*nyD86fNgxL19oc3rCaZ~5nz*)N7G_n;@zDOwg;0!lmiN=5 zGH*abGlso!$fh!LXPO?h8kR*$lbPm2xk6>Gy$|&gRi{0Ew3Vr?cyKo9>w3c&?{&3x z(XJ7x)X_T7Dw9q!A{u=Pr{VrXcOk`pUCHIs#lfGm&pyc8-~TW=XZsa1*Mz(fX`a zyDs-#L)nqiaXsSKYp_^1l{%exXYBV#r=y5rhM$&K&j#_@8Wb-bhE^16x6HyD=@aDv zlPUC;D^%uT)mth>6N9njWja!*ODyRq^LH6BHzk-f|HMmX94OA|_?kqfhT&@q>FGh` zTfbI+OYAY=L?-6VUy{hkCuBrQ@QltmX`d~sQ@ zcQd64{je`3B{W}jr>(I+rlQNFqYbn*e#*oQewc~s>!y0y-%VPdn*9kIi_vwq1RQ2n z!-? zU@4}(@m&D&TDFzU-0|E-ORw$1uM8heF-mDsEIh%!r0g>6`bk%#wC_+)B;X=q`C0_} zc{Hg^+dE7(r+u=`n6tT#<{W5FkoF?c?u&_3TwkPjDjR9;yj9uoZv{PdAQfh$WTlxu zprb|LZC$8D`gPxs(#52kih$$-4a-$eBmNAD;D9p}&3ZagPuF6oNLNiG&oRKY2x}eo zDC&3U*-nyTl5$J)e7qkEZE7#Z1hnVm^mLI)1)AAR86kszaAWed_>t%~m z>yxxx;tvzu_?`l9K1W!*u8ydu$#_PBj40c*Qv*epCOkm9h-DjC`OBxCT7}oE*{Iam zAC{ei_kpYbdF>ryw?}YHaGY@XtRf<8Ek-{<&0kSOpQ;Qt!w-TGMBCoi&pbxsxtob9=M4B7x@!|VZ?gKQiyO#L$H zcZ1Fj*L|m+g2nxBsYbXg^769Y+S+Tg%$zXeFJX zwVtB2%C7e2s+0I07rwof8BEGd^v=e#yJ2}}BJePOq%-thjfePJf13_!eIUCDbQ>qq znSLk_I&h+pz>A&arMLWR;A9!%~H8bvdZ6h+|F|R?IU*e0iN=w zsb&P-c{9{`j})l$BKhjPrs?XurFrVSC3D8l9xEE1Q1I^udegZne>G?S-e`&7DUy>U%X$qgTt7<&z8I88W996h$6$tZ8LM#%%*%bb4mVq-dJw%!WlVg2I6H${05x(z9Amxrd-^ofJV|{o-;oiH*Q>_ zNdEVqvMU1#ZF6QT=eK6G6u|C6dzP}lnX7ykD0L^En~295x$2Bprl}c7Kb7g`$W@N# z^HlyL)0MqxraAyWFX7oCVNW#AVE+od6#OXoQN$DeCWHr>t!5jge?!*zh3Dt0^It)l zMeK+t{NaLz<#^twuqbVi=XRt4*=@#?bAyh5rrGMxmY1#aT64y;MkVg;GgS3iN`31b z)PLlEPQIFhFlR&091-MIQvt%rXZK%#rd`4ydaK#W!**_-I=3@RIgmFF$meJ%2--*= zVJ>O{E}f=|mYgxhX^$`r3`XL3MwvG>^b|Wak%r>lJ`HlAZ-dTU8=fQ06nFGEV6QUm zDUV_2Td36M@n~9vlW9kMBhaZPlyi(XzJX_DoA8Cb%CtW#SDi)SP3ERhN02?aXZjO) zM$xf37hyQJ>3o}D7MkHpanAziG>w*dqMcG!v(1&OT!`7M2aNj$f?QyLf&}v=nw^8k-B?{}u61?pCwa&zxB{mGdoKzN=A|xZXfN zmf}BWF7niNfyxeMl~eg2gZrEd@|1IFk#hdajPd-jyx_E!Tpzjl$nCNmRcyOcp&ny; z11e>kou_6ap0k^PkazYHr%u;bpnpF=x%nsbZ_!Vsx@Ur!;sQC0??ct_{PtE&V>RQ_ zAC(nEStQ+S&xW36sXY%U^=CYZn>76dvxRQ-#~904=q8vs5A#&@K8)XggmfewV|nt~ z{5{xJe;Rgka@CwSb5P%*jzN7w_J{B^ksIQZX(nDNztoy6og@tCf$<>PuY+d!LHV_q zZFRY-&Z487e-G>Yqdd^{{`9o|l8!!sZ>->XpXEZh8Fq7uP-i};^SA{(=A4_0_Tfx5 z<6kD`uhzL76?{smU;PqA^mZN331&{aT-9<^sr&HkxE?gcd8!y?W)|X>M`1&LtGkvN z`rnWnw9U;{bC>3*oYiJr@>PCF$|CH`@3pBxJZ9Kdvu#th+GP5DJzKqQzW+5_{Z-ys zS0cFI2Qv7+WK&P$F?mfiLwP~R^_-QCb%^S@X=>}2ZR(yqHsz-JlkA1>-ndPjb61-0 z1oJC->Xr69^%DG>{H^Y`Gjr6LknPMRGlSfgEy>d51$LwF+0>5rZBnP8&bOF#IYSu( z-wEXmIySsIOWj(NrF<(5R{`^&lRTW`bF0Mk}+_7gwZdtY%v{58vlO zU5fN|ARQb_&~`qRubzU;BS?ptkl*YB*}U1xYw85^&QXRhOLgKg^G`%2M5Uj8?5D6U-96 zZ*!KK1HZa$N8ih0o--#~<$o)8ET>$DkET~$hycqUq5d@LB&2^%lT%ekveXTD`Y9YL zH*aG8~8w zFxpD0JMYO-XYNMY_M_hFw5xqvvsBKuEVWO7X(4FV8(f{4v+rURvU3>p~$V`ZUFj&-ph=Wq0iaH=ghk`_`8-j93LRYHtveRV-xc^} zo&ItUGPN{XD8Ij42dnmGyS-fLt-9S9+b#SRwzIO+b|SW&EMvaZ?OiB;zZ<0Ky$;g! zl+W0%l;4+Qc}V@n3{b|>J^au7kC-q9&eur3B${ucINcmD9`O6K^?VNXjZs%qw z%g(U+_%vB#`}}nh%aZ)|2WINXFcNEi7x^Re>wI`zK4hu9Po=-J$~_hb^l(2@)w}K(iXCg z{Jm*y@>eL^*q`;}?`SA%c*mK~l7;&B?^)t{p4dHF%K2UJ`MmzdHHZ5;-}Ev!oojrb zX+8Mt!g(^ar{1SBMy2;DaX-g&++b^+eEkm!xW2x9Tp-7Y#Ep#HQ^u*o;4;RkQGFfn zBDl$Wm$>_R2I~3hgI@Yld|SjvURhq8E?&nspobg4@f%Q8<_2(W7%-~T4H&s!&L@4h zhI5O)Blj8ohjw@S`Nq2Lxj@_>D+w3slBV&!?bZx*y#L}3>(0K+)$MjjOMS_c>Q>?| zE7_B$IL#E5uKRB(&(C>0D(FJA_E0P(<;iFDP2JpH%_YuX-`n$#WLdK;3zoXzGRDgW z?lZ1w1zmNIv*OZyaW$9H|1yS|=l<9G%l0)}fBY<@P^__VIl|_l4deebn2JgL=4w z*pC71$KLEm8T;WMb%5i2DE9<5!?snN*88xtuXw`lp$51@K&FgY|P7?O@?B;sD z>kkj^Tju&M3%FhleAiIZoxZoPOCD0wtIIvvtn)5!10@5t{u<+t*4gZD3U z`|sqQmgg{X{g-Dhah@w(fi0DCV-$3W51IsZ^u~*1eEJ2*HNycOh=g=%97_Hvivibaa38>F+b0^i|XRrzq{MN{!4EEQNz6F zc|F-L{T#oa3qH^1_-w~}pus`E3vS=nl|9+d1&?RkKB2@7snxm{r+tHZxj~EX5cP zVaDupu|l2>Y0HyrEOC!v#oH_P`9=lYsCvH}M!)tx1AAiv;{j>;JmZ}&jNAFImAEfm zUbvp}O=^cU`_Va%Y#(3bQm&C$;r_j2TGuP~`Rw!V?&o3DBSrnDFZR313kv6NcQ5@5 zd^5yHAD88O($cPW3-GmkL6sLVhmAIqWmUqlXm$=adeQb$4*0gu* z(9GxU{)83E>5#TOJ?l+!YH1NjqH=(J7eef_A-7b;dj&C^SfrNLx;3?OsMBOoP+Ncw#U6n zQQG `1|Wr|rl7_2%Bed+w33=V;rxzx$B(`H23y$o8>AntsqJkM8$pdh z0!)Ce=LPLk8gSja2X^;?;&lH*IflNY9ZxOda<}jGS8kZRYv9h2Tmz4Fkv;+U18jI5 zZ6*DRJUV6w$0k_Mmhx@y9@jAXf{@wTC{fBgS`&3=dbJ?%CeS8hBr`03Phh+KO zy0`B(SDN?d;-_zRPD?qv*JF8yvM=QNI*Mm_9P`Nj0e1nWeUbg?w6+~^u{o*>wHf>8Cxma_4;#nFTD_7lhs9*7pMPj9gb(}!hm}TD_qx#(|Qk6^qn4c z%|rrj3s(64uw$BfcgoZMX1}|+-g~~~^|uIZ;N#dI^muuE|JZ)veWRr1x+R~}rrP&& zTqh!NjycxgeNQRv(b>m1P@KnW1IE;E1zaOm{M}`-&puz-cLP0L^KWlJA^aio{N>nfh9+4f}lo-}RDy2b1HX7zBhUJST%`JF|t zsr&*$_af@`x1F@dWdU~&7Q9sJU!3+`z%#!m_om)G<=Iz0kmVVM)KQKT&jBM10rx64 zS=JRF&mAQFHdbZjbxs$r<16ps%By0`=>Ad5+s9Q$Q39f_5fNRE{^vaa} z*~vGrx0}blRPkM8<%^~6T<-PGqAt;C^1QiIUWqaw`%PX)Uiqxx$g9t$JLdHr;&+GG zb6tIA!Si!I>-8JOv+$`rvltj~17~^XKy+WmKWziPTl)^j1S{M_bx3=C-0xzI0XH8j zT(^qT`n;|W&+B^gyl!uv*Y$D(ZsmEMca9aE%W}VVSHPWv>377mO=n+Wdn?%E`q`uzg!B;Omx)^c52$1(q!^cUJu+OLz}cYZH- z{`Q{kjQSp~FLm!ba_@Z4>|Po9zTA6;)hOSp(_Z^>|G{^odvhOH#&;vhbih4|rKD`B z_s%je{VKjTZ+rZ91YMjiUZ?+I-RVzbLgk~536=Xsg$mcIq|fKP?|G-{_0s!pM#`st zq1J%A2rIu_`+sp-pGonIa2of?h0mXSr;%UJ?}1uq16jvwU-_<{zK5MxD5pbO`kS^> z@w&b;zbhNblUAPS4gN}*`wHV@pPh`M+p&*cIxd(9r-?KkpU zM$XmT(mlSr@zuP}_Z&sOs+;&dCq7r?+xT^UbH{d*McWv=oP2C!M^XK%@WmzHReQEE z`WEv2hJI1x%iPMfmUTbtZ>-dvzf+BcJg-p)`72`^^7n|P53}?@;}-MpG(O9=G(~M(`gN(h6ULpM3_6=QcU{X2S*kI+3F)lLy$Cm##OK<DC2Nr$k@+VYW&#x-@C>g#@CE58MhcS#!bd|t=&H~`ftU#0meg( zBaIPb)Odlh-ni6wtMP7Qn{ktIvoU8J&}sZQmG4#L?*e1JF>jn@`Qyf=##@a|#)pj0 z8n+vF8B49afyQCRrHr-mS8t3NPct58Jj}SC(HWOnIa`fS8e5DjjAM=7#$JN9@__^G;#5l`%nsKc0P-D5#Z+wgEiTpile9icfajo%I<2A-b#zH;E zT6&uCFk?UCht^Izj4v9Sjhl>x^0MGnSY6BX%rdi69g!8i^^IBMRNz+7sv1GrgQ6qTbxv2@7i%E*dq*y@-x3j8B=#tPc(DWl1fr ztFa{SN>R!}d6RVxao6V7p0uFKn@DOC`n2jxJY9o6xq5+C!yV_FTRV;S7VC&m!b*Hv zU|Z~_mz7_7N*VIP-h^6tGyF^`nx7c5)p-rowY*HWsCu5eo%AVnny<>mNKNvlFLCa9 z$+<8-zMk67a+65e{LaqLcF(NgZE$&Mua6nXJd-k+6IH;E zJvE$M$mP8ks&m-&^L)%HR(0mQxeI2}=lZM1J5u83%RtX__RM+p)4Z289kC~+d_9^4 z-@dy`lAMmnl#<8#gjW!0ZxpzUi5y3G>T$=*&XsjU-&?fs5?cQYUYeGYexx%KGE1?% zTg`XIyYqUlW>?N(1RCx6=Cc00g_VR_<5%9EhqspLXI>z<-Rs}Gd;MBw4dcaZuY@-} zua+n;UiU6uU)@%LrMuTZrDEb#=hz8W7%^I3+WVrLG_7(X)0tGBTzhG}hBKm&W{x_} z!HXmcvWhPq3{Cnv3yeVnA}qL$?RkhE;J za@xYm!uU8uyk3p=Z1EcLG2~Txl^R_r$J@R)B^M(;Ii|Dqg^Mb6%#`DgPwMFni83t& zZ%ugXdfSwmOgM321HZ%}pVdPKPtEyuQHf{CX-Q1o-T5RKr7KMEInvs4U!OPgyBCU% zcXPV2f#S~Yeio1(HfiCaGkGJow)*s0G9iY$$3K-T2@~s_SxuwWc=PqY>$H#Vc5yv= zBrts*fh)M2F}srcVIehM=87VM%t=#EJ8Ac5SkY~YOsGG%n%x`khLp&>lZDwW&pPv@ zsWuq8w*vF^BIx>*()GNe&M93|7iZd@dafTwm(qzA%w{V8?*(LUc{9Q<9kXh2+*NvN zo-E|&But??&$*-UEwGhG>AJMj4YHKd29*{H9xBUb*U;~OS5i6uBBrnB+!tSb7V|Am zmy%~PRmi-fNAf;Jw@T*uXJ&%Yque#ZtH0!)K4pJ_bZGB<8qiBU-< zbHB*s0*90`LBh-hv`J%N4#NN=Y+%kD=8>skZm80F?hY>DqVi_I&Up7iU|wAvArq=y zMYl@!ase|JoFMH*R@OLk`h=+?Muhc@{;sdGa`vM7$|?y@$=yn24b!~4JJoyE0)2s; z*XU>Kym0OgT{5jO0k3pfI*&`JUoHtWh0Vajc&IaOUfp47)aC*!EPl>kxny@oaFe|D zxyZHpD;F=28M9m|?c((|sj0h*vUr1-L8yV#EJkWVB{SI1p2rL}mAhYff3u|0a?F$* z@%W6{@p`-b=6#hj=hw}x^a^li)2H^7{!%x_(|Pq=rRTd}?$MRi?pWVA@p{t^N8||4 zIM)sKjq~DO>KI%l!-+SU8kZP?q;fk^6_FWLyv32o87GbR*1A$!gOhkc(Yi7pS>5iH zoqM6%xJu4Jua8o{c%-hrO12t3>BNZ@bh<}a&W*$8F8?LVXUt+S^>(eWw$%Ce-Nwyk zHFX_5ecTYH>7wOqF6YR^v&IdXEh9BkRWNZ`WTIw_jEFF*yeg$KnPcU`IhBlkbE|h3 zEcKFe;T6fjJ=@&+8tHlqZ9CrCqB+hBjN^80=3-*=as;ej70RhRjT#;h7+1%vu?r%F zy3uu+PkPqkIiFiQuXUt-D^Hc0RGunzSxQ|_ubb1byPSWtkGo5eb}H9e%-+5Bf1(x@ zUR$g#8Rwm)yG!^FZ-4wrL16= zh&Myc?y50&_djmj85NbMQNYb5c( zFhbPHoEl%pXCutQMU%MOVQeWZi}+3=eo$4lMXBYDG-ALNrN{ZtkZDSy)r-6-o|v75 z`FCWdLwA^5Yi)?K(od;!M;3YYZV#vXNW6N7K8*o;d>vy*wJ0~zXP;*@^JJZ}Ts}Y5 zxl?_W6B-&=u<(*SL#LbLVz6l$j=Lo=yLuiY^fx@taccr| zi0`q;tyMDqHwWf0Q^_2+ORi7ewe$l|aoKc#6Gcfp4==5|n1Rv__Bh84^RAzA<^B7= zO}U585pVr>bS{9?&|)<_vr2ut)NQ?;=h?&g9(Xjy+<76cSYfVC;iIq-&Sk=UKp%tV z=L~tHyca6(X-0;!9FzA?bCi+C(p;m1Se$iZ?7h6#n*Jqa{2aZN^@Pu}-e7+3fyw)0 zNtQeOvF9kOjdhPFy_R=UTJf!6JLn`9#M0}XOJNZ#yo|EQlWKujjC7d%K`e@8F?Su` z(KnM{w)aLi7ikK($ZDRCW5G26xhe3zcZ$Jy3eERep}Pa#cUq~*x(zAUjW2Pj2_-HD zk>{0CJ*z4E_Sa3zD8;VW9&czmC%diyo0Ja%>1$zto8`kHJQa1z} zi=Bp5V-47K*zMRlY!mhr_Dk$f*x#_=ou%$T>`Pb#n~qgsmtfanE3j7VF)WMy8hZ=- z80+=jQa2DAj{O@p1)GU2!Y;>d#BRgZU=L!?V6S6;!@jVx)E$J4#U^3rVzpQTTYze^>lXuJab{TE18*7 z1~KLntl6`Q7sF}h?3!wMven7$?c(42rJy2j#mu_17RcmWReaFm)}YQxk>>(lLr6V~ zoz`3hmpt+4*n(4;#(YtI$I{MZ15$e{T#_AE;uG9Njb2>T@OzxaO~1#xr}6jrIy67- z-TT0%7gh62Vgj@L$uT40O`#q2!UcE^Z&Bf)nBcaU{MCQ&?*Xgtm6Tr$;`%HA@?r=4IAP>FJhY(|f|NYX)5UK+wxR#fx9hfA4Wik*jcVE^=wuxeghp z@`-H3Xf2pRB*|yF!a9=VgHmyF%8I=}Y9;6&&)Zt5Sv! zhD;}Oh3-y>vqQqWbFJf3G?`{yG~Y=E^Lcs2_rKvU{)a%qSG1!?jvGI{=;Njv+4$=t z?l|1JXU-2jKj%exBT(nSDy$Mo={#Nq?%JW{1^=jw8CMu{#_*qXdEB_!m^X(1tjiO| zt;XORR<1E^Ts}uEJxGrrsGC;sixDG zPF<<##MR2sd}U^#(j}DnCFZw$!D}_mdnI1|c~?bwmHFp%WZcqeW8N5=tNEhFgfU-h z=FfF`wm@6%EFCt+jKSwMe}NH87ns_j%X7xiGn!5rlRwjR+L$%wjiG0C zdEOX*&dM_;D>YqUBxdPOjLuYl@TbbOF=hS&C%hts_(4*0lRpM+OV|Y`v^8_!G?+H71Q& zW5)Vp-WYm8^9QXzMvQS|)RrfVX=BdL)2K0L{_xATePh~~xAQmniY|{Ol;LYE|96z3 z+m(4sXDyxlruqv^+-mug9T~KI30p5^H%N116?M(#4+r%c-NXxj4G@{}#l+48h458kc$f>y7X)jMq4OWN{y ztChb(nYDD@(&0AsNAIwFmQGtbzd`-M?^?c%%B-cG?N4H*`ooq#dZ(si)(!>oUZgi} z^S+|Tl%>O~H649WnYFb0zNX_%%Cx0}Ycw6(WPVErf1v5;T4l!4`Oiu7KBrfY_&Q^! zH1C9Z%XtseW9KyQm3n^O<pj`$sIaYaw4D9ct9|^Ty0- zO(&cFW7{v3^UpHgY5&|Z+rBY$W5;@=EgiW@{aIt!+M#njQk~kTusmmex7@a8bT?bt z=x*t_{iLNs-%x+r7)siDM)yrk$Bj8-^j7s}jNxxt+8Dh}(>Y`O+nRQ_E0f01cQjqt zp90h7kF3z;S!3)DP3Mh?J2hSC51+^2cROyUkgu@4M5pD!m6|_g4Byph{X*LMy<6LH zd7<0_)Bj+3A>TjC@VbA0`~PgY|Izi*g>mn3tw-KiSU>rM`h!m@lg7gG;E(@n^$!=; zFR;`37&m|NbCwtC@y{~ZqV>-i!>yW57_-JuoBHF%j4`-D{V`+O=r*c9YD^jP#z?y@ z@3g=F?0)=L*Gqm*eRAdxr~fteO<1{EW9VMpPTZI=2JcgU%$PR1?^(T!DP!IkxnGwj zjX7iZ0b9@7Kek5G3FGIrXR6ckOsDkct@p3;=l(Bm|6jFV|83>k_#0~0~B1y?T|4R{Qp~+{;}?V)|fY@p0fV&v@*0=nKx#BqUq#MmBF7`+8Eqo zX=CsiOB;jFTH2U4c5e5q`BTqn{&-dy`MEOqyp>}NzF=u%=khwIgD+ZsWAGQ2HU?j^ zv@!TgOB;h*H61r*jp3IqpD}NYzM}rLF>8#zs{YRPOPW95X?b{?m17M5>fc{K-f4N- z(h0jxWR0N*wVb#yV+?*@{V`+O=r-AQjVWW^82N!NPa1Q^@I$uV|K;%@@ek^ewdJ87 z{%h(Rw{kPa;KRC|m@#d1KeFu`Q^ve8@`x@^8gs_*qv}r>v&N8(cezRWy@s>D9tH6) z;%9wdHi@rhBd4D{dD654U#mJZS z_%#^wM|V7)i&qp{w2S|e76|gYJxu08Nx(vU58+LHoeRw<^_W7BK?_gWhk0huQTP~E zfzHA{`%)I~#RuVt{hZq}pWlnY#sM1hLRg4pA$)8gQ$n7@@5bOZY$aOw9@d5~j;B!^ zYeQmi_y$oo@(71uW6;7Au?ln)N~{m5LvhRxi9I5*Lu#mVaSRcOE%IcDI9m9HZ(#SM zgPl7d~((FI2>nV z+s-ZZI2WBq7smmScp&`P&eh`=o_e@*%hAF*)54Xeg+DPZJZ?B|?~z|P0n4C^W0FX0 zlBcoB_=WPj(iplp#)-r_c^(^xU-(yS6k0goNY%yhR3xs-2iSJ{p0LkR97pmC55;!j z7an1L`R(g{VcPs++7=EUq5VXD4?7Q&^GJT*y7x$?tKgW*?_Jxmhbc#X|2p+(^~>*H z2aZxLzpL%>Wi3a3XWL`6X*lEp~&xU4?ot9JN%*P3_R=KY+LXz z$EkM56AK4BPWmT&33CfeT@GG+f}RTr7#zpGkw^;Tm z3`d?u|HL1Gw`0;KDfqhSJRE(x)frxIIte$M&cd>&<_W?I(^0t0bP{ecorS&5u>5ec z=_p)oItjO!&ca?(EkB%WItrJYPQpK!&cn%PYW^r}Go6O}OjCbIXgUF3Hl2fG&(b^* z*l0Qp-!Pqr!>4PWFswBlhi#_Q@D0;>IQ(qO4{J@wVVmhRES;fwg76a43HZ9{Je+op z=83`kOlROB=UVyjHq$BC^Q%@STxU8B&p6M@fxh!C51ec|3Uj7~mtCNF5^!Lp>JU87 zbPPUkItOcF+Q;JX15Emro5}CTG10<@O=sZ8rg!R1=>+_<={%fNt9hdE`=&GS z(D~{Q!`n=!;5O4aIBo7UPECaepYd8Es44H%zYf2^LcLshQ7zRi550ux1ohwuqJeItS^ZH zmcYvK3$MY#=;F9x5>G7h0Qa=iO?VbB!lY7QX)z>U2SAhuB^c#M)JkNA-yf29h_Gj#J@(XW%nf1|0IQDrwu-{PVAB3fmf%)nqSNrOU#kwo7fk2iwK?@CVUORa4#JyECt;7@njhX| zIthFH&iwEu(@EH4yZPZ$n6yt8UjKX5N%)>=_d3TKlRRm-^bfi(NqE5y)iF5pkD4bA z2mDFP55Z?KuY7pzpVgm)6W&lAg@fMIazbz$Ci!!4W#zyRG4FVNz)T>R=nP!)q2-5% zeWd;{e8qGQ-t@8hlW^?cR7c>SOy}X9pQt|tPyJMN6nQ>r)+rJ-Vq5 z!iP*};DsgXkHZ1X^C#5x9m}FWy)R_uWf%2wvAibrRmv(=@!L zmudK|y;Y~+-Mvl2d;6%)z@GSrQXxBr2vL-2$_sw431gH*@hl_Av$ z_?^M3Q}B_4RcGMlLsVzsABU*U!|sQw4#Fdcst&`GhpCRj1z%Dfhc_IiIte!(t~w3R z9j^6{!MR6RemL()({R91c6{MaO=sa{Vf82AVIx$B;VY(d@T8-)oG5%?lHg+$EnW1UmveJ2R}VQwHxPi2Srqe;E3_6Bk+t9 zRmb4P6I3VQHz%r2!F4C8PQ&$+OvCS=tU3cPFYp=YTM!_%g#j>5TTtB%84W~ffW zvFGUVioj#fReuDY{8d{Q_Bzk!ja@-_@cF94@c0W8rDJ zTS52=Cg)=greYtwRVtheK1?sPJn(CApLb82 zfFmx}{1JH0BFz(nJ?gAY;47HdCh(4W&7Xp&F4jCzIDLuwWAOM(wEPHM(qP+yU%piH zN8rhq*}Cwouc?l~BQMu&h2ddWs6Pzf!lX^|@T@CsTkx=}EI<6vw7h-uQ%vfdg|A+% z`E#)K8lQWZ`|~t>{95&A;V+izwsP?I*Qw6KZZ~M2Ap9dH?U{$8Z&ZH-e*5dHi{pbz zT+y#$_3}&@UWYA53nhN(N_24?Q;BbS$~SyGLm_S~l$fQX(8aM!C5GvZ-}Lcpg?liV zzt!i0XyIwMvA^gjEd93C8Qy=pwnGLk`HuP%aP$hRKYY(Llf$^_-_?DL!J}6C+%E3- zietA*OxF>2`P_^6g^y!9&{_DsyLH_ReEJ?OKMU_%r8)(#ZPYwTSi4&NarhTZ+SWDs z+=eykPs5|vsy_mEU|t`9r>;|f6uw|O2WK~{KMsFtIt$NSul^YPo#{M0wZ+PTFPP53 z*{xO%{Hf_IJfzL~8@y(N&-<*GgumUWIu9qbYn~|Fj(ML4;nK9_hx^>C`x1gj-KRPX zZ^EPQBH|Fz;N3V;@i*fp?lt!4FNl2f1!yl0OC?GM#|~zOVieyv%e0zG6BD z$8NIn;hm;aaLNy~{!v)^kk%~-pE8|=$NWhB5xDMA)oC~pJYjj@K2NC*!FM;S zc0cjC2QfL;8JOOp?J2w_tNtXM^`h!HJoFc;!*HLMRfph9rgQN2SJa<^(_d8`gO6`h zorR-+t=o#g&A(Bdg}>XbIuC!bL-Xh02XCl$Z*o0-M|B9kWI6|Le^>n}c=lgZ$6$}0 z+Rj1vkm(FO{I8lP3}42);|^!Pr#cS*V%ojWvBtb(4fon*Wx{WnPQgPyP=6TSWI74| zWI7K|{ZR8nVTt9{&i-G8PGci*1)N3O4*r%SphpPpnM1 z&~zN`GVMO~xn-E_R}#K$IuB2G8v8d2+fAooAD{YzaG~iqe9m+h9@S0rgyHW@=ix&o z#CYU-k%2c!yhn5r{uPsc=$Jdb1(W)u;bouT0{z-ivwt99~R}KhX(zcP}j`1w*~NdDm;<34PQbf#(EO$6&6n<`Le$kCu~y zXM90*4EF7(Is|`iItRZ=TyfcM3SPLMmKld*_qT1qPcW~}<=x!(F|W?>LgGhBo5bPh z0hS-G!6Z)_{^S7lXW`KUtsUSym{;b3-Q1a&v|9{*&vXWUVUYSm@Ltmyc*a4NAHHMS zh1ka--Q19wv_G6bOv{hMAAQN{496Zuykh!f1U_Us1IHe2e)y2-44iyKH`j|Yqj1}i zs&lY5tU3;ViAnu)@Z=GyqwwI7s>AR{rZaHK(ORDb{KII~dARl%)oD0qjOsWH9oxs(@> z{|qa`FZ?|=5S@o>CtCZ!OHb0{m4K&AQXPf;PgWg*D=>L}n}X#Pb{@exOpaFqjy^@p zjKKFyyHmTl2QlfNS$O?dR43u|DO!FEZowo^aSU*Y7k(*)56}<)t`oev$f7)*p3akkn*9#An!#S@8VeG5~KWpO6q`LxCNVt z&ccUcx^4zuH?tex^RbU``YesL9)oXUa*Xn@qDr?Lg)h!gor9C++PMY`@y>;}&ZB+U zmarA8L8sw07wY(vgj4EhJC0p(9CC?AenLIRm;6GBW!{TC#WBr`9I#gz6xC+jJgY{iOQSPjz!gK5hBobEdQKip}azz>=R>{%5+mTb@;&gg<^x zbr!ypRULnUYtW0j?-`hQN&Ui#t*WE&xtC4V8hVDE3q+X;rFo$ zba4!7iA{atM~rJVr5SJxa(6k;EjIHZP7vE-}iF zC@pc9v#xLomPAKkA;!7zS9_JX8Tf^N!)np4M~Rz*$?u)wupjZ^hvN^yIhY*NIE)gz zUCw3UZ!x)c7sqBVj@vHr+du7H;&O9JJ$CQIexZd2VSXteo{CBNQTQk(Nve~RO5DwpImc&H!|>4=>d(M+ z=c-P_x6h+Jr4I1P^R@n2xZnbnt6j9 za|U^Ngi9BxX5J$Ad(+HWiTN*KTx#Il=68?9@v9}) z^^b^+-ERTU4d9d5Ftl(xHU?cBJ6mFEFTRp;7&nBMV|lc2CFaP_JV@@(SLwEx^T=I* z$^J6`iSu2p{tP_g8uc@uirb2L=Qu21rv4Dz>qc$EAk3N;K6aD(vv9@NRj1&9x zP3zCRHtyDMn_fYiV6uINb4x0H%+|#C+o5WqQ zQvJ+J;*PmXHFK`Ghp>mKKl7)!YcSEwmEyYHV}8h7ES{e^SKN%0YUWpQTTL@ZjQj2? zEt7d)+=rOdnK@tFR7`YnJa&oIzV~X*0k$O^hBc#^^Ta)eN&T7c#4T)6&0HsL?=`BK z=Y(g@s?%`FTGh;N;@&jP+$L_`I&DMdF>!|wKVJG$aqM`BDgO!4E^_(;4;u!Q2 zoBkneGJfIfSPab^IIgwD>HufAs%CB(_cKiPmw9E};ccp!Q^tMWbP^u5L5~-6!?^93 z>@V}mxDz*O{wVwi6F>9GxCb%O%$4INr?vf=_r@J|uWIJFaV@5qU&oESPyNi5SwTtHw=yP|IPS8n@Fl zbJVy-OzO=1G;Zo9)yz%fy8S>k^U}EcOfx5qtA2=Wk)Qcz+?}G?uJE8AGCr^^;S{VN znmK3OWtijEjK@-nz^jp4<6IL#5`7RuP3aJ!EsM&9_HI}3x90+;WJNJ-+P*|YqM(R z5_20d>66SS=9m*l$Ny(I7MRqTdCuJa&#GqbGWQB5{v13tYyRhHLrnb17fam1FEgIX zzQfZn@kikX)66O5eu#-b1IN6oIs)(8rgg}`1AnFd5S(c`4y#_X{e{ziZS{xgoN3tj z8`bW&9P8g{nL*)p)p5A!_o@@H{&m$k`05`_!!0{hhyTbi{gY`p@XxA)Z!#XfrQ3?a ztKU|ghljtTIt*vNt2zt)J5>kah`*{%!580CorAtz=7-UbR11fEqB;z}Z8`-5pQ=9y zFJ=~HIi?A?-E`9Dce}c&KU(5v!MB#P4w*zsqy(90yOq{FD=g2Yx~Ggy7qz^Dx;@{lbC!QfK;M2bS z;Z5UICt)a}ZJU6fn0Dj+?n+GBKLJZmR2_%gP3K|N1oOiqCt981^_W*@_?GEBy!Ir& zcU+Qi%p}bpfjdm+;q51@KLsaMsE)$-OuJL)KbY)G8lH11+d{|SO`>TlVc)O#T@=4? z3RZ=V!pktpBm5K_j$e4}WWS4`Bk)2@@(AC?%J2)nG=;v14#U?msY4#NpJw%et*6_$ z30Fo{yEFXmBTUXsH`VXnz(hyS^t+|gv|lCRy=SQoP4~NLXRD6Et7oXr!}rdya?WM^ z#H5_qSN(3zd8*^E=6uyz*tgQkgi~Uw)9{^{s@*KVJ7Tu#V71@<9`nXG_=h=KPOir9 z&Yh=i5`(`sor8~D==a{+%D}TOQXPZ8z@!ax@T^+ZsRfL^nE11Czk3%G?JoAanV6R! zeq)j9B@9PV@uJ(LoW5Z+t9*Kv1WAg zGSX-n=yfOf8vW$=x^4_s{)uym zbz|_kH?{mMT=ACb6ddrj<`2Q%@6f(H;|jvb?=oKTZlLf5EXQ*;;Ro1GbmA|5_bY7L zBA&~^g*)kIXkqzZX&p3$@Of+?TKH!yj1~_3m~j9t zya5w`5?=Q=T~|2u6Tf>BzwjdL4YY72wiPYx{;B$d@F+}^`Ezwkh8GCBmG4iN7gorO=72HeMND+{}K*EsXS30PSjF+JdXY#=%ftIGne zS3NO1;9b}-wD2J;iWd6&1l)0GVF(ky@C5Tm;196jlqviGn}`w_$O#u*ckhOQ3}})Nt(3!k=SlbPm3c$#Hk{0`5L6hCc(}#JuYlTyde+GX-D5 z#4nt15yw=H7rYsB>{k{Js@41$3LxM}DJti>A8!XIHv(ZWF& zvu(8SOIRB^Q5SH7>$S`<{595gDfnXBz*n)!I-a|#Qhh4*}o{wW$hd^zoa&cN%hU|S8P9`Cw}V}TZ)b1i)ZEnI@VffnAd zl=BXqgf(AhyXZK49h)rgfWtY<>3jHvhu%V+(ZXY}%h3^d7bfpm2_M1UKnweRgJVG+ z;n*Z&BU-o&8--57X6#AoFWii6K?`5Qa%kZ@riBZ>6>vN83opS!@;MGRV$$b@Phk(E zg~#8<_=67K&c0)Ez9iu3-wC)GtQ&=QVZ#`Qg^yvE;}`x3OG-Pyg)2BV=s4_u2j{zd zmjs`~YVl{`hj;3D?!HUAVqSk<$+&@umUvI|O$#?-!LOBi>~k0A6gmjc!DL&)yRaQ- z;Q(SpeTeEQOac?hiq+*zy7sC0NY*+X=mLk7!%xcDGw8W%Zib;Nn zO*NuP+ehM6`PQhGcva&uDJKf2t>xHJ&ln7>qo1IKKgFh@g?l&CCbBQEa=ng?F}NM` z&Se;CVcpBw7g&j%hZcT{#nHlkt<(=KJOH~*^23X;aJOklX znA9f;U&9jAIs7bj!!D;xVcfLvCey+PO$*;Q?Vh7QW3p}pR$*JKI5*)pu^2iBznBfU ziaE?11FNtZ=>NC>eEhC}_gfv0`a1kcEH&N<{S5zJd}OR(Su8lJ+ZDbJD|w0I#x=~Z z4H1#2j;LnG4;^u2cxb3vVlEPZ>iD5&O`CMYn4uv8?<}aADdAX;A9`tZ-OzC-?A_zI znRRv5^Jmpw8lr#&b;l1~ylBDLy4f{^EUr6Z{=C_X7S=7CQ-8$lh4aVGteb!2k`Y5g zguYGmv~WD+QI*zw4)F9)?>}O>e-8lF?6Y=@hqyocrjb4 zu8J<2w}dcagelv-uz2xF4Xi4`+$Ix)tTt3D|BoLk5!aV2yr_E7(9q&}<7dw%@a^$K z=gh3Fs~#FUYIixu9rgKJIqs+qbvo{--8;wX#~oE@Hxhq;IR4&~<9-qE*0s5{JJz~& zW$R|Fi><3!7hi`n&v^sF?PJ;_?G^3O_8IN5_L}y1dqaDoeOY_5eMNh!y}3QzzNtOa zzPUZyzO_BqzN0#E$U9jo%IcCB)aWsSkc^2Si( zu*PuXn8rwBMPsyaMq{k8rZL{w(3ogk)|hNu(U@v%ZcI0BYRoilZp=1rZOk?9Xv{b6 zYILj1RtHy?uMVvqwmQ6e%<9PMiq+B8Ggik|*Q}1OZdjdIy=--I^@`Q0)y=EZt2eFA ztlqpjyL#*D-0B^x^Q(8Qc1>kX!KU)2P}8ucaMPHkNK-{qv}s0Dtf{6c-qg^PXj;~k zY+BKjYHDsuH*IRlG;MCmHf?RnHSK81H|=V2Ys%IH*Oadbtr@l^yk^Xr$eM~Z(KR#H z#MacTiLYr`lUTECO>)hOHK{etYtm~rt;wv}ye7M5>zdq}9c%JycCB%1%hm?hmah%1 z9kw>ScFfwy+KRQ&wKLYn*4C_zuWeYHSi5X(a_x$>skO~((`z@a&8*$LHoJDK*BkO{ zcX>S`xUPI%Xx*@N;dNuyMb=fUi|+0t4eJu?maR*!Td^*+u6bR0-KKS!b(_~^*KJ*w zTeo9fe%-EhuDPr^*j(NmY97`cZXVMdX|8CFHqU5|HP@S<{i!X=3UKhecAfp`ttRm^~2VO*N<5rSzoa}x_-v`*!r6F@%0Vs z6YH0)Pp)6FKDEAieR}<-^_lgX*JsynU7uUOV|{-8uJx{^tR>h|-V$mV))HM-&t&!G>)@bXD)>vyz zYrM6gHPO1PHQBnNHPzbOnr_|HnrYqKnr+?Mnrq$Bns43J>e|ZMf^Fq(p|)Xd;kGet zk+zDqXxogoSX)h7yse=v(Uxj!ZcDdqYRj~3Zp*f9ZOgUoXv??lYI7UPHUu}6ZwPG| zwjsP>%!bH@iVe{XGd9FF)NF`vXxNb0uxvwe!-@^54b2mEsjnR!WHpVvAY>aPg*qGS3Y-4icijAp_%^TAj zH*L&p+`KWnaqGt1#vL2;8+UDV?Pcx3_VV^n`>^)#KXtadAop!D{&$`4cD~EN$>$vK zpB)MQd&dDP7$r_CXlUeLihDZPgM(SlnWAauTi(S`9{6BUiPW^v4`es|Uw&YrN zwB%cMwYb)@)?jOS>%VS9Ue=auTk$`6TuyU7%guY&xZHIg_W!HxTD zCEDanr5|_wb+tfO3v{(WR||BtKvxTNwLn)3bhSWN3v{(WR||BtKvxTNwLn)3bhSWN z3v{(WR||BtKvxTNwLn)3bhSWN3v{(WR||BtKvxTNwLn)3bhSWN3v{(WR||BtKvxTN zwLn)3bhSWN3v{(WR||BtKvxTNwLn)3bhSWN3v{(WR||BtKvxTNwLn)3bhSWN3v{(W NR||Bt!2iG&_&>_2c2)oY literal 459264 zcmeFad3Y367B*fEhp_@ff5;_6e zq7@YsN1bt;VMfPg97a~RbOIy+lmIefXBNJZ-joFO8x7I7m;q8zG}o@a6Xm#H*tPp#PcluJiC9e{lO70A-%lAJ0q6i{K^A^ zMl8U2(a+C~_$xdAW5mns{3<(-zHiFC#G|Q3qlzTy?nQ}G`g@O$*YBN_dO4EgTT9Y1 zS&|-tlKAsHkLwh6S z0Lqp3nZXM(9igkFqTE9ll*{ikbJol$xW#M&+c2}QZLZwZ2Ombk*9ixcz!9-_fQA%b-aAJnHzLhqy_f?r+`0Fjf0*f=ZV*d4R zt(7ylP;y9;d&(})l=AS95D94C@gkFDFHV|$EB-r6Dp;vNoGW1e4>H_ZoH}J|q)PQ~ zvF7IeZAPLL=oY6ey*Uzzs2ZeKHOTG?qz6$})gDY6rTRBHoVPnC-dVYw{gHCkTgWzA z-n}T~(&Tw7px*&!=3f7~1q)>Vx#GurszG~K1PGV5V*|C>@NE2x*i+D!P~MI5s%Gm) z@&EBL2O4A&a+b7;FG_GL(@+EPxIy*)g40m_tYBHRhW zOx#%b4@+feA(yglYdYB=5C3*5i=W0xDP4>Il=14EzDntBpr%BzQaVyxmMEnO;&O>n zI#65&>P`r{zbd8Qh|AZN($3=k8%pUXBDYp4BdVh8axH`^Irs!L_Mc2hM{P^40c}#8 z%JOn2Jkh@?qmp=kF=wXtM!MLgl;#My-QEF|v)8+UPWzOyZ*kHQpW=w|3~`!kpczsx zb#F7JR+t#?S4uYnmN9;&H%@fL&DhYoJvgRsC#T@?TG?M3TsrVminh@sHI?zMklRN z^;aHLgM|(?cZ)Yy>4B^Sk5=W$ELVCILnKLAn^K^xZ6jsw^d+g0^0FG=cV)Z0531UP z4Ao!n5Tw594Ou80vEROw+GhDI8% z21Z#U_BOwxQ1I@xBNtZCzD>+2}UCHIj zTKU^&0U0`IbtQ+8;VfzR`1q|Sd@gOPR>8`K4y7blYZaleHFU_za+0f^%GywJbxGrW zkIaAD*O@!Wpy%%@37-9fv4Fk;9}27YO1dZzZYX3lmrQx^tknW&r3e0(u8m@Yw8K;n7IK zq<_Oe2PQrJ44E{UnRFDKhD`bt3C~PQeVb-0M;UD=vtj74(S*shu;41(4IQ>7?@X>O z`Q^)OpY;mi3$wU+t$C9{34H*8y#T3k1s zJh7yq$Lo2Y{Xy!^-MhzwTKgxcui@11yq0_4AEf@vh#%Jx^*f;ck*chu;l4GlcmE)D zS?595fjW5+sQ=5UKfF_3?d$i4^lmfa&17HFhGC$tp9{uar2Z%WAZg-vL*F6Nbs)_H z>Bgem)4pr|h-W|iQrl}bXrS}T8-_idS`2@721mt*iyI;lPcX-MSEA$@m{Wk0Qu-cz z0>SOOrHdrBtVSt)4(W(}(UaU`%IGeF@hDZxX^-+4CLL6RLmckhElTNdb`#?x8Y8OO z)vbcS2+U8r)q}L7DEm95N5145_>fg8U5QGo8qx;;C8xH%sO*SR+8>EXjZ*eC&K~V% zM879einOoX{^Kc5oPq_2msLvX$GBZow%=>Ty}Dzd$8~{IYmG8mC_04LtCW6-d(=Db zQ%YBh%P*ADe~L?Vs4wGkc(A})_dG6&2%*NQg%IP=u`-~NMqJkV3JGPe*UrGaZRzxd zH;GRBeQnCV^I4tmLnf(yqElHn+CsL~YQpJfBN24QNBAu#m0se#oK6964?4Z>?L?ct?tU*PUCb zl)i`?)07@AGH+{cmy^Wqq^~W*Bwpc?Cb*#V)z;sI8fxR6fNF6C9%>V*@r`PR19i20 z{O&Ay6tmE`zxH+_U?|WUa)&Pmw6m&!-7$(zEIv`S+30(}cj%5&7XB4}h{3c&)!;2O ztmflv_~Fzi;X~+3X`G$myu&$Bjimp$m?E&f08xyOo(G&kq!ag>jxX6fCCd}Mdcqy# z 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�%Zde6H{=z4M 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

1ga620R< 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 From 561abcca51a268472f1a50b7ca871d2faeb00db2 Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 14 Sep 2017 19:44:18 -0500 Subject: [PATCH 151/219] add some 64bit libdarm.dll that I just made --- output/dll/libdarm.dll | Bin 0 -> 58880 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 output/dll/libdarm.dll diff --git a/output/dll/libdarm.dll b/output/dll/libdarm.dll new file mode 100644 index 0000000000000000000000000000000000000000..6a16a2bc5ffd5483f9516f3d18210182b6cd52e5 GIT binary patch literal 58880 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 literal 0 HcmV?d00001 From 0574013bd0889bf53dba1d6b91f7625a3f488afa Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 20 Sep 2017 10:26:33 -0400 Subject: [PATCH 152/219] Atari 2600 -Recast to run single cycle -Remove frame buffer from state -Always end frames on vsync boundary --- .../Consoles/Atari/2600/Tia/Tia.SyncState.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/Tia.SyncState.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/Tia.SyncState.cs index 00aa6e7669..1f3807247a 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/Tia.SyncState.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/Tia.SyncState.cs @@ -62,10 +62,8 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 ser.Sync("vblankEnabled", ref _vblankEnabled); ser.Sync("vsyncEnabled", ref _vsyncEnabled); ser.Sync("CurrentScanLine", ref _currentScanLine); - ser.Sync("scanlinebuffer", ref _scanlinebuffer, false); ser.Sync("AudioClocks", ref AudioClocks); - ser.Sync("FrameStartCycles", ref _frameStartCycles); - ser.Sync("FrameEndCycles", ref _frameEndCycles); + ser.Sync("New_Frame", ref New_Frame); ser.BeginSection("Player0"); _player0.SyncState(ser); From 30f1d61f7f027192d286c8cd636b274af32051d9 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 20 Sep 2017 10:27:27 -0400 Subject: [PATCH 153/219] Atari 2600 -Recast to run single cycle -Remove frame buffer from state -Always end frames on vsync boundary --- .../Consoles/Atari/2600/Atari2600.Core.cs | 109 +++--------------- .../Atari/2600/Atari2600.IDebuggable.cs | 101 +--------------- .../Atari/2600/Atari2600.IEmulator.cs | 41 ++++++- .../Atari/2600/Atari2600.IStatable.cs | 2 +- .../Consoles/Atari/2600/Atari2600.cs | 19 ++- 5 files changed, 73 insertions(+), 199 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs index bbfdb5e569..0bb4f9c11c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.Core.cs @@ -21,7 +21,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 private IController _controller; private int _frame; private int _lastAddress; - private bool _frameStartPending = true; private bool _leftDifficultySwitchPressed; private bool _rightDifficultySwitchPressed; @@ -34,6 +33,9 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 internal byte[] Rom { get; } internal int DistinctAccessCount { get; private set; } + // keeps track of tia cycles, 3 cycles per CPU cycle + private int cyc_counter; + private static MapperBase SetMultiCartMapper(int romLength, int gameTotal) { switch (romLength / gameTotal) @@ -319,17 +321,10 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 _m6532 = new M6532(this); - // Set up the system state here. for instance.. - // Read from the reset vector for where to start - Cpu.PC = (ushort)(ReadMemory(0x1FFC) + (ReadMemory(0x1FFD) << 8)); // set the initial PC + HardReset(); // Show mapper class on romstatusdetails CoreComm.RomStatusDetails = $"{this._game.Name}\r\nSHA1:{Rom.HashSHA1()}\r\nMD5:{Rom.HashMD5()}\r\nMapper Impl \"{_mapper.GetType()}\""; - - // as it turns out, the stack pointer cannot be set to 0 for some games as they do not initilize it themselves. - // some documentation seems to indicate it should beset to FD, but currently there is no documentation of the 6532 - // executing a reset sequence at power on, but it's needed so let's hard code it for now - Cpu.S = 0xFD; } private bool _pal; @@ -349,96 +344,28 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 }; _tia.Reset(); - _m6532 = new M6532(this); - Cpu.PC = (ushort)(ReadMemory(0x1FFC) + (ReadMemory(0x1FFD) << 8)); // set the initial PC - - // as it turns out, the stack pointer cannot be set to 0 for some games as they do not initilize it themselves. - // some documentation seems to indicate it should beset to FD, but currently there is no documentation of the 6532 - // executing a reset sequence at power on, but it's needed so let's hard code it for now - Cpu.S = 0xFD; - SetupMemoryDomains(); - } - - private void VFrameAdvance() // advance up to 500 lines looking for end of video frame - // after vsync falling edge, continues to end of next line - { - bool frameend = false; - _tia.FrameEndCallBack = (n) => frameend = true; - for (int i = 0; i < 500 && !frameend; i++) - { - ScanlineAdvance(); - } - - _tia.FrameEndCallBack = null; - } - - private void StartFrameCond() - { - if (_frameStartPending) - { - _frame++; - _islag = true; - - if (_controller.IsPressed("Power")) - { - HardReset(); - } - - if (_controller.IsPressed("Toggle Left Difficulty") && !_leftDifficultySwitchHeld) - { - _leftDifficultySwitchPressed ^= true; - _leftDifficultySwitchHeld = true; - } - else if (!_controller.IsPressed("Toggle Left Difficulty")) - { - _leftDifficultySwitchHeld = false; - } - - if (_controller.IsPressed("Toggle Right Difficulty") && !_rightDifficultySwitchHeld) - { - _rightDifficultySwitchPressed ^= true; - _rightDifficultySwitchHeld = true; - } - else if (!_controller.IsPressed("Toggle Right Difficulty")) - { - _rightDifficultySwitchHeld = false; - } - - _tia.BeginAudioFrame(); - _frameStartPending = false; - } - } - - private void FinishFrameCond() - { - if (_tia.LineCount >= _tia.NominalNumScanlines) - { - _tia.CompleteAudioFrame(); - if (_islag) - { - _lagcount++; - } - - _tia.LineCount = 0; - _frameStartPending = true; - } + cyc_counter = 0; } private void Cycle() { - _tia.Execute(1); - _tia.Execute(1); - _tia.Execute(1); - _m6532.Timer.Tick(); - if (Tracer.Enabled) + _tia.Execute(); + cyc_counter++; + if (cyc_counter == 3) { - Tracer.Put(Cpu.TraceState()); - } + _m6532.Timer.Tick(); + if (Tracer.Enabled) + { + Tracer.Put(Cpu.TraceState()); + } - Cpu.ExecuteOne(); - _mapper.ClockCpu(); + Cpu.ExecuteOne(); + _mapper.ClockCpu(); + + cyc_counter = 0; + } } internal byte ReadControls1(bool peek) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IDebuggable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IDebuggable.cs index cf7ae45ba1..52c2c313a7 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IDebuggable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IDebuggable.cs @@ -60,97 +60,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 public bool CanStep(StepType type) { - switch (type) - { - case StepType.Into: - case StepType.Out: - case StepType.Over: - return true; - default: - return false; - } + return false; } [FeatureNotImplemented] public void Step(StepType type) { - switch (type) - { - case StepType.Into: - StepInto(); - break; - case StepType.Out: - StepOut(); - break; - case StepType.Over: - StepOver(); - break; - } + throw new NotImplementedException(); } + public int TotalExecutedCycles => Cpu.TotalExecutedCycles; - private void StepInto() - { - do - { - CycleAdvance(); - } while (!Cpu.AtStart); - } - - private void StepOver() - { - var instruction = Cpu.PeekMemory(Cpu.PC); - - if (instruction == JSR) - { - var destination = Cpu.PC + opsize[JSR]; - while (Cpu.PC != destination) - { - StepInto(); - } - } - else - { - StepInto(); - } - } - - private void StepOut() - { - var instruction = Cpu.PeekMemory(Cpu.PC); - - JSRCount = instruction == JSR ? 1 : 0; - - var bailOutFrame = Frame + 1; - while (true) - { - StepInto(); - var instr = Cpu.PeekMemory(Cpu.PC); - if (instr == JSR) - { - JSRCount++; - } - else if (instr == RTS && JSRCount <= 0) - { - StepInto(); - JSRCount = 0; - break; - } - else if (instr == RTS) - { - JSRCount--; - } - else // Emergency bail out logic - { - if (Frame == bailOutFrame) - { - break; - } - } - } - } - private int JSRCount = 0; private const byte JSR = 0x20; @@ -212,22 +133,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 #region Currently Unused Debug hooks - private void ScanlineAdvance() - { - StartFrameCond(); - int currentLine = _tia.LineCount; - while (_tia.LineCount == currentLine) - Cycle(); - FinishFrameCond(); - } - - private void CycleAdvance() - { - StartFrameCond(); - Cycle(); - FinishFrameCond(); - } - private int CurrentScanLine { get { return _tia.LineCount; } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IEmulator.cs index 65d910b1c1..cfcd8176bc 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IEmulator.cs @@ -12,18 +12,53 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 { _controller = controller; - StartFrameCond(); - while (_tia.LineCount < _tia.NominalNumScanlines) + _frame++; + _islag = true; + + // Handle all the console controls here + if (_controller.IsPressed("Power")) + { + HardReset(); + } + + if (_controller.IsPressed("Toggle Left Difficulty") && !_leftDifficultySwitchHeld) + { + _leftDifficultySwitchPressed ^= true; + _leftDifficultySwitchHeld = true; + } + else if (!_controller.IsPressed("Toggle Left Difficulty")) + { + _leftDifficultySwitchHeld = false; + } + + if (_controller.IsPressed("Toggle Right Difficulty") && !_rightDifficultySwitchHeld) + { + _rightDifficultySwitchPressed ^= true; + _rightDifficultySwitchHeld = true; + } + else if (!_controller.IsPressed("Toggle Right Difficulty")) + { + _rightDifficultySwitchHeld = false; + } + + while (!_tia.New_Frame) { Cycle(); } + _tia.New_Frame = false; + if (rendersound == false) { _tia.AudioClocks = 0; // we need this here since the async sound provider won't check in this case } - FinishFrameCond(); + if (_islag) + { + _lagcount++; + } + + _tia.LineCount = 0; } public int Frame => _frame; diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IStatable.cs index aa6d4e78b4..dcff99f432 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IStatable.cs @@ -46,7 +46,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 ser.Sync("Lag", ref _lagcount); ser.Sync("Frame", ref _frame); ser.Sync("IsLag", ref _islag); - ser.Sync("frameStartPending", ref _frameStartPending); + ser.Sync("cyc_counter", ref cyc_counter); ser.Sync("leftDifficultySwitchPressed", ref _leftDifficultySwitchPressed); ser.Sync("rightDifficultySwitchPressed", ref _rightDifficultySwitchPressed); ser.Sync("leftDifficultySwitchHeld", ref _leftDifficultySwitchHeld); diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.cs index 5a7d466c6f..e44db03cf7 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.cs @@ -102,18 +102,25 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 // give the emu a minimal of input\output connections so it doesn't crash var comm = new CoreComm(null, null); + + // here we advance past start up irregularities to see how long a frame is based on calls to Vsync + // we run 72 frames, then run 270 scanlines worth of cycles. + // if we don't hit a new frame, we can be pretty confident we are in PAL using (Atari2600 emu = new Atari2600(new CoreComm(null, null), newgame, rom, null, null)) { - List framecounts = new List(); - emu._tia.FrameEndCallBack = (i) => framecounts.Add(i); - for (int i = 0; i < 71; i++) // run for 71 * 262 lines, since we're in NTSC mode + for (int i = 0; i < 72; i++) { emu.FrameAdvance(NullController.Instance, false, false); } - int numpal = framecounts.Count((i) => i > 287); - bool pal = numpal >= 25; - Console.WriteLine("PAL Detection: {0} lines, {1}", numpal, pal); + for (int i = 0; i < 61560; i++) + { + emu.Cycle(); + } + + bool pal = !emu._tia.New_Frame; + + Console.WriteLine("PAL Detection: {0}", pal); return pal; } } From 32797eea4665fb51c4c402dd46a946c33d6c80ce Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 20 Sep 2017 10:33:14 -0400 Subject: [PATCH 154/219] Atari 2600 -Recast to run single cycle -Remove frame buffer from state -Always end frames on vsync boundary --- .../Consoles/Atari/2600/Tia/TIA.cs | 44 ++++++------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs index 1fd27cd171..af5ea5f124 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Tia/TIA.cs @@ -35,6 +35,9 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 _spf = _vsyncNum / (double)_vsyncDen > 55.0 ? 735 : 882; } + // indicates to the core where a new frame is starting + public bool New_Frame = false; + private const int BackColor = unchecked((int)0xff000000); private const int ScreenWidth = 160; private const int MaxScreenHeight = 312; @@ -161,11 +164,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 ///

public int LineCount { get; set; } - /// - /// Gets or sets a callback that is called at the end of a video frame. used internally - /// - public Action FrameEndCallBack { private get; set; } - public void Reset() { _hsyncCnt = 0; @@ -229,11 +227,9 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 } // Execute TIA cycles - public void Execute(int cycles) + public void Execute() { - // Still ignoring cycles... - - // delay vblank latch + // Handle all of the Latch delays that occur in the TIA if (_vblankDelay > 0) { _vblankDelay++; @@ -244,7 +240,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 } } - // delay latch to new playfield register if (_pf0Updater) { _pf0DelayClock++; @@ -275,7 +270,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 } } - // delay latch to missile enable if (_enam0Delay > 0) { _enam0Delay++; @@ -296,7 +290,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 } } - // delay latch to ball enable if (_enambDelay > 0) { _enambDelay++; @@ -307,7 +300,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 } } - // delay latch to player graphics registers if (_prg0Delay > 0) { _prg0Delay++; @@ -333,7 +325,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 } } - // HMP write delay if (_hmp0Delay > 0) { _hmp0Delay++; @@ -773,9 +764,12 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 // do the audio sampling if (_hsyncCnt == 36 || _hsyncCnt == 148) { - LocalAudioCycles[AudioClocks] += (short)(AUD[0].Cycle() / 2); - LocalAudioCycles[AudioClocks] += (short)(AUD[1].Cycle() / 2); - AudioClocks++; + if (AudioClocks < 2000) + { + LocalAudioCycles[AudioClocks] += (short)(AUD[0].Cycle() / 2); + LocalAudioCycles[AudioClocks] += (short)(AUD[1].Cycle() / 2); + AudioClocks++; + } } // Increment the hsync counter @@ -796,7 +790,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 int topLine = _pal ? _core.Settings.PALTopLine : _core.Settings.NTSCTopLine; int bottomLine = _pal ? _core.Settings.PALBottomLine : _core.Settings.NTSCBottomLine; - // if vsync occured unexpectedly early, black out the remainer + // if vsync occured unexpectedly early, black out the remainder for (; validlines < bottomLine; validlines++) { for (int i = 0; i < 160; i++) @@ -972,7 +966,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 // write to frame buffer OutputFrame(_currentScanLine); - FrameEndCallBack?.Invoke(_currentScanLine); + New_Frame = true; // Clear all from last frame _currentScanLine = 0; @@ -1337,17 +1331,5 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 { AUDC, AUDF, AUDV } - - private int _frameStartCycles, _frameEndCycles; - - public void BeginAudioFrame() - { - _frameStartCycles = _core.Cpu.TotalExecutedCycles; - } - - public void CompleteAudioFrame() - { - _frameEndCycles = _core.Cpu.TotalExecutedCycles; - } } } \ No newline at end of file From 961723ef3266a25ed21ea627e939ca3fcd47f8d1 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 27 Sep 2017 22:17:38 -0400 Subject: [PATCH 155/219] NESHawk Fix ACtion 52 --- .../Consoles/Nintendo/NES/Boards/MLT-ACTION52.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/MLT-ACTION52.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/MLT-ACTION52.cs index f51293921e..09583ef19c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/MLT-ACTION52.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/MLT-ACTION52.cs @@ -1,5 +1,6 @@ using BizHawk.Common; using BizHawk.Common.NumberExtensions; +using System; namespace BizHawk.Emulation.Cores.Nintendo.NES { @@ -108,6 +109,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { cheetahmen = true; } + else + { + prg_bank_mask_16k = 0x1F; + prg_bank_mask_32k = 0xF; + } AutoMapperProps.Apply(this); @@ -155,6 +161,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES //$8000-FFFF: [.... ..CC] Low 2 bits of CHR //A~[..MH HPPP PPO. CCCC] + addr += 0x8000; + if (addr.Bit(13)) { SetMirrorType(EMirrorType.Horizontal); @@ -173,7 +181,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES switch (chip) { case 0: - chip_offset = 0; + chip_offset = 0x0; break; case 1: chip_offset = 0x80000; @@ -201,7 +209,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES if (prg_mode == false) { int bank = (prg_reg >> 1) & prg_bank_mask_32k; - return ROM[(bank * 0x8000) + addr]; + return ROM[(bank * 0x8000) + addr + chip_offset]; } else { From 15329509619db6ece625340e4ec8b23577072c12 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Fri, 29 Sep 2017 18:07:11 -0400 Subject: [PATCH 156/219] sameboy: fix possible crash on loadstate with gb printer active --- BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index 5ae284dce9..edfc7d41fe 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -300,6 +300,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy protected override void LoadStateBinaryInternal(BinaryReader reader) { UpdateCoreScanlineCallback(false); + _core.SetPrinterCallback(_printerCallback); } public bool IsCGBMode() => _cgb; From 148cadda723e18283cc1c36223632f6bee8a66b8 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Fri, 29 Sep 2017 18:07:50 -0400 Subject: [PATCH 157/219] Fix issue #1009: sameboy: stack pointer saved in init state --- .../Consoles/Nintendo/Gameboy/Sameboy.cs | 2 +- output/dll/sameboy.wbx.gz | Bin 59417 -> 59403 bytes waterbox/sameboy/sgb.c | 42 ++++++++++-------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index edfc7d41fe..59a3c7aa7c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -64,7 +64,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy { Filename = "sameboy.wbx", SbrkHeapSizeKB = 192, - InvisibleHeapSizeKB = 4, + InvisibleHeapSizeKB = 12, SealedHeapSizeKB = 9 * 1024, PlainHeapSizeKB = 4, MmapHeapSizeKB = 1024 diff --git a/output/dll/sameboy.wbx.gz b/output/dll/sameboy.wbx.gz index 451322c7590e9ffa836329b8b55f8d870b31bb74..9233cc62d76438af938bab63f72ce26f719cbf37 100644 GIT binary patch literal 59403 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 literal 59417 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�#{H51H842E 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�-`pSBp$Nl%3%vtN1*+*&p@Ma-DY_w{dg&lR3 z#e8V`U&}$YpE8bU-p)2LA3E_GI@0Cmf>b4}1}6D?^8G7(Cc$gTH?jv{{oXz3IhoID zQa%r5>x6M@1eO723RnzS8dzAsx~YF}im@xeLckgYJr4tG0(Ob@49y|?b*C=C_Bf6E zF}yd*;5vTnG=}yLN_J`i3rcp{B4G(g6qszM)IZUmj4Rrk7Ta@pO59$XN7wfYs^;gW zASY3FL2bL!TjulQo8vPOqx-?Bq|j1 zgdpqqFWKfYe!WlOg1V5zRlpriyB7J2chI+9#7rY0bB!94G=awtR=%<3} zARX!FUiBT)^)~TC(Ed@q5(lDLEBSz%xC6s%f~F%d%rL?P6X75NhsJRJ#*2xy6|Bs#f8c^~aZq4qS2^a?gn95t5s&zMv_CtEs{oPT7*VPeV zPsQ=ppSWR4)cL&w%3Rg?x$amP%bKfw%B^!;q0v4M?{O+O_u@+KpUbDQYVb}dLH8+O z5?ENk8r(7M>E0XFnz_+-yiU{^TkFJb+9-aZTg8~Vr2eTLi=#{nES%O)h- zAt8Gwqhyr5WtL-0NRr6N-pR}!McI27LS9%I@lsZj>=!~te0~|3;k~E6eZSrQ&vWnn zpZ_`c+~;}jaa*j9EPps}sr}9RyPN6P=i`Gj{k$i{_jSRRJg(LF>-90_SNl(8%*S)z zcQfaqPxxwdHDU*G3~%s<`dr}IDGcfG3Xnd%Im|ETTx42qNb zka(AkYlRO;0=F8w9wT#MH?NyiVpfVzeg7x|9qGq-F3o^&|5d=PDpjib1**w4gaXio+ctjbGHOBLO2hJlgh7VS79->e3{Yut;+|GR* zOm66uui=5d&7G^*_jSrckfE=i$zzd4Pv%+3rWf)uJM!s0d;Qw zah;*6pMgZ@y!Mvrn%7JQMK&PdNNOPU|AT=&#*McaG^T3 zi%xh$pu=VBI#%iGe54`tNiNjbHqr^VX=3hl2VRMHdIM)}YFqR(Z+xn`dDK_9e@pYJ zNAgZo*L(O08tUg`2aTQ zlRU7k*Mqp7kKv>~$+g<~ou6*Z6L3RM=HBg{lk1clcChwh48KE`{?ju1pI*p2 zJ6S7w58vr*9q8wr_OwoPxaeT}tWNm+Q1hs-aG442Pgmzh7_Faky@}4rbz?q<`7xfK zOz|9J3}>3^IqH0zW183QXijiUhb!QuuFmyvMmOdbIIBDG5M0zF`5~_8=X`61InlTI zXZj#sUFGM*LX}iA8%L-9X`FzzN4@3to8OCy^#0fj6TVCa8Wu`#)Iy@Pb zb$A16>+nf5)ZyD`rr9-hYzrMu&_#zEqqh#H7@)(GF-(UyV6+aO!~`9_jp>?Q1IYaA zaDt^e+!$+gIK?I%o{Swjya5Mv_#}?$@NJyY>>JI$4kx&-!;Nu6hg00s;mLTc!yE8I zhfm_24&O$WL0LGi+mbg*Dm&(p*)uA>f9Y`bjss)m<~OeFJXti!UcC) z!#d&lIHMQxC0vOy++mk_)8T`7pilA>ywJ~i_-^wu*kk4`$ffsi={=5_x;oE6S-p^t zqq;uHm(fsP;of`Ak52gw+UN{^Q8*L5^+JAtA^JHt-EV$$2fl#G`U+P%VD5BvK7lp* zB$qnqx$A@<;fQ|D6Aw8~>d9R1ur;F_^Df-hd$`FFufe(lAHq9*l3O43e22K5=Y3@F zPC{;q0sxMmV;)Q9q)_JZk}_nt<~bJ|QxeLot0+m5$h0vn6bnj`C`pm=B{Jt3ip=w@ zt|1F4erpSB3$OnD|9!*x?s@0jdwcIKJ~Y*v`6}A#GS@s|59m5P3aQR`6GrRJd=(RQ znQNZ32Xq~tfn4W&4l8t-8=Z1Z)6IDuw(HIO9(#4c6HYr{^mKlP^Sa<=XUtKr;tP1G z%iQCvIqH-P{L~y~m&|dlW8gz*st@xgwABTFxoD0$Tngb9hU=&N^RjD*4p$sArt9YX z^p-hl4)3r`7rf#&^eWzR-#*v7`3Sb_68CxF`m9qvhF!YE10R{Y&iEmY>Zjc7vAOH! z+!xn$$^%f=8IQvqJ)P&_p3Zp}9_roP=!xUj&3O|Fy_xsnr#{RTo(2P0JHGMEy;7IC z{|o1WPWjj?=YlTrTO_*R(XTy+I^$_b^>ofLSaVp9;d(Rg$7p?+?;z7px!)VlxlVa3 zrt6F+W0s!I^Dsx}yc`SkD&C4*@8$zoq7U;4EYl_ag%vuybv|LeKFlYuU6=SGcIYzS z#4i1m-($Bfc>X)~1glD7De1D43bi!Xd z#E|OH(RiI=7_RGZxpNGe=5VA(3=?&UyLw}6flm24a$V+bUW6~xDR1Z-!y3JrpJTf& zxJ$nncIbrLr!nl(2@f0?!$F<#1)S1l-ZLnMOZqUs#~oep4?NVt2WmC&RM+7qc&VFn zN4(Vu_r^z^@<*m+8=<~#&MnYbC)^uNb;`rhTxUEPE%kJs zhqgNB<>;ta@kS(iGv7sb{gmIMk1qHJQXPgm9t_rXxE_Y<=G+pab;5N=STEh2cVepE z%`3;mFh{TAwG*wE-ptRjLKpmYQVgqf!Sg0tJDv0Nc`>Zl93Eo3e#$fFTRWZeSM1ec zfqk;bI_eT%z;RvXcQ~aBZs^1Jl5WmZ@)*wRba4!yP|a&+4po6rhpG1e|Hr@i zh?Sz77FY8>ERrhIE9aH63Z+nv^=gD#v2ul)NsZ~%^J-a@Ql+x{N)i1I{Cwq5X?4Y< z!t|JjEcn{rF;s}-LlWy$548sVIjZjmRId~&#LAUo;%)gRwL^p7?3K|Cf-n$<|3WE9 zj5>o8G>pIm#t8^dJ`$gt$4QJ6ID&B!O)JP0W z`XyC{Ov@(ik{vF9$R*M$(V{^oREne)8V%sp5%c+d375L(GRk|*8oqrpUKO;lwbnM) z4aY0zV#eLPRt3uaLKjWmshzweH{6Fc0NC?hOYUj%Y5ROQ#~7XF%sH`te+)j)A9G+x z#{)5ZK6uw$_h$Uyq&*UgUP%~7>*2nPmEpRJ*Qdt}_gjEX(1&yT)iyN- z-^+Ba@poLz+Ys6}wa@(qIq%}|-Q7MZJ7W|8ffxvevry3HzIdhlH@aHq|~u6wgxo<-0>oC2L6R8;suM;TIqI?ncP$tg5G&b$(~o`TQ(; zTGcvdJ?z@C3BphSMNz>rjUxymI?f+KtR2Qpv~~<9NoncfVk#?pKRf~{Q-yo}`RhOH ze||id!_@bDe0JQr`>~r=ul-a%iNBoXxSfEPWW`&)YY~=`;Malo3XK3Y?~dfrWUt&?i2wa{UDNiAhI ztMlkDwVc_so7&9MZSgL#(}NakV^su?DE|)eCjVI-q`8tJE%Q zff`+HPV=izYMpgQ-LH_xT%v4GB$ajy)b3Na$0L<*_@>Hn@N#z$NgpxcUPyTzbBKB3j$_F61}N~HH%#+|pVVxM!YUFRrjxVexJi*wCMofeIsUL> za}?H+WIyd>=;l0^86?jg9`b?`@0n#uqid2iG>~8~M@W-ph{u$uu)yks-@>q)qh#o1 zm{F$q%Cap{SVt4>oZtdixkZ5y9x=g7N|gCc?bax)XAf;;$dPA)Sypayeo`DK%N6eN znhIgNz2YEgE;7sm-ZDpRG71|>ahd_fct?c=mhZ4n?4y$`*SX6xrujv*GYa)2IY0+p zoZ}KV$a9}3yy63&nW4(kUEUiFG;@qJ-Slyd0wYXO;uG^!scZ5%QBMnPba9402D!}` zPbo3O531BP`(ChtMp`&T2dC(v_b+AFwW~D@gZ&U(@(hSQt`Hl97-9)A6w=m|K$?~$ zW$z{S-h1!8c{>s}ZE4sSN5}r`Bp#{%+oG zYo|}kws4gq%$d%3BeHaRD$x*9)htKL+``I1jH`^*RmLr{DlM4CymJ#uSds&?cqiA2 z#Fl@Y6l=9eYKs|@W&Sg=#Y3qJPIKCeiGt@CgYI-;Eb1N)v1L8doEf=l%Q9SVNGa8N zk=Ggt4v50kvPuipuISUqglQcNYQbdyJzsa{Q}9mId@Hj;V!^9{ZjcVcqLwaT2f1Kb zE`?1u5MGreQ1LUN{dqi1(U=yLJkK#}wUQUE0qe_FuZ`Qzm4bU{L zfkoNuuG{ixo3?@X|9-fhM3~-(60CVC@H`2b@3|~WG1!{N4ry7+a}!3jCCOp(Dl93$~@XG^yFjQ%oVZ4(ocHul@I1GarZYymyS7tqG=1%;pk4sHQ1&MAi0b3Hu)uy4} zR{yQA!o@9VEOnPAv}|L!z4}2dl9Uy^s)VAE73M;F=g`in>II!LuUvw;7aC}qMsB>i z)ZMowynwmfwBkJfK`pL3(^9wEcX>vL)dP#0QSu|SH04SPg&oFLEgUntrw|^eYc*@J z5ivd?mB{t1Eipc0%rCI94K^t-_m3Iflh*saBU{IV9IYB37@Q|L5@)tz%&f%=m$FF> zW@r7br9b;jUb=ABQsx}TjHX60OgEJ7grNzQ{{sEEoFyWY<^|1C%zj$s z5)Ho-bnb*@UZxFVuUc6l*-s{#mblGo9_<}pjL6t`AYM0S#^UAv8)AvDzPchZ`}e_b z(iuBwX|!-0<@vj%}9(J2R z>+8A8on?z0n5J~eML9W>AMES>({Wa0pzWyO@kvvfjwJQ^D4QwNC@iWn-pq(xaa(J2 z9~R41&7>{amNAe>Q8AunEJJB|q_Xwg*aoBTuNBL5lVJ)m!;B#BjTRfZ%_pb|w~|1$ zY+t^F^v~ceT*v^St1Y+AgWkzHWm~wc5kw_j$)VsvfyVVAgbKBr9kC0u(3#&F7=6E~N~=mxNos346DuiD6%NazBX^$y+W>Y;96^$=Bo zw65EveP`c_RpSPN=*03l2}(i;CUu%Xz{aFWxFP`uySO4n2n4PO7+Kcd9nsw?TIDSF z2?X*3DN?2K2lxYAx^(H%rAybwh2QKxA3}C(R~``W&AXFkceOLC70CFNl9Qz&u+I&J z?WN0h&0Igb6X)960QcW(12~B4ITJECmpQ0Td!S}PwPYv>lcca^MUQ>FGBoXBnWb6q zP-~R5Mv8OAU;fstUX5pbc|Df;Lo8h!LhC~7;!EUSL+e57LF+fPuh9C?h7GNNHiUL< zT3Uec}P}ka$EqCY}&aiRZ)zYXKLDFNn*;E^(dsk=Q405es4sY}(J3|F`Au zw*39I_^$sAdyHiT37cX6VYHgRho6<@#3Ccpq#D@?#sXSC+SH;^mDt}Sq43NOeNGFy z0~0x$Gq%Vk5=92d=Hy{yd^w91@sH<`aas0FUPh+M@?73TCKMys=KMIx5l;E{c|1s^ z<3f4qd9kCsQa-j*Jz-n9CM)bw$G@R4%71lyX!+kkXkKuz;HoV&SoA#b5}mUp?&E?! z7l}N*KTRAj@kBPhOtwd;jGr_21HZ!Vq3?yOLsf_Ud4^@Uu5}4>7Q59^wX-pOEfR@F z)C!a6u2N(*zOh5^#fr1C82BJXSoL28AI)`Xt^({`&@c$;(h{_lw<4c{hPN(5>nezH zXBX{VEv%kU486%Ss0E2cq820)i9{kXOOQw;5{X3i{`dA8Boc{4B9TZWa^JT%KQXav zS(B4i)SV;Rq&fZL(ZBA--x*#QKkF1SVDrc4-&a5Q(N7*c`q?jj^_$=Q;ZJ}0+drPI zufDghg=j=8I?;lrZSVcEMzGwS<6PYvXi|Wl?saPc{Rhi0Fp-NS$S~aRwo$A$~Ml~r=sAjdORc&flhdR}z zZuKap10Cu}$2!re&UCH|UFu5Ly3wufbgu_J>Pdq}J?llUdegf;^r>qj#an9xKf zHi=11W^z-Q(p084jcHA1dNY{OOa=^^*(_!?o7v4_PIH;tJcil8hBmUXO>Am2o7=*c zwz9QtY->B)+rf@@vS889cCoA7>~0Tx+RNVdu?zzYF~S%VOfkb83oNn18XIh}!yX45 zaY8`E85dk}!yOMi@xmJ)WG--_i(Kpym%7a5u5hKRTVr-4SA2ncDWg;v^Vr-M$q=%$C54}9n& z&(4n@9tI2o2qA(P5_sz@hXP8dpoRuo=%9xIMwkEqVTJ`(*kFePPPpKP2N(}{$Ri%} zgr_{?IWKt0D_--4x4h#$ANa^84jlQ+7rye1@BH8=zxd4`&O{(W5s6qNA{Cj)MIlO2 ziC^jW6qmTgBbW?iC?olI>iIn=e6Zp_55LdDKN4SF`1-B+xs!bdYTFOJ4k`oy)j^Xe diff --git a/waterbox/sameboy/sgb.c b/waterbox/sameboy/sgb.c index f4fb6af834..d08ff4ae8d 100644 --- a/waterbox/sameboy/sgb.c +++ b/waterbox/sameboy/sgb.c @@ -3,6 +3,7 @@ #include #include #include "snes_spc/spc.h" +#include "../emulibc/emulibc.h" #define utils_log printf @@ -76,13 +77,13 @@ typedef struct uint16_t tilemap[32 * 32]; // frame data - uint8_t frame[160 * 144]; // the most recent obtained full frame + uint8_t frame[160 * 144]; // the most recent obtained full frame uint32_t frozenframe[256 * 224]; // the most recent saved full frame (MASK_EN) - uint8_t attr[20 * 18]; // current attr map for the GB screen - uint8_t auxattr[45][20 * 18]; // 45 attr files + uint8_t attr[20 * 18]; // current attr map for the GB screen + uint8_t auxattr[45][20 * 18]; // 45 attr files // MASK_EN - uint8_t active_mask; // true if mask is currently being used + uint8_t active_mask; // true if mask is currently being used // audio SNES_SPC *spc; @@ -622,12 +623,15 @@ int sgb_init(const uint8_t *spc, int length) utils_log("SGB: Failed to load SPC\n"); return 0; } - + + // make a scratch buffer in a predictable (not stack) place because spc stores multiple pointers to it + // which is kind of nasty... + int16_t *sound_buffer = alloc_invisible(4096 * sizeof(int16_t)); + // the combination of the sameboy bootrom plus the built in SPC file we use means // that the SPC doesn't finish its init fast enough for donkey kong, which starts poking // data too early. it's just a combination of various HLE concerns not meshing... - int16_t sound_buffer[4096]; - spc_set_output(sgb.spc, sound_buffer, sizeof(sound_buffer) / sizeof(sound_buffer[0])); + spc_set_output(sgb.spc, sound_buffer, 4096); for (int i = 0; i < 240; i++) { spc_end_frame(sgb.spc, 35104); @@ -741,10 +745,10 @@ void sgb_set_controller_data(const uint8_t *buttons) memcpy(sgb.joypad_data, buttons, sizeof(sgb.joypad_data)); } -static void trn_sound(const uint8_t* data) +static void trn_sound(const uint8_t *data) { - const uint8_t* const dataend = data + 0x10000; - uint8_t* const dst = spc_get_ram(sgb.spc); + const uint8_t *const dataend = data + 0x10000; + uint8_t *const dst = spc_get_ram(sgb.spc); while (1) { @@ -771,7 +775,7 @@ static void trn_sound(const uint8_t* data) utils_log("TRN_SOUND dst overflow\n"); return; } - utils_log("TRN_SOUND addr %04x len %04x\n", addr, len); + utils_log("TRN_SOUND addr %04x len %04x\n", addr, len); memcpy(dst + addr, data, len); data += len; } @@ -1014,14 +1018,14 @@ void sgb_render_audio(uint64_t time, void (*callback)(int16_t l, int16_t r, uint else { utils_log("SPC: %02x %02x %02x %02x => %02x %02x %02x %02x\n", - spc_read_port(sgb.spc, 0, 0), - spc_read_port(sgb.spc, 0, 1), - spc_read_port(sgb.spc, 0, 2), - spc_read_port(sgb.spc, 0, 3), - sgb.sound_control[0], - sgb.sound_control[1], - sgb.sound_control[2], - sgb.sound_control[3]); + spc_read_port(sgb.spc, 0, 0), + spc_read_port(sgb.spc, 0, 1), + spc_read_port(sgb.spc, 0, 2), + spc_read_port(sgb.spc, 0, 3), + sgb.sound_control[0], + sgb.sound_control[1], + sgb.sound_control[2], + sgb.sound_control[3]); } for (int p = 0; p < 4; p++) { From 74d1eba3689d118f4359a37fde2489ebe6267b24 Mon Sep 17 00:00:00 2001 From: zeromus Date: Tue, 3 Oct 2017 15:26:36 -0500 Subject: [PATCH 158/219] fix Broken Jump List #1015 --- BizHawk.Client.EmuHawk/ArgParser.cs | 2 +- BizHawk.Client.EmuHawk/MainForm.cs | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/BizHawk.Client.EmuHawk/ArgParser.cs b/BizHawk.Client.EmuHawk/ArgParser.cs index 939ca94b29..9e4c5ab1b9 100644 --- a/BizHawk.Client.EmuHawk/ArgParser.cs +++ b/BizHawk.Client.EmuHawk/ArgParser.cs @@ -112,7 +112,7 @@ namespace BizHawk.Client.EmuHawk } else { - cmdRom = arg; + cmdRom = args[i]; } } } diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 930474edc4..7929f31a90 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -274,7 +274,8 @@ namespace BizHawk.Client.EmuHawk if (argParse.cmdRom != null) { // Commandline should always override auto-load - LoadRom(argParse.cmdRom, new LoadRomArgs { OpenAdvanced = new OpenAdvanced_OpenRom() }); + var ioa = OpenAdvancedSerializer.ParseWithLegacy(argParse.cmdRom); + LoadRom(argParse.cmdRom, new LoadRomArgs { OpenAdvanced = ioa }); if (Global.Game == null) { MessageBox.Show("Failed to load " + argParse.cmdRom + " specified on commandline"); @@ -3582,6 +3583,12 @@ namespace BizHawk.Client.EmuHawk } } + if (ioa is OpenAdvanced_OpenRom) + { + var ioa_openrom = (OpenAdvanced_OpenRom)ioa; + path = ioa_openrom.Path; + } + CoreFileProvider.SyncCoreCommInputSignals(nextComm); var result = loader.LoadRom(path, nextComm); From 43b04a4ee0118fbcf6dd5c0352b8a51a3cfbd3ab Mon Sep 17 00:00:00 2001 From: zeromus Date: Tue, 3 Oct 2017 15:35:16 -0500 Subject: [PATCH 159/219] fix "BSNES in SGB mode creates two entries for the WRAM domain" #1012 --- .../Consoles/Nintendo/SNES/LibsnesCore.IMemoryDomains.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.IMemoryDomains.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.IMemoryDomains.cs index ebb2853714..874a443f03 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.IMemoryDomains.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.IMemoryDomains.cs @@ -71,8 +71,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES MakeMemoryDomain("SGB HRAM", LibsnesApi.SNES_MEMORY.SGB_HRAM, MemoryDomain.Endian.Little); MakeMemoryDomain("SGB CARTRAM", LibsnesApi.SNES_MEMORY.SGB_CARTRAM, MemoryDomain.Endian.Little); - - MakeMemoryDomain("WRAM", LibsnesApi.SNES_MEMORY.WRAM, MemoryDomain.Endian.Little); } From 0d8b9c42ccf795c49de135e9c44cb0b8c0dc629e Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 6 Oct 2017 10:51:40 -0400 Subject: [PATCH 160/219] Add reset button to colecovision Fixes #992 --- .../Consoles/Coleco/ColecoControllerDeck.cs | 4 ++++ .../Consoles/Coleco/ColecoVision.IEmulator.cs | 12 ++++++++++++ .../Consoles/Coleco/ColecoVision.cs | 12 ++++++++++++ 3 files changed, 28 insertions(+) diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoControllerDeck.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoControllerDeck.cs index 2ad8b5cd5b..97a45d4e9b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoControllerDeck.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoControllerDeck.cs @@ -30,6 +30,10 @@ namespace BizHawk.Emulation.Cores.ColecoVision Name = "ColecoVision Basic Controller", BoolButtons = Port1.Definition.BoolButtons .Concat(Port2.Definition.BoolButtons) + .Concat(new[] + { + "Power", "Reset" + }) .ToList() }; diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs index 68d8493693..a503350386 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs @@ -12,6 +12,18 @@ namespace BizHawk.Emulation.Cores.ColecoVision public void FrameAdvance(IController controller, bool render, bool renderSound) { _controller = controller; + + // NOTE: Need to research differences between reset and power cycle + if (_controller.IsPressed("Power")) + { + HardReset(); + } + + if (_controller.IsPressed("Reset")) + { + SoftReset(); + } + _cpu.Debug = _tracer.Enabled; _frame++; _isLag = true; diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs index 21f5bb535c..2422f9a36f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs @@ -223,5 +223,17 @@ namespace BizHawk.Emulation.Cores.ColecoVision ////Console.WriteLine("Unhandled write at {0:X4}:{1:X2}", addr, value); } + + private void HardReset() + { + PSG.Reset(); + _cpu.Reset(); + } + + private void SoftReset() + { + PSG.Reset(); + _cpu.Reset(); + } } } \ No newline at end of file From 84412eafd92a545a7705ad0c28f2b310ba3de991 Mon Sep 17 00:00:00 2001 From: feos Date: Sat, 7 Oct 2017 15:19:50 +0300 Subject: [PATCH 161/219] tastudio: do normal seeking while recording too. needs testing if you go to a frame while recording and unpaused, it will seek to that frame (not touching input since rec mode is suspended), and after it reaches it, it will unpause and restore rec mode --- BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs | 6 +++--- BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs index 295976bb22..a6643a9de3 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs @@ -55,7 +55,7 @@ namespace BizHawk.Client.EmuHawk private bool _triggerAutoRestore; // If true, autorestore will be called on mouse up private bool? _autoRestorePaused = null; private int? _seekStartFrame = null; - private bool _shouldUnpauseFromRewind = false; + private bool _unpauseAfterSeeking = false; private ControllerDefinition ControllerType => Global.MovieSession.MovieControllerAdapter.Definition; @@ -111,10 +111,10 @@ namespace BizHawk.Client.EmuHawk } Mainform.PauseOnFrame = null; - if (_shouldUnpauseFromRewind) + if (_unpauseAfterSeeking) { Mainform.UnpauseEmulator(); - _shouldUnpauseFromRewind = false; + _unpauseAfterSeeking = false; } if (CurrentTasMovie != null) diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index d2d48907b7..84405c107b 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -829,7 +829,7 @@ namespace BizHawk.Client.EmuHawk if (frame == Emulator.Frame) return; - _shouldUnpauseFromRewind = fromRewinding && !Mainform.EmulatorPaused; + _unpauseAfterSeeking = (fromRewinding || WasRecording) && !Mainform.EmulatorPaused; TastudioPlayMode(); KeyValuePair closestState = CurrentTasMovie.TasStateManager.GetStateClosestToFrame(frame); if (closestState.Value != null && (frame < Emulator.Frame || closestState.Key > Emulator.Frame)) @@ -871,7 +871,8 @@ namespace BizHawk.Client.EmuHawk // frame == Emulator.Frame when frame == 0 if (frame > Emulator.Frame) { - if (Mainform.EmulatorPaused || Mainform.IsSeeking || fromRewinding) // make seek frame keep up with emulation on fast scrolls + // make seek frame keep up with emulation on fast scrolls + if (Mainform.EmulatorPaused || Mainform.IsSeeking || fromRewinding || WasRecording) { StartSeeking(frame); } From 94170687a4f636d2711d3cf04fbcd37acd325637 Mon Sep 17 00:00:00 2001 From: feos Date: Sat, 7 Oct 2017 23:07:15 +0300 Subject: [PATCH 162/219] tastudio: always assign branch's laglog when it's loaded fixes failure to color greenzone if a branch without input diff was loaded (and some other weird conditions were met) --- BizHawk.Client.Common/movie/tasproj/TasMovie.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.cs index ed41d86b61..4b5c27aa04 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.cs @@ -514,14 +514,14 @@ namespace BizHawk.Client.Common Log?.Dispose(); Log = branch.InputLog.Clone(); - ////_changes = true; + + _lagLog.FromLagLog(branch.LagLog); // if there are branch states, they will be loaded anyway // but if there's none, or only *after* divergent point, don't invalidate the entire movie anymore if (divergentPoint.HasValue) { _stateManager.Invalidate(divergentPoint.Value); - _lagLog.FromLagLog(branch.LagLog); // don't truncate LagLog if the branch's one is shorter, but input is the same } else { @@ -530,8 +530,7 @@ namespace BizHawk.Client.Common _stateManager.LoadBranch(Branches.IndexOf(branch)); _stateManager.SetState(branch.Frame, branch.CoreData); - - ////ChangeLog = branch.ChangeLog; + if (BindMarkersToInput) // pretty critical not to erase them { Markers = branch.Markers; From 7529570ab86b8a73801dc7e00a64af24a78239ac Mon Sep 17 00:00:00 2001 From: feos Date: Sat, 7 Oct 2017 23:17:02 +0300 Subject: [PATCH 163/219] tastudio: unbreak things if user cancels movie conversion on file open --- BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs index 30c4349282..63be9aa051 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs @@ -72,11 +72,10 @@ namespace BizHawk.Client.EmuHawk } else if (ofd.FileName.EndsWith(".bkm") || ofd.FileName.EndsWith(".bk2")) // todo: proper extention iteration { - Mainform.StartNewMovie(MovieService.Get(ofd.FileName), false); - var result1 = MessageBox.Show("This is a regular movie, a new project must be created from it, in order to use in TAStudio\nProceed?", "Convert movie", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (result1 == DialogResult.OK) { + Mainform.StartNewMovie(MovieService.Get(ofd.FileName), false); ConvertCurrentMovieToTasproj(); StartNewMovieWrapper(false); SetUpColumns(); From 1bd535c31fa9e321573ff580dbd656522eda82f8 Mon Sep 17 00:00:00 2001 From: feos Date: Sat, 7 Oct 2017 23:40:54 +0300 Subject: [PATCH 164/219] tastudio: don't trigger right button up events if left button is still held down --- BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs index a6643a9de3..bb3d0089d8 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs @@ -762,7 +762,8 @@ namespace BizHawk.Client.EmuHawk private void TasView_MouseUp(object sender, MouseEventArgs e) { - if (e.Button == MouseButtons.Right && !TasView.IsPointingAtColumnHeader && !_supressContextMenu && TasView.SelectedRows.Any()) + if (e.Button == MouseButtons.Right && !TasView.IsPointingAtColumnHeader && + !_supressContextMenu && TasView.SelectedRows.Any() && !_leftButtonHeld) { if (Global.MovieSession.Movie.FrameCount < TasView.SelectedRows.Max()) { From 420aec7870b4b4571a0eda9930afdc95160e788a Mon Sep 17 00:00:00 2001 From: Asnivor Date: Wed, 11 Oct 2017 10:57:58 +0100 Subject: [PATCH 165/219] DiscIdentifier - Improved detection of PC-FX. Added detection of lots more systems. --- .../DiscIdentifier.cs | 212 ++++++++++++++++-- 1 file changed, 192 insertions(+), 20 deletions(-) diff --git a/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs b/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs index a9add9cf4e..7db33ef622 100644 --- a/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs +++ b/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; //disc type identification logic @@ -8,7 +9,7 @@ namespace BizHawk.Emulation.DiscSystem public enum DiscType { /// - /// Disc contains audio in track 1. Nothing more can readily be determined + /// Disc contains audio in track 1. This may be a PCFX or PCECD game, but if not it is assumed AudioDisc /// AudioDisc, @@ -38,7 +39,7 @@ namespace BizHawk.Emulation.DiscSystem SegaSaturn, /// - /// Its not clear whether we can ever have enough info to ID a turboCD disc (we're using hashes) + /// PC Engine CD /// TurboCD, @@ -50,7 +51,47 @@ namespace BizHawk.Emulation.DiscSystem /// /// By NEC. /// - PCFX + PCFX, + + /// + /// By Panasonic + /// + Panasonic3DO, + + /// + /// Philips + /// + CDi, + + /// + /// Nintendo Gamecube + /// + GameCube, + + /// + /// Nintendo Wii + /// + Wii, + + /// + /// SNK NeoGeo + /// + NeoGeoCD, + + /// + /// Bandai Playdia + /// + Playdia, + + /// + /// Either CDTV or CD32 (I havent found a reliable way of distinguishing between them yet -asni) + /// + Amiga, + + /// + /// Sega Dreamcast + /// + Dreamcast } public class DiscIdentifier @@ -76,24 +117,26 @@ namespace BizHawk.Emulation.DiscSystem ///
public DiscType DetectDiscType() { - // not fully tested yet + // PCFX & TurboCD sometimes (if not alltimes) have audio on track 1 - run these before the AudioDisc detection (asni) if (DetectPCFX()) return DiscType.PCFX; - //check track 1's data type. if it's an audio track, further data-track testing is useless - //furthermore, it's probably senseless (no binary data there to read) - //NOTE: PCE-CD detection goes through here (no good way to detect PCE cd) - if (!_disc.TOC.TOCItems[1].IsData) + if (DetectTurboCD()) + return DiscType.TurboCD; + + //check track 1's data type. if it's an audio track, further data-track testing is useless + //furthermore, it's probably senseless (no binary data there to read) + if (!_disc.TOC.TOCItems[1].IsData) return DiscType.AudioDisc; // if (_dsr.ReadLBA_Mode(_disc.TOC.TOCItems[1].LBA) == 0) // return DiscType.AudioDisc; // sega doesnt put anything identifying in the cdfs volume info. but its consistent about putting its own header here in sector 0 + //asni - this isn't strictly true - SystemIdentifier in volume descriptor has been observed on occasion (see below) if (DetectSegaSaturn()) return DiscType.SegaSaturn; - // not fully tested yet if (DetectMegaCD()) return DiscType.MegaCD; @@ -102,31 +145,79 @@ namespace BizHawk.Emulation.DiscSystem if (DetectPSX()) return DiscType.SonyPSX; - //we dont know how to detect TurboCD. - //an emulator frontend will likely just guess TurboCD if the disc is UnknownFormat - //(we can also have a gameDB!) + if (Detect3DO()) + return DiscType.Panasonic3DO; - var discView = EDiscStreamView.DiscStreamView_Mode1_2048; + if (DetectCDi()) + return DiscType.CDi; + + if (DetectGameCube()) + return DiscType.GameCube; + + if (DetectWii()) + return DiscType.Wii; + + var discView = EDiscStreamView.DiscStreamView_Mode1_2048; if (_disc.TOC.Session1Format == SessionFormat.Type20_CDXA) discView = EDiscStreamView.DiscStreamView_Mode2_Form1_2048; var iso = new ISOFile(); bool isIso = iso.Parse(new DiscStream(_disc, discView, 0)); + if (!isIso) + { + // its much quicker to detect dreamcast from ISO data. Only do this if ISO is not detected + if (DetectDreamcast()) + return DiscType.Dreamcast; + } + + //*** asni - 20171011 - Suggestion: move this to the beginning of the DetectDiscType() method before any longer running lookups? + //its a cheap win for a lot of systems, but ONLY if the iso.Parse() method is quick running (might have to time it) if (isIso) { var appId = System.Text.Encoding.ASCII.GetString(iso.VolumeDescriptors[0].ApplicationIdentifier).TrimEnd('\0', ' '); + var sysId = System.Text.Encoding.ASCII.GetString(iso.VolumeDescriptors[0].SystemIdentifier).TrimEnd('\0', ' '); - //for example: PSX magical drop F (JP SLPS_02337) doesn't have the correct iso PVD fields - //but, some PSX games (junky rips) don't have the 'licensed by string' so we'll hope they get caught here - if (appId == "PLAYSTATION") + //for example: PSX magical drop F (JP SLPS_02337) doesn't have the correct iso PVD fields + //but, some PSX games (junky rips) don't have the 'licensed by string' so we'll hope they get caught here + if (appId == "PLAYSTATION") return DiscType.SonyPSX; if (appId == "PSP GAME") return DiscType.SonyPSP; + // in case the appId is not set correctly... + if (iso.Root.Children.Where(a => a.Key == "PSP_GAME").FirstOrDefault().Value as ISODirectoryNode != null) + return DiscType.SonyPSP; - return DiscType.UnknownCDFS; - } + if (sysId == "SEGA SEGASATURN") + return DiscType.SegaSaturn; + + if (sysId.Contains("SEGAKATANA")) + return DiscType.Dreamcast; + + if (sysId == "MEGA_CD") + return DiscType.MegaCD; + + if (sysId == "ASAHI-CDV") + return DiscType.Playdia; + + if (sysId == "CDTV" || sysId == "AMIGA") + return DiscType.Amiga; + foreach (var f in iso.Root.Children) + if (f.Key.ToLower().Contains("cd32")) + return DiscType.Amiga; + + // NeoGeoCD Check + var absTxt = iso.Root.Children.Where(a => a.Key.Contains("ABS.TXT")).ToList(); + if (absTxt.Count > 0) + { + if (SectorContains("abstracted by snk", Convert.ToInt32(absTxt.First().Value.Offset))) + return DiscType.NeoGeoCD; + } + + + return DiscType.UnknownCDFS; + } return DiscType.UnknownFormat; } @@ -165,13 +256,87 @@ namespace BizHawk.Emulation.DiscSystem t++) { var track = _disc.TOC.TOCItems[t]; - if (track.IsData && StringAt("PC-FX:Hu_CD-ROM", 0, track.LBA)) + //asni - this search is less specific - turns out there are discs where 'Hu:' is not present + if (track.IsData && SectorContains("pc-fx", track.LBA)) return true; } return false; } - private byte[] ReadSectorCached(int lba) + //asni 20171011 - this ONLY works if a valid cuefile/ccd is passed into DiscIdentifier. + //if an .iso is presented, the internally manufactured cue data does not work - possibly something to do with + //track 01 being Audio. Not tested, but presumably PCFX has the same issue + bool DetectTurboCD() + { + var toc = _disc.TOC; + for (int t = toc.FirstRecordedTrackNumber; + t <= toc.LastRecordedTrackNumber; + t++) + { + var track = _disc.TOC.TOCItems[t]; + //asni - pcfx games also contain the 'PC Engine' string + if ((track.IsData && SectorContains("pc engine", track.LBA + 1) && !SectorContains("pc-fx", track.LBA + 1))) + return true; + } + return false; + } + + bool Detect3DO() + { + var toc = _disc.TOC; + for (int t = toc.FirstRecordedTrackNumber; + t <= toc.LastRecordedTrackNumber; + t++) + { + var track = _disc.TOC.TOCItems[t]; + if (track.IsData && SectorContains("iamaduckiamaduck", track.LBA)) + return true; + } + return false; + } + + //asni - slightly longer running than the others due to its brute-force nature. Should run later in the method + bool DetectDreamcast() + { + for (int i = 0; i < 10000; i++) + { + if (SectorContains("segakatana", i)) + return true; + } + + return false; + } + + bool DetectCDi() + { + return StringAt("CD-RTOS", 8, 16); + } + + bool DetectGameCube() + { + var data = ReadSectorCached(0); + if (data == null) return false; + byte[] magic = data.Skip(28).Take(4).ToArray(); + string hexString = ""; + foreach (var b in magic) + hexString += b.ToString("X2"); + + return hexString == "C2339F3D"; + } + + bool DetectWii() + { + var data = ReadSectorCached(0); + if (data == null) return false; + byte[] magic = data.Skip(24).Take(4).ToArray(); + string hexString = ""; + foreach (var b in magic) + hexString += b.ToString("X2"); + + return hexString == "5D1C9EA3"; + } + + private byte[] ReadSectorCached(int lba) { //read it if we dont have it cached //we wont be caching very much here, it's no big deal @@ -197,5 +362,12 @@ namespace BizHawk.Emulation.DiscSystem Buffer.BlockCopy(data, n, cmp2, 0, cmp.Length); return System.Linq.Enumerable.SequenceEqual(cmp, cmp2); } + + private bool SectorContains(string s, int lba = 0) + { + var data = ReadSectorCached(lba); + if (data == null) return false; + return System.Text.Encoding.ASCII.GetString(data).ToLower().Contains(s.ToLower()); + } } } \ No newline at end of file From 688015bde8a409b3d37112f3c4d54281f97aac34 Mon Sep 17 00:00:00 2001 From: Asnivor Date: Wed, 11 Oct 2017 11:20:46 +0100 Subject: [PATCH 166/219] Reduced dreamcast detection time by a factor of 10 --- BizHawk.Emulation.DiscSystem/DiscIdentifier.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs b/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs index 7db33ef622..e4fe3c2f74 100644 --- a/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs +++ b/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs @@ -298,7 +298,7 @@ namespace BizHawk.Emulation.DiscSystem //asni - slightly longer running than the others due to its brute-force nature. Should run later in the method bool DetectDreamcast() { - for (int i = 0; i < 10000; i++) + for (int i = 0; i < 1000; i++) { if (SectorContains("segakatana", i)) return true; From ff13009e976ab92bdf47cd4c734ddfe2e5686f61 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 12 Oct 2017 20:19:42 -0400 Subject: [PATCH 167/219] Create ReadMe.txt --- BizHawk.Emulation.Cores/CPUs/Z80A/ReadMe.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 BizHawk.Emulation.Cores/CPUs/Z80A/ReadMe.txt diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/ReadMe.txt b/BizHawk.Emulation.Cores/CPUs/Z80A/ReadMe.txt new file mode 100644 index 0000000000..d11f79b637 --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/ReadMe.txt @@ -0,0 +1,8 @@ +TODO: + +Mode 0 and 2 interrupts +Check T-cycle level memory access timing +Check R register +new tests for WZ Registers +Memory refresh - IR is pushed onto the address bus at instruction start, does anything need this? +Data Bus - For mode zero and 2 interrupts, need a system that uses it to test From 12c46db79054d549e108e3134527666ee2273a8f Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 12 Oct 2017 20:20:13 -0400 Subject: [PATCH 168/219] Add files via upload --- BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs | 1469 +++++++++++++++++ .../CPUs/Z80A/Interrupts.cs | 122 ++ .../CPUs/Z80A/NewDisassembler.cs | 467 ++++++ .../CPUs/Z80A/Operations.cs | 727 ++++++++ .../CPUs/Z80A/Registers.cs | 134 ++ .../CPUs/Z80A/Tables_Direct.cs | 590 +++++++ .../CPUs/Z80A/Tables_Indirect.cs | 478 ++++++ BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs | 697 ++++++++ 8 files changed, 4684 insertions(+) create mode 100644 BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs create mode 100644 BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs create mode 100644 BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs create mode 100644 BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs create mode 100644 BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs create mode 100644 BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs create mode 100644 BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Indirect.cs create mode 100644 BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs new file mode 100644 index 0000000000..ce3fb3f729 --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs @@ -0,0 +1,1469 @@ +using System; + +namespace BizHawk.Emulation.Common.Components.Z80A +{ + public partial class Z80A + { + private int totalExecutedCycles; + public int TotalExecutedCycles { get { return totalExecutedCycles; } set { totalExecutedCycles = value; } } + + private int EI_pending; + + public const ushort CBpre = 0; + public const ushort EXTDpre = 1; + public const ushort IXpre = 2; + public const ushort IYpre = 3; + public const ushort IXCBpre = 4; + public const ushort IYCBpre = 5; + + // variables for executing instructions + public int instr_pntr = 0; + public ushort[] cur_instr; + public int opcode; + public bool NO_prefix, CB_prefix, IX_prefix, EXTD_prefix, IY_prefix, IXCB_prefix, IYCB_prefix; + public bool IXCB_prefetch, IYCB_prefetch; // value is fetched before opcode + public bool halted; + public bool jammed; + public ushort PF; + + public void FetchInstruction(byte opcode) + { + if (NO_prefix) + { + switch (opcode) + { + case 0x00: NOP_(); break; // NOP + case 0x01: LD_IND_16(C, B, PCl, PCh); break; // LD BC, nn + case 0x02: LD_8_IND(C, B, A); break; // LD (BC), A + case 0x03: INC_16(C, B); break; // INC BC + case 0x04: INT_OP(INC8, B); break; // INC B + case 0x05: INT_OP(DEC8, B); break; // DEC B + case 0x06: LD_IND_8_INC(B, PCl, PCh); break; // LD B, n + case 0x07: INT_OP(RLC, Aim); break; // RLCA + case 0x08: EXCH_(); break; // EXCH AF, AF' + case 0x09: ADD_16(L, H, C, B); break; // ADD HL, BC + case 0x0A: REG_OP_IND(TR, A, C, B); break; // LD A, (BC) + case 0x0B: DEC_16(C, B); break; // DEC BC + case 0x0C: INT_OP(INC8, C); break; // INC C + case 0x0D: INT_OP(DEC8, C); break; // DEC C + case 0x0E: LD_IND_8_INC(C, PCl, PCh); break; // LD C, n + case 0x0F: INT_OP(RRC, Aim); break; // RRCA + case 0x10: DJNZ_(); break; // DJNZ B + case 0x11: LD_IND_16(E, D, PCl, PCh); break; // LD DE, nn + case 0x12: LD_8_IND(E, D, A); break; // LD (DE), A + case 0x13: INC_16(E, D); break; // INC DE + case 0x14: INT_OP(INC8, D); break; // INC D + case 0x15: INT_OP(DEC8, D); break; // DEC D + case 0x16: LD_IND_8_INC(D, PCl, PCh); break; // LD D, n + case 0x17: INT_OP(RL, Aim); break; // RLA + case 0x18: JR_COND(true); break; // JR, r8 + case 0x19: ADD_16(L, H, E, D); break; // ADD HL, DE + case 0x1A: REG_OP_IND(TR, A, E, D); break; // LD A, (DE) + case 0x1B: DEC_16(E, D); break; // DEC DE + case 0x1C: INT_OP(INC8, E); break; // INC E + case 0x1D: INT_OP(DEC8, E); break; // DEC E + case 0x1E: LD_IND_8_INC(E, PCl, PCh); break; // LD E, n + case 0x1F: INT_OP(RR, Aim); break; // RRA + case 0x20: JR_COND(!FlagZ); break; // JR NZ, r8 + case 0x21: LD_IND_16(L, H, PCl, PCh); break; // LD HL, nn + case 0x22: LD_16_IND_nn(L, H); break; // LD (nn), HL + case 0x23: INC_16(L, H); break; // INC HL + case 0x24: INT_OP(INC8, H); break; // INC H + case 0x25: INT_OP(DEC8, H); break; // DEC H + case 0x26: LD_IND_8_INC(H, PCl, PCh); break; // LD H, n + case 0x27: INT_OP(DA, A); break; // DAA + case 0x28: JR_COND(FlagZ); break; // JR Z, r8 + case 0x29: ADD_16(L, H, L, H); break; // ADD HL, HL + case 0x2A: LD_IND_16_nn(L, H); break; // LD HL, (nn) + case 0x2B: DEC_16(L, H); break; // DEC HL + case 0x2C: INT_OP(INC8, L); break; // INC L + case 0x2D: INT_OP(DEC8, L); break; // DEC L + case 0x2E: LD_IND_8_INC(L, PCl, PCh); break; // LD L, n + case 0x2F: INT_OP(CPL, A); break; // CPL + case 0x30: JR_COND(!FlagC); break; // JR NC, r8 + case 0x31: LD_IND_16(SPl, SPh, PCl, PCh); break; // LD SP, nn + case 0x32: LD_8_IND_nn(A); break; // LD (nn), A + case 0x33: INC_16(SPl, SPh); break; // INC SP + case 0x34: INC_8_IND(L, H); break; // INC (HL) + case 0x35: DEC_8_IND(L, H); break; // DEC (HL) + case 0x36: LD_8_IND_IND(L, H, PCl, PCh); break; // LD (HL), n + case 0x37: INT_OP(SCF, A); break; // SCF + case 0x38: JR_COND(FlagC); break; // JR C, r8 + case 0x39: ADD_16(L, H, SPl, SPh); break; // ADD HL, SP + case 0x3A: LD_IND_8_nn(A); break; // LD A, (nn) + case 0x3B: DEC_16(SPl, SPh); break; // DEC SP + case 0x3C: INT_OP(INC8, A); break; // INC A + case 0x3D: INT_OP(DEC8, A); break; // DEC A + case 0x3E: LD_IND_8_INC(A, PCl, PCh); break; // LD A, n + case 0x3F: INT_OP(CCF, A); break; // CCF + case 0x40: REG_OP(TR, B, B); break; // LD B, B + case 0x41: REG_OP(TR, B, C); break; // LD B, C + case 0x42: REG_OP(TR, B, D); break; // LD B, D + case 0x43: REG_OP(TR, B, E); break; // LD B, E + case 0x44: REG_OP(TR, B, H); break; // LD B, H + case 0x45: REG_OP(TR, B, L); break; // LD B, L + case 0x46: REG_OP_IND(TR, B, L, H); break; // LD B, (HL) + case 0x47: REG_OP(TR, B, A); break; // LD B, A + case 0x48: REG_OP(TR, C, B); break; // LD C, B + case 0x49: REG_OP(TR, C, C); break; // LD C, C + case 0x4A: REG_OP(TR, C, D); break; // LD C, D + case 0x4B: REG_OP(TR, C, E); break; // LD C, E + case 0x4C: REG_OP(TR, C, H); break; // LD C, H + case 0x4D: REG_OP(TR, C, L); break; // LD C, L + case 0x4E: REG_OP_IND(TR, C, L, H); break; // LD C, (HL) + case 0x4F: REG_OP(TR, C, A); break; // LD C, A + case 0x50: REG_OP(TR, D, B); break; // LD D, B + case 0x51: REG_OP(TR, D, C); break; // LD D, C + case 0x52: REG_OP(TR, D, D); break; // LD D, D + case 0x53: REG_OP(TR, D, E); break; // LD D, E + case 0x54: REG_OP(TR, D, H); break; // LD D, H + case 0x55: REG_OP(TR, D, L); break; // LD D, L + case 0x56: REG_OP_IND(TR, D, L, H); break; // LD D, (HL) + case 0x57: REG_OP(TR, D, A); break; // LD D, A + case 0x58: REG_OP(TR, E, B); break; // LD E, B + case 0x59: REG_OP(TR, E, C); break; // LD E, C + case 0x5A: REG_OP(TR, E, D); break; // LD E, D + case 0x5B: REG_OP(TR, E, E); break; // LD E, E + case 0x5C: REG_OP(TR, E, H); break; // LD E, H + case 0x5D: REG_OP(TR, E, L); break; // LD E, L + case 0x5E: REG_OP_IND(TR, E, L, H); break; // LD E, (HL) + case 0x5F: REG_OP(TR, E, A); break; // LD E, A + case 0x60: REG_OP(TR, H, B); break; // LD H, B + case 0x61: REG_OP(TR, H, C); break; // LD H, C + case 0x62: REG_OP(TR, H, D); break; // LD H, D + case 0x63: REG_OP(TR, H, E); break; // LD H, E + case 0x64: REG_OP(TR, H, H); break; // LD H, H + case 0x65: REG_OP(TR, H, L); break; // LD H, L + case 0x66: REG_OP_IND(TR, H, L, H); break; // LD H, (HL) + case 0x67: REG_OP(TR, H, A); break; // LD H, A + case 0x68: REG_OP(TR, L, B); break; // LD L, B + case 0x69: REG_OP(TR, L, C); break; // LD L, C + case 0x6A: REG_OP(TR, L, D); break; // LD L, D + case 0x6B: REG_OP(TR, L, E); break; // LD L, E + case 0x6C: REG_OP(TR, L, H); break; // LD L, H + case 0x6D: REG_OP(TR, L, L); break; // LD L, L + case 0x6E: REG_OP_IND(TR, L, L, H); break; // LD L, (HL) + case 0x6F: REG_OP(TR, L, A); break; // LD L, A + case 0x70: LD_8_IND(L, H, B); break; // LD (HL), B + case 0x71: LD_8_IND(L, H, C); break; // LD (HL), C + case 0x72: LD_8_IND(L, H, D); break; // LD (HL), D + case 0x73: LD_8_IND(L, H, E); break; // LD (HL), E + case 0x74: LD_8_IND(L, H, H); break; // LD (HL), H + case 0x75: LD_8_IND(L, H, L); break; // LD (HL), L + case 0x76: HALT_(); break; // HALT + case 0x77: LD_8_IND(L, H, A); break; // LD (HL), A + case 0x78: REG_OP(TR, A, B); break; // LD A, B + case 0x79: REG_OP(TR, A, C); break; // LD A, C + case 0x7A: REG_OP(TR, A, D); break; // LD A, D + case 0x7B: REG_OP(TR, A, E); break; // LD A, E + case 0x7C: REG_OP(TR, A, H); break; // LD A, H + case 0x7D: REG_OP(TR, A, L); break; // LD A, L + case 0x7E: REG_OP_IND(TR, A, L, H); break; // LD A, (HL) + case 0x7F: REG_OP(TR, A, A); break; // LD A, A + case 0x80: REG_OP(ADD8, A, B); break; // ADD A, B + case 0x81: REG_OP(ADD8, A, C); break; // ADD A, C + case 0x82: REG_OP(ADD8, A, D); break; // ADD A, D + case 0x83: REG_OP(ADD8, A, E); break; // ADD A, E + case 0x84: REG_OP(ADD8, A, H); break; // ADD A, H + case 0x85: REG_OP(ADD8, A, L); break; // ADD A, L + case 0x86: REG_OP_IND(ADD8, A, L, H); break; // ADD A, (HL) + case 0x87: REG_OP(ADD8, A, A); break; // ADD A, A + case 0x88: REG_OP(ADC8, A, B); break; // ADC A, B + case 0x89: REG_OP(ADC8, A, C); break; // ADC A, C + case 0x8A: REG_OP(ADC8, A, D); break; // ADC A, D + case 0x8B: REG_OP(ADC8, A, E); break; // ADC A, E + case 0x8C: REG_OP(ADC8, A, H); break; // ADC A, H + case 0x8D: REG_OP(ADC8, A, L); break; // ADC A, L + case 0x8E: REG_OP_IND(ADC8, A, L, H); break; // ADC A, (HL) + case 0x8F: REG_OP(ADC8, A, A); break; // ADC A, A + case 0x90: REG_OP(SUB8, A, B); break; // SUB A, B + case 0x91: REG_OP(SUB8, A, C); break; // SUB A, C + case 0x92: REG_OP(SUB8, A, D); break; // SUB A, D + case 0x93: REG_OP(SUB8, A, E); break; // SUB A, E + case 0x94: REG_OP(SUB8, A, H); break; // SUB A, H + case 0x95: REG_OP(SUB8, A, L); break; // SUB A, L + case 0x96: REG_OP_IND(SUB8, A, L, H); break; // SUB A, (HL) + case 0x97: REG_OP(SUB8, A, A); break; // SUB A, A + case 0x98: REG_OP(SBC8, A, B); break; // SBC A, B + case 0x99: REG_OP(SBC8, A, C); break; // SBC A, C + case 0x9A: REG_OP(SBC8, A, D); break; // SBC A, D + case 0x9B: REG_OP(SBC8, A, E); break; // SBC A, E + case 0x9C: REG_OP(SBC8, A, H); break; // SBC A, H + case 0x9D: REG_OP(SBC8, A, L); break; // SBC A, L + case 0x9E: REG_OP_IND(SBC8, A, L, H); break; // SBC A, (HL) + case 0x9F: REG_OP(SBC8, A, A); break; // SBC A, A + case 0xA0: REG_OP(AND8, A, B); break; // AND A, B + case 0xA1: REG_OP(AND8, A, C); break; // AND A, C + case 0xA2: REG_OP(AND8, A, D); break; // AND A, D + case 0xA3: REG_OP(AND8, A, E); break; // AND A, E + case 0xA4: REG_OP(AND8, A, H); break; // AND A, H + case 0xA5: REG_OP(AND8, A, L); break; // AND A, L + case 0xA6: REG_OP_IND(AND8, A, L, H); break; // AND A, (HL) + case 0xA7: REG_OP(AND8, A, A); break; // AND A, A + case 0xA8: REG_OP(XOR8, A, B); break; // XOR A, B + case 0xA9: REG_OP(XOR8, A, C); break; // XOR A, C + case 0xAA: REG_OP(XOR8, A, D); break; // XOR A, D + case 0xAB: REG_OP(XOR8, A, E); break; // XOR A, E + case 0xAC: REG_OP(XOR8, A, H); break; // XOR A, H + case 0xAD: REG_OP(XOR8, A, L); break; // XOR A, L + case 0xAE: REG_OP_IND(XOR8, A, L, H); break; // XOR A, (HL) + case 0xAF: REG_OP(XOR8, A, A); break; // XOR A, A + case 0xB0: REG_OP(OR8, A, B); break; // OR A, B + case 0xB1: REG_OP(OR8, A, C); break; // OR A, C + case 0xB2: REG_OP(OR8, A, D); break; // OR A, D + case 0xB3: REG_OP(OR8, A, E); break; // OR A, E + case 0xB4: REG_OP(OR8, A, H); break; // OR A, H + case 0xB5: REG_OP(OR8, A, L); break; // OR A, L + case 0xB6: REG_OP_IND(OR8, A, L, H); break; // OR A, (HL) + case 0xB7: REG_OP(OR8, A, A); break; // OR A, A + case 0xB8: REG_OP(CP8, A, B); break; // CP A, B + case 0xB9: REG_OP(CP8, A, C); break; // CP A, C + case 0xBA: REG_OP(CP8, A, D); break; // CP A, D + case 0xBB: REG_OP(CP8, A, E); break; // CP A, E + case 0xBC: REG_OP(CP8, A, H); break; // CP A, H + case 0xBD: REG_OP(CP8, A, L); break; // CP A, L + case 0xBE: REG_OP_IND(CP8, A, L, H); break; // CP A, (HL) + case 0xBF: REG_OP(CP8, A, A); break; // CP A, A + case 0xC0: RET_COND(!FlagZ); break; // Ret NZ + case 0xC1: POP_(C, B); break; // POP BC + case 0xC2: JP_COND(!FlagZ); break; // JP NZ + case 0xC3: JP_COND(true); break; // JP + case 0xC4: CALL_COND(!FlagZ); break; // CALL NZ + case 0xC5: PUSH_(C, B); break; // PUSH BC + case 0xC6: REG_OP_IND_INC(ADD8, A, PCl, PCh); break; // ADD A, n + case 0xC7: RST_(0); break; // RST 0 + case 0xC8: RET_COND(FlagZ); break; // RET Z + case 0xC9: RET_(); break; // RET + case 0xCA: JP_COND(FlagZ); break; // JP Z + case 0xCB: PREFIX_(CBpre); break; // PREFIX CB + case 0xCC: CALL_COND(FlagZ); break; // CALL Z + case 0xCD: CALL_COND(true); break; // CALL + case 0xCE: REG_OP_IND_INC(ADC8, A, PCl, PCh); break; // ADC A, n + case 0xCF: RST_(0x08); break; // RST 0x08 + case 0xD0: RET_COND(!FlagC); break; // Ret NC + case 0xD1: POP_(E, D); break; // POP DE + case 0xD2: JP_COND(!FlagC); break; // JP NC + case 0xD3: OUT_(); break; // OUT A + case 0xD4: CALL_COND(!FlagC); break; // CALL NC + case 0xD5: PUSH_(E, D); break; // PUSH DE + case 0xD6: REG_OP_IND_INC(SUB8, A, PCl, PCh); break; // SUB A, n + case 0xD7: RST_(0x10); break; // RST 0x10 + case 0xD8: RET_COND(FlagC); break; // RET C + case 0xD9: EXX_(); break; // EXX + case 0xDA: JP_COND(FlagC); break; // JP C + case 0xDB: IN_(); break; // IN A + case 0xDC: CALL_COND(FlagC); break; // CALL C + case 0xDD: PREFIX_(IXpre); break; // PREFIX IX + case 0xDE: REG_OP_IND_INC(SBC8, A, PCl, PCh); break; // SBC A, n + case 0xDF: RST_(0x18); break; // RST 0x18 + case 0xE0: RET_COND(!FlagP); break; // RET Po + case 0xE1: POP_(L, H); break; // POP HL + case 0xE2: JP_COND(!FlagP); break; // JP Po + case 0xE3: EXCH_16_IND_(SPl, SPh, L, H); break; // ex (SP), HL + case 0xE4: CALL_COND(!FlagP); break; // CALL Po + case 0xE5: PUSH_(L, H); break; // PUSH HL + case 0xE6: REG_OP_IND_INC(AND8, A, PCl, PCh); break; // AND A, n + case 0xE7: RST_(0x20); break; // RST 0x20 + case 0xE8: RET_COND(FlagP); break; // RET Pe + case 0xE9: JP_16(L, H); break; // JP (HL) + case 0xEA: JP_COND(FlagP); break; // JP Pe + case 0xEB: EXCH_16_(E,D, L, H); break; // ex DE, HL + case 0xEC: CALL_COND(FlagP); break; // CALL Pe + case 0xED: PREFIX_(EXTDpre); break; // PREFIX EXTD + case 0xEE: REG_OP_IND_INC(XOR8, A, PCl, PCh); break; // XOR A, n + case 0xEF: RST_(0x28); break; // RST 0x28 + case 0xF0: RET_COND(!FlagS); break; // RET p + case 0xF1: POP_(F, A); break; // POP AF + case 0xF2: JP_COND(!FlagS); break; // JP p + case 0xF3: DI_(); break; // DI + case 0xF4: CALL_COND(!FlagS); break; // CALL p + case 0xF5: PUSH_(F, A); break; // PUSH AF + case 0xF6: REG_OP_IND_INC(OR8, A, PCl, PCh); break; // OR A, n + case 0xF7: RST_(0x30); break; // RST 0x30 + case 0xF8: RET_COND(FlagS); break; // RET M + case 0xF9: LD_SP_16(L, H); break; // LD SP, HL + case 0xFA: JP_COND(FlagS); break; // JP M + case 0xFB: EI_(); break; // EI + case 0xFC: CALL_COND(FlagS); break; // CALL M + case 0xFD: PREFIX_(IYpre); break; // PREFIX IY + case 0xFE: REG_OP_IND_INC(CP8, A, PCl, PCh); break; // CP A, n + case 0xFF: RST_(0x38); break; // RST 0x38 + } + } + else if (CB_prefix) + { + CB_prefix = false; + NO_prefix = true; + switch (opcode) + { + case 0x00: INT_OP(RLC, B); break; // RLC B + case 0x01: INT_OP(RLC, C); break; // RLC C + case 0x02: INT_OP(RLC, D); break; // RLC D + case 0x03: INT_OP(RLC, E); break; // RLC E + case 0x04: INT_OP(RLC, H); break; // RLC H + case 0x05: INT_OP(RLC, L); break; // RLC L + case 0x06: INT_OP_IND(RLC, L, H); break; // RLC (HL) + case 0x07: INT_OP(RLC, A); break; // RLC A + case 0x08: INT_OP(RRC, B); break; // RRC B + case 0x09: INT_OP(RRC, C); break; // RRC C + case 0x0A: INT_OP(RRC, D); break; // RRC D + case 0x0B: INT_OP(RRC, E); break; // RRC E + case 0x0C: INT_OP(RRC, H); break; // RRC H + case 0x0D: INT_OP(RRC, L); break; // RRC L + case 0x0E: INT_OP_IND(RRC, L, H); break; // RRC (HL) + case 0x0F: INT_OP(RRC, A); break; // RRC A + case 0x10: INT_OP(RL, B); break; // RL B + case 0x11: INT_OP(RL, C); break; // RL C + case 0x12: INT_OP(RL, D); break; // RL D + case 0x13: INT_OP(RL, E); break; // RL E + case 0x14: INT_OP(RL, H); break; // RL H + case 0x15: INT_OP(RL, L); break; // RL L + case 0x16: INT_OP_IND(RL, L, H); break; // RL (HL) + case 0x17: INT_OP(RL, A); break; // RL A + case 0x18: INT_OP(RR, B); break; // RR B + case 0x19: INT_OP(RR, C); break; // RR C + case 0x1A: INT_OP(RR, D); break; // RR D + case 0x1B: INT_OP(RR, E); break; // RR E + case 0x1C: INT_OP(RR, H); break; // RR H + case 0x1D: INT_OP(RR, L); break; // RR L + case 0x1E: INT_OP_IND(RR, L, H); break; // RR (HL) + case 0x1F: INT_OP(RR, A); break; // RR A + case 0x20: INT_OP(SLA, B); break; // SLA B + case 0x21: INT_OP(SLA, C); break; // SLA C + case 0x22: INT_OP(SLA, D); break; // SLA D + case 0x23: INT_OP(SLA, E); break; // SLA E + case 0x24: INT_OP(SLA, H); break; // SLA H + case 0x25: INT_OP(SLA, L); break; // SLA L + case 0x26: INT_OP_IND(SLA, L, H); break; // SLA (HL) + case 0x27: INT_OP(SLA, A); break; // SLA A + case 0x28: INT_OP(SRA, B); break; // SRA B + case 0x29: INT_OP(SRA, C); break; // SRA C + case 0x2A: INT_OP(SRA, D); break; // SRA D + case 0x2B: INT_OP(SRA, E); break; // SRA E + case 0x2C: INT_OP(SRA, H); break; // SRA H + case 0x2D: INT_OP(SRA, L); break; // SRA L + case 0x2E: INT_OP_IND(SRA, L, H); break; // SRA (HL) + case 0x2F: INT_OP(SRA, A); break; // SRA A + case 0x30: INT_OP(SLL, B); break; // SLL B + case 0x31: INT_OP(SLL, C); break; // SLL C + case 0x32: INT_OP(SLL, D); break; // SLL D + case 0x33: INT_OP(SLL, E); break; // SLL E + case 0x34: INT_OP(SLL, H); break; // SLL H + case 0x35: INT_OP(SLL, L); break; // SLL L + case 0x36: INT_OP_IND(SLL, L, H); break; // SLL (HL) + case 0x37: INT_OP(SLL, A); break; // SLL A + case 0x38: INT_OP(SRL, B); break; // SRL B + case 0x39: INT_OP(SRL, C); break; // SRL C + case 0x3A: INT_OP(SRL, D); break; // SRL D + case 0x3B: INT_OP(SRL, E); break; // SRL E + case 0x3C: INT_OP(SRL, H); break; // SRL H + case 0x3D: INT_OP(SRL, L); break; // SRL L + case 0x3E: INT_OP_IND(SRL, L, H); break; // SRL (HL) + case 0x3F: INT_OP(SRL, A); break; // SRL A + case 0x40: BIT_OP(BIT, 0, B); break; // BIT 0, B + case 0x41: BIT_OP(BIT, 0, C); break; // BIT 0, C + case 0x42: BIT_OP(BIT, 0, D); break; // BIT 0, D + case 0x43: BIT_OP(BIT, 0, E); break; // BIT 0, E + case 0x44: BIT_OP(BIT, 0, H); break; // BIT 0, H + case 0x45: BIT_OP(BIT, 0, L); break; // BIT 0, L + case 0x46: BIT_TE_IND(BIT, 0, L, H); break; // BIT 0, (HL) + case 0x47: BIT_OP(BIT, 0, A); break; // BIT 0, A + case 0x48: BIT_OP(BIT, 1, B); break; // BIT 1, B + case 0x49: BIT_OP(BIT, 1, C); break; // BIT 1, C + case 0x4A: BIT_OP(BIT, 1, D); break; // BIT 1, D + case 0x4B: BIT_OP(BIT, 1, E); break; // BIT 1, E + case 0x4C: BIT_OP(BIT, 1, H); break; // BIT 1, H + case 0x4D: BIT_OP(BIT, 1, L); break; // BIT 1, L + case 0x4E: BIT_TE_IND(BIT, 1, L, H); break; // BIT 1, (HL) + case 0x4F: BIT_OP(BIT, 1, A); break; // BIT 1, A + case 0x50: BIT_OP(BIT, 2, B); break; // BIT 2, B + case 0x51: BIT_OP(BIT, 2, C); break; // BIT 2, C + case 0x52: BIT_OP(BIT, 2, D); break; // BIT 2, D + case 0x53: BIT_OP(BIT, 2, E); break; // BIT 2, E + case 0x54: BIT_OP(BIT, 2, H); break; // BIT 2, H + case 0x55: BIT_OP(BIT, 2, L); break; // BIT 2, L + case 0x56: BIT_TE_IND(BIT, 2, L, H); break; // BIT 2, (HL) + case 0x57: BIT_OP(BIT, 2, A); break; // BIT 2, A + case 0x58: BIT_OP(BIT, 3, B); break; // BIT 3, B + case 0x59: BIT_OP(BIT, 3, C); break; // BIT 3, C + case 0x5A: BIT_OP(BIT, 3, D); break; // BIT 3, D + case 0x5B: BIT_OP(BIT, 3, E); break; // BIT 3, E + case 0x5C: BIT_OP(BIT, 3, H); break; // BIT 3, H + case 0x5D: BIT_OP(BIT, 3, L); break; // BIT 3, L + case 0x5E: BIT_TE_IND(BIT, 3, L, H); break; // BIT 3, (HL) + case 0x5F: BIT_OP(BIT, 3, A); break; // BIT 3, A + case 0x60: BIT_OP(BIT, 4, B); break; // BIT 4, B + case 0x61: BIT_OP(BIT, 4, C); break; // BIT 4, C + case 0x62: BIT_OP(BIT, 4, D); break; // BIT 4, D + case 0x63: BIT_OP(BIT, 4, E); break; // BIT 4, E + case 0x64: BIT_OP(BIT, 4, H); break; // BIT 4, H + case 0x65: BIT_OP(BIT, 4, L); break; // BIT 4, L + case 0x66: BIT_TE_IND(BIT, 4, L, H); break; // BIT 4, (HL) + case 0x67: BIT_OP(BIT, 4, A); break; // BIT 4, A + case 0x68: BIT_OP(BIT, 5, B); break; // BIT 5, B + case 0x69: BIT_OP(BIT, 5, C); break; // BIT 5, C + case 0x6A: BIT_OP(BIT, 5, D); break; // BIT 5, D + case 0x6B: BIT_OP(BIT, 5, E); break; // BIT 5, E + case 0x6C: BIT_OP(BIT, 5, H); break; // BIT 5, H + case 0x6D: BIT_OP(BIT, 5, L); break; // BIT 5, L + case 0x6E: BIT_TE_IND(BIT, 5, L, H); break; // BIT 5, (HL) + case 0x6F: BIT_OP(BIT, 5, A); break; // BIT 5, A + case 0x70: BIT_OP(BIT, 6, B); break; // BIT 6, B + case 0x71: BIT_OP(BIT, 6, C); break; // BIT 6, C + case 0x72: BIT_OP(BIT, 6, D); break; // BIT 6, D + case 0x73: BIT_OP(BIT, 6, E); break; // BIT 6, E + case 0x74: BIT_OP(BIT, 6, H); break; // BIT 6, H + case 0x75: BIT_OP(BIT, 6, L); break; // BIT 6, L + case 0x76: BIT_TE_IND(BIT, 6, L, H); break; // BIT 6, (HL) + case 0x77: BIT_OP(BIT, 6, A); break; // BIT 6, A + case 0x78: BIT_OP(BIT, 7, B); break; // BIT 7, B + case 0x79: BIT_OP(BIT, 7, C); break; // BIT 7, C + case 0x7A: BIT_OP(BIT, 7, D); break; // BIT 7, D + case 0x7B: BIT_OP(BIT, 7, E); break; // BIT 7, E + case 0x7C: BIT_OP(BIT, 7, H); break; // BIT 7, H + case 0x7D: BIT_OP(BIT, 7, L); break; // BIT 7, L + case 0x7E: BIT_TE_IND(BIT, 7, L, H); break; // BIT 7, (HL) + case 0x7F: BIT_OP(BIT, 7, A); break; // BIT 7, A + case 0x80: BIT_OP(RES, 0, B); break; // RES 0, B + case 0x81: BIT_OP(RES, 0, C); break; // RES 0, C + case 0x82: BIT_OP(RES, 0, D); break; // RES 0, D + case 0x83: BIT_OP(RES, 0, E); break; // RES 0, E + case 0x84: BIT_OP(RES, 0, H); break; // RES 0, H + case 0x85: BIT_OP(RES, 0, L); break; // RES 0, L + case 0x86: BIT_OP_IND(RES, 0, L, H); break; // RES 0, (HL) + case 0x87: BIT_OP(RES, 0, A); break; // RES 0, A + case 0x88: BIT_OP(RES, 1, B); break; // RES 1, B + case 0x89: BIT_OP(RES, 1, C); break; // RES 1, C + case 0x8A: BIT_OP(RES, 1, D); break; // RES 1, D + case 0x8B: BIT_OP(RES, 1, E); break; // RES 1, E + case 0x8C: BIT_OP(RES, 1, H); break; // RES 1, H + case 0x8D: BIT_OP(RES, 1, L); break; // RES 1, L + case 0x8E: BIT_OP_IND(RES, 1, L, H); break; // RES 1, (HL) + case 0x8F: BIT_OP(RES, 1, A); break; // RES 1, A + case 0x90: BIT_OP(RES, 2, B); break; // RES 2, B + case 0x91: BIT_OP(RES, 2, C); break; // RES 2, C + case 0x92: BIT_OP(RES, 2, D); break; // RES 2, D + case 0x93: BIT_OP(RES, 2, E); break; // RES 2, E + case 0x94: BIT_OP(RES, 2, H); break; // RES 2, H + case 0x95: BIT_OP(RES, 2, L); break; // RES 2, L + case 0x96: BIT_OP_IND(RES, 2, L, H); break; // RES 2, (HL) + case 0x97: BIT_OP(RES, 2, A); break; // RES 2, A + case 0x98: BIT_OP(RES, 3, B); break; // RES 3, B + case 0x99: BIT_OP(RES, 3, C); break; // RES 3, C + case 0x9A: BIT_OP(RES, 3, D); break; // RES 3, D + case 0x9B: BIT_OP(RES, 3, E); break; // RES 3, E + case 0x9C: BIT_OP(RES, 3, H); break; // RES 3, H + case 0x9D: BIT_OP(RES, 3, L); break; // RES 3, L + case 0x9E: BIT_OP_IND(RES, 3, L, H); break; // RES 3, (HL) + case 0x9F: BIT_OP(RES, 3, A); break; // RES 3, A + case 0xA0: BIT_OP(RES, 4, B); break; // RES 4, B + case 0xA1: BIT_OP(RES, 4, C); break; // RES 4, C + case 0xA2: BIT_OP(RES, 4, D); break; // RES 4, D + case 0xA3: BIT_OP(RES, 4, E); break; // RES 4, E + case 0xA4: BIT_OP(RES, 4, H); break; // RES 4, H + case 0xA5: BIT_OP(RES, 4, L); break; // RES 4, L + case 0xA6: BIT_OP_IND(RES, 4, L, H); break; // RES 4, (HL) + case 0xA7: BIT_OP(RES, 4, A); break; // RES 4, A + case 0xA8: BIT_OP(RES, 5, B); break; // RES 5, B + case 0xA9: BIT_OP(RES, 5, C); break; // RES 5, C + case 0xAA: BIT_OP(RES, 5, D); break; // RES 5, D + case 0xAB: BIT_OP(RES, 5, E); break; // RES 5, E + case 0xAC: BIT_OP(RES, 5, H); break; // RES 5, H + case 0xAD: BIT_OP(RES, 5, L); break; // RES 5, L + case 0xAE: BIT_OP_IND(RES, 5, L, H); break; // RES 5, (HL) + case 0xAF: BIT_OP(RES, 5, A); break; // RES 5, A + case 0xB0: BIT_OP(RES, 6, B); break; // RES 6, B + case 0xB1: BIT_OP(RES, 6, C); break; // RES 6, C + case 0xB2: BIT_OP(RES, 6, D); break; // RES 6, D + case 0xB3: BIT_OP(RES, 6, E); break; // RES 6, E + case 0xB4: BIT_OP(RES, 6, H); break; // RES 6, H + case 0xB5: BIT_OP(RES, 6, L); break; // RES 6, L + case 0xB6: BIT_OP_IND(RES, 6, L, H); break; // RES 6, (HL) + case 0xB7: BIT_OP(RES, 6, A); break; // RES 6, A + case 0xB8: BIT_OP(RES, 7, B); break; // RES 7, B + case 0xB9: BIT_OP(RES, 7, C); break; // RES 7, C + case 0xBA: BIT_OP(RES, 7, D); break; // RES 7, D + case 0xBB: BIT_OP(RES, 7, E); break; // RES 7, E + case 0xBC: BIT_OP(RES, 7, H); break; // RES 7, H + case 0xBD: BIT_OP(RES, 7, L); break; // RES 7, L + case 0xBE: BIT_OP_IND(RES, 7, L, H); break; // RES 7, (HL) + case 0xBF: BIT_OP(RES, 7, A); break; // RES 7, A + case 0xC0: BIT_OP(SET, 0, B); break; // SET 0, B + case 0xC1: BIT_OP(SET, 0, C); break; // SET 0, C + case 0xC2: BIT_OP(SET, 0, D); break; // SET 0, D + case 0xC3: BIT_OP(SET, 0, E); break; // SET 0, E + case 0xC4: BIT_OP(SET, 0, H); break; // SET 0, H + case 0xC5: BIT_OP(SET, 0, L); break; // SET 0, L + case 0xC6: BIT_OP_IND(SET, 0, L, H); break; // SET 0, (HL) + case 0xC7: BIT_OP(SET, 0, A); break; // SET 0, A + case 0xC8: BIT_OP(SET, 1, B); break; // SET 1, B + case 0xC9: BIT_OP(SET, 1, C); break; // SET 1, C + case 0xCA: BIT_OP(SET, 1, D); break; // SET 1, D + case 0xCB: BIT_OP(SET, 1, E); break; // SET 1, E + case 0xCC: BIT_OP(SET, 1, H); break; // SET 1, H + case 0xCD: BIT_OP(SET, 1, L); break; // SET 1, L + case 0xCE: BIT_OP_IND(SET, 1, L, H); break; // SET 1, (HL) + case 0xCF: BIT_OP(SET, 1, A); break; // SET 1, A + case 0xD0: BIT_OP(SET, 2, B); break; // SET 2, B + case 0xD1: BIT_OP(SET, 2, C); break; // SET 2, C + case 0xD2: BIT_OP(SET, 2, D); break; // SET 2, D + case 0xD3: BIT_OP(SET, 2, E); break; // SET 2, E + case 0xD4: BIT_OP(SET, 2, H); break; // SET 2, H + case 0xD5: BIT_OP(SET, 2, L); break; // SET 2, L + case 0xD6: BIT_OP_IND(SET, 2, L, H); break; // SET 2, (HL) + case 0xD7: BIT_OP(SET, 2, A); break; // SET 2, A + case 0xD8: BIT_OP(SET, 3, B); break; // SET 3, B + case 0xD9: BIT_OP(SET, 3, C); break; // SET 3, C + case 0xDA: BIT_OP(SET, 3, D); break; // SET 3, D + case 0xDB: BIT_OP(SET, 3, E); break; // SET 3, E + case 0xDC: BIT_OP(SET, 3, H); break; // SET 3, H + case 0xDD: BIT_OP(SET, 3, L); break; // SET 3, L + case 0xDE: BIT_OP_IND(SET, 3, L, H); break; // SET 3, (HL) + case 0xDF: BIT_OP(SET, 3, A); break; // SET 3, A + case 0xE0: BIT_OP(SET, 4, B); break; // SET 4, B + case 0xE1: BIT_OP(SET, 4, C); break; // SET 4, C + case 0xE2: BIT_OP(SET, 4, D); break; // SET 4, D + case 0xE3: BIT_OP(SET, 4, E); break; // SET 4, E + case 0xE4: BIT_OP(SET, 4, H); break; // SET 4, H + case 0xE5: BIT_OP(SET, 4, L); break; // SET 4, L + case 0xE6: BIT_OP_IND(SET, 4, L, H); break; // SET 4, (HL) + case 0xE7: BIT_OP(SET, 4, A); break; // SET 4, A + case 0xE8: BIT_OP(SET, 5, B); break; // SET 5, B + case 0xE9: BIT_OP(SET, 5, C); break; // SET 5, C + case 0xEA: BIT_OP(SET, 5, D); break; // SET 5, D + case 0xEB: BIT_OP(SET, 5, E); break; // SET 5, E + case 0xEC: BIT_OP(SET, 5, H); break; // SET 5, H + case 0xED: BIT_OP(SET, 5, L); break; // SET 5, L + case 0xEE: BIT_OP_IND(SET, 5, L, H); break; // SET 5, (HL) + case 0xEF: BIT_OP(SET, 5, A); break; // SET 5, A + case 0xF0: BIT_OP(SET, 6, B); break; // SET 6, B + case 0xF1: BIT_OP(SET, 6, C); break; // SET 6, C + case 0xF2: BIT_OP(SET, 6, D); break; // SET 6, D + case 0xF3: BIT_OP(SET, 6, E); break; // SET 6, E + case 0xF4: BIT_OP(SET, 6, H); break; // SET 6, H + case 0xF5: BIT_OP(SET, 6, L); break; // SET 6, L + case 0xF6: BIT_OP_IND(SET, 6, L, H); break; // SET 6, (HL) + case 0xF7: BIT_OP(SET, 6, A); break; // SET 6, A + case 0xF8: BIT_OP(SET, 7, B); break; // SET 7, B + case 0xF9: BIT_OP(SET, 7, C); break; // SET 7, C + case 0xFA: BIT_OP(SET, 7, D); break; // SET 7, D + case 0xFB: BIT_OP(SET, 7, E); break; // SET 7, E + case 0xFC: BIT_OP(SET, 7, H); break; // SET 7, H + case 0xFD: BIT_OP(SET, 7, L); break; // SET 7, L + case 0xFE: BIT_OP_IND(SET, 7, L, H); break; // SET 7, (HL) + case 0xFF: BIT_OP(SET, 7, A); break; // SET 7, A + } + } + else if (EXTD_prefix) + { + // NOTE: Much of EXTD is empty + EXTD_prefix = false; + NO_prefix = true; + + switch (opcode) + { + case 0x40: IN_REG_(B, C); break; // IN B, (C) + case 0x41: OUT_REG_(C, B); break; // OUT (C), B + case 0x42: REG_OP_16_(SBC16, L, H, C, B); break; // SBC HL, BC + case 0x43: LD_16_IND_nn(C, B); break; // LD (nn), BC + case 0x44: INT_OP(NEG, A); break; // NEG + case 0x45: RETN_(); break; // RETN + case 0x46: INT_MODE_(0); break; // IM $0 + case 0x47: REG_OP_IR(TR, I, A); break; // LD I, A + case 0x48: IN_REG_(C, C); break; // IN C, (C) + case 0x49: OUT_REG_(C, C); break; // OUT (C), C + case 0x4A: REG_OP_16_(ADC16, L, H, C, B); break; // ADC HL, BC + case 0x4B: LD_IND_16_nn(C, B); break; // LD BC, (nn) + case 0x4C: INT_OP(NEG, A); break; // NEG + case 0x4D: RETI_(); break; // RETI + case 0x4E: INT_MODE_(0); break; // IM $0 + case 0x4F: REG_OP_IR(TR, R, A); break; // LD R, A + case 0x50: IN_REG_(D, C); break; // IN D, (C) + case 0x51: OUT_REG_(C, D); break; // OUT (C), D + case 0x52: REG_OP_16_(SBC16, L, H, E, D); break; // SBC HL, DE + case 0x53: LD_16_IND_nn(E, D); break; // LD (nn), DE + case 0x54: INT_OP(NEG, A); break; // NEG + case 0x55: RETN_(); break; // RETN + case 0x56: INT_MODE_(1); break; // IM $1 + case 0x57: REG_OP_IR(TR, A, I); break; // LD A, I + case 0x58: IN_REG_(E, C); break; // IN E, (C) + case 0x59: OUT_REG_(C, E); break; // OUT (C), E + case 0x5A: REG_OP_16_(ADC16, L, H, E, D); break; // ADC HL, DE + case 0x5B: LD_IND_16_nn(E, D); break; // LD DE, (nn) + case 0x5C: INT_OP(NEG, A); break; // NEG + case 0x5D: RETN_(); break; // RETI + case 0x5E: INT_MODE_(2); break; // IM $0 + case 0x5F: REG_OP_IR(TR, A, R); break; // LD R, A + case 0x60: IN_REG_(H, C); break; // IN H, (C) + case 0x61: OUT_REG_(C, H); break; // OUT (C), H + case 0x62: REG_OP_16_(SBC16, L, H, L, H); break; // SBC HL, HL + case 0x63: LD_16_IND_nn(L, H); break; // LD (nn), HL + case 0x64: INT_OP(NEG, A); break; // NEG + case 0x65: RETN_(); break; // RETN + case 0x66: INT_MODE_(0); break; // IM $0 + case 0x67: RRD_(); break; // RRD + case 0x68: IN_REG_(L, C); break; // IN L, (C) + case 0x69: OUT_REG_(C, L); break; // OUT (C), L + case 0x6A: REG_OP_16_(ADC16, L, H, L, H); break; // ADC HL, HL + case 0x6B: LD_IND_16_nn(L, H); break; // LD HL, (nn) + case 0x6C: INT_OP(NEG, A); break; // NEG + case 0x6D: RETN_(); break; // RETI + case 0x6E: INT_MODE_(0); break; // IM $0 + case 0x6F: RLD_(); break; // LD R, A + case 0x70: IN_REG_(ALU, C); break; // IN 0, (C) + case 0x71: OUT_REG_(C, ZERO); break; // OUT (C), 0 + case 0x72: REG_OP_16_(SBC16, L, H, SPl, SPh); break; // SBC HL, SP + case 0x73: LD_16_IND_nn(SPl, SPh); break; // LD (nn), SP + case 0x74: INT_OP(NEG, A); break; // NEG + case 0x75: RETN_(); break; // RETN + case 0x76: INT_MODE_(1); break; // IM $1 + case 0x77: JAM_(); break; // JAM + case 0x78: IN_REG_(A, C); break; // IN A, (C) + case 0x79: OUT_REG_(C, A); break; // OUT (C), A + case 0x7A: REG_OP_16_(ADC16, L, H, SPl, SPh); break; // ADC HL, SP + case 0x7B: LD_IND_16_nn(SPl, SPh); break; // LD SP, (nn) + case 0x7C: INT_OP(NEG, A); break; // NEG + case 0x7D: RETN_(); break; // RETI + case 0x7E: INT_MODE_(2); break; // IM $2 + case 0x7F: JAM_(); break; // JAM + case 0xA0: LD_OP_R(INC16, 0); break; // LDI + case 0xA1: CP_OP_R(INC16, 0); break; // CPI + case 0xA2: IN_OP_R(INC16, 0); break; // INI + case 0xA3: OUT_OP_R(INC16, 0); break; // OUTI + case 0xA8: LD_OP_R(DEC16, 0); break; // LDD + case 0xA9: CP_OP_R(DEC16, 0); break; // CPD + case 0xAA: IN_OP_R(DEC16, 0); break; // IND + case 0xAB: OUT_OP_R(DEC16, 0); break; // OUTD + case 0xB0: LD_OP_R(INC16, 1); break; // LDIR + case 0xB1: CP_OP_R(INC16, 1); break; // CPIR + case 0xB2: IN_OP_R(INC16, 1); break; // INIR + case 0xB3: OUT_OP_R(INC16, 1); break; // OTIR + case 0xB8: LD_OP_R(DEC16, 1); break; // LDDR + case 0xB9: CP_OP_R(DEC16, 1); break; // CPDR + case 0xBA: IN_OP_R(DEC16, 1); break; // INDR + case 0xBB: OUT_OP_R(DEC16, 1); break; // OTDR + default: JAM_(); break; // JAM + + } + } + else if (IX_prefix) + { + IX_prefix = false; + NO_prefix = true; + + switch (opcode) + { + case 0x00: NOP_(); break; // NOP + case 0x01: LD_IND_16(C, B, PCl, PCh); break; // LD BC, nn + case 0x02: LD_8_IND(C, B, A); break; // LD (BC), A + case 0x03: INC_16(C, B); break; // INC BC + case 0x04: INT_OP(INC8, B); break; // INC B + case 0x05: INT_OP(DEC8, B); break; // DEC B + case 0x06: LD_IND_8_INC(B, PCl, PCh); break; // LD B, n + case 0x07: INT_OP(RLC, Aim); break; // RLCA + case 0x08: EXCH_(); break; // EXCH AF, AF' + case 0x09: ADD_16(Ixl, Ixh, C, B); break; // ADD Ix, BC + case 0x0A: REG_OP_IND(TR, A, C, B); break; // LD A, (BC) + case 0x0B: DEC_16(C, B); break; // DEC BC + case 0x0C: INT_OP(INC8, C); break; // INC C + case 0x0D: INT_OP(DEC8, C); break; // DEC C + case 0x0E: LD_IND_8_INC(C, PCl, PCh); break; // LD C, n + case 0x0F: INT_OP(RRC, Aim); break; // RRCA + case 0x10: DJNZ_(); break; // DJNZ B + case 0x11: LD_IND_16(E, D, PCl, PCh); break; // LD DE, nn + case 0x12: LD_8_IND(E, D, A); break; // LD (DE), A + case 0x13: INC_16(E, D); break; // INC DE + case 0x14: INT_OP(INC8, D); break; // INC D + case 0x15: INT_OP(DEC8, D); break; // DEC D + case 0x16: LD_IND_8_INC(D, PCl, PCh); break; // LD D, n + case 0x17: INT_OP(RL, Aim); break; // RLA + case 0x18: JR_COND(true); break; // JR, r8 + case 0x19: ADD_16(Ixl, Ixh, E, D); break; // ADD Ix, DE + case 0x1A: REG_OP_IND(TR, A, E, D); break; // LD A, (DE) + case 0x1B: DEC_16(E, D); break; // DEC DE + case 0x1C: INT_OP(INC8, E); break; // INC E + case 0x1D: INT_OP(DEC8, E); break; // DEC E + case 0x1E: LD_IND_8_INC(E, PCl, PCh); break; // LD E, n + case 0x1F: INT_OP(RR, Aim); break; // RRA + case 0x20: JR_COND(!FlagZ); break; // JR NZ, r8 + case 0x21: LD_IND_16(Ixl, Ixh, PCl, PCh); break; // LD Ix, nn + case 0x22: LD_16_IND_nn(Ixl, Ixh); break; // LD (nn), Ix + case 0x23: INC_16(Ixl, Ixh); break; // INC Ix + case 0x24: INT_OP(INC8, Ixh); break; // INC Ixh + case 0x25: INT_OP(DEC8, Ixh); break; // DEC Ixh + case 0x26: LD_IND_8_INC(Ixh, PCl, PCh); break; // LD Ixh, n + case 0x27: INT_OP(DA, A); break; // DAA + case 0x28: JR_COND(FlagZ); break; // JR Z, r8 + case 0x29: ADD_16(Ixl, Ixh, Ixl, Ixh); break; // ADD Ix, Ix + case 0x2A: LD_IND_16_nn(Ixl, Ixh); break; // LD Ix, (nn) + case 0x2B: DEC_16(Ixl, Ixh); break; // DEC Ix + case 0x2C: INT_OP(INC8, Ixl); break; // INC Ixl + case 0x2D: INT_OP(DEC8, Ixl); break; // DEC Ixl + case 0x2E: LD_IND_8_INC(Ixl, PCl, PCh); break; // LD Ixl, n + case 0x2F: INT_OP(CPL, A); break; // CPL + case 0x30: JR_COND(!FlagC); break; // JR NC, r8 + case 0x31: LD_IND_16(SPl, SPh, PCl, PCh); break; // LD SP, nn + case 0x32: LD_8_IND_nn(A); break; // LD (nn), A + case 0x33: INC_16(SPl, SPh); break; // INC SP + case 0x34: I_OP_n(INC8, Ixl, Ixh); break; // INC (Ix + n) + case 0x35: I_OP_n(DEC8, Ixl, Ixh); break; // DEC (Ix + n) + case 0x36: I_OP_n_n(Ixl, Ixh); break; // LD (Ix + n), n + case 0x37: INT_OP(SCF, A); break; // SCF + case 0x38: JR_COND(FlagC); break; // JR C, r8 + case 0x39: ADD_16(Ixl, Ixh, SPl, SPh); break; // ADD Ix, SP + case 0x3A: LD_IND_8_nn(A); break; // LD A, (nn) + case 0x3B: DEC_16(SPl, SPh); break; // DEC SP + case 0x3C: INT_OP(INC8, A); break; // INC A + case 0x3D: INT_OP(DEC8, A); break; // DEC A + case 0x3E: LD_IND_8_INC(A, PCl, PCh); break; // LD A, n + case 0x3F: INT_OP(CCF, A); break; // CCF + case 0x40: REG_OP(TR, B, B); break; // LD B, B + case 0x41: REG_OP(TR, B, C); break; // LD B, C + case 0x42: REG_OP(TR, B, D); break; // LD B, D + case 0x43: REG_OP(TR, B, E); break; // LD B, E + case 0x44: REG_OP(TR, B, Ixh); break; // LD B, Ixh + case 0x45: REG_OP(TR, B, Ixl); break; // LD B, Ixl + case 0x46: I_REG_OP_IND_n(TR, B, Ixl, Ixh); break; // LD B, (Ix + n) + case 0x47: REG_OP(TR, B, A); break; // LD B, A + case 0x48: REG_OP(TR, C, B); break; // LD C, B + case 0x49: REG_OP(TR, C, C); break; // LD C, C + case 0x4A: REG_OP(TR, C, D); break; // LD C, D + case 0x4B: REG_OP(TR, C, E); break; // LD C, E + case 0x4C: REG_OP(TR, C, Ixh); break; // LD C, Ixh + case 0x4D: REG_OP(TR, C, Ixl); break; // LD C, Ixl + case 0x4E: I_REG_OP_IND_n(TR, C, Ixl, Ixh); break; // LD C, (Ix + n) + case 0x4F: REG_OP(TR, C, A); break; // LD C, A + case 0x50: REG_OP(TR, D, B); break; // LD D, B + case 0x51: REG_OP(TR, D, C); break; // LD D, C + case 0x52: REG_OP(TR, D, D); break; // LD D, D + case 0x53: REG_OP(TR, D, E); break; // LD D, E + case 0x54: REG_OP(TR, D, Ixh); break; // LD D, Ixh + case 0x55: REG_OP(TR, D, Ixl); break; // LD D, Ixl + case 0x56: I_REG_OP_IND_n(TR, D, Ixl, Ixh); break; // LD D, (Ix + n) + case 0x57: REG_OP(TR, D, A); break; // LD D, A + case 0x58: REG_OP(TR, E, B); break; // LD E, B + case 0x59: REG_OP(TR, E, C); break; // LD E, C + case 0x5A: REG_OP(TR, E, D); break; // LD E, D + case 0x5B: REG_OP(TR, E, E); break; // LD E, E + case 0x5C: REG_OP(TR, E, Ixh); break; // LD E, Ixh + case 0x5D: REG_OP(TR, E, Ixl); break; // LD E, Ixl + case 0x5E: I_REG_OP_IND_n(TR, E, Ixl, Ixh); break; // LD E, (Ix + n) + case 0x5F: REG_OP(TR, E, A); break; // LD E, A + case 0x60: REG_OP(TR, Ixh, B); break; // LD Ixh, B + case 0x61: REG_OP(TR, Ixh, C); break; // LD Ixh, C + case 0x62: REG_OP(TR, Ixh, D); break; // LD Ixh, D + case 0x63: REG_OP(TR, Ixh, E); break; // LD Ixh, E + case 0x64: REG_OP(TR, Ixh, Ixh); break; // LD Ixh, Ixh + case 0x65: REG_OP(TR, Ixh, Ixl); break; // LD Ixh, Ixl + case 0x66: I_REG_OP_IND_n(TR, H, Ixl, Ixh); break; // LD H, (Ix + n) + case 0x67: REG_OP(TR, Ixh, A); break; // LD Ixh, A + case 0x68: REG_OP(TR, Ixl, B); break; // LD Ixl, B + case 0x69: REG_OP(TR, Ixl, C); break; // LD Ixl, C + case 0x6A: REG_OP(TR, Ixl, D); break; // LD Ixl, D + case 0x6B: REG_OP(TR, Ixl, E); break; // LD Ixl, E + case 0x6C: REG_OP(TR, Ixl, Ixh); break; // LD Ixl, Ixh + case 0x6D: REG_OP(TR, Ixl, Ixl); break; // LD Ixl, Ixl + case 0x6E: I_REG_OP_IND_n(TR, L, Ixl, Ixh); break; // LD L, (Ix + n) + case 0x6F: REG_OP(TR, Ixl, A); break; // LD Ixl, A + case 0x70: I_LD_8_IND_n(Ixl, Ixh, B); break; // LD (Ix + n), B + case 0x71: I_LD_8_IND_n(Ixl, Ixh, C); break; // LD (Ix + n), C + case 0x72: I_LD_8_IND_n(Ixl, Ixh, D); break; // LD (Ix + n), D + case 0x73: I_LD_8_IND_n(Ixl, Ixh, E); break; // LD (Ix + n), E + case 0x74: I_LD_8_IND_n(Ixl, Ixh, H); break; // LD (Ix + n), H + case 0x75: I_LD_8_IND_n(Ixl, Ixh, L); break; // LD (Ix + n), L + case 0x76: HALT_(); break; // HALT + case 0x77: I_LD_8_IND_n(Ixl, Ixh, A); break; // LD (Ix + n), A + case 0x78: REG_OP(TR, A, B); break; // LD A, B + case 0x79: REG_OP(TR, A, C); break; // LD A, C + case 0x7A: REG_OP(TR, A, D); break; // LD A, D + case 0x7B: REG_OP(TR, A, E); break; // LD A, E + case 0x7C: REG_OP(TR, A, Ixh); break; // LD A, Ixh + case 0x7D: REG_OP(TR, A, Ixl); break; // LD A, Ixl + case 0x7E: I_REG_OP_IND_n(TR, A, Ixl, Ixh); break; // LD A, (Ix + n) + case 0x7F: REG_OP(TR, A, A); break; // LD A, A + case 0x80: REG_OP(ADD8, A, B); break; // ADD A, B + case 0x81: REG_OP(ADD8, A, C); break; // ADD A, C + case 0x82: REG_OP(ADD8, A, D); break; // ADD A, D + case 0x83: REG_OP(ADD8, A, E); break; // ADD A, E + case 0x84: REG_OP(ADD8, A, Ixh); break; // ADD A, Ixh + case 0x85: REG_OP(ADD8, A, Ixl); break; // ADD A, Ixl + case 0x86: I_REG_OP_IND_n(ADD8, A, Ixl, Ixh); break; // ADD A, (Ix + n) + case 0x87: REG_OP(ADD8, A, A); break; // ADD A, A + case 0x88: REG_OP(ADC8, A, B); break; // ADC A, B + case 0x89: REG_OP(ADC8, A, C); break; // ADC A, C + case 0x8A: REG_OP(ADC8, A, D); break; // ADC A, D + case 0x8B: REG_OP(ADC8, A, E); break; // ADC A, E + case 0x8C: REG_OP(ADC8, A, Ixh); break; // ADC A, Ixh + case 0x8D: REG_OP(ADC8, A, Ixl); break; // ADC A, Ixl + case 0x8E: I_REG_OP_IND_n(ADC8, A, Ixl, Ixh); break; // ADC A, (Ix + n) + case 0x8F: REG_OP(ADC8, A, A); break; // ADC A, A + case 0x90: REG_OP(SUB8, A, B); break; // SUB A, B + case 0x91: REG_OP(SUB8, A, C); break; // SUB A, C + case 0x92: REG_OP(SUB8, A, D); break; // SUB A, D + case 0x93: REG_OP(SUB8, A, E); break; // SUB A, E + case 0x94: REG_OP(SUB8, A, Ixh); break; // SUB A, Ixh + case 0x95: REG_OP(SUB8, A, Ixl); break; // SUB A, Ixl + case 0x96: I_REG_OP_IND_n(SUB8, A, Ixl, Ixh); break; // SUB A, (Ix + n) + case 0x97: REG_OP(SUB8, A, A); break; // SUB A, A + case 0x98: REG_OP(SBC8, A, B); break; // SBC A, B + case 0x99: REG_OP(SBC8, A, C); break; // SBC A, C + case 0x9A: REG_OP(SBC8, A, D); break; // SBC A, D + case 0x9B: REG_OP(SBC8, A, E); break; // SBC A, E + case 0x9C: REG_OP(SBC8, A, Ixh); break; // SBC A, Ixh + case 0x9D: REG_OP(SBC8, A, Ixl); break; // SBC A, Ixl + case 0x9E: I_REG_OP_IND_n(SBC8, A, Ixl, Ixh); break; // SBC A, (Ix + n) + case 0x9F: REG_OP(SBC8, A, A); break; // SBC A, A + case 0xA0: REG_OP(AND8, A, B); break; // AND A, B + case 0xA1: REG_OP(AND8, A, C); break; // AND A, C + case 0xA2: REG_OP(AND8, A, D); break; // AND A, D + case 0xA3: REG_OP(AND8, A, E); break; // AND A, E + case 0xA4: REG_OP(AND8, A, Ixh); break; // AND A, Ixh + case 0xA5: REG_OP(AND8, A, Ixl); break; // AND A, Ixl + case 0xA6: I_REG_OP_IND_n(AND8, A, Ixl, Ixh); break; // AND A, (Ix + n) + case 0xA7: REG_OP(AND8, A, A); break; // AND A, A + case 0xA8: REG_OP(XOR8, A, B); break; // XOR A, B + case 0xA9: REG_OP(XOR8, A, C); break; // XOR A, C + case 0xAA: REG_OP(XOR8, A, D); break; // XOR A, D + case 0xAB: REG_OP(XOR8, A, E); break; // XOR A, E + case 0xAC: REG_OP(XOR8, A, Ixh); break; // XOR A, Ixh + case 0xAD: REG_OP(XOR8, A, Ixl); break; // XOR A, Ixl + case 0xAE: I_REG_OP_IND_n(XOR8, A, Ixl, Ixh); break; // XOR A, (Ix + n) + case 0xAF: REG_OP(XOR8, A, A); break; // XOR A, A + case 0xB0: REG_OP(OR8, A, B); break; // OR A, B + case 0xB1: REG_OP(OR8, A, C); break; // OR A, C + case 0xB2: REG_OP(OR8, A, D); break; // OR A, D + case 0xB3: REG_OP(OR8, A, E); break; // OR A, E + case 0xB4: REG_OP(OR8, A, Ixh); break; // OR A, Ixh + case 0xB5: REG_OP(OR8, A, Ixl); break; // OR A, Ixl + case 0xB6: I_REG_OP_IND_n(OR8, A, Ixl, Ixh); break; // OR A, (Ix + n) + case 0xB7: REG_OP(OR8, A, A); break; // OR A, A + case 0xB8: REG_OP(CP8, A, B); break; // CP A, B + case 0xB9: REG_OP(CP8, A, C); break; // CP A, C + case 0xBA: REG_OP(CP8, A, D); break; // CP A, D + case 0xBB: REG_OP(CP8, A, E); break; // CP A, E + case 0xBC: REG_OP(CP8, A, Ixh); break; // CP A, Ixh + case 0xBD: REG_OP(CP8, A, Ixl); break; // CP A, Ixl + case 0xBE: I_REG_OP_IND_n(CP8, A, Ixl, Ixh); break; // CP A, (Ix + n) + case 0xBF: REG_OP(CP8, A, A); break; // CP A, A + case 0xC0: RET_COND(!FlagZ); break; // Ret NZ + case 0xC1: POP_(C, B); break; // POP BC + case 0xC2: JP_COND(!FlagZ); break; // JP NZ + case 0xC3: JP_COND(true); break; // JP + case 0xC4: CALL_COND(!FlagZ); break; // CALL NZ + case 0xC5: PUSH_(C, B); break; // PUSH BC + case 0xC6: REG_OP_IND_INC(ADD8, A, PCl, PCh); break; // ADD A, n + case 0xC7: RST_(0); break; // RST 0 + case 0xC8: RET_COND(FlagZ); break; // RET Z + case 0xC9: RET_(); break; // RET + case 0xCA: JP_COND(FlagZ); break; // JP Z + case 0xCB: PREFIX_(IXCBpre); break; // PREFIX IXCB + case 0xCC: CALL_COND(FlagZ); break; // CALL Z + case 0xCD: CALL_COND(true); break; // CALL + case 0xCE: REG_OP_IND_INC(ADC8, A, PCl, PCh); break; // ADC A, n + case 0xCF: RST_(0x08); break; // RST 0x08 + case 0xD0: RET_COND(!FlagC); break; // Ret NC + case 0xD1: POP_(E, D); break; // POP DE + case 0xD2: JP_COND(!FlagC); break; // JP NC + case 0xD3: OUT_(); break; // OUT A + case 0xD4: CALL_COND(!FlagC); break; // CALL NC + case 0xD5: PUSH_(E, D); break; // PUSH DE + case 0xD6: REG_OP_IND_INC(SUB8, A, PCl, PCh); break; // SUB A, n + case 0xD7: RST_(0x10); break; // RST 0x10 + case 0xD8: RET_COND(FlagC); break; // RET C + case 0xD9: EXX_(); break; // EXX + case 0xDA: JP_COND(FlagC); break; // JP C + case 0xDB: IN_(); break; // IN A + case 0xDC: CALL_COND(FlagC); break; // CALL C + case 0xDD: JAM_(); break; // Jam (invalid) + case 0xDE: REG_OP_IND_INC(SBC8, A, PCl, PCh); break; // SBC A, n + case 0xDF: RST_(0x18); break; // RST 0x18 + case 0xE0: RET_COND(!FlagP); break; // RET Po + case 0xE1: POP_(Ixl, Ixh); break; // POP Ix + case 0xE2: JP_COND(!FlagP); break; // JP Po + case 0xE3: EXCH_16_IND_(SPl, SPh, Ixl, Ixh); break; // ex (SP), Ix + case 0xE4: CALL_COND(!FlagP); break; // CALL Po + case 0xE5: PUSH_(Ixl, Ixh); break; // PUSH Ix + case 0xE6: REG_OP_IND_INC(AND8, A, PCl, PCh); break; // AND A, n + case 0xE7: RST_(0x20); break; // RST 0x20 + case 0xE8: RET_COND(FlagP); break; // RET Pe + case 0xE9: JP_16(Ixl, Ixh); break; // JP (Ix) + case 0xEA: JP_COND(FlagP); break; // JP Pe + case 0xEB: EXCH_16_(E, D, L, H); break; // ex DE, HL + case 0xEC: CALL_COND(FlagP); break; // CALL Pe + case 0xED: JAM_(); break; // Jam (invalid) + case 0xEE: REG_OP_IND_INC(XOR8, A, PCl, PCh); break; // XOR A, n + case 0xEF: RST_(0x28); break; // RST 0x28 + case 0xF0: RET_COND(!FlagS); break; // RET p + case 0xF1: POP_(F, A); break; // POP AF + case 0xF2: JP_COND(!FlagS); break; // JP p + case 0xF3: DI_(); break; // DI + case 0xF4: CALL_COND(!FlagS); break; // CALL p + case 0xF5: PUSH_(F, A); break; // PUSH AF + case 0xF6: REG_OP_IND_INC(OR8, A, PCl, PCh); break; // OR A, n + case 0xF7: RST_(0x30); break; // RST 0x30 + case 0xF8: RET_COND(FlagS); break; // RET M + case 0xF9: LD_SP_16(Ixl, Ixh); break; // LD SP, Ix + case 0xFA: JP_COND(FlagS); break; // JP M + case 0xFB: EI_(); break; // EI + case 0xFC: CALL_COND(FlagS); break; // CALL M + case 0xFD: JAM_(); break; // Jam (invalid) + case 0xFE: REG_OP_IND_INC(CP8, A, PCl, PCh); break; // CP A, n + case 0xFF: RST_(0x38); break; // RST $38 + } + } + else if (IY_prefix) + { + IY_prefix = false; + NO_prefix = true; + + switch (opcode) + { + case 0x00: NOP_(); break; // NOP + case 0x01: LD_IND_16(C, B, PCl, PCh); break; // LD BC, nn + case 0x02: LD_8_IND(C, B, A); break; // LD (BC), A + case 0x03: INC_16(C, B); break; // INC BC + case 0x04: INT_OP(INC8, B); break; // INC B + case 0x05: INT_OP(DEC8, B); break; // DEC B + case 0x06: LD_IND_8_INC(B, PCl, PCh); break; // LD B, n + case 0x07: INT_OP(RLC, Aim); break; // RLCA + case 0x08: EXCH_(); break; // EXCH AF, AF' + case 0x09: ADD_16(Iyl, Iyh, C, B); break; // ADD Iy, BC + case 0x0A: REG_OP_IND(TR, A, C, B); break; // LD A, (BC) + case 0x0B: DEC_16(C, B); break; // DEC BC + case 0x0C: INT_OP(INC8, C); break; // INC C + case 0x0D: INT_OP(DEC8, C); break; // DEC C + case 0x0E: LD_IND_8_INC(C, PCl, PCh); break; // LD C, n + case 0x0F: INT_OP(RRC, Aim); break; // RRCA + case 0x10: DJNZ_(); break; // DJNZ B + case 0x11: LD_IND_16(E, D, PCl, PCh); break; // LD DE, nn + case 0x12: LD_8_IND(E, D, A); break; // LD (DE), A + case 0x13: INC_16(E, D); break; // INC DE + case 0x14: INT_OP(INC8, D); break; // INC D + case 0x15: INT_OP(DEC8, D); break; // DEC D + case 0x16: LD_IND_8_INC(D, PCl, PCh); break; // LD D, n + case 0x17: INT_OP(RL, Aim); break; // RLA + case 0x18: JR_COND(true); break; // JR, r8 + case 0x19: ADD_16(Iyl, Iyh, E, D); break; // ADD Iy, DE + case 0x1A: REG_OP_IND(TR, A, E, D); break; // LD A, (DE) + case 0x1B: DEC_16(E, D); break; // DEC DE + case 0x1C: INT_OP(INC8, E); break; // INC E + case 0x1D: INT_OP(DEC8, E); break; // DEC E + case 0x1E: LD_IND_8_INC(E, PCl, PCh); break; // LD E, n + case 0x1F: INT_OP(RR, Aim); break; // RRA + case 0x20: JR_COND(!FlagZ); break; // JR NZ, r8 + case 0x21: LD_IND_16(Iyl, Iyh, PCl, PCh); break; // LD Iy, nn + case 0x22: LD_16_IND_nn(Iyl, Iyh); break; // LD (nn), Iy + case 0x23: INC_16(Iyl, Iyh); break; // INC Iy + case 0x24: INT_OP(INC8, Iyh); break; // INC Iyh + case 0x25: INT_OP(DEC8, Iyh); break; // DEC Iyh + case 0x26: LD_IND_8_INC(Iyh, PCl, PCh); break; // LD Iyh, n + case 0x27: INT_OP(DA, A); break; // DAA + case 0x28: JR_COND(FlagZ); break; // JR Z, r8 + case 0x29: ADD_16(Iyl, Iyh, Iyl, Iyh); break; // ADD Iy, Iy + case 0x2A: LD_IND_16_nn(Iyl, Iyh); break; // LD Iy, (nn) + case 0x2B: DEC_16(Iyl, Iyh); break; // DEC Iy + case 0x2C: INT_OP(INC8, Iyl); break; // INC Iyl + case 0x2D: INT_OP(DEC8, Iyl); break; // DEC Iyl + case 0x2E: LD_IND_8_INC(Iyl, PCl, PCh); break; // LD Iyl, n + case 0x2F: INT_OP(CPL, A); break; // CPL + case 0x30: JR_COND(!FlagC); break; // JR NC, r8 + case 0x31: LD_IND_16(SPl, SPh, PCl, PCh); break; // LD SP, nn + case 0x32: LD_8_IND_nn(A); break; // LD (nn), A + case 0x33: INC_16(SPl, SPh); break; // INC SP + case 0x34: I_OP_n(INC8, Iyl, Iyh); break; // INC (Iy + n) + case 0x35: I_OP_n(DEC8, Iyl, Iyh); break; // DEC (Iy + n) + case 0x36: I_OP_n_n(Iyl, Iyh); break; // LD (Iy + n), n + case 0x37: INT_OP(SCF, A); break; // SCF + case 0x38: JR_COND(FlagC); break; // JR C, r8 + case 0x39: ADD_16(Iyl, Iyh, SPl, SPh); break; // ADD Iy, SP + case 0x3A: LD_IND_8_nn(A); break; // LD A, (nn) + case 0x3B: DEC_16(SPl, SPh); break; // DEC SP + case 0x3C: INT_OP(INC8, A); break; // INC A + case 0x3D: INT_OP(DEC8, A); break; // DEC A + case 0x3E: LD_IND_8_INC(A, PCl, PCh); break; // LD A, n + case 0x3F: INT_OP(CCF, A); break; // CCF + case 0x40: REG_OP(TR, B, B); break; // LD B, B + case 0x41: REG_OP(TR, B, C); break; // LD B, C + case 0x42: REG_OP(TR, B, D); break; // LD B, D + case 0x43: REG_OP(TR, B, E); break; // LD B, E + case 0x44: REG_OP(TR, B, Iyh); break; // LD B, Iyh + case 0x45: REG_OP(TR, B, Iyl); break; // LD B, Iyl + case 0x46: I_REG_OP_IND_n(TR, B, Iyl, Iyh); break; // LD B, (Iy + n) + case 0x47: REG_OP(TR, B, A); break; // LD B, A + case 0x48: REG_OP(TR, C, B); break; // LD C, B + case 0x49: REG_OP(TR, C, C); break; // LD C, C + case 0x4A: REG_OP(TR, C, D); break; // LD C, D + case 0x4B: REG_OP(TR, C, E); break; // LD C, E + case 0x4C: REG_OP(TR, C, Iyh); break; // LD C, Iyh + case 0x4D: REG_OP(TR, C, Iyl); break; // LD C, Iyl + case 0x4E: I_REG_OP_IND_n(TR, C, Iyl, Iyh); break; // LD C, (Iy + n) + case 0x4F: REG_OP(TR, C, A); break; // LD C, A + case 0x50: REG_OP(TR, D, B); break; // LD D, B + case 0x51: REG_OP(TR, D, C); break; // LD D, C + case 0x52: REG_OP(TR, D, D); break; // LD D, D + case 0x53: REG_OP(TR, D, E); break; // LD D, E + case 0x54: REG_OP(TR, D, Iyh); break; // LD D, Iyh + case 0x55: REG_OP(TR, D, Iyl); break; // LD D, Iyl + case 0x56: I_REG_OP_IND_n(TR, D, Iyl, Iyh); break; // LD D, (Iy + n) + case 0x57: REG_OP(TR, D, A); break; // LD D, A + case 0x58: REG_OP(TR, E, B); break; // LD E, B + case 0x59: REG_OP(TR, E, C); break; // LD E, C + case 0x5A: REG_OP(TR, E, D); break; // LD E, D + case 0x5B: REG_OP(TR, E, E); break; // LD E, E + case 0x5C: REG_OP(TR, E, Iyh); break; // LD E, Iyh + case 0x5D: REG_OP(TR, E, Iyl); break; // LD E, Iyl + case 0x5E: I_REG_OP_IND_n(TR, E, Iyl, Iyh); break; // LD E, (Iy + n) + case 0x5F: REG_OP(TR, E, A); break; // LD E, A + case 0x60: REG_OP(TR, Iyh, B); break; // LD Iyh, B + case 0x61: REG_OP(TR, Iyh, C); break; // LD Iyh, C + case 0x62: REG_OP(TR, Iyh, D); break; // LD Iyh, D + case 0x63: REG_OP(TR, Iyh, E); break; // LD Iyh, E + case 0x64: REG_OP(TR, Iyh, Iyh); break; // LD Iyh, Iyh + case 0x65: REG_OP(TR, Iyh, Iyl); break; // LD Iyh, Iyl + case 0x66: I_REG_OP_IND_n(TR, H, Iyl, Iyh); break; // LD H, (Iy + n) + case 0x67: REG_OP(TR, Iyh, A); break; // LD Iyh, A + case 0x68: REG_OP(TR, Iyl, B); break; // LD Iyl, B + case 0x69: REG_OP(TR, Iyl, C); break; // LD Iyl, C + case 0x6A: REG_OP(TR, Iyl, D); break; // LD Iyl, D + case 0x6B: REG_OP(TR, Iyl, E); break; // LD Iyl, E + case 0x6C: REG_OP(TR, Iyl, Iyh); break; // LD Iyl, Iyh + case 0x6D: REG_OP(TR, Iyl, Iyl); break; // LD Iyl, Iyl + case 0x6E: I_REG_OP_IND_n(TR, L, Iyl, Iyh); break; // LD L, (Iy + n) + case 0x6F: REG_OP(TR, Iyl, A); break; // LD Iyl, A + case 0x70: I_LD_8_IND_n(Iyl, Iyh, B); break; // LD (Iy + n), B + case 0x71: I_LD_8_IND_n(Iyl, Iyh, C); break; // LD (Iy + n), C + case 0x72: I_LD_8_IND_n(Iyl, Iyh, D); break; // LD (Iy + n), D + case 0x73: I_LD_8_IND_n(Iyl, Iyh, E); break; // LD (Iy + n), E + case 0x74: I_LD_8_IND_n(Iyl, Iyh, H); break; // LD (Iy + n), H + case 0x75: I_LD_8_IND_n(Iyl, Iyh, L); break; // LD (Iy + n), L + case 0x76: HALT_(); break; // HALT + case 0x77: I_LD_8_IND_n(Iyl, Iyh, A); break; // LD (Iy + n), A + case 0x78: REG_OP(TR, A, B); break; // LD A, B + case 0x79: REG_OP(TR, A, C); break; // LD A, C + case 0x7A: REG_OP(TR, A, D); break; // LD A, D + case 0x7B: REG_OP(TR, A, E); break; // LD A, E + case 0x7C: REG_OP(TR, A, Iyh); break; // LD A, Iyh + case 0x7D: REG_OP(TR, A, Iyl); break; // LD A, Iyl + case 0x7E: I_REG_OP_IND_n(TR, A, Iyl, Iyh); break; // LD A, (Iy + n) + case 0x7F: REG_OP(TR, A, A); break; // LD A, A + case 0x80: REG_OP(ADD8, A, B); break; // ADD A, B + case 0x81: REG_OP(ADD8, A, C); break; // ADD A, C + case 0x82: REG_OP(ADD8, A, D); break; // ADD A, D + case 0x83: REG_OP(ADD8, A, E); break; // ADD A, E + case 0x84: REG_OP(ADD8, A, Iyh); break; // ADD A, Iyh + case 0x85: REG_OP(ADD8, A, Iyl); break; // ADD A, Iyl + case 0x86: I_REG_OP_IND_n(ADD8, A, Iyl, Iyh); break; // ADD A, (Iy + n) + case 0x87: REG_OP(ADD8, A, A); break; // ADD A, A + case 0x88: REG_OP(ADC8, A, B); break; // ADC A, B + case 0x89: REG_OP(ADC8, A, C); break; // ADC A, C + case 0x8A: REG_OP(ADC8, A, D); break; // ADC A, D + case 0x8B: REG_OP(ADC8, A, E); break; // ADC A, E + case 0x8C: REG_OP(ADC8, A, Iyh); break; // ADC A, Iyh + case 0x8D: REG_OP(ADC8, A, Iyl); break; // ADC A, Iyl + case 0x8E: I_REG_OP_IND_n(ADC8, A, Iyl, Iyh); break; // ADC A, (Iy + n) + case 0x8F: REG_OP(ADC8, A, A); break; // ADC A, A + case 0x90: REG_OP(SUB8, A, B); break; // SUB A, B + case 0x91: REG_OP(SUB8, A, C); break; // SUB A, C + case 0x92: REG_OP(SUB8, A, D); break; // SUB A, D + case 0x93: REG_OP(SUB8, A, E); break; // SUB A, E + case 0x94: REG_OP(SUB8, A, Iyh); break; // SUB A, Iyh + case 0x95: REG_OP(SUB8, A, Iyl); break; // SUB A, Iyl + case 0x96: I_REG_OP_IND_n(SUB8, A, Iyl, Iyh); break; // SUB A, (Iy + n) + case 0x97: REG_OP(SUB8, A, A); break; // SUB A, A + case 0x98: REG_OP(SBC8, A, B); break; // SBC A, B + case 0x99: REG_OP(SBC8, A, C); break; // SBC A, C + case 0x9A: REG_OP(SBC8, A, D); break; // SBC A, D + case 0x9B: REG_OP(SBC8, A, E); break; // SBC A, E + case 0x9C: REG_OP(SBC8, A, Iyh); break; // SBC A, Iyh + case 0x9D: REG_OP(SBC8, A, Iyl); break; // SBC A, Iyl + case 0x9E: I_REG_OP_IND_n(SBC8, A, Iyl, Iyh); break; // SBC A, (Iy + n) + case 0x9F: REG_OP(SBC8, A, A); break; // SBC A, A + case 0xA0: REG_OP(AND8, A, B); break; // AND A, B + case 0xA1: REG_OP(AND8, A, C); break; // AND A, C + case 0xA2: REG_OP(AND8, A, D); break; // AND A, D + case 0xA3: REG_OP(AND8, A, E); break; // AND A, E + case 0xA4: REG_OP(AND8, A, Iyh); break; // AND A, Iyh + case 0xA5: REG_OP(AND8, A, Iyl); break; // AND A, Iyl + case 0xA6: I_REG_OP_IND_n(AND8, A, Iyl, Iyh); break; // AND A, (Iy + n) + case 0xA7: REG_OP(AND8, A, A); break; // AND A, A + case 0xA8: REG_OP(XOR8, A, B); break; // XOR A, B + case 0xA9: REG_OP(XOR8, A, C); break; // XOR A, C + case 0xAA: REG_OP(XOR8, A, D); break; // XOR A, D + case 0xAB: REG_OP(XOR8, A, E); break; // XOR A, E + case 0xAC: REG_OP(XOR8, A, Iyh); break; // XOR A, Iyh + case 0xAD: REG_OP(XOR8, A, Iyl); break; // XOR A, Iyl + case 0xAE: I_REG_OP_IND_n(XOR8, A, Iyl, Iyh); break; // XOR A, (Iy + n) + case 0xAF: REG_OP(XOR8, A, A); break; // XOR A, A + case 0xB0: REG_OP(OR8, A, B); break; // OR A, B + case 0xB1: REG_OP(OR8, A, C); break; // OR A, C + case 0xB2: REG_OP(OR8, A, D); break; // OR A, D + case 0xB3: REG_OP(OR8, A, E); break; // OR A, E + case 0xB4: REG_OP(OR8, A, Iyh); break; // OR A, Iyh + case 0xB5: REG_OP(OR8, A, Iyl); break; // OR A, Iyl + case 0xB6: I_REG_OP_IND_n(OR8, A, Iyl, Iyh); break; // OR A, (Iy + n) + case 0xB7: REG_OP(OR8, A, A); break; // OR A, A + case 0xB8: REG_OP(CP8, A, B); break; // CP A, B + case 0xB9: REG_OP(CP8, A, C); break; // CP A, C + case 0xBA: REG_OP(CP8, A, D); break; // CP A, D + case 0xBB: REG_OP(CP8, A, E); break; // CP A, E + case 0xBC: REG_OP(CP8, A, Iyh); break; // CP A, Iyh + case 0xBD: REG_OP(CP8, A, Iyl); break; // CP A, Iyl + case 0xBE: I_REG_OP_IND_n(CP8, A, Iyl, Iyh); break; // CP A, (Iy + n) + case 0xBF: REG_OP(CP8, A, A); break; // CP A, A + case 0xC0: RET_COND(!FlagZ); break; // Ret NZ + case 0xC1: POP_(C, B); break; // POP BC + case 0xC2: JP_COND(!FlagZ); break; // JP NZ + case 0xC3: JP_COND(true); break; // JP + case 0xC4: CALL_COND(!FlagZ); break; // CALL NZ + case 0xC5: PUSH_(C, B); break; // PUSH BC + case 0xC6: REG_OP_IND_INC(ADD8, A, PCl, PCh); break; // ADD A, n + case 0xC7: RST_(0); break; // RST 0 + case 0xC8: RET_COND(FlagZ); break; // RET Z + case 0xC9: RET_(); break; // RET + case 0xCA: JP_COND(FlagZ); break; // JP Z + case 0xCB: PREFIX_(IYCBpre); break; // PREFIy IyCB + case 0xCC: CALL_COND(FlagZ); break; // CALL Z + case 0xCD: CALL_COND(true); break; // CALL + case 0xCE: REG_OP_IND_INC(ADC8, A, PCl, PCh); break; // ADC A, n + case 0xCF: RST_(0x08); break; // RST 0x08 + case 0xD0: RET_COND(!FlagC); break; // Ret NC + case 0xD1: POP_(E, D); break; // POP DE + case 0xD2: JP_COND(!FlagC); break; // JP NC + case 0xD3: OUT_(); break; // OUT A + case 0xD4: CALL_COND(!FlagC); break; // CALL NC + case 0xD5: PUSH_(E, D); break; // PUSH DE + case 0xD6: REG_OP_IND_INC(SUB8, A, PCl, PCh); break; // SUB A, n + case 0xD7: RST_(0x10); break; // RST 0x10 + case 0xD8: RET_COND(FlagC); break; // RET C + case 0xD9: EXX_(); break; // EXX + case 0xDA: JP_COND(FlagC); break; // JP C + case 0xDB: IN_(); break; // IN A + case 0xDC: CALL_COND(FlagC); break; // CALL C + case 0xDD: JAM_(); break; // Jam (invalid) + case 0xDE: REG_OP_IND_INC(SBC8, A, PCl, PCh); break; // SBC A, n + case 0xDF: RST_(0x18); break; // RST 0x18 + case 0xE0: RET_COND(!FlagP); break; // RET Po + case 0xE1: POP_(Iyl, Iyh); break; // POP Iy + case 0xE2: JP_COND(!FlagP); break; // JP Po + case 0xE3: EXCH_16_IND_(SPl, SPh, Iyl, Iyh); break; // ex (SP), Iy + case 0xE4: CALL_COND(!FlagP); break; // CALL Po + case 0xE5: PUSH_(Iyl, Iyh); break; // PUSH Iy + case 0xE6: REG_OP_IND_INC(AND8, A, PCl, PCh); break; // AND A, n + case 0xE7: RST_(0x20); break; // RST 0x20 + case 0xE8: RET_COND(FlagP); break; // RET Pe + case 0xE9: JP_16(Iyl, Iyh); break; // JP (Iy) + case 0xEA: JP_COND(FlagP); break; // JP Pe + case 0xEB: EXCH_16_(E, D, L, H); break; // ex DE, HL + case 0xEC: CALL_COND(FlagP); break; // CALL Pe + case 0xED: JAM_(); break; // Jam (invalid) + case 0xEE: REG_OP_IND_INC(XOR8, A, PCl, PCh); break; // XOR A, n + case 0xEF: RST_(0x28); break; // RST 0x28 + case 0xF0: RET_COND(!FlagS); break; // RET p + case 0xF1: POP_(F, A); break; // POP AF + case 0xF2: JP_COND(!FlagS); break; // JP p + case 0xF3: DI_(); break; // DI + case 0xF4: CALL_COND(!FlagS); break; // CALL p + case 0xF5: PUSH_(F, A); break; // PUSH AF + case 0xF6: REG_OP_IND_INC(OR8, A, PCl, PCh); break; // OR A, n + case 0xF7: RST_(0x30); break; // RST 0x30 + case 0xF8: RET_COND(FlagS); break; // RET M + case 0xF9: LD_SP_16(Iyl, Iyh); break; // LD SP, Iy + case 0xFA: JP_COND(FlagS); break; // JP M + case 0xFB: EI_(); break; // EI + case 0xFC: CALL_COND(FlagS); break; // CALL M + case 0xFD: JAM_(); break; // Jam (invalid) + case 0xFE: REG_OP_IND_INC(CP8, A, PCl, PCh); break; // CP A, n + case 0xFF: RST_(0x38); break; // RST $38 + } + } + else if (IXCB_prefix || IYCB_prefix) + { + // the first byte fetched is the prefetch value to use with the instruction + // we pick Ix or Iy here, the indexed value is stored in WZ + // In this way, we don't need to pass them as an argument to the I_Funcs. + if (IXCB_prefetch) + { + IXCB_prefetch = false; + PF = opcode; + Regs[ALU] = PF; + PREFETCH_(Ixl, Ixh); + return; + } + + if (IYCB_prefetch) + { + IYCB_prefetch = false; + PF = opcode; + Regs[ALU] = PF; + PREFETCH_(Iyl, Iyh); + + return; + } + + IXCB_prefix = false; + IYCB_prefix = false; + NO_prefix = true; + + switch (opcode) + { + case 0x00: I_INT_OP(RLC, B); break; // RLC (I* + n) -> B + case 0x01: I_INT_OP(RLC, C); break; // RLC (I* + n) -> C + case 0x02: I_INT_OP(RLC, D); break; // RLC (I* + n) -> D + case 0x03: I_INT_OP(RLC, E); break; // RLC (I* + n) -> E + case 0x04: I_INT_OP(RLC, H); break; // RLC (I* + n) -> H + case 0x05: I_INT_OP(RLC, L); break; // RLC (I* + n) -> L + case 0x06: I_INT_OP(RLC, ALU); break; // RLC (I* + n) + case 0x07: I_INT_OP(RLC, A); break; // RLC (I* + n) -> A + case 0x08: I_INT_OP(RRC, B); break; // RRC (I* + n) -> B + case 0x09: I_INT_OP(RRC, C); break; // RRC (I* + n) -> C + case 0x0A: I_INT_OP(RRC, D); break; // RRC (I* + n) -> D + case 0x0B: I_INT_OP(RRC, E); break; // RRC (I* + n) -> E + case 0x0C: I_INT_OP(RRC, H); break; // RRC (I* + n) -> H + case 0x0D: I_INT_OP(RRC, L); break; // RRC (I* + n) -> L + case 0x0E: I_INT_OP(RRC, ALU); break; // RRC (I* + n) + case 0x0F: I_INT_OP(RRC, A); break; // RRC (I* + n) -> A + case 0x10: I_INT_OP(RL, B); break; // RL (I* + n) -> B + case 0x11: I_INT_OP(RL, C); break; // RL (I* + n) -> C + case 0x12: I_INT_OP(RL, D); break; // RL (I* + n) -> D + case 0x13: I_INT_OP(RL, E); break; // RL (I* + n) -> E + case 0x14: I_INT_OP(RL, H); break; // RL (I* + n) -> H + case 0x15: I_INT_OP(RL, L); break; // RL (I* + n) -> L + case 0x16: I_INT_OP(RL, ALU); break; // RL (I* + n) + case 0x17: I_INT_OP(RL, A); break; // RL (I* + n) -> A + case 0x18: I_INT_OP(RR, B); break; // RR (I* + n) -> B + case 0x19: I_INT_OP(RR, C); break; // RR (I* + n) -> C + case 0x1A: I_INT_OP(RR, D); break; // RR (I* + n) -> D + case 0x1B: I_INT_OP(RR, E); break; // RR (I* + n) -> E + case 0x1C: I_INT_OP(RR, H); break; // RR (I* + n) -> H + case 0x1D: I_INT_OP(RR, L); break; // RR (I* + n) -> L + case 0x1E: I_INT_OP(RR, ALU); break; // RR (I* + n) + case 0x1F: I_INT_OP(RR, A); break; // RR (I* + n) -> A + case 0x20: I_INT_OP(SLA, B); break; // SLA (I* + n) -> B + case 0x21: I_INT_OP(SLA, C); break; // SLA (I* + n) -> C + case 0x22: I_INT_OP(SLA, D); break; // SLA (I* + n) -> D + case 0x23: I_INT_OP(SLA, E); break; // SLA (I* + n) -> E + case 0x24: I_INT_OP(SLA, H); break; // SLA (I* + n) -> H + case 0x25: I_INT_OP(SLA, L); break; // SLA (I* + n) -> L + case 0x26: I_INT_OP(SLA, ALU); break; // SLA (I* + n) + case 0x27: I_INT_OP(SLA, A); break; // SLA (I* + n) -> A + case 0x28: I_INT_OP(SRA, B); break; // SRA (I* + n) -> B + case 0x29: I_INT_OP(SRA, C); break; // SRA (I* + n) -> C + case 0x2A: I_INT_OP(SRA, D); break; // SRA (I* + n) -> D + case 0x2B: I_INT_OP(SRA, E); break; // SRA (I* + n) -> E + case 0x2C: I_INT_OP(SRA, H); break; // SRA (I* + n) -> H + case 0x2D: I_INT_OP(SRA, L); break; // SRA (I* + n) -> L + case 0x2E: I_INT_OP(SRA, ALU); break; // SRA (I* + n) + case 0x2F: I_INT_OP(SRA, A); break; // SRA (I* + n) -> A + case 0x30: I_INT_OP(SLL, B); break; // SLL (I* + n) -> B + case 0x31: I_INT_OP(SLL, C); break; // SLL (I* + n) -> C + case 0x32: I_INT_OP(SLL, D); break; // SLL (I* + n) -> D + case 0x33: I_INT_OP(SLL, E); break; // SLL (I* + n) -> E + case 0x34: I_INT_OP(SLL, H); break; // SLL (I* + n) -> H + case 0x35: I_INT_OP(SLL, L); break; // SLL (I* + n) -> L + case 0x36: I_INT_OP(SLL, ALU); break; // SLL (I* + n) + case 0x37: I_INT_OP(SLL, A); break; // SLL (I* + n) -> A + case 0x38: I_INT_OP(SRL, B); break; // SRL (I* + n) -> B + case 0x39: I_INT_OP(SRL, C); break; // SRL (I* + n) -> C + case 0x3A: I_INT_OP(SRL, D); break; // SRL (I* + n) -> D + case 0x3B: I_INT_OP(SRL, E); break; // SRL (I* + n) -> E + case 0x3C: I_INT_OP(SRL, H); break; // SRL (I* + n) -> H + case 0x3D: I_INT_OP(SRL, L); break; // SRL (I* + n) -> L + case 0x3E: I_INT_OP(SRL, ALU); break; // SRL (I* + n) + case 0x3F: I_INT_OP(SRL, A); break; // SRL (I* + n) -> A + case 0x40: I_BIT_TE(0); break; // BIT 0, (I* + n) + case 0x41: I_BIT_TE(0); break; // BIT 0, (I* + n) + case 0x42: I_BIT_TE(0); break; // BIT 0, (I* + n) + case 0x43: I_BIT_TE(0); break; // BIT 0, (I* + n) + case 0x44: I_BIT_TE(0); break; // BIT 0, (I* + n) + case 0x45: I_BIT_TE(0); break; // BIT 0, (I* + n) + case 0x46: I_BIT_TE(0); break; // BIT 0, (I* + n) + case 0x47: I_BIT_TE(0); break; // BIT 0, (I* + n) + case 0x48: I_BIT_TE(1); break; // BIT 1, (I* + n) + case 0x49: I_BIT_TE(1); break; // BIT 1, (I* + n) + case 0x4A: I_BIT_TE(1); break; // BIT 1, (I* + n) + case 0x4B: I_BIT_TE(1); break; // BIT 1, (I* + n) + case 0x4C: I_BIT_TE(1); break; // BIT 1, (I* + n) + case 0x4D: I_BIT_TE(1); break; // BIT 1, (I* + n) + case 0x4E: I_BIT_TE(1); break; // BIT 1, (I* + n) + case 0x4F: I_BIT_TE(1); break; // BIT 1, (I* + n) + case 0x50: I_BIT_TE(2); break; // BIT 2, (I* + n) + case 0x51: I_BIT_TE(2); break; // BIT 2, (I* + n) + case 0x52: I_BIT_TE(2); break; // BIT 2, (I* + n) + case 0x53: I_BIT_TE(2); break; // BIT 2, (I* + n) + case 0x54: I_BIT_TE(2); break; // BIT 2, (I* + n) + case 0x55: I_BIT_TE(2); break; // BIT 2, (I* + n) + case 0x56: I_BIT_TE(2); break; // BIT 2, (I* + n) + case 0x57: I_BIT_TE(2); break; // BIT 2, (I* + n) + case 0x58: I_BIT_TE(3); break; // BIT 3, (I* + n) + case 0x59: I_BIT_TE(3); break; // BIT 3, (I* + n) + case 0x5A: I_BIT_TE(3); break; // BIT 3, (I* + n) + case 0x5B: I_BIT_TE(3); break; // BIT 3, (I* + n) + case 0x5C: I_BIT_TE(3); break; // BIT 3, (I* + n) + case 0x5D: I_BIT_TE(3); break; // BIT 3, (I* + n) + case 0x5E: I_BIT_TE(3); break; // BIT 3, (I* + n) + case 0x5F: I_BIT_TE(3); break; // BIT 3, (I* + n) + case 0x60: I_BIT_TE(4); break; // BIT 4, (I* + n) + case 0x61: I_BIT_TE(4); break; // BIT 4, (I* + n) + case 0x62: I_BIT_TE(4); break; // BIT 4, (I* + n) + case 0x63: I_BIT_TE(4); break; // BIT 4, (I* + n) + case 0x64: I_BIT_TE(4); break; // BIT 4, (I* + n) + case 0x65: I_BIT_TE(4); break; // BIT 4, (I* + n) + case 0x66: I_BIT_TE(4); break; // BIT 4, (I* + n) + case 0x67: I_BIT_TE(4); break; // BIT 4, (I* + n) + case 0x68: I_BIT_TE(5); break; // BIT 5, (I* + n) + case 0x69: I_BIT_TE(5); break; // BIT 5, (I* + n) + case 0x6A: I_BIT_TE(5); break; // BIT 5, (I* + n) + case 0x6B: I_BIT_TE(5); break; // BIT 5, (I* + n) + case 0x6C: I_BIT_TE(5); break; // BIT 5, (I* + n) + case 0x6D: I_BIT_TE(5); break; // BIT 5, (I* + n) + case 0x6E: I_BIT_TE(5); break; // BIT 5, (I* + n) + case 0x6F: I_BIT_TE(5); break; // BIT 5, (I* + n) + case 0x70: I_BIT_TE(6); break; // BIT 6, (I* + n) + case 0x71: I_BIT_TE(6); break; // BIT 6, (I* + n) + case 0x72: I_BIT_TE(6); break; // BIT 6, (I* + n) + case 0x73: I_BIT_TE(6); break; // BIT 6, (I* + n) + case 0x74: I_BIT_TE(6); break; // BIT 6, (I* + n) + case 0x75: I_BIT_TE(6); break; // BIT 6, (I* + n) + case 0x76: I_BIT_TE(6); break; // BIT 6, (I* + n) + case 0x77: I_BIT_TE(6); break; // BIT 6, (I* + n) + case 0x78: I_BIT_TE(7); break; // BIT 7, (I* + n) + case 0x79: I_BIT_TE(7); break; // BIT 7, (I* + n) + case 0x7A: I_BIT_TE(7); break; // BIT 7, (I* + n) + case 0x7B: I_BIT_TE(7); break; // BIT 7, (I* + n) + case 0x7C: I_BIT_TE(7); break; // BIT 7, (I* + n) + case 0x7D: I_BIT_TE(7); break; // BIT 7, (I* + n) + case 0x7E: I_BIT_TE(7); break; // BIT 7, (I* + n) + case 0x7F: I_BIT_TE(7); break; // BIT 7, (I* + n) + case 0x80: I_BIT_OP(RES, 0, B); break; // RES 0, (I* + n) -> B + case 0x81: I_BIT_OP(RES, 0, C); break; // RES 0, (I* + n) -> C + case 0x82: I_BIT_OP(RES, 0, D); break; // RES 0, (I* + n) -> D + case 0x83: I_BIT_OP(RES, 0, E); break; // RES 0, (I* + n) -> E + case 0x84: I_BIT_OP(RES, 0, H); break; // RES 0, (I* + n) -> H + case 0x85: I_BIT_OP(RES, 0, L); break; // RES 0, (I* + n) -> L + case 0x86: I_BIT_OP(RES, 0, ALU); break; // RES 0, (I* + n) + case 0x87: I_BIT_OP(RES, 0, A); break; // RES 0, (I* + n) -> A + case 0x88: I_BIT_OP(RES, 1, B); break; // RES 1, (I* + n) -> B + case 0x89: I_BIT_OP(RES, 1, C); break; // RES 1, (I* + n) -> C + case 0x8A: I_BIT_OP(RES, 1, D); break; // RES 1, (I* + n) -> D + case 0x8B: I_BIT_OP(RES, 1, E); break; // RES 1, (I* + n) -> E + case 0x8C: I_BIT_OP(RES, 1, H); break; // RES 1, (I* + n) -> H + case 0x8D: I_BIT_OP(RES, 1, L); break; // RES 1, (I* + n) -> L + case 0x8E: I_BIT_OP(RES, 1, ALU); break; // RES 1, (I* + n) + case 0x8F: I_BIT_OP(RES, 1, A); break; // RES 1, (I* + n) -> A + case 0x90: I_BIT_OP(RES, 2, B); break; // RES 2, (I* + n) -> B + case 0x91: I_BIT_OP(RES, 2, C); break; // RES 2, (I* + n) -> C + case 0x92: I_BIT_OP(RES, 2, D); break; // RES 2, (I* + n) -> D + case 0x93: I_BIT_OP(RES, 2, E); break; // RES 2, (I* + n) -> E + case 0x94: I_BIT_OP(RES, 2, H); break; // RES 2, (I* + n) -> H + case 0x95: I_BIT_OP(RES, 2, L); break; // RES 2, (I* + n) -> L + case 0x96: I_BIT_OP(RES, 2, ALU); break; // RES 2, (I* + n) + case 0x97: I_BIT_OP(RES, 2, A); break; // RES 2, (I* + n) -> A + case 0x98: I_BIT_OP(RES, 3, B); break; // RES 3, (I* + n) -> B + case 0x99: I_BIT_OP(RES, 3, C); break; // RES 3, (I* + n) -> C + case 0x9A: I_BIT_OP(RES, 3, D); break; // RES 3, (I* + n) -> D + case 0x9B: I_BIT_OP(RES, 3, E); break; // RES 3, (I* + n) -> E + case 0x9C: I_BIT_OP(RES, 3, H); break; // RES 3, (I* + n) -> H + case 0x9D: I_BIT_OP(RES, 3, L); break; // RES 3, (I* + n) -> L + case 0x9E: I_BIT_OP(RES, 3, ALU); break; // RES 3, (I* + n) + case 0x9F: I_BIT_OP(RES, 3, A); break; // RES 3, (I* + n) -> A + case 0xA0: I_BIT_OP(RES, 4, B); break; // RES 4, (I* + n) -> B + case 0xA1: I_BIT_OP(RES, 4, C); break; // RES 4, (I* + n) -> C + case 0xA2: I_BIT_OP(RES, 4, D); break; // RES 4, (I* + n) -> D + case 0xA3: I_BIT_OP(RES, 4, E); break; // RES 4, (I* + n) -> E + case 0xA4: I_BIT_OP(RES, 4, H); break; // RES 4, (I* + n) -> H + case 0xA5: I_BIT_OP(RES, 4, L); break; // RES 4, (I* + n) -> L + case 0xA6: I_BIT_OP(RES, 4, ALU); break; // RES 4, (I* + n) + case 0xA7: I_BIT_OP(RES, 4, A); break; // RES 4, (I* + n) -> A + case 0xA8: I_BIT_OP(RES, 5, B); break; // RES 5, (I* + n) -> B + case 0xA9: I_BIT_OP(RES, 5, C); break; // RES 5, (I* + n) -> C + case 0xAA: I_BIT_OP(RES, 5, D); break; // RES 5, (I* + n) -> D + case 0xAB: I_BIT_OP(RES, 5, E); break; // RES 5, (I* + n) -> E + case 0xAC: I_BIT_OP(RES, 5, H); break; // RES 5, (I* + n) -> H + case 0xAD: I_BIT_OP(RES, 5, L); break; // RES 5, (I* + n) -> L + case 0xAE: I_BIT_OP(RES, 5, ALU); break; // RES 5, (I* + n) + case 0xAF: I_BIT_OP(RES, 5, A); break; // RES 5, (I* + n) -> A + case 0xB0: I_BIT_OP(RES, 6, B); break; // RES 6, (I* + n) -> B + case 0xB1: I_BIT_OP(RES, 6, C); break; // RES 6, (I* + n) -> C + case 0xB2: I_BIT_OP(RES, 6, D); break; // RES 6, (I* + n) -> D + case 0xB3: I_BIT_OP(RES, 6, E); break; // RES 6, (I* + n) -> E + case 0xB4: I_BIT_OP(RES, 6, H); break; // RES 6, (I* + n) -> H + case 0xB5: I_BIT_OP(RES, 6, L); break; // RES 6, (I* + n) -> L + case 0xB6: I_BIT_OP(RES, 6, ALU); break; // RES 6, (I* + n) + case 0xB7: I_BIT_OP(RES, 6, A); break; // RES 6, (I* + n) -> A + case 0xB8: I_BIT_OP(RES, 7, B); break; // RES 7, (I* + n) -> B + case 0xB9: I_BIT_OP(RES, 7, C); break; // RES 7, (I* + n) -> C + case 0xBA: I_BIT_OP(RES, 7, D); break; // RES 7, (I* + n) -> D + case 0xBB: I_BIT_OP(RES, 7, E); break; // RES 7, (I* + n) -> E + case 0xBC: I_BIT_OP(RES, 7, H); break; // RES 7, (I* + n) -> H + case 0xBD: I_BIT_OP(RES, 7, L); break; // RES 7, (I* + n) -> L + case 0xBE: I_BIT_OP(RES, 7, ALU); break; // RES 7, (I* + n) + case 0xBF: I_BIT_OP(RES, 7, A); break; // RES 7, (I* + n) -> A + case 0xC0: I_BIT_OP(SET, 0, B); break; // SET 0, (I* + n) -> B + case 0xC1: I_BIT_OP(SET, 0, C); break; // SET 0, (I* + n) -> C + case 0xC2: I_BIT_OP(SET, 0, D); break; // SET 0, (I* + n) -> D + case 0xC3: I_BIT_OP(SET, 0, E); break; // SET 0, (I* + n) -> E + case 0xC4: I_BIT_OP(SET, 0, H); break; // SET 0, (I* + n) -> H + case 0xC5: I_BIT_OP(SET, 0, L); break; // SET 0, (I* + n) -> L + case 0xC6: I_BIT_OP(SET, 0, ALU); break; // SET 0, (I* + n) + case 0xC7: I_BIT_OP(SET, 0, A); break; // SET 0, (I* + n) -> A + case 0xC8: I_BIT_OP(SET, 1, B); break; // SET 1, (I* + n) -> B + case 0xC9: I_BIT_OP(SET, 1, C); break; // SET 1, (I* + n) -> C + case 0xCA: I_BIT_OP(SET, 1, D); break; // SET 1, (I* + n) -> D + case 0xCB: I_BIT_OP(SET, 1, E); break; // SET 1, (I* + n) -> E + case 0xCC: I_BIT_OP(SET, 1, H); break; // SET 1, (I* + n) -> H + case 0xCD: I_BIT_OP(SET, 1, L); break; // SET 1, (I* + n) -> L + case 0xCE: I_BIT_OP(SET, 1, ALU); break; // SET 1, (I* + n) + case 0xCF: I_BIT_OP(SET, 1, A); break; // SET 1, (I* + n) -> A + case 0xD0: I_BIT_OP(SET, 2, B); break; // SET 2, (I* + n) -> B + case 0xD1: I_BIT_OP(SET, 2, C); break; // SET 2, (I* + n) -> C + case 0xD2: I_BIT_OP(SET, 2, D); break; // SET 2, (I* + n) -> D + case 0xD3: I_BIT_OP(SET, 2, E); break; // SET 2, (I* + n) -> E + case 0xD4: I_BIT_OP(SET, 2, H); break; // SET 2, (I* + n) -> H + case 0xD5: I_BIT_OP(SET, 2, L); break; // SET 2, (I* + n) -> L + case 0xD6: I_BIT_OP(SET, 2, ALU); break; // SET 2, (I* + n) + case 0xD7: I_BIT_OP(SET, 2, A); break; // SET 2, (I* + n) -> A + case 0xD8: I_BIT_OP(SET, 3, B); break; // SET 3, (I* + n) -> B + case 0xD9: I_BIT_OP(SET, 3, C); break; // SET 3, (I* + n) -> C + case 0xDA: I_BIT_OP(SET, 3, D); break; // SET 3, (I* + n) -> D + case 0xDB: I_BIT_OP(SET, 3, E); break; // SET 3, (I* + n) -> E + case 0xDC: I_BIT_OP(SET, 3, H); break; // SET 3, (I* + n) -> H + case 0xDD: I_BIT_OP(SET, 3, L); break; // SET 3, (I* + n) -> L + case 0xDE: I_BIT_OP(SET, 3, ALU); break; // SET 3, (I* + n) + case 0xDF: I_BIT_OP(SET, 3, A); break; // SET 3, (I* + n) -> A + case 0xE0: I_BIT_OP(SET, 4, B); break; // SET 4, (I* + n) -> B + case 0xE1: I_BIT_OP(SET, 4, C); break; // SET 4, (I* + n) -> C + case 0xE2: I_BIT_OP(SET, 4, D); break; // SET 4, (I* + n) -> D + case 0xE3: I_BIT_OP(SET, 4, E); break; // SET 4, (I* + n) -> E + case 0xE4: I_BIT_OP(SET, 4, H); break; // SET 4, (I* + n) -> H + case 0xE5: I_BIT_OP(SET, 4, L); break; // SET 4, (I* + n) -> L + case 0xE6: I_BIT_OP(SET, 4, ALU); break; // SET 4, (I* + n) + case 0xE7: I_BIT_OP(SET, 4, A); break; // SET 4, (I* + n) -> A + case 0xE8: I_BIT_OP(SET, 5, B); break; // SET 5, (I* + n) -> B + case 0xE9: I_BIT_OP(SET, 5, C); break; // SET 5, (I* + n) -> C + case 0xEA: I_BIT_OP(SET, 5, D); break; // SET 5, (I* + n) -> D + case 0xEB: I_BIT_OP(SET, 5, E); break; // SET 5, (I* + n) -> E + case 0xEC: I_BIT_OP(SET, 5, H); break; // SET 5, (I* + n) -> H + case 0xED: I_BIT_OP(SET, 5, L); break; // SET 5, (I* + n) -> L + case 0xEE: I_BIT_OP(SET, 5, ALU); break; // SET 5, (I* + n) + case 0xEF: I_BIT_OP(SET, 5, A); break; // SET 5, (I* + n) -> A + case 0xF0: I_BIT_OP(SET, 6, B); break; // SET 6, (I* + n) -> B + case 0xF1: I_BIT_OP(SET, 6, C); break; // SET 6, (I* + n) -> C + case 0xF2: I_BIT_OP(SET, 6, D); break; // SET 6, (I* + n) -> D + case 0xF3: I_BIT_OP(SET, 6, E); break; // SET 6, (I* + n) -> E + case 0xF4: I_BIT_OP(SET, 6, H); break; // SET 6, (I* + n) -> H + case 0xF5: I_BIT_OP(SET, 6, L); break; // SET 6, (I* + n) -> L + case 0xF6: I_BIT_OP(SET, 6, ALU); break; // SET 6, (I* + n) + case 0xF7: I_BIT_OP(SET, 6, A); break; // SET 6, (I* + n) -> A + case 0xF8: I_BIT_OP(SET, 7, B); break; // SET 7, (I* + n) -> B + case 0xF9: I_BIT_OP(SET, 7, C); break; // SET 7, (I* + n) -> C + case 0xFA: I_BIT_OP(SET, 7, D); break; // SET 7, (I* + n) -> D + case 0xFB: I_BIT_OP(SET, 7, E); break; // SET 7, (I* + n) -> E + case 0xFC: I_BIT_OP(SET, 7, H); break; // SET 7, (I* + n) -> H + case 0xFD: I_BIT_OP(SET, 7, L); break; // SET 7, (I* + n) -> L + case 0xFE: I_BIT_OP(SET, 7, ALU); break; // SET 7, (I* + n) + case 0xFF: I_BIT_OP(SET, 7, A); break; // SET 7, (I* + n) -> A + } + } + } + } +} \ No newline at end of file diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs new file mode 100644 index 0000000000..33df2edf55 --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs @@ -0,0 +1,122 @@ +using System; + +namespace BizHawk.Emulation.Common.Components.Z80A +{ + public partial class Z80A + { + private bool iff1; + public bool IFF1 { get { return iff1; } set { iff1 = value; } } + + private bool iff2; + public bool IFF2 { get { return iff2; } set { iff2 = value; } } + + private bool nonMaskableInterrupt; + public bool NonMaskableInterrupt + { + get { return nonMaskableInterrupt; } + set { if (value && !nonMaskableInterrupt) NonMaskableInterruptPending = true; nonMaskableInterrupt = value; } + } + + private bool nonMaskableInterruptPending; + public bool NonMaskableInterruptPending { get { return nonMaskableInterruptPending; } set { nonMaskableInterruptPending = value; } } + + private int interruptMode; + public int InterruptMode + { + get { return interruptMode; } + set { if (value < 0 || value > 2) throw new ArgumentOutOfRangeException(); interruptMode = value; } + } + + public Action IRQCallback = delegate () { }; + public Action NMICallback = delegate () { }; + + private void NMI_() + { + cur_instr = new ushort[] + {IDLE, + DEC16, SPl, SPh, + WR, SPl, SPh, PCh, + IDLE, + DEC16, SPl, SPh, + WR, SPl, SPh, PCl, + IDLE, + ASGN, PCl, 0x66, + ASGN, PCh, 0, + IDLE, + OP }; + } + + // Mode 0 interrupts only take effect if a CALL or RST is on the data bus + // Otherwise operation just continues as normal + // For now assume a NOP is on the data bus, in which case no stack operations occur + + //NOTE: TODO: When a CALL is present on the data bus, adjust WZ accordingly + private void INTERRUPT_0(ushort src) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, ALU, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + OP }; + } + + // Just jump to $0038 + private void INTERRUPT_1() + { + cur_instr = new ushort[] + {DEC16, SPl, SPh, + IDLE, + WR, SPl, SPh, PCh, + IDLE, + DEC16, SPl, SPh, + IDLE, + WR, SPl, SPh, PCl, + IDLE, + ASGN, PCl, 0x38, + IDLE, + ASGN, PCh, 0, + IDLE, + OP }; + } + + // Interrupt mode 2 uses the I vector combined with a byte on the data bus + // Again for now we assume only a 0 on the data bus and jump to 0xI00 + private void INTERRUPT_2(ushort src) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + IDLE, + DEC16, SPl, SPh, + IDLE, + WR, SPl, SPh, PCh, + IDLE, + DEC16, SPl, SPh, + IDLE, + WR, SPl, SPh, PCl, + IDLE, + ASGN, PCl, 0, + IDLE, + TR, PCh, I, + IDLE, + OP }; + } + + private static ushort[] INT_vectors = new ushort[] {0x40, 0x48, 0x50, 0x58, 0x60}; + + private void ResetInterrupts() + { + IFF1 = false; + IFF2 = false; + NonMaskableInterrupt = false; + NonMaskableInterruptPending = false; + InterruptMode = 1; + } + } +} \ No newline at end of file diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs new file mode 100644 index 0000000000..62c546ca6e --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs @@ -0,0 +1,467 @@ +using System; +using System.Collections.Generic; + +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Common.Components.Z80A +{ + public sealed partial class Z80A : IDisassemblable + { + static string Result(string format, Func read, ref ushort addr) + { + //d immediately succeeds the opcode + //n immediate succeeds the opcode and the displacement (if present) + //nn immediately succeeds the opcode and the displacement (if present) + if (format.IndexOf("nn") != -1) + { + byte B = read(addr++); + byte C = read(addr++); + format = format.Replace("nn", string.Format("{0:X4}h", B + C * 256)); + } + + if (format.IndexOf("n") != -1) + { + byte B = read(addr++); + format = format.Replace("n", string.Format("{0:X2}h", B)); + } + + if (format.IndexOf("+d") != -1) format = format.Replace("+d", "d"); + + if (format.IndexOf("d") != -1) + { + byte B = read(addr++); + bool neg = ((B & 0x80) != 0); + char sign = neg ? '-' : '+'; + int val = neg ? 256 - B : B; + format = format.Replace("d", string.Format("{0}{1:X2}h", sign, val)); + } + + return format; + } + + readonly static string[] mnemonics = new string[] + { + "NOP", "LD BC, nn", "LD (BC), A", "INC BC", //0x04 + "INC B", "DEC B", "LD B, n", "RLCA", //0x08 + "EX AF, AF'", "ADD HL, BC", "LD A, (BC)", "DEC BC", //0x0C + "INC C", "DEC C", "LD C, n", "RRCA", //0x10 + "DJNZ d", "LD DE, nn", "LD (DE), A", "INC DE", //0x14 + "INC D", "DEC D", "LD D, n", "RLA", //0x18 + "JR d", "ADD HL, DE", "LD A, (DE)", "DEC DE", //0x1C + "INC E", "DEC E", "LD E, n", "RRA", //0x20 + "JR NZ, d", "LD HL, nn", "LD (nn), HL", "INC HL", //0x24 + "INC H", "DEC H", "LD H, n", "DAA", //0x28 + "JR Z, d", "ADD HL, HL", "LD HL, (nn)", "DEC HL", //0x2C + "INC L", "DEC L", "LD L, n", "CPL", //0x30 + "JR NC, d", "LD SP, nn", "LD (nn), A", "INC SP", //0x34 + "INC (HL)", "DEC (HL)", "LD (HL), n", "SCF", //0x38 + "JR C, d", "ADD HL, SP", "LD A, (nn)", "DEC SP", //0x3C + "INC A", "DEC A", "LD A, n", "CCF", //0x40 + "LD B, B", "LD B, C", "LD B, D", "LD B, E", //0x44 + "LD B, H", "LD B, L", "LD B, (HL)", "LD B, A", //0x48 + "LD C, B", "LD C, C", "LD C, D", "LD C, E", //0x4C + "LD C, H", "LD C, L", "LD C, (HL)", "LD C, A", //0x50 + "LD D, B", "LD D, C", "LD D, D", "LD D, E", //0x54 + "LD D, H", "LD D, L", "LD D, (HL)", "LD D, A", //0x58 + "LD E, B", "LD E, C", "LD E, D", "LD E, E", //0x5C + "LD E, H", "LD E, L", "LD E, (HL)", "LD E, A", //0x60 + "LD H, B", "LD H, C", "LD H, D", "LD H, E", //0x64 + "LD H, H", "LD H, L", "LD H, (HL)", "LD H, A", //0x68 + "LD L, B", "LD L, B", "LD L, D", "LD L, E", //0x6C + "LD L, H", "LD L, L", "LD L, (HL)", "LD L, A", //0x70 + "LD (HL), B", "LD (HL), C", "LD (HL), D", "LD (HL), E", //0x74 + "LD (HL), H", "LD (HL), L", "HALT", "LD (HL), A", //0x78 + "LD A, B", "LD A, C", "LD A, D", "LD A, E", //0x7C + "LD A, H", "LD A, L", "LD A, (HL)", "LD A, A", //0x80 + "ADD A, B", "ADD A, C", "ADD A, D", "ADD A, E", //0x84 + "ADD A, H", "ADD A, L", "ADD A, (HL)", "ADD A, A", //0x88 + "ADC A, B", "ADC A, C", "ADC A, D", "ADC A, E", //0x8C + "ADC A, H", "ADC A, L", "ADC A, (HL)", "ADC A, A", //0x90 + "SUB A, B", "SUB A, C", "SUB A, D", "SUB A, E", //0x94 + "SUB A, H", "SUB A, L", "SUB A, (HL)", "SUB A, A", //0x98 + "SBC A, B", "SBC A, C", "SBC A, D", "SBC A, E", //0x9C + "SBC A, H", "SBC A, L", "SBC A, (HL)", "SBC A, A", //0xA0 + "AND B", "AND C", "AND D", "AND E", //0xA4 + "AND H", "AND L", "AND (HL)", "AND A", //0xA8 + "XOR B", "XOR C", "XOR D", "XOR E", //0xAC + "XOR H", "XOR L", "XOR (HL)", "XOR A", //0xB0 + "OR B", "OR C", "OR D", "OR E", //0xB4 + "OR H", "OR L", "OR (HL)", "OR A", //0xB8 + "CP B", "CP C", "CP D", "CP E", //0xBC + "CP H", "CP L", "CP (HL)", "CP A", //0xC0 + "RET NZ", "POP BC", "JP NZ, nn", "JP nn", //0xC4 + "CALL NZ, nn", "PUSH BC", "ADD A, n", "RST $00", //0xC8 + "RET Z", "RET", "JP Z, nn", "[CB]", //0xCC + "CALL Z, nn", "CALL nn", "ADC A, n", "RST $08", //0xD0 + "RET NC", "POP DE", "JP NC, nn", "OUT n, A", //0xD4 + "CALL NC, nn", "PUSH DE", "SUB n", "RST $10", //0xD8 + "RET C", "EXX", "JP C, nn", "IN A, n", //0xDC + "CALL C, nn", "[DD]", "SBC A, n", "RST $18", //0xE0 + "RET PO", "POP HL", "JP PO, nn", "EX (SP), HL", //0xE4 + "CALL C, nn", "PUSH HL", "AND n", "RST $20", //0xE8 + "RET PE", "JP HL", "JP PE, nn", "EX DE, HL", //0xEC + "CALL PE, nn", "[ED]", "XOR n", "RST $28", //0xF0 + "RET P", "POP AF", "JP P, nn", "DI", //0xF4 + "CALL P, nn", "PUSH AF", "OR n", "RST $30", //0xF8 + "RET M", "LD SP, HL", "JP M, nn", "EI", //0xFC + "CALL M, nn", "[FD]", "CP n", "RST $38", //0x100 + }; + + readonly static string[] mnemonicsDD = new string[] + { + "NOP", "LD BC, nn", "LD (BC), A", "INC BC", //0x04 + "INC B", "DEC B", "LD B, n", "RLCA", //0x08 + "EX AF, AF'", "ADD IX, BC", "LD A, (BC)", "DEC BC", //0x0C + "INC C", "DEC C", "LD C, n", "RRCA", //0x10 + "DJNZ d", "LD DE, nn", "LD (DE), A", "INC DE", //0x14 + "INC D", "DEC D", "LD D, n", "RLA", //0x18 + "JR d", "ADD IX, DE", "LD A, (DE)", "DEC DE", //0x1C + "INC E", "DEC E", "LD E, n", "RRA", //0x20 + "JR NZ, d", "LD IX, nn", "LD (nn), IX", "INC IX", //0x24 + "INC IXH", "DEC IXH", "LD IXH, n", "DAA", //0x28 + "JR Z, d", "ADD IX, IX", "LD IX, (nn)", "DEC IX", //0x2C + "INC IXL", "DEC IXL", "LD IXL, n", "CPL", //0x30 + "JR NC, d", "LD SP, nn", "LD (nn), A", "INC SP", //0x34 + "INC (IX+d)", "DEC (IX+d)", "LD (IX+d), n", "SCF", //0x38 + "JR C, d", "ADD IX, SP", "LD A, (nn)", "DEC SP", //0x3C + "INC A", "DEC A", "LD A, n", "CCF", //0x40 + "LD B, B", "LD B, C", "LD B, D", "LD B, E", //0x44 + "LD B, IXH", "LD B, IXL", "LD B, (IX+d)", "LD B, A", //0x48 + "LD C, B", "LD C, C", "LD C, D", "LD C, E", //0x4C + "LD C, IXH", "LD C, IXL", "LD C, (IX+d)", "LD C, A", //0x50 + "LD D, B", "LD D, C", "LD D, D", "LD D, E", //0x54 + "LD D, IXH", "LD D, IXL", "LD D, (IX+d)", "LD D, A", //0x58 + "LD E, B", "LD E, C", "LD E, D", "LD E, E", //0x5C + "LD E, IXH", "LD E, IXL", "LD E, (IX+d)", "LD E, A", //0x60 + "LD IXH, B", "LD IXH, C", "LD IXH, D", "LD IXH, E", //0x64 + "LD IXH, IXH", "LD IXH, IXL", "LD H, (IX+d)", "LD IXH, A", //0x68 + "LD IXL, B", "LD IXL, C", "LD IXL, D", "LD IXL, E", //0x6C + "LD IXL, IXH", "LD IXL, IXL", "LD L, (IX+d)", "LD IXL, A", //0x70 + "LD (IX+d), B", "LD (IX+d), C", "LD (IX+d), D", "LD (IX+d), E", //0x74 + "LD (IX+d), H", "LD (IX+d), L", "HALT", "LD (IX+d), A", //0x78 + "LD A, B", "LD A, C", "LD A, D", "LD A, E", //0x7C + "LD A, IXH", "LD A, IXL", "LD A, (IX+d)", "LD A, A", //0x80 + "ADD A, B", "ADD A, C", "ADD A, D", "ADD A, E", //0x84 + "ADD A, IXH", "ADD A, IXL", "ADD A, (IX+d)", "ADD A, A", //0x88 + "ADC A, B", "ADC A, C", "ADC A, D", "ADC A, E", //0x8C + "ADC A, IXH", "ADC A, IXL", "ADC A, (IX+d)", "ADC A, A", //0x90 + "SUB A, B", "SUB A, C", "SUB A, D", "SUB A, E", //0x94 + "SUB A, IXH", "SUB A, IXL", "SUB A, (IX+d)", "SUB A, A", //0x98 + "SBC A, B", "SBC A, C", "SBC A, D", "SBC A, E", //0x9C + "SBC A, IXH", "SBC A, IXL", "SBC A, (IX+d)", "SBC A, A", //0xA0 + "AND B", "AND C", "AND D", "AND E", //0xA4 + "AND IXH", "AND IXL", "AND (IX+d)", "AND A", //0xA8 + "XOR B", "XOR C", "XOR D", "XOR E", //0xAC + "XOR IXH", "XOR IXL", "XOR (IX+d)", "XOR A", //0xB0 + "OR B", "OR C", "OR D", "OR E", //0xB4 + "OR IXH", "OR IXL", "OR (IX+d)", "OR A", //0xB8 + "CP B", "CP C", "CP D", "CP E", //0xBC + "CP IXH", "CP IXL", "CP (IX+d)", "CP A", //0xC0 + "RET NZ", "POP BC", "JP NZ, nn", "JP nn", //0xC4 + "CALL NZ, nn", "PUSH BC", "ADD A, n", "RST $00", //0xC8 + "RET Z", "RET", "JP Z, nn", "[DD CB]", //0xCC + "CALL Z, nn", "CALL nn", "ADC A, n", "RST $08", //0xD0 + "RET NC", "POP DE", "JP NC, nn", "OUT n, A", //0xD4 + "CALL NC, nn", "PUSH DE", "SUB n", "RST $10", //0xD8 + "RET C", "EXX", "JP C, nn", "IN A, n", //0xDC + "CALL C, nn", "[!DD DD!]", "SBC A, n", "RST $18", //0xE0 + "RET PO", "POP IX", "JP PO, nn", "EX (SP), IX", //0xE4 + "CALL C, nn", "PUSH IX", "AND n", "RST $20", //0xE8 + "RET PE", "JP IX", "JP PE, nn", "EX DE, HL", //0xEC + "CALL PE, nn", "[DD ED]", "XOR n", "RST $28", //0xF0 + "RET P", "POP AF", "JP P, nn", "DI", //0xF4 + "CALL P, nn", "PUSH AF", "OR n", "RST $30", //0xF8 + "RET M", "LD SP, IX", "JP M, nn", "EI", //0xFC + "CALL M, nn", "[!!DD FD!!]", "CP n", "RST $38", //0x100 + }; + + readonly static string[] mnemonicsFD = new string[] + { + "NOP", "LD BC, nn", "LD (BC), A", "INC BC", //0x04 + "INC B", "DEC B", "LD B, n", "RLCA", //0x08 + "EX AF, AF'", "ADD IY, BC", "LD A, (BC)", "DEC BC", //0x0C + "INC C", "DEC C", "LD C, n", "RRCA", //0x10 + "DJNZ d", "LD DE, nn", "LD (DE), A", "INC DE", //0x14 + "INC D", "DEC D", "LD D, n", "RLA", //0x18 + "JR d", "ADD IY, DE", "LD A, (DE)", "DEC DE", //0x1C + "INC E", "DEC E", "LD E, n", "RRA", //0x20 + "JR NZ, d", "LD IY, nn", "LD (nn), IY", "INC IY", //0x24 + "INC IYH", "DEC IYH", "LD IYH, n", "DAA", //0x28 + "JR Z, d", "ADD IY, IY", "LD IY, (nn)", "DEC IY", //0x2C + "INC IYL", "DEC IYL", "LD IYL, n", "CPL", //0x30 + "JR NC, d", "LD SP, nn", "LD (nn), A", "INC SP", //0x34 + "INC (IY+d)", "DEC (IY+d)", "LD (IY+d), n", "SCF", //0x38 + "JR C, d", "ADD IY, SP", "LD A, (nn)", "DEC SP", //0x3C + "INC A", "DEC A", "LD A, n", "CCF", //0x40 + "LD B, B", "LD B, C", "LD B, D", "LD B, E", //0x44 + "LD B, IYH", "LD B, IYL", "LD B, (IY+d)", "LD B, A", //0x48 + "LD C, B", "LD C, C", "LD C, D", "LD C, E", //0x4C + "LD C, IYH", "LD C, IYL", "LD C, (IY+d)", "LD C, A", //0x50 + "LD D, B", "LD D, C", "LD D, D", "LD D, E", //0x54 + "LD D, IYH", "LD D, IYL", "LD D, (IY+d)", "LD D, A", //0x58 + "LD E, B", "LD E, C", "LD E, D", "LD E, E", //0x5C + "LD E, IYH", "LD E, IYL", "LD E, (IY+d)", "LD E, A", //0x60 + "LD IYH, B", "LD IYH, C", "LD IYH, D", "LD IYH, E", //0x64 + "LD IYH, IYH", "LD IYH, IYL", "LD H, (IY+d)", "LD IYH, A", //0x68 + "LD IYL, B", "LD IYL, C", "LD IYL, D", "LD IYL, E", //0x6C + "LD IYL, IYH", "LD IYL, IYL", "LD L, (IY+d)", "LD IYL, A", //0x70 + "LD (IY+d), B", "LD (IY+d), C", "LD (IY+d), D", "LD (IY+d), E", //0x74 + "LD (IY+d), H", "LD (IY+d), L", "HALT", "LD (IY+d), A", //0x78 + "LD A, B", "LD A, C", "LD A, D", "LD A, E", //0x7C + "LD A, IYH", "LD A, IYL", "LD A, (IY+d)", "LD A, A", //0x80 + "ADD A, B", "ADD A, C", "ADD A, D", "ADD A, E", //0x84 + "ADD A, IYH", "ADD A, IYL", "ADD A, (IY+d)", "ADD A, A", //0x88 + "ADC A, B", "ADC A, C", "ADC A, D", "ADC A, E", //0x8C + "ADC A, IYH", "ADC A, IYL", "ADC A, (IY+d)", "ADC A, A", //0x90 + "SUB A, B", "SUB A, C", "SUB A, D", "SUB A, E", //0x94 + "SUB A, IYH", "SUB A, IYL", "SUB A, (IY+d)", "SUB A, A", //0x98 + "SBC A, B", "SBC A, C", "SBC A, D", "SBC A, E", //0x9C + "SBC A, IYH", "SBC A, IYL", "SBC A, (IY+d)", "SBC A, A", //0xA0 + "AND B", "AND C", "AND D", "AND E", //0xA4 + "AND IYH", "AND IYL", "AND (IY+d)", "AND A", //0xA8 + "XOR B", "XOR C", "XOR D", "XOR E", //0xAC + "XOR IYH", "XOR IYL", "XOR (IY+d)", "XOR A", //0xB0 + "OR B", "OR C", "OR D", "OR E", //0xB4 + "OR IYH", "OR IYL", "OR (IY+d)", "OR A", //0xB8 + "CP B", "CP C", "CP D", "CP E", //0xBC + "CP IYH", "CP IYL", "CP (IY+d)", "CP A", //0xC0 + "RET NZ", "POP BC", "JP NZ, nn", "JP nn", //0xC4 + "CALL NZ, nn", "PUSH BC", "ADD A, n", "RST $00", //0xC8 + "RET Z", "RET", "JP Z, nn", "[DD CB]", //0xCC + "CALL Z, nn", "CALL nn", "ADC A, n", "RST $08", //0xD0 + "RET NC", "POP DE", "JP NC, nn", "OUT n, A", //0xD4 + "CALL NC, nn", "PUSH DE", "SUB n", "RST $10", //0xD8 + "RET C", "EXX", "JP C, nn", "IN A, n", //0xDC + "CALL C, nn", "[!FD DD!]", "SBC A, n", "RST $18", //0xE0 + "RET PO", "POP IY", "JP PO, nn", "EX (SP), IY", //0xE4 + "CALL C, nn", "PUSH IY", "AND n", "RST $20", //0xE8 + "RET PE", "JP IY", "JP PE, nn", "EX DE, HL", //0xEC + "CALL PE, nn", "[FD ED]", "XOR n", "RST $28", //0xF0 + "RET P", "POP AF", "JP P, nn", "DI", //0xF4 + "CALL P, nn", "PUSH AF", "OR n", "RST $30", //0xF8 + "RET M", "LD SP, IY", "JP M, nn", "EI", //0xFC + "CALL M, nn", "[!FD FD!]", "CP n", "RST $38", //0x100 + }; + + readonly static string[] mnemonicsDDCB = new string[] + { + "RLC (IX+d)->B", "RLC (IX+d)->C", "RLC (IX+d)->D", "RLC (IX+d)->E", "RLC (IX+d)->H", "RLC (IX+d)->L", "RLC (IX+d)", "RLC (IX+d)->A", + "RRC (IX+d)->B", "RRC (IX+d)->C", "RRC (IX+d)->D", "RRC (IX+d)->E", "RRC (IX+d)->H", "RRC (IX+d)->L", "RRC (IX+d)", "RRC (IX+d)->A", + "RL (IX+d)->B", "RL (IX+d)->C", "RL (IX+d)->D", "RL (IX+d)->E", "RL (IX+d)->H", "RL (IX+d)->L", "RL (IX+d)", "RL (IX+d)->A", + "RR (IX+d)->B", "RR (IX+d)->C", "RR (IX+d)->D", "RR (IX+d)->E", "RR (IX+d)->H", "RR (IX+d)->L", "RR (IX+d)", "RR (IX+d)->A", + "SLA (IX+d)->B", "SLA (IX+d)->C", "SLA (IX+d)->D", "SLA (IX+d)->E", "SLA (IX+d)->H", "SLA (IX+d)->L", "SLA (IX+d)", "SLA (IX+d)->A", + "SRA (IX+d)->B", "SRA (IX+d)->C", "SRA (IX+d)->D", "SRA (IX+d)->E", "SRA (IX+d)->H", "SRA (IX+d)->L", "SRA (IX+d)", "SRA (IX+d)->A", + "SL1 (IX+d)->B", "SL1 (IX+d)->C", "SL1 (IX+d)->D", "SL1 (IX+d)->E", "SL1 (IX+d)->H", "SL1 (IX+d)->L", "SL1 (IX+d)", "SL1 (IX+d)->A", + "SRL (IX+d)->B", "SRL (IX+d)->C", "SRL (IX+d)->D", "SRL (IX+d)->E", "SRL (IX+d)->H", "SRL (IX+d)->L", "SRL (IX+d)", "SRL (IX+d)->A", + "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", + "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", + "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", + "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", + "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", + "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", + "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", + "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", + "RES 0 (IX+d)->B", "RES 0 (IX+d)->C", "RES 0 (IX+d)->D", "RES 0 (IX+d)->E", "RES 0 (IX+d)->H", "RES 0 (IX+d)->L", "RES 0 (IX+d)", "RES 0 (IX+d)->A", + "RES 1 (IX+d)->B", "RES 1 (IX+d)->C", "RES 1 (IX+d)->D", "RES 1 (IX+d)->E", "RES 1 (IX+d)->H", "RES 1 (IX+d)->L", "RES 1 (IX+d)", "RES 1 (IX+d)->A", + "RES 2 (IX+d)->B", "RES 2 (IX+d)->C", "RES 2 (IX+d)->D", "RES 2 (IX+d)->E", "RES 2 (IX+d)->H", "RES 2 (IX+d)->L", "RES 2 (IX+d)", "RES 2 (IX+d)->A", + "RES 3 (IX+d)->B", "RES 3 (IX+d)->C", "RES 3 (IX+d)->D", "RES 3 (IX+d)->E", "RES 3 (IX+d)->H", "RES 3 (IX+d)->L", "RES 3 (IX+d)", "RES 3 (IX+d)->A", + "RES 4 (IX+d)->B", "RES 4 (IX+d)->C", "RES 4 (IX+d)->D", "RES 4 (IX+d)->E", "RES 4 (IX+d)->H", "RES 4 (IX+d)->L", "RES 4 (IX+d)", "RES 4 (IX+d)->A", + "RES 5 (IX+d)->B", "RES 5 (IX+d)->C", "RES 5 (IX+d)->D", "RES 5 (IX+d)->E", "RES 5 (IX+d)->H", "RES 5 (IX+d)->L", "RES 5 (IX+d)", "RES 5 (IX+d)->A", + "RES 6 (IX+d)->B", "RES 6 (IX+d)->C", "RES 6 (IX+d)->D", "RES 6 (IX+d)->E", "RES 6 (IX+d)->H", "RES 6 (IX+d)->L", "RES 6 (IX+d)", "RES 6 (IX+d)->A", + "RES 7 (IX+d)->B", "RES 7 (IX+d)->C", "RES 7 (IX+d)->D", "RES 7 (IX+d)->E", "RES 7 (IX+d)->H", "RES 7 (IX+d)->L", "RES 7 (IX+d)", "RES 7 (IX+d)->A", + "SET 0 (IX+d)->B", "SET 0 (IX+d)->C", "SET 0 (IX+d)->D", "SET 0 (IX+d)->E", "SET 0 (IX+d)->H", "SET 0 (IX+d)->L", "SET 0 (IX+d)", "SET 0 (IX+d)->A", + "SET 1 (IX+d)->B", "SET 1 (IX+d)->C", "SET 1 (IX+d)->D", "SET 1 (IX+d)->E", "SET 1 (IX+d)->H", "SET 1 (IX+d)->L", "SET 1 (IX+d)", "SET 1 (IX+d)->A", + "SET 2 (IX+d)->B", "SET 2 (IX+d)->C", "SET 2 (IX+d)->D", "SET 2 (IX+d)->E", "SET 2 (IX+d)->H", "SET 2 (IX+d)->L", "SET 2 (IX+d)", "SET 2 (IX+d)->A", + "SET 3 (IX+d)->B", "SET 3 (IX+d)->C", "SET 3 (IX+d)->D", "SET 3 (IX+d)->E", "SET 3 (IX+d)->H", "SET 3 (IX+d)->L", "SET 3 (IX+d)", "SET 3 (IX+d)->A", + "SET 4 (IX+d)->B", "SET 4 (IX+d)->C", "SET 4 (IX+d)->D", "SET 4 (IX+d)->E", "SET 4 (IX+d)->H", "SET 4 (IX+d)->L", "SET 4 (IX+d)", "SET 4 (IX+d)->A", + "SET 5 (IX+d)->B", "SET 5 (IX+d)->C", "SET 5 (IX+d)->D", "SET 5 (IX+d)->E", "SET 5 (IX+d)->H", "SET 5 (IX+d)->L", "SET 5 (IX+d)", "SET 5 (IX+d)->A", + "SET 6 (IX+d)->B", "SET 6 (IX+d)->C", "SET 6 (IX+d)->D", "SET 6 (IX+d)->E", "SET 6 (IX+d)->H", "SET 6 (IX+d)->L", "SET 6 (IX+d)", "SET 6 (IX+d)->A", + "SET 7 (IX+d)->B", "SET 7 (IX+d)->C", "SET 7 (IX+d)->D", "SET 7 (IX+d)->E", "SET 7 (IX+d)->H", "SET 7 (IX+d)->L", "SET 7 (IX+d)", "SET 7 (IX+d)->A", + }; + + readonly static string[] mnemonicsFDCB = new string[] + { + "RLC (IY+d)->B", "RLC (IY+d)->C", "RLC (IY+d)->D", "RLC (IY+d)->E", "RLC (IY+d)->H", "RLC (IY+d)->L", "RLC (IY+d)", "RLC (IY+d)->A", + "RRC (IY+d)->B", "RRC (IY+d)->C", "RRC (IY+d)->D", "RRC (IY+d)->E", "RRC (IY+d)->H", "RRC (IY+d)->L", "RRC (IY+d)", "RRC (IY+d)->A", + "RL (IY+d)->B", "RL (IY+d)->C", "RL (IY+d)->D", "RL (IY+d)->E", "RL (IY+d)->H", "RL (IY+d)->L", "RL (IY+d)", "RL (IY+d)->A", + "RR (IY+d)->B", "RR (IY+d)->C", "RR (IY+d)->D", "RR (IY+d)->E", "RR (IY+d)->H", "RR (IY+d)->L", "RR (IY+d)", "RR (IY+d)->A", + "SLA (IY+d)->B", "SLA (IY+d)->C", "SLA (IY+d)->D", "SLA (IY+d)->E", "SLA (IY+d)->H", "SLA (IY+d)->L", "SLA (IY+d)", "SLA (IY+d)->A", + "SRA (IY+d)->B", "SRA (IY+d)->C", "SRA (IY+d)->D", "SRA (IY+d)->E", "SRA (IY+d)->H", "SRA (IY+d)->L", "SRA (IY+d)", "SRA (IY+d)->A", + "SL1 (IY+d)->B", "SL1 (IY+d)->C", "SL1 (IY+d)->D", "SL1 (IY+d)->E", "SL1 (IY+d)->H", "SL1 (IY+d)->L", "SL1 (IY+d)", "SL1 (IY+d)->A", + "SRL (IY+d)->B", "SRL (IY+d)->C", "SRL (IY+d)->D", "SRL (IY+d)->E", "SRL (IY+d)->H", "SRL (IY+d)->L", "SRL (IY+d)", "SRL (IY+d)->A", + "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", + "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", + "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", + "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", + "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", + "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", + "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", + "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", + "RES 0 (IY+d)->B", "RES 0 (IY+d)->C", "RES 0 (IY+d)->D", "RES 0 (IY+d)->E", "RES 0 (IY+d)->H", "RES 0 (IY+d)->L", "RES 0 (IY+d)", "RES 0 (IY+d)->A", + "RES 1 (IY+d)->B", "RES 1 (IY+d)->C", "RES 1 (IY+d)->D", "RES 1 (IY+d)->E", "RES 1 (IY+d)->H", "RES 1 (IY+d)->L", "RES 1 (IY+d)", "RES 1 (IY+d)->A", + "RES 2 (IY+d)->B", "RES 2 (IY+d)->C", "RES 2 (IY+d)->D", "RES 2 (IY+d)->E", "RES 2 (IY+d)->H", "RES 2 (IY+d)->L", "RES 2 (IY+d)", "RES 2 (IY+d)->A", + "RES 3 (IY+d)->B", "RES 3 (IY+d)->C", "RES 3 (IY+d)->D", "RES 3 (IY+d)->E", "RES 3 (IY+d)->H", "RES 3 (IY+d)->L", "RES 3 (IY+d)", "RES 3 (IY+d)->A", + "RES 4 (IY+d)->B", "RES 4 (IY+d)->C", "RES 4 (IY+d)->D", "RES 4 (IY+d)->E", "RES 4 (IY+d)->H", "RES 4 (IY+d)->L", "RES 4 (IY+d)", "RES 4 (IY+d)->A", + "RES 5 (IY+d)->B", "RES 5 (IY+d)->C", "RES 5 (IY+d)->D", "RES 5 (IY+d)->E", "RES 5 (IY+d)->H", "RES 5 (IY+d)->L", "RES 5 (IY+d)", "RES 5 (IY+d)->A", + "RES 6 (IY+d)->B", "RES 6 (IY+d)->C", "RES 6 (IY+d)->D", "RES 6 (IY+d)->E", "RES 6 (IY+d)->H", "RES 6 (IY+d)->L", "RES 6 (IY+d)", "RES 6 (IY+d)->A", + "RES 7 (IY+d)->B", "RES 7 (IY+d)->C", "RES 7 (IY+d)->D", "RES 7 (IY+d)->E", "RES 7 (IY+d)->H", "RES 7 (IY+d)->L", "RES 7 (IY+d)", "RES 7 (IY+d)->A", + "SET 0 (IY+d)->B", "SET 0 (IY+d)->C", "SET 0 (IY+d)->D", "SET 0 (IY+d)->E", "SET 0 (IY+d)->H", "SET 0 (IY+d)->L", "SET 0 (IY+d)", "SET 0 (IY+d)->A", + "SET 1 (IY+d)->B", "SET 1 (IY+d)->C", "SET 1 (IY+d)->D", "SET 1 (IY+d)->E", "SET 1 (IY+d)->H", "SET 1 (IY+d)->L", "SET 1 (IY+d)", "SET 1 (IY+d)->A", + "SET 2 (IY+d)->B", "SET 2 (IY+d)->C", "SET 2 (IY+d)->D", "SET 2 (IY+d)->E", "SET 2 (IY+d)->H", "SET 2 (IY+d)->L", "SET 2 (IY+d)", "SET 2 (IY+d)->A", + "SET 3 (IY+d)->B", "SET 3 (IY+d)->C", "SET 3 (IY+d)->D", "SET 3 (IY+d)->E", "SET 3 (IY+d)->H", "SET 3 (IY+d)->L", "SET 3 (IY+d)", "SET 3 (IY+d)->A", + "SET 4 (IY+d)->B", "SET 4 (IY+d)->C", "SET 4 (IY+d)->D", "SET 4 (IY+d)->E", "SET 4 (IY+d)->H", "SET 4 (IY+d)->L", "SET 4 (IY+d)", "SET 4 (IY+d)->A", + "SET 5 (IY+d)->B", "SET 5 (IY+d)->C", "SET 5 (IY+d)->D", "SET 5 (IY+d)->E", "SET 5 (IY+d)->H", "SET 5 (IY+d)->L", "SET 5 (IY+d)", "SET 5 (IY+d)->A", + "SET 6 (IY+d)->B", "SET 6 (IY+d)->C", "SET 6 (IY+d)->D", "SET 6 (IY+d)->E", "SET 6 (IY+d)->H", "SET 6 (IY+d)->L", "SET 6 (IY+d)", "SET 6 (IY+d)->A", + "SET 7 (IY+d)->B", "SET 7 (IY+d)->C", "SET 7 (IY+d)->D", "SET 7 (IY+d)->E", "SET 7 (IY+d)->H", "SET 7 (IY+d)->L", "SET 7 (IY+d)", "SET 7 (IY+d)->A", + }; + + readonly static string[] mnemonicsCB = new string[] + { + "RLC B", "RLC C", "RLC D", "RLC E", "RLC H", "RLC L", "RLC (HL)", "RLC A", + "RRC B", "RRC C", "RRC D", "RRC E", "RRC H", "RRC L", "RRC (HL)", "RRC A", + "RL B", "RL C", "RL D", "RL E", "RL H", "RL L", "RL (HL)", "RL A", + "RR B", "RR C", "RR D", "RR E", "RR H", "RR L", "RR (HL)", "RR A", + "SLA B", "SLA C", "SLA D", "SLA E", "SLA H", "SLA L", "SLA (HL)", "SLA A", + "SRA B", "SRA C", "SRA D", "SRA E", "SRA H", "SRA L", "SRA (HL)", "SRA A", + "SL1 B", "SL1 C", "SL1 D", "SL1 E", "SL1 H", "SL1 L", "SL1 (HL)", "SL1 A", + "SRL B", "SRL C", "SRL D", "SRL E", "SRL H", "SRL L", "SRL (HL)", "SRL A", + "BIT 0, B", "BIT 0, C", "BIT 0, D", "BIT 0, E", "BIT 0, H", "BIT 0, L", "BIT 0, (HL)", "BIT 0, A", + "BIT 1, B", "BIT 1, C", "BIT 1, D", "BIT 1, E", "BIT 1, H", "BIT 1, L", "BIT 1, (HL)", "BIT 1, A", + "BIT 2, B", "BIT 2, C", "BIT 2, D", "BIT 2, E", "BIT 2, H", "BIT 2, L", "BIT 2, (HL)", "BIT 2, A", + "BIT 3, B", "BIT 3, C", "BIT 3, D", "BIT 3, E", "BIT 3, H", "BIT 3, L", "BIT 3, (HL)", "BIT 3, A", + "BIT 4, B", "BIT 4, C", "BIT 4, D", "BIT 4, E", "BIT 4, H", "BIT 4, L", "BIT 4, (HL)", "BIT 4, A", + "BIT 5, B", "BIT 5, C", "BIT 5, D", "BIT 5, E", "BIT 5, H", "BIT 5, L", "BIT 5, (HL)", "BIT 5, A", + "BIT 6, B", "BIT 6, C", "BIT 6, D", "BIT 6, E", "BIT 6, H", "BIT 6, L", "BIT 6, (HL)", "BIT 6, A", + "BIT 7, B", "BIT 7, C", "BIT 7, D", "BIT 7, E", "BIT 7, H", "BIT 7, L", "BIT 7, (HL)", "BIT 7, A", + "RES 0, B", "RES 0, C", "RES 0, D", "RES 0, E", "RES 0, H", "RES 0, L", "RES 0, (HL)", "RES 0, A", + "RES 1, B", "RES 1, C", "RES 1, D", "RES 1, E", "RES 1, H", "RES 1, L", "RES 1, (HL)", "RES 1, A", + "RES 2, B", "RES 2, C", "RES 2, D", "RES 2, E", "RES 2, H", "RES 2, L", "RES 2, (HL)", "RES 2, A", + "RES 3, B", "RES 3, C", "RES 3, D", "RES 3, E", "RES 3, H", "RES 3, L", "RES 3, (HL)", "RES 3, A", + "RES 4, B", "RES 4, C", "RES 4, D", "RES 4, E", "RES 4, H", "RES 4, L", "RES 4, (HL)", "RES 4, A", + "RES 5, B", "RES 5, C", "RES 5, D", "RES 5, E", "RES 5, H", "RES 5, L", "RES 5, (HL)", "RES 5, A", + "RES 6, B", "RES 6, C", "RES 6, D", "RES 6, E", "RES 6, H", "RES 6, L", "RES 6, (HL)", "RES 6, A", + "RES 7, B", "RES 7, C", "RES 7, D", "RES 7, E", "RES 7, H", "RES 7, L", "RES 7, (HL)", "RES 7, A", + "SET 0, B", "SET 0, C", "SET 0, D", "SET 0, E", "SET 0, H", "SET 0, L", "SET 0, (HL)", "SET 0, A", + "SET 1, B", "SET 1, C", "SET 1, D", "SET 1, E", "SET 1, H", "SET 1, L", "SET 1, (HL)", "SET 1, A", + "SET 2, B", "SET 2, C", "SET 2, D", "SET 2, E", "SET 2, H", "SET 2, L", "SET 2, (HL)", "SET 2, A", + "SET 3, B", "SET 3, C", "SET 3, D", "SET 3, E", "SET 3, H", "SET 3, L", "SET 3, (HL)", "SET 3, A", + "SET 4, B", "SET 4, C", "SET 4, D", "SET 4, E", "SET 4, H", "SET 4, L", "SET 4, (HL)", "SET 4, A", + "SET 5, B", "SET 5, C", "SET 5, D", "SET 5, E", "SET 5, H", "SET 5, L", "SET 5, (HL)", "SET 5, A", + "SET 6, B", "SET 6, C", "SET 6, D", "SET 6, E", "SET 6, H", "SET 6, L", "SET 6, (HL)", "SET 6, A", + "SET 7, B", "SET 7, C", "SET 7, D", "SET 7, E", "SET 7, H", "SET 7, L", "SET 7, (HL)", "SET 7, A", + }; + + readonly static string[] mnemonicsED = new string[] + { + "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", + "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", + "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", + "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", + + "IN B, C", "OUT C, B", "SBC HL, BC", "LD (nn), BC", //0x44 + "NEG", "RETN", "IM $0", "LD I, A", //0x48 + "IN C, C", "OUT C, C", "ADC HL, BC", "LD BC, (nn)", //0x4C + "NEG", "RETI", "IM $0", "LD R, A", //0x50 + "IN D, C", "OUT C, D", "SBC HL, DE", "LD (nn), DE", //0x54 + "NEG", "RETN", "IM $1", "LD A, I", //0x58 + "IN E, C", "OUT C, E", "ADC HL, DE", "LD DE, (nn)", //0x5C + "NEG", "RETI", "IM $2", "LD A, R", //0x60 + + "IN H, C", "OUT C, H", "SBC HL, HL", "LD (nn), HL", //0x64 + "NEG", "RETN", "IM $0", "RRD", //0x68 + "IN L, C", "OUT C, L", "ADC HL, HL", "LD HL, (nn)", //0x6C + "NEG", "RETI", "IM $0", "RLD", //0x70 + "IN 0, C", "OUT C, 0", "SBC HL, SP", "LD (nn), SP", //0x74 + "NEG", "RETN", "IM $1", "NOP", //0x78 + "IN A, C", "OUT C, A", "ADC HL, SP", "LD SP, (nn)", //0x7C + "NEG", "RETI", "IM $2", "NOP", //0x80 + + "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0x90 + "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0xA0 + "LDI", "CPI", "INI", "OUTI", //0xA4 + "NOP", "NOP", "NOP", "NOP", //0xA8 + "LDD", "CPD", "IND", "OUTD", //0xAC + "NOP", "NOP", "NOP", "NOP", //0xB0 + "LDIR", "CPIR", "INIR", "OTIR", //0xB4 + "NOP", "NOP", "NOP", "NOP", //0xB8 + "LDDR", "CPDR", "INDR", "OTDR", //0xBC + "NOP", "NOP", "NOP", "NOP", //0xC0 + + "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0xD0 + "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0xE0 + "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0xF0 + "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0x100 + }; + + public string Disassemble(ushort addr, Func read, out ushort size) + { + ushort start_addr = addr; + byte A = read(addr++); + string format; + switch (A) + { + case 0xCB: + A = read(addr++); + format = mnemonicsCB[A]; + break; + case 0xDD: + A = read(addr++); + switch (A) + { + case 0xCB: format = mnemonicsDDCB[A]; break; + case 0xED: format = mnemonicsED[A]; break; + default: format = mnemonicsDD[A]; break; + } + break; + case 0xED: + A = read(addr++); + format = mnemonicsED[A]; + break; + case 0xFD: + A = read(addr++); + switch (A) + { + case 0xCB: format = mnemonicsFDCB[A]; break; + case 0xED: format = mnemonicsED[A]; break; + default: format = mnemonicsFD[A]; break; + } + break; + default: format = mnemonics[A]; break; + } + + string temp = Result(format, read, ref addr); + + size = (ushort)(addr - start_addr); + return temp; + } + + #region IDisassemblable + + public string Cpu + { + get { return "Z80"; } + set { } + } + + public string PCRegisterName + { + get { return "PC"; } + } + + public IEnumerable AvailableCpus + { + get { yield return "Z80"; } + } + + public string Disassemble(MemoryDomain m, uint addr, out int length) + { + int loc = (int)addr; + ushort unused = 0; + string ret = Disassemble((ushort) addr, a => m.PeekByte(a), out unused); + length = loc - (int)addr; + return ret; + } + + #endregion + } +} diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs new file mode 100644 index 0000000000..64ddc1ae5c --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs @@ -0,0 +1,727 @@ +using BizHawk.Common.NumberExtensions; +using System; + +namespace BizHawk.Emulation.Common.Components.Z80A +{ + public partial class Z80A + { + public void Read_Func(ushort dest, ushort src_l, ushort src_h) + { + Regs[dest] = ReadMemory((ushort)(Regs[src_l] | (Regs[src_h]) << 8)); + } + + public void I_Read_Func(ushort dest, ushort src_l, ushort src_h, ushort inc) + { + Regs[dest] = ReadMemory((ushort)((Regs[src_l] | (Regs[src_h]) << 8) + inc)); + } + + public void Write_Func(ushort dest_l, ushort dest_h, ushort src) + { + WriteMemory((ushort)(Regs[dest_l] | (Regs[dest_h]) << 8), (byte)Regs[src]); + } + + public void I_Write_Func(ushort dest_l, ushort dest_h, ushort inc, ushort src) + { + WriteMemory((ushort)((Regs[dest_l] | (Regs[dest_h] + inc)) << 8), (byte)Regs[src]); + } + + public void TR_Func(ushort dest, ushort src) + { + Regs[dest] = Regs[src]; + } + + public void TR16_Func(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + Regs[dest_l] = Regs[src_l]; + Regs[dest_h] = Regs[src_h]; + } + + public void ADD16_Func(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + int Reg16_d = Regs[dest_l] | (Regs[dest_h] << 8); + int Reg16_s = Regs[src_l] | (Regs[src_h] << 8); + int temp = Reg16_d + Reg16_s; + + FlagC = temp.Bit(16); + FlagH = ((Reg16_d & 0xFFF) + (Reg16_s & 0xFFF)) > 0xFFF; + FlagN = false; + Flag3 = (temp & 0x0800) != 0; + Flag5 = (temp & 0x2000) != 0; + + Regs[dest_l] = (ushort)(temp & 0xFF); + Regs[dest_h] = (ushort)((temp & 0xFF00) >> 8); + } + + public void ADD8_Func(ushort dest, ushort src) + { + int Reg16_d = Regs[dest]; + Reg16_d += Regs[src]; + + FlagC = Reg16_d.Bit(8); + FlagZ = (Reg16_d & 0xFF) == 0; + + ushort ans = (ushort)(Reg16_d & 0xFF); + + // redo for half carry flag + Reg16_d = Regs[dest] & 0xF; + Reg16_d += (Regs[src] & 0xF); + + FlagH = Reg16_d.Bit(4); + FlagN = false; + Flag3 = (ans & 0x08) != 0; + Flag5 = (ans & 0x20) != 0; + FlagP = (Regs[dest].Bit(7) == Regs[src].Bit(7)) && (Regs[dest].Bit(7) != ans.Bit(7)); + FlagS = ans > 127; + + Regs[dest] = ans; + } + + public void SUB8_Func(ushort dest, ushort src) + { + int Reg16_d = Regs[dest]; + Reg16_d -= Regs[src]; + + FlagC = Reg16_d.Bit(8); + FlagZ = (Reg16_d & 0xFF) == 0; + + ushort ans = (ushort)(Reg16_d & 0xFF); + + // redo for half carry flag + Reg16_d = Regs[dest] & 0xF; + Reg16_d -= (Regs[src] & 0xF); + + FlagH = Reg16_d.Bit(4); + FlagN = true; + Flag3 = (ans & 0x08) != 0; + Flag5 = (ans & 0x20) != 0; + FlagP = (Regs[dest].Bit(7) != Regs[src].Bit(7)) && (Regs[dest].Bit(7) != ans.Bit(7)); + FlagS = ans > 127; + + Regs[dest] = ans; + } + + public void BIT_Func(ushort bit, ushort src) + { + FlagZ = !Regs[src].Bit(bit); + FlagP = FlagZ; // special case + FlagH = true; + FlagN = false; + FlagS = ((bit == 7) && Regs[src].Bit(bit)); + Flag5 = Regs[src].Bit(5); + Flag3 = Regs[src].Bit(3); + } + + // When doing I* + n bit tests, flags 3 and 5 come from I* + n + // This cooresponds to the high byte of WZ + // This is the same for the (HL) bit tests, except that WZ were not assigned to before the test occurs + public void I_BIT_Func(ushort bit, ushort src) + { + FlagZ = !Regs[src].Bit(bit); + FlagP = FlagZ; // special case + FlagH = true; + FlagN = false; + FlagS = ((bit == 7) && Regs[src].Bit(bit)); + Flag5 = Regs[W].Bit(5); + Flag3 = Regs[W].Bit(3); + } + + public void SET_Func(ushort bit, ushort src) + { + Regs[src] |= (ushort)(1 << bit); + } + + public void RES_Func(ushort bit, ushort src) + { + Regs[src] &= (ushort)(0xFF - (1 << bit)); + } + + public void ASGN_Func(ushort src, ushort val) + { + Regs[src] = val; + } + + public void SLL_Func(ushort src) + { + FlagC = Regs[src].Bit(7); + + Regs[src] = (ushort)(((Regs[src] << 1) & 0xFF) | 0x1); + + FlagS = Regs[src].Bit(7); + FlagZ = Regs[src] == 0; + FlagP = TableParity[Regs[src]]; + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + FlagH = false; + FlagN = false; + } + + public void SLA_Func(ushort src) + { + FlagC = Regs[src].Bit(7); + + Regs[src] = (ushort)((Regs[src] << 1) & 0xFF); + + FlagS = Regs[src].Bit(7); + FlagZ = Regs[src] == 0; + FlagP = TableParity[Regs[src]]; + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + FlagH = false; + FlagN = false; + } + + public void SRA_Func(ushort src) + { + FlagC = Regs[src].Bit(0); + + ushort temp = (ushort)(Regs[src] & 0x80); // MSB doesn't change in this operation + + Regs[src] = (ushort)((Regs[src] >> 1) | temp); + + FlagS = Regs[src].Bit(7); + FlagZ = Regs[src] == 0; + FlagP = TableParity[Regs[src]]; + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + FlagH = false; + FlagN = false; + } + + public void SRL_Func(ushort src) + { + FlagC = Regs[src].Bit(0) ? true : false; + + Regs[src] = (ushort)(Regs[src] >> 1); + + FlagS = Regs[src].Bit(7); + FlagZ = Regs[src] == 0; + FlagP = TableParity[Regs[src]]; + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + FlagH = false; + FlagN = false; + } + + public void CPL_Func(ushort src) + { + Regs[src] = (ushort)((~Regs[src]) & 0xFF); + + FlagH = true; + FlagN = true; + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + } + + public void CCF_Func(ushort src) + { + FlagH = FlagC; + FlagC = !FlagC; + FlagN = false; + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + } + + public void SCF_Func(ushort src) + { + FlagC = true; + FlagH = false; + FlagN = false; + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + } + + public void AND8_Func(ushort dest, ushort src) + { + Regs[dest] = (ushort)(Regs[dest] & Regs[src]); + + FlagZ = Regs[dest] == 0; + FlagC = false; + FlagH = true; + FlagN = false; + Flag3 = (Regs[dest] & 0x08) != 0; + Flag5 = (Regs[dest] & 0x20) != 0; + FlagS = Regs[dest] > 127; + FlagP = TableParity[Regs[dest]]; + } + + public void OR8_Func(ushort dest, ushort src) + { + Regs[dest] = (ushort)(Regs[dest] | Regs[src]); + + FlagZ = Regs[dest] == 0; + FlagC = false; + FlagH = false; + FlagN = false; + Flag3 = (Regs[dest] & 0x08) != 0; + Flag5 = (Regs[dest] & 0x20) != 0; + FlagS = Regs[dest] > 127; + FlagP = TableParity[Regs[dest]]; + } + + public void XOR8_Func(ushort dest, ushort src) + { + Regs[dest] = (ushort)(Regs[dest] ^ Regs[src]); + + FlagZ = Regs[dest] == 0; + FlagC = false; + FlagH = false; + FlagN = false; + Flag3 = (Regs[dest] & 0x08) != 0; + Flag5 = (Regs[dest] & 0x20) != 0; + FlagS = Regs[dest] > 127; + FlagP = TableParity[Regs[dest]]; + } + + public void CP8_Func(ushort dest, ushort src) + { + int Reg16_d = Regs[dest]; + Reg16_d -= Regs[src]; + + FlagC = Reg16_d.Bit(8); + FlagZ = (Reg16_d & 0xFF) == 0; + + ushort ans = (ushort)(Reg16_d & 0xFF); + + // redo for half carry flag + Reg16_d = Regs[dest] & 0xF; + Reg16_d -= (Regs[src] & 0xF); + + FlagH = Reg16_d.Bit(4); + FlagN = true; + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + FlagP = (Regs[dest].Bit(7) != Regs[src].Bit(7)) && (Regs[dest].Bit(7) != ans.Bit(7)); + FlagS = ans > 127; + } + + public void RRC_Func(ushort src) + { + bool imm = src == Aim; + if (imm) { src = A; } + + FlagC = Regs[src].Bit(0); + + Regs[src] = (ushort)((FlagC ? 0x80 : 0) | (Regs[src] >> 1)); + + if (!imm) + { + FlagS = Regs[src].Bit(7); + FlagZ = Regs[src] == 0; + FlagP = TableParity[Regs[src]]; + } + + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + FlagH = false; + FlagN = false; + } + + public void RR_Func(ushort src) + { + bool imm = src == Aim; + if (imm) { src = A; } + + ushort c = (ushort)(FlagC ? 0x80 : 0); + + FlagC = Regs[src].Bit(0); + + Regs[src] = (ushort)(c | (Regs[src] >> 1)); + + if (!imm) + { + FlagS = Regs[src].Bit(7); + FlagZ = Regs[src] == 0; + FlagP = TableParity[Regs[src]]; + } + + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + FlagH = false; + FlagN = false; + } + + public void RLC_Func(ushort src) + { + bool imm = src == Aim; + if (imm) { src = A; } + + ushort c = (ushort)(Regs[src].Bit(7) ? 1 : 0); + FlagC = Regs[src].Bit(7); + + Regs[src] = (ushort)(((Regs[src] << 1) & 0xFF) | c); + + if (!imm) + { + FlagS = Regs[src].Bit(7); + FlagZ = Regs[src] == 0; + FlagP = TableParity[Regs[src]]; + } + + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + FlagH = false; + FlagN = false; + } + + public void RL_Func(ushort src) + { + bool imm = src == Aim; + if (imm) { src = A; } + + ushort c = (ushort)(FlagC ? 1 : 0); + FlagC = Regs[src].Bit(7); + + Regs[src] = (ushort)(((Regs[src] << 1) & 0xFF) | c); + + if (!imm) + { + FlagS = Regs[src].Bit(7); + FlagZ = Regs[src] == 0; + FlagP = TableParity[Regs[src]]; + } + + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + FlagH = false; + FlagN = false; + } + + public void INC8_Func(ushort src) + { + int Reg16_d = Regs[src]; + Reg16_d += 1; + + FlagZ = (Reg16_d & 0xFF) == 0; + + ushort ans = (ushort)(Reg16_d & 0xFF); + + // redo for half carry flag + Reg16_d = Regs[src] & 0xF; + Reg16_d += 1; + + FlagH = Reg16_d.Bit(4); + FlagN = false; + + Regs[src] = ans; + + FlagS = Regs[src].Bit(7); + FlagP = Regs[src] == 0x80; + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + } + + public void DEC8_Func(ushort src) + { + int Reg16_d = Regs[src]; + Reg16_d -= 1; + + FlagZ = (Reg16_d & 0xFF) == 0; + + ushort ans = (ushort)(Reg16_d & 0xFF); + + // redo for half carry flag + Reg16_d = Regs[src] & 0xF; + Reg16_d -= 1; + + FlagH = Reg16_d.Bit(4); + FlagN = true; + + Regs[src] = ans; + + FlagS = Regs[src].Bit(7); + FlagP = Regs[src] == 0x7F; + Flag3 = (Regs[src] & 0x08) != 0; + Flag5 = (Regs[src] & 0x20) != 0; + } + + public void INC16_Func(ushort src_l, ushort src_h) + { + int Reg16_d = Regs[src_l] | (Regs[src_h] << 8); + + Reg16_d += 1; + + Regs[src_l] = (ushort)(Reg16_d & 0xFF); + Regs[src_h] = (ushort)((Reg16_d & 0xFF00) >> 8); + } + + public void DEC16_Func(ushort src_l, ushort src_h) + { + int Reg16_d = Regs[src_l] | (Regs[src_h] << 8); + + Reg16_d -= 1; + + Regs[src_l] = (ushort)(Reg16_d & 0xFF); + Regs[src_h] = (ushort)((Reg16_d & 0xFF00) >> 8); + } + + public void ADC8_Func(ushort dest, ushort src) + { + int Reg16_d = Regs[dest]; + int c = FlagC ? 1 : 0; + + Reg16_d += (Regs[src] + c); + + FlagC = Reg16_d.Bit(8); + FlagZ = (Reg16_d & 0xFF) == 0; + + ushort ans = (ushort)(Reg16_d & 0xFF); + + // redo for half carry flag + Reg16_d = Regs[dest] & 0xF; + Reg16_d += ((Regs[src] & 0xF) + c); + + FlagH = Reg16_d.Bit(4); + FlagN = false; + Flag3 = (ans & 0x08) != 0; + Flag5 = (ans & 0x20) != 0; + FlagP = (Regs[dest].Bit(7) == Regs[src].Bit(7)) && (Regs[dest].Bit(7) != ans.Bit(7)); + FlagS = ans > 127; + + Regs[dest] = ans; + } + + public void SBC8_Func(ushort dest, ushort src) + { + int Reg16_d = Regs[dest]; + int c = FlagC ? 1 : 0; + + Reg16_d -= (Regs[src] + c); + + FlagC = Reg16_d.Bit(8); + FlagZ = (Reg16_d & 0xFF) == 0; + + ushort ans = (ushort)(Reg16_d & 0xFF); + + // redo for half carry flag + Reg16_d = Regs[dest] & 0xF; + Reg16_d -= ((Regs[src] & 0xF) + c); + + FlagH = Reg16_d.Bit(4); + FlagN = true; + Flag3 = (ans & 0x08) != 0; + Flag5 = (ans & 0x20) != 0; + FlagP = (Regs[dest].Bit(7) != Regs[src].Bit(7)) && (Regs[dest].Bit(7) != ans.Bit(7)); + FlagS = ans > 127; + + Regs[dest] = ans; + } + + public void DA_Func(ushort src) + { + byte a = (byte)Regs[src]; + byte temp = a; + + if (FlagN) + { + if (FlagH || ((a & 0x0F) > 0x09)) { temp -= 0x06; } + if (FlagC || a > 0x99) { temp -= 0x60; } + } + else + { + if (FlagH || ((a & 0x0F) > 0x09)) { temp += 0x06; } + if (FlagC || a > 0x99) { temp += 0x60; } + } + + temp &= 0xFF; + + FlagC = FlagC || a > 0x99; + FlagZ = temp == 0; + FlagH = ((a ^ temp) & 0x10) != 0; + FlagP = TableParity[temp]; + FlagS = temp > 127; + Flag3 = (temp & 0x08) != 0; + Flag5 = (temp & 0x20) != 0; + + Regs[src] = temp; + } + + // used for signed operations + public void ADDS_Func(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + int Reg16_d = Regs[dest_l]; + int Reg16_s = Regs[src_l]; + + Reg16_d += Reg16_s; + + ushort temp = 0; + + // since this is signed addition, calculate the high byte carry appropriately + // note that flags are unaffected by this operation + if (Reg16_s.Bit(7)) + { + if (((Reg16_d & 0xFF) >= Regs[dest_l])) + { + temp = 0xFF; + } + else + { + temp = 0; + } + } + else + { + temp = (ushort)(Reg16_d.Bit(8) ? 1 : 0); + } + + ushort ans_l = (ushort)(Reg16_d & 0xFF); + + Regs[dest_l] = ans_l; + Regs[dest_h] += temp; + Regs[dest_h] &= 0xFF; + + } + + public void EXCH_16_Func(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + ushort temp = Regs[dest_l]; + Regs[dest_l] = Regs[src_l]; + Regs[src_l] = temp; + + temp = Regs[dest_h]; + Regs[dest_h] = Regs[src_h]; + Regs[src_h] = temp; + } + + public void OUT_Func(ushort dest, ushort src) + { + WriteHardware(Regs[dest], (byte)(Regs[src])); + } + + public void IN_Func(ushort dest, ushort src) + { + Regs[dest] = ReadHardware(Regs[src]); + } + + public void SBC_16_Func(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + int Reg16_d = Regs[dest_l] | (Regs[dest_h] << 8); + int Reg16_s = Regs[src_l] | (Regs[src_h] << 8); + int c = FlagC ? 1 : 0; + + int ans = Reg16_d - Reg16_s - c; + + FlagN = true; + FlagC = ans.Bit(16); + FlagP = (Reg16_d.Bit(15) != Reg16_s.Bit(15)) && (Reg16_d.Bit(15) != ans.Bit(15)); + FlagS = (ushort)(ans & 0xFFFF) > 32767; + FlagZ = (ans & 0xFFFF) == 0; + Flag3 = (ans & 0x0800) != 0; + Flag5 = (ans & 0x2000) != 0; + + // redo for half carry flag + Reg16_d &= 0xFFF; + Reg16_d -= ((Reg16_s & 0xFFF) + c); + + FlagH = Reg16_d.Bit(12); + + Regs[dest_l] = (ushort)(ans & 0xFF); + Regs[dest_h] = (ushort)((ans >> 8) & 0xFF); + } + + public void ADC_16_Func(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + int Reg16_d = Regs[dest_l] | (Regs[dest_h] << 8); + int Reg16_s = Regs[src_l] | (Regs[src_h] << 8); + + int ans = Reg16_d + Reg16_s + (FlagC ? 1 : 0); + + FlagH = ((Reg16_d & 0xFFF) + (Reg16_s & 0xFFF) + (FlagC ? 1 : 0)) > 0xFFF; + FlagN = false; + FlagC = ans.Bit(16); + FlagP = (Reg16_d.Bit(15) == Reg16_s.Bit(15)) && (Reg16_d.Bit(15) != ans.Bit(15)); + FlagS = (ans & 0xFFFF) > 32767; + FlagZ = (ans & 0xFFFF) == 0; + Flag3 = (ans & 0x0800) != 0; + Flag5 = (ans & 0x2000) != 0; + + Regs[dest_l] = (ushort)(ans & 0xFF); + Regs[dest_h] = (ushort)((ans >> 8) & 0xFF); + } + + public void NEG_8_Func(ushort src) + { + int Reg16_d = 0; + Reg16_d -= Regs[src]; + + FlagC = Regs[src] != 0x0; + FlagZ = (Reg16_d & 0xFF) == 0; + FlagP = Regs[src] == 0x80; + FlagS = (Reg16_d & 0xFF) > 127; + + ushort ans = (ushort)(Reg16_d & 0xFF); + // redo for half carry flag + Reg16_d = 0; + Reg16_d -= (Regs[src] & 0xF); + FlagH = Reg16_d.Bit(4); + Regs[src] = ans; + FlagN = true; + Flag3 = (ans & 0x08) != 0; + Flag5 = (ans & 0x20) != 0; + } + + public void RRD_Func(ushort dest, ushort src) + { + ushort temp1 = Regs[src]; + ushort temp2 = Regs[dest]; + Regs[dest] = (ushort)(((temp1 & 0x0F) << 4) + ((temp2 & 0xF0) >> 4)); + Regs[src] = (ushort)((temp1 & 0xF0) + (temp2 & 0x0F)); + + temp1 = Regs[src]; + FlagS = temp1 > 127; + FlagZ = temp1 == 0; + FlagH = false; + FlagP = TableParity[temp1]; + FlagN = false; + Flag3 = (temp1 & 0x08) != 0; + Flag5 = (temp1 & 0x20) != 0; + } + + public void RLD_Func(ushort dest, ushort src) + { + ushort temp1 = Regs[src]; + ushort temp2 = Regs[dest]; + Regs[dest] = (ushort)((temp1 & 0x0F) + ((temp2 & 0x0F) << 4)); + Regs[src] = (ushort)((temp1 & 0xF0) + ((temp2 & 0xF0) >> 4)); + + temp1 = Regs[src]; + FlagS = temp1 > 127; + FlagZ = temp1 == 0; + FlagH = false; + FlagP = TableParity[temp1]; + FlagN = false; + Flag3 = (temp1 & 0x08) != 0; + Flag5 = (temp1 & 0x20) != 0; + } + + // sets flags for LD/R + public void SET_FL_LD_Func() + { + FlagP = (Regs[C] | (Regs[B] << 8)) != 0; + FlagH = false; + FlagN = false; + Flag5 = ((Regs[ALU] + Regs[A]) & 0x02) != 0; + Flag3 = ((Regs[ALU] + Regs[A]) & 0x08) != 0; + } + + // set flags for CP/R + public void SET_FL_CP_Func() + { + int Reg8_d = Regs[A]; + int Reg8_s = Regs[ALU]; + + // get half carry flag + byte temp = (byte)((Reg8_d & 0xF) - (Reg8_s & 0xF)); + FlagH = temp.Bit(4); + + temp = (byte)(Reg8_d - Reg8_s); + FlagN = true; + FlagZ = temp == 0; + FlagS = temp > 127; + FlagP = (Regs[C] | (Regs[B] << 8)) != 0; + + temp = (byte)(Reg8_d - Reg8_s - (FlagH ? 1 : 0)); + Flag5 = (temp & 0x02) != 0; + Flag3 = (temp & 0x08) != 0; + } + } +} diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs new file mode 100644 index 0000000000..e2095693ec --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs @@ -0,0 +1,134 @@ +using System.Runtime.InteropServices; +using System; + +namespace BizHawk.Emulation.Common.Components.Z80A +{ + public partial class Z80A + { + // registers + // note these are not constants. When shadows are used, they will be changed accordingly + public ushort PCl = 0; + public ushort PCh = 1; + public ushort SPl = 2; + public ushort SPh = 3; + public ushort A = 4; + public ushort F = 5; + public ushort B = 6; + public ushort C = 7; + public ushort D = 8; + public ushort E = 9; + public ushort H = 10; + public ushort L = 11; + public ushort W = 12; + public ushort Z = 13; + public ushort Aim = 14; // use this indicator for RLCA etc., since the Z flag is reset on those + public ushort Ixl = 15; + public ushort Ixh = 16; + public ushort Iyl = 17; + public ushort Iyh = 18; + public ushort Int = 19; + public ushort R = 20; + public ushort I = 21; + public ushort ZERO = 22; // it is convenient to have a register that is always zero, to reuse instructions + public ushort ALU = 23; // This will be temporary arthimatic storage + // shadow registers + public ushort A_s = 24; + public ushort F_s = 25; + public ushort B_s = 26; + public ushort C_s = 27; + public ushort D_s = 28; + public ushort E_s = 29; + public ushort H_s = 30; + public ushort L_s = 31; + + public ushort[] Regs = new ushort[36]; + + // The Z80 also has ports to communicate with external components + + public bool FlagI; + + public bool FlagC + { + get { return (Regs[5] & 0x01) != 0; } + set { Regs[5] = (ushort)((Regs[5] & ~0x01) | (value ? 0x01 : 0x00)); } + } + + public bool FlagN + { + get { return (Regs[5] & 0x02) != 0; } + set { Regs[5] = (ushort)((Regs[5] & ~0x02) | (value ? 0x02 : 0x00)); } + } + + public bool FlagP + { + get { return (Regs[5] & 0x04) != 0; } + set { Regs[5] = (ushort)((Regs[5] & ~0x04) | (value ? 0x04 : 0x00)); } + } + + public bool Flag3 + { + get { return (Regs[5] & 0x08) != 0; } + set { Regs[5] = (ushort)((Regs[5] & ~0x08) | (value ? 0x08 : 0x00)); } + } + + public bool FlagH + { + get { return (Regs[5] & 0x10) != 0; } + set { Regs[5] = (ushort)((Regs[5] & ~0x10) | (value ? 0x10 : 0x00)); } + } + + public bool Flag5 + { + get { return (Regs[5] & 0x20) != 0; } + set { Regs[5] = (ushort)((Regs[5] & ~0x20) | (value ? 0x20 : 0x00)); } + } + + public bool FlagZ + { + get { return (Regs[5] & 0x40) != 0; } + set { Regs[5] = (ushort)((Regs[5] & ~0x40) | (value ? 0x40 : 0x00)); } + } + + public bool FlagS + { + get { return (Regs[5] & 0x80) != 0; } + set { Regs[5] = (ushort)((Regs[5] & ~0x80) | (value ? 0x80 : 0x00)); } + } + + public ushort RegPC + { + get { return (ushort)(Regs[0] | (Regs[1] << 8)); } + set + { + Regs[0] = (ushort)(value & 0xFF); + Regs[1] = (ushort)((value >> 8) & 0xFF); + } + } + + private void ResetRegisters() + { + for (int i=0; i < 14; i++) + { + Regs[i] = 0; + } + } + + private bool[] TableParity; + private void InitTableParity() + { + TableParity = new bool[256]; + for (int i = 0; i < 256; ++i) + { + int Bits = 0; + for (int j = 0; j < 8; ++j) + { + Bits += (i >> j) & 1; + } + TableParity[i] = (Bits & 1) == 0; + } + } + + + + } +} \ No newline at end of file diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs new file mode 100644 index 0000000000..a3ca05dcb0 --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs @@ -0,0 +1,590 @@ +using System; + +namespace BizHawk.Emulation.Common.Components.Z80A +{ + public partial class Z80A + { + // this contains the vectors of instrcution operations + // NOTE: This list is NOT confirmed accurate for each individual cycle + + private void NOP_() + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + OP }; + } + + // NOTE: In a real Z80, this operation just flips a switch to choose between 2 registers + // but it's simpler to emulate just by exchanging the register with it's shadow + private void EXCH_() + { + cur_instr = new ushort[] + {EXCH, + IDLE, + IDLE, + OP }; + } + + private void EXX_() + { + cur_instr = new ushort[] + {EXX, + IDLE, + IDLE, + OP }; + } + + // this exchanges 2 16 bit registers + private void EXCH_16_(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {EXCH_16, dest_l, dest_h, src_l, src_h, + IDLE, + IDLE, + OP }; + } + + private void INC_16(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + INC16, src_l, src_h, + IDLE, + OP }; + } + + + private void DEC_16(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + DEC16, src_l, src_h, + IDLE, + IDLE, + OP }; + } + + // this is done in two steps technically, but the flags don't work out using existing funcitons + // so let's use a different function since it's an internal operation anyway + private void ADD_16(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + TR16, Z, W, dest_l, dest_h, + INC16, Z, W, + IDLE, + IDLE, + ADD16, dest_l, dest_h, src_l, src_h, + IDLE, + IDLE, + OP }; + } + + private void REG_OP(ushort operation, ushort dest, ushort src) + { + cur_instr = new ushort[] + {operation, dest, src, + IDLE, + IDLE, + OP }; + } + + // Operations using the I and R registers take one T-cycle longer + private void REG_OP_IR(ushort operation, ushort dest, ushort src) + { + cur_instr = new ushort[] + {operation, dest, src, + IDLE, + IDLE, + IDLE, + OP }; + } + + // note: do not use DEC here since no flags are affected by this operation + private void DJNZ_() + { + if ((Regs[B] - 1) != 0) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + ASGN, B, (ushort)((Regs[B] - 1) & 0xFF), + IDLE, + RD, Z, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + ASGN, W, 0, + IDLE, + ADDS, PCl, PCh, Z, W, + TR16, Z, W, PCl, PCh, + OP }; + } + else + { + cur_instr = new ushort[] + {IDLE, + ASGN, B, (ushort)((Regs[B] - 1) & 0xFF), + IDLE, + RD, ALU, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + OP }; + } + } + + private void HALT_() + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + HALT }; + } + + private void JR_COND(bool cond) + { + if (cond) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, Z, PCl, PCh, + INC16, PCl, PCh, + IDLE, + IDLE, + ASGN, W, 0, + IDLE, + ADDS, PCl, PCh, Z, W, + TR16, Z, W, PCl, PCh, + IDLE, + OP }; + } + else + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, ALU, PCl, PCh, + IDLE, + INC16, PCl, PCh, + OP }; + } + } + + private void JP_COND(bool cond) + { + if (cond) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, Z, PCl, PCh, + INC16, PCl, PCh, + RD, W, PCl, PCh, + IDLE, + INC16, PCl, PCh, + TR16, PCl, PCh, Z, W, + IDLE, + OP }; + } + else + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, Z, PCl, PCh, + INC16, PCl, PCh, + IDLE, + RD, W, PCl, PCh, + INC16, PCl, PCh, + IDLE, + IDLE, + OP }; + } + } + + private void RET_() + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, Z, SPl, SPh, + INC16, SPl, SPh, + IDLE, + IDLE, + RD, W, SPl, SPh, + INC16, SPl, SPh, + TR16, PCl, PCh, Z, W, + OP }; + } + + private void RETI_() + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, Z, SPl, SPh, + INC16, SPl, SPh, + IDLE, + IDLE, + RD, W, SPl, SPh, + INC16, SPl, SPh, + TR16, PCl, PCh, Z, W, + OP }; + } + + private void RETN_() + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, Z, SPl, SPh, + INC16, SPl, SPh, + IDLE, + RD, W, SPl, SPh, + INC16, SPl, SPh, + EI_RETN, + TR16, PCl, PCh, Z, W, + OP }; + } + + + private void RET_COND(bool cond) + { + if (cond) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, Z, SPl, SPh, + INC16, SPl, SPh, + IDLE, + IDLE, + RD, W, SPl, SPh, + INC16, SPl, SPh, + IDLE, + TR16, PCl, PCh, Z, W, + OP }; + } + else + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + IDLE, + OP }; + } + } + + private void CALL_COND(bool cond) + { + if (cond) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, Z, PCl, PCh, + INC16, PCl, PCh, + IDLE, + RD, W, PCl, PCh, + INC16, PCl, PCh, + IDLE, + DEC16, SPl, SPh, + IDLE, + WR, SPl, SPh, PCh, + DEC16, SPl, SPh, + WR, SPl, SPh, PCl, + IDLE, + TR, PCl, Z, + TR, PCh, W, + OP }; + } + else + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, Z, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + RD, W, PCl, PCh, + IDLE, + INC16, PCl, PCh, + OP }; + } + } + + private void INT_OP(ushort operation, ushort src) + { + cur_instr = new ushort[] + {operation, src, + IDLE, + IDLE, + OP }; + } + + private void BIT_OP(ushort operation, ushort bit, ushort src) + { + cur_instr = new ushort[] + {operation, bit, src, + IDLE, + IDLE, + OP }; + } + + private void PUSH_(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + DEC16, SPl, SPh, + IDLE, + WR, SPl, SPh, src_h, + IDLE, + DEC16, SPl, SPh, + IDLE, + WR, SPl, SPh, src_l, + IDLE, + OP }; + } + + + private void POP_(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + RD, src_l, SPl, SPh, + IDLE, + INC16, SPl, SPh, + IDLE, + RD, src_h, SPl, SPh, + IDLE, + INC16, SPl, SPh, + IDLE, + OP }; + } + + private void RST_(ushort n) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + DEC16, SPl, SPh, + WR, SPl, SPh, PCh, + DEC16, SPl, SPh, + WR, SPl, SPh, PCl, + IDLE, + ASGN, Z, n, + ASGN, W, 0, + TR16, PCl, PCh, Z, W, + OP }; + } + + private void PREFIX_(ushort src) + { + cur_instr = new ushort[] + {PREFIX, src, + IDLE, + IDLE, + OP }; + } + + private void PREFETCH_(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {TR16, Z, W, src_l, src_h, + ADDS, Z, W, ALU, ZERO, + IDLE, + OP }; + } + + private void DI_() + { + cur_instr = new ushort[] + {DI, + IDLE, + IDLE, + OP }; + } + + private void EI_() + { + cur_instr = new ushort[] + {EI, + IDLE, + IDLE, + OP }; + } + + private void JP_16(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {TR, PCl, src_l, + IDLE, + TR, PCh, src_h, + OP }; + } + + private void LD_SP_16(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + TR, SPl, src_l, + IDLE, + TR, SPh, src_h, + IDLE, + OP }; + } + + private void JAM_() + { + cur_instr = new ushort[] + {JAM, + IDLE, + IDLE, + IDLE }; + } + + private void OUT_() + { + cur_instr = new ushort[] + {IDLE, + RD, ALU, PCl, PCh, + IDLE, + INC16, PCl, PCh, + TR, W, A, + OUT, ALU, A, + TR, Z, ALU, + INC16, Z, ALU, + IDLE, + IDLE, + OP}; + } + + private void OUT_REG_(ushort dest, ushort src) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + OUT, dest, src, + IDLE, + TR16, Z, W, C, B, + INC16, Z, W, + IDLE, + OP}; + } + + private void IN_() + { + cur_instr = new ushort[] + {IDLE, + RD, ALU, PCl, PCh, + IDLE, + INC16, PCl, PCh, + TR, W, A, + IN, A, ALU, + TR, Z, ALU, + INC16, Z, W, + IDLE, + IDLE, + OP}; + } + + private void IN_REG_(ushort dest, ushort src) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IN, dest, src, + IDLE, + TR16, Z, W, C, B, + INC16, Z, W, + IDLE, + OP}; + } + + private void REG_OP_16_(ushort op, ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + TR16, Z, W, dest_l, dest_h, + INC16, Z, W, + IDLE, + op, dest_l, dest_h, src_l, src_h, + IDLE, + IDLE, + OP}; + } + + private void INT_MODE_(ushort src) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + INT_MODE, src, + OP }; + } + + private void RRD_() + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + IDLE, + TR16, Z, W, L, H, + IDLE, + IDLE, + IDLE, + RD, ALU, Z, W, + IDLE, + RRD, ALU, A, + IDLE, + WR, Z, W, ALU, + IDLE, + INC16, Z, W, + IDLE, + IDLE, + OP }; + } + + private void RLD_() + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + IDLE, + TR16, Z, W, L, H, + IDLE, + IDLE, + IDLE, + RD, ALU, Z, W, + IDLE, + RLD, ALU, A, + IDLE, + WR, Z, W, ALU, + IDLE, + INC16, Z, W, + IDLE, + IDLE, + OP }; + } + } +} diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Indirect.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Indirect.cs new file mode 100644 index 0000000000..38890f7918 --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Indirect.cs @@ -0,0 +1,478 @@ +namespace BizHawk.Emulation.Common.Components.Z80A +{ + public partial class Z80A + { + private void INT_OP_IND(ushort operation, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, ALU, src_l, src_h, + IDLE, + operation, ALU, + IDLE, + WR, src_l, src_h, ALU, + IDLE, + IDLE, + OP }; + } + + private void BIT_OP_IND(ushort operation, ushort bit, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, ALU, src_l, src_h, + IDLE, + operation, bit, ALU, + IDLE, + WR, src_l, src_h, ALU, + IDLE, + IDLE, + OP }; + } + + // Note that this operation uses I_BIT, same as indexed BIT. + // This is where the strange behaviour in Flag bits 3 and 5 come from. + // normally WZ contain I* + n when doing I_BIT ops, but here we use that code path + // even though WZ is not assigned to, letting it's value from other operations show through + private void BIT_TE_IND(ushort operation, ushort bit, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, ALU, src_l, src_h, + IDLE, + I_BIT, bit, ALU, + IDLE, + OP }; + } + + private void REG_OP_IND_INC(ushort operation, ushort dest, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, ALU, src_l, src_h, + IDLE, + operation, dest, ALU, + INC16, src_l, src_h, + OP }; + } + + private void REG_OP_IND(ushort operation, ushort dest, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + TR16, Z, W, src_l, src_h, + RD, ALU, Z, W, + INC16, Z, W, + operation, dest, ALU, + OP }; + } + + private void LD_16_IND_nn(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + RD, Z, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + RD, W, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + WR, Z, W, src_l, + IDLE, + INC16, Z, W, + IDLE, + WR, Z, W, src_h, + IDLE, + OP }; + } + + private void LD_IND_16_nn(ushort dest_l, ushort dest_h) + { + cur_instr = new ushort[] + {IDLE, + RD, Z, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + RD, W, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + RD, dest_l, Z, W, + IDLE, + INC16, Z, W, + IDLE, + RD, dest_h, Z, W, + IDLE, + OP }; + } + + private void LD_8_IND_nn(ushort src) + { + cur_instr = new ushort[] + {IDLE, + RD, Z, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + RD, W, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + WR, Z, W, src, + INC16, Z, W, + TR, W, A, + OP }; + } + + private void LD_IND_8_nn(ushort dest) + { + cur_instr = new ushort[] + {IDLE, + RD, Z, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + RD, W, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + RD, dest, Z, W, + IDLE, + INC16, Z, W, + OP }; + } + + private void LD_8_IND(ushort dest_l, ushort dest_h, ushort src) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + TR16, Z, W, dest_l, dest_h, + WR, Z, W, src, + INC16, Z, W, + TR, W, A, + OP }; + } + + private void LD_8_IND_IND(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, ALU, src_l, src_h, + IDLE, + INC16, src_l, src_h, + IDLE, + WR, dest_l, dest_h, ALU, + IDLE, + OP }; + } + + private void LD_IND_8_INC(ushort dest, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, dest, src_l, src_h, + IDLE, + INC16, src_l, src_h, + OP }; + } + + private void LD_IND_8_DEC(ushort dest, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, dest, src_l, src_h, + IDLE, + DEC16, src_l, src_h, + IDLE, + OP }; + } + + private void LD_IND_16(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, dest_l, src_l, src_h, + IDLE, + INC16, src_l, src_h, + RD, dest_h, src_l, src_h, + IDLE, + INC16, src_l, src_h, + OP }; + } + + private void INC_8_IND(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, ALU, src_l, src_h, + IDLE, + INC8, ALU, + IDLE, + WR, src_l, src_h, ALU, + IDLE, + IDLE, + OP }; + } + + private void DEC_8_IND(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, ALU, src_l, src_h, + IDLE, + DEC8, ALU, + IDLE, + WR, src_l, src_h, ALU, + IDLE, + IDLE, + OP }; + } + + // NOTE: WZ implied for the wollowing 3 functions + private void I_INT_OP(ushort operation, ushort dest) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, ALU, Z, W, + IDLE, + operation, ALU, + IDLE, + WR, Z, W, ALU, + IDLE, + TR, dest, ALU, + IDLE, + OP }; + } + + private void I_BIT_OP(ushort operation, ushort bit, ushort dest) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, ALU, Z, W, + IDLE, + operation, bit, ALU, + IDLE, + WR, Z, W, ALU, + IDLE, + TR, dest, ALU, + IDLE, + OP }; + } + + private void I_BIT_TE(ushort bit) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + RD, ALU, Z, W, + IDLE, + I_BIT, bit, ALU, + IDLE, + OP }; + } + + private void I_OP_n(ushort operation, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, ALU, PCl, PCh, + INC16, PCl, PCh, + IDLE, + TR16, Z, W, src_l, src_h, + IDLE, + ADDS, Z, W, ALU, ZERO, + IDLE, + RD, ALU, Z, W, + IDLE, + IDLE, + operation, ALU, + IDLE, + IDLE, + IDLE, + WR, Z, W, ALU, + IDLE, + OP }; + } + + private void I_OP_n_n(ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, ALU, PCl, PCh, + INC16, PCl, PCh, + IDLE, + TR16, Z, W, src_l, src_h, + IDLE, + ADDS, Z, W, ALU, ZERO, + IDLE, + RD, ALU, PCl, PCh, + INC16, PCl, PCh, + IDLE, + WR, Z, W, ALU, + IDLE, + OP }; + } + + private void I_REG_OP_IND_n(ushort operation, ushort dest, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, ALU, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + TR16, Z, W, src_l, src_h, + IDLE, + ADDS, Z, W, ALU, ZERO, + IDLE, + RD, ALU, Z, W, + IDLE, + operation, dest, ALU, + IDLE, + OP }; + } + + private void I_LD_8_IND_n(ushort dest_l, ushort dest_h, ushort src) + { + cur_instr = new ushort[] + {IDLE, + RD, ALU, PCl, PCh, + IDLE, + INC16, PCl, PCh, + IDLE, + TR16, Z, W, dest_l, dest_h, + IDLE, + ADDS, Z, W, ALU, ZERO, + IDLE, + WR, Z, W, src, + IDLE, + IDLE, + IDLE, + IDLE, + OP }; + } + + private void LD_OP_R(ushort operation, ushort repeat_instr) + { + cur_instr = new ushort[] + {RD, ALU, L, H, + IDLE, + WR, E, D, ALU, + IDLE, + operation, L, H, + IDLE, + operation, E, D, + IDLE, + DEC16, C, B, + SET_FL_LD, + IDLE, + OP_R, 0, operation, repeat_instr }; + } + + private void CP_OP_R(ushort operation, ushort repeat_instr) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, ALU, L, H, + operation, L, H, + IDLE, + IDLE, + DEC16, C, B, + SET_FL_CP, + IDLE, + operation, Z, W, + IDLE, + OP_R, 1, operation, repeat_instr }; + } + + private void IN_OP_R(ushort operation, ushort repeat_instr) + { + cur_instr = new ushort[] + {IN, ALU, C, + IDLE, + WR, L, H, ALU, + IDLE, + operation, L, H, + IDLE, + TR16, Z, W, C, B, + operation, Z, W, + IDLE, + DEC8, B, + IDLE, + OP_R, 2, operation, repeat_instr }; + } + + private void OUT_OP_R(ushort operation, ushort repeat_instr) + { + cur_instr = new ushort[] + {RD, ALU, L, H, + IDLE, + OUT, C, ALU, + IDLE, + IDLE, + operation, L, H, + DEC8, B, + IDLE, + TR16, Z, W, C, B, + operation, Z, W, + IDLE, + OP_R, 3, operation, repeat_instr }; + } + + // this is an indirect change of a a 16 bit register with memory + private void EXCH_16_IND_(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) + { + cur_instr = new ushort[] + {IDLE, + IDLE, + RD, Z, dest_l, dest_h, + IDLE, + IDLE, + I_RD, W, dest_l, dest_h, 1, + IDLE, + IDLE, + WR, dest_l, dest_h, src_l, + IDLE, + IDLE, + I_WR, dest_l, dest_h, 1, src_h, + IDLE, + IDLE, + TR16, src_l, src_h, Z, W, + IDLE, + IDLE, + IDLE, + OP }; + } + } +} diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs new file mode 100644 index 0000000000..0f640eb124 --- /dev/null +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs @@ -0,0 +1,697 @@ +using System; +using System.Globalization; +using System.IO; + +using BizHawk.Common; +using BizHawk.Emulation.Common; +using BizHawk.Common.NumberExtensions; + +// Z80A CPU +namespace BizHawk.Emulation.Common.Components.Z80A +{ + public sealed partial class Z80A + { + // operations that can take place in an instruction + public const ushort IDLE = 0; + public const ushort OP = 1; + public const ushort OP_R = 2; // used for repeating operations + public const ushort HALT = 3; + public const ushort RD = 4; + public const ushort WR = 5; + public const ushort I_RD = 6; + public const ushort I_WR = 7; + public const ushort TR = 8; + public const ushort TR16 = 9; + public const ushort ADD16 = 10; + public const ushort ADD8 = 11; + public const ushort SUB8 = 12; + public const ushort ADC8 = 13; + public const ushort SBC8 = 14; + public const ushort SBC16 = 15; + public const ushort ADC16 = 16; + public const ushort INC16 = 17; + public const ushort INC8 = 18; + public const ushort DEC16 = 19; + public const ushort DEC8 = 20; + public const ushort RLC = 21; + public const ushort RL = 22; + public const ushort RRC = 23; + public const ushort RR = 24; + public const ushort CPL = 25; + public const ushort DA = 26; + public const ushort SCF = 27; + public const ushort CCF = 28; + public const ushort AND8 = 29; + public const ushort XOR8 = 30; + public const ushort OR8 = 31; + public const ushort CP8 = 32; + public const ushort SLA = 33; + public const ushort SRA = 34; + public const ushort SRL = 35; + public const ushort SLL = 36; + public const ushort BIT = 37; + public const ushort RES = 38; + public const ushort SET = 39; + public const ushort EI = 40; + public const ushort DI = 41; + public const ushort EXCH = 42; + public const ushort EXX = 43; + public const ushort EXCH_16 = 44; + public const ushort PREFIX = 45; + public const ushort PREFETCH = 46; + public const ushort ASGN = 47; + public const ushort ADDS = 48; // signed 16 bit operation used in 2 instructions + public const ushort JAM = 49; // all undocumented opcodes jam the machine + public const ushort EI_RETN = 50; + public const ushort EI_RETI = 51; // reti has no delay in interrupt enable + public const ushort OUT = 52; + public const ushort IN = 53; + public const ushort NEG = 54; + public const ushort INT_MODE = 55; + public const ushort RRD = 56; + public const ushort RLD = 57; + public const ushort SET_FL_LD = 58; + public const ushort SET_FL_CP = 59; + public const ushort I_BIT = 60; + public const ushort HL_BIT = 61; + + + public Z80A() + { + Reset(); + InitTableParity(); + } + + public void Reset() + { + ResetRegisters(); + ResetInterrupts(); + TotalExecutedCycles = 0; + cur_instr = new ushort[] { OP }; + NO_prefix = true; + } + + public IMemoryCallbackSystem MemoryCallbacks { get; set; } + + // Memory Access + public Func FetchMemory; + public Func ReadMemory; + public Action WriteMemory; + public Func PeekMemory; + public Func DummyReadMemory; + + // Hardware I/O Port Access + public Func ReadHardware; + public Action WriteHardware; + + //this only calls when the first byte of an instruction is fetched. + public Action OnExecFetch; + + public void UnregisterMemoryMapper() + { + ReadMemory = null; + WriteMemory = null; + PeekMemory = null; + DummyReadMemory = null; + ReadHardware = null; + WriteHardware = null; + } + + public void SetCallbacks + ( + Func ReadMemory, + Func DummyReadMemory, + Func PeekMemory, + Action WriteMemory, + Func ReadHardware, + Action WriteHardware + ) + { + this.ReadMemory = ReadMemory; + this.DummyReadMemory = DummyReadMemory; + this.PeekMemory = PeekMemory; + this.WriteMemory = WriteMemory; + this.ReadHardware = ReadHardware; + this.WriteHardware = WriteHardware; + } + + // Execute instructions + public void ExecuteOne() + { + switch (cur_instr[instr_pntr++]) + { + case IDLE: + // do nothing + break; + case OP: + // Read the opcode of the next instruction + if (EI_pending > 0 && NO_prefix) + { + EI_pending--; + if (EI_pending == 0) + { + IFF1 = IFF2 = true; + } + } + + // Process interrupt requests. + if (nonMaskableInterruptPending && NO_prefix) + { + nonMaskableInterruptPending = false; + + if (TraceCallback != null) + { + TraceCallback(new TraceInfo + { + Disassembly = "====NMI====", + RegisterInfo = "" + }); + } + + iff2 = iff1; + iff1 = false; + NMI_(); + NMICallback(); + + } + else if (iff1 && FlagI && NO_prefix) + { + iff1 = iff2 = false; + + if (TraceCallback != null) + { + TraceCallback(new TraceInfo + { + Disassembly = "====IRQ====", + RegisterInfo = "" + }); + } + + switch (interruptMode) + { + case 0: + // Requires something to be pushed onto the data bus + // we'll assume it's a zero for now + INTERRUPT_0(0); + break; + case 1: + INTERRUPT_1(); + break; + case 2: + // Low byte of interrupt vector comes from data bus + // We'll assume it's zero for now + INTERRUPT_2(0); + break; + } + IRQCallback(); + } + else + { + if (OnExecFetch != null) OnExecFetch(RegPC); + if (TraceCallback != null && NO_prefix) TraceCallback(State()); + FetchInstruction(ReadMemory(RegPC++)); + } + instr_pntr = 0; + Regs[R]++; + break; + case OP_R: + // determine if we repeat based on what operation we are doing + // single execution versions also come here, but never repeat + ushort temp1 = cur_instr[instr_pntr++]; + ushort temp2 = cur_instr[instr_pntr++]; + ushort temp3 = cur_instr[instr_pntr++]; + + bool repeat = false; + int Reg16_d = Regs[C] | (Regs[B] << 8); + switch (temp1) + { + case 0: + repeat = Reg16_d != 0; + break; + case 1: + repeat = (Reg16_d != 0) && !FlagZ; + break; + case 2: + repeat = Regs[B] != 0; + break; + case 3: + repeat = Regs[B] != 0; + break; + } + + // if we repeat, we do a 5 cycle refresh which decrements PC by 2 + // if we don't repeat, continue on as a normal opcode fetch + if (repeat && temp3 > 0) + { + instr_pntr = 0; + cur_instr = new ushort[] + {IDLE, + DEC16, PCl, PCh, + IDLE, + DEC16, PCl, PCh, + OP }; + + // adjust WZ register accordingly + switch (temp1) + { + case 0: + // TEST: PC before or after the instruction? + Regs[Z] = Regs[PCl]; + Regs[W] = Regs[PCh]; + INC16_Func(Z, W); + break; + case 1: + // TEST: PC before or after the instruction? + Regs[Z] = Regs[PCl]; + Regs[W] = Regs[PCh]; + INC16_Func(Z, W); + break; + case 2: + // Nothing + break; + case 3: + // Nothing + break; + } + } + else + { + // Interrupts can occur at this point, so process them accordingly + // Read the opcode of the next instruction + if (EI_pending > 0) + { + EI_pending--; + if (EI_pending == 0) + { + IFF1 = IFF2 = true; + } + } + + // Process interrupt requests. + if (nonMaskableInterruptPending && NO_prefix) + { + nonMaskableInterruptPending = false; + + if (TraceCallback != null) + { + TraceCallback(new TraceInfo + { + Disassembly = "====NMI====", + RegisterInfo = "" + }); + } + + iff2 = iff1; + iff1 = false; + NMI_(); + NMICallback(); + + } + else if (iff1 && FlagI && NO_prefix) + { + iff1 = iff2 = false; + + if (TraceCallback != null) + { + TraceCallback(new TraceInfo + { + Disassembly = "====IRQ====", + RegisterInfo = "" + }); + } + + switch (interruptMode) + { + case 0: + // Requires something to be pushed onto the data bus + // we'll assume it's a zero for now + INTERRUPT_0(0); + break; + case 1: + INTERRUPT_1(); + break; + case 2: + // Low byte of interrupt vector comes from data bus + // We'll assume it's zero for now + INTERRUPT_2(0); + break; + } + IRQCallback(); + } + else + { + if (OnExecFetch != null) OnExecFetch(RegPC); + if (TraceCallback != null) TraceCallback(State()); + FetchInstruction(ReadMemory(RegPC++)); + instr_pntr = 0; + Regs[R]++; + } + } + break; + + case HALT: + halted = true; + if (EI_pending > 0 && NO_prefix) + { + EI_pending--; + if (EI_pending == 0) + { + IFF1 = IFF2 = true; + } + } + + // Process interrupt requests. + if (nonMaskableInterruptPending && NO_prefix) + { + nonMaskableInterruptPending = false; + + if (TraceCallback != null) + { + TraceCallback(new TraceInfo + { + Disassembly = "====NMI====", + RegisterInfo = "" + }); + } + + iff2 = iff1; + iff1 = false; + NMI_(); + NMICallback(); + + } + else if (iff1 && FlagI && NO_prefix) + { + iff1 = iff2 = false; + + if (TraceCallback != null) + { + TraceCallback(new TraceInfo + { + Disassembly = "====IRQ====", + RegisterInfo = "" + }); + } + + switch (interruptMode) + { + case 0: + // Requires something to be pushed onto the data bus + // we'll assume it's a zero for now + INTERRUPT_0(0); + break; + case 1: + INTERRUPT_1(); + break; + case 2: + // Low byte of interrupt vector comes from data bus + // We'll assume it's zero for now + INTERRUPT_2(0); + break; + } + IRQCallback(); + } + else + { + instr_pntr = 0; + Regs[R]++; + cur_instr = new ushort[] + {IDLE, + IDLE, + IDLE, + HALT }; + } + break; + case RD: + Read_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case WR: + Write_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case I_RD: + I_Read_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case I_WR: + I_Write_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case TR: + TR_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case TR16: + TR16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case ADD16: + ADD16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case ADD8: + ADD8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case SUB8: + SUB8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case ADC8: + ADC8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case ADC16: + ADC_16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case SBC8: + SBC8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case SBC16: + SBC_16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case INC16: + INC16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case INC8: + INC8_Func(cur_instr[instr_pntr++]); + break; + case DEC16: + DEC16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case DEC8: + DEC8_Func(cur_instr[instr_pntr++]); + break; + case RLC: + RLC_Func(cur_instr[instr_pntr++]); + break; + case RL: + RL_Func(cur_instr[instr_pntr++]); + break; + case RRC: + RRC_Func(cur_instr[instr_pntr++]); + break; + case RR: + RR_Func(cur_instr[instr_pntr++]); + break; + case CPL: + CPL_Func(cur_instr[instr_pntr++]); + break; + case DA: + DA_Func(cur_instr[instr_pntr++]); + break; + case SCF: + SCF_Func(cur_instr[instr_pntr++]); + break; + case CCF: + CCF_Func(cur_instr[instr_pntr++]); + break; + case AND8: + AND8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case XOR8: + XOR8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case OR8: + OR8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case CP8: + CP8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case SLA: + SLA_Func(cur_instr[instr_pntr++]); + break; + case SRA: + SRA_Func(cur_instr[instr_pntr++]); + break; + case SRL: + SRL_Func(cur_instr[instr_pntr++]); + break; + case SLL: + SLL_Func(cur_instr[instr_pntr++]); + break; + case BIT: + BIT_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case I_BIT: + I_BIT_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case RES: + RES_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case SET: + SET_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case EI: + EI_pending = 2; + break; + case DI: + IFF1 = IFF2 = false; + EI_pending = 0; + break; + case EXCH: + EXCH_16_Func(F_s, A_s, F, A); + break; + case EXX: + EXCH_16_Func(C_s, B_s, C, B); + EXCH_16_Func(E_s, D_s, E, D); + EXCH_16_Func(L_s, H_s, L, H); + break; + case EXCH_16: + EXCH_16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case PREFIX: + ushort prefix_src = cur_instr[instr_pntr++]; + NO_prefix = false; + if (prefix_src == CBpre) { CB_prefix = true; } + if (prefix_src == EXTDpre) { EXTD_prefix = true; } + if (prefix_src == IXpre) { IX_prefix = true; } + if (prefix_src == IYpre) { IY_prefix = true; } + if (prefix_src == IXCBpre) { IXCB_prefix = true; IXCB_prefetch = true; } + if (prefix_src == IYCBpre) { IYCB_prefix = true; IYCB_prefetch = true; } + Regs[R]++; + break; + case ASGN: + ASGN_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case ADDS: + ADDS_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case JAM: + jammed = true; + instr_pntr--; + break; + case EI_RETI: + // NOTE: This is needed for systems using multiple interrupt sources, it triggers the next interrupt + // Not currently implemented here + break; + case EI_RETN: + EI_pending = 1; + break; + case OUT: + OUT_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case IN: + IN_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case NEG: + NEG_8_Func(cur_instr[instr_pntr++]); + break; + case INT_MODE: + interruptMode = cur_instr[instr_pntr++]; + break; + case RRD: + RRD_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case RLD: + RLD_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); + break; + case SET_FL_LD: + SET_FL_LD_Func(); + break; + case SET_FL_CP: + SET_FL_CP_Func(); + break; + } + totalExecutedCycles++; + } + + // tracer stuff + public Action TraceCallback; + + public string TraceHeader + { + get { return "Z80A: PC, machine code, mnemonic, operands, registers (AF, BC, DE, HL, IX, IY, SP, Cy), flags (CNP3H5ZS)"; } + } + + public TraceInfo State(bool disassemble = true) + { + ushort bytes_read = 0; + + string disasm = disassemble ? Disassemble(RegPC, ReadMemory, out bytes_read) : "---"; + string byte_code = null; + + for (ushort i = 0; i < bytes_read; i++) + { + byte_code += ReadMemory((ushort)(RegPC + i)).ToHexString(2); + if (i < (bytes_read - 1)) + { + byte_code += " "; + } + } + + return new TraceInfo + { + Disassembly = string.Format( + "{0:X4}: {1} {2}", + RegPC, + byte_code.PadRight(12), + disasm.PadRight(26)), + RegisterInfo = string.Format( + "AF:{0:X4} BC:{1:X4} DE:{2:X4} HL:{3:X4} IX:{4:X4} IY:{5:X4} SP:{6:X4} Cy:{7} {8}{9}{10}{11}{12}{13}{14}{15}{16}", + (Regs[A] << 8) + Regs[F], + (Regs[B] << 8) + Regs[C], + (Regs[D] << 8) + Regs[E], + (Regs[H] << 8) + Regs[L], + (Regs[Ixh] << 8) + Regs[Ixl], + (Regs[Iyh] << 8) + Regs[Iyl], + Regs[SPl] | (Regs[SPh] << 8), + TotalExecutedCycles, + FlagC ? "C" : "c", + FlagN ? "N" : "n", + FlagP ? "P" : "p", + Flag3 ? "3" : "-", + FlagH ? "H" : "h", + Flag5 ? "5" : "-", + FlagZ ? "Z" : "z", + FlagS ? "S" : "s", + FlagI ? "E" : "e") + }; + } + // State Save/Load + + public void SyncState(Serializer ser) + { + ser.BeginSection("Z80A"); + ser.Sync("Regs", ref Regs, false); + ser.Sync("NMI", ref nonMaskableInterrupt); + ser.Sync("NMIPending", ref nonMaskableInterruptPending); + ser.Sync("IM", ref interruptMode); + ser.Sync("IFF1", ref iff1); + ser.Sync("IFF2", ref iff2); + ser.Sync("Halted", ref halted); + ser.Sync("ExecutedCycles", ref totalExecutedCycles); + ser.Sync("EI_pending", ref EI_pending); + + ser.Sync("instruction_pointer", ref instr_pntr); + ser.Sync("current instruction", ref cur_instr, false); + ser.Sync("opcode", ref opcode); + ser.Sync("jammped", ref jammed); + ser.Sync("FlagI", ref FlagI); + + ser.Sync("NO Preifx", ref NO_prefix); + ser.Sync("CB Preifx", ref CB_prefix); + ser.Sync("IX_prefix", ref IX_prefix); + ser.Sync("IY_prefix", ref IY_prefix); + ser.Sync("IXCB_prefix", ref IXCB_prefix); + ser.Sync("IYCB_prefix", ref IYCB_prefix); + ser.Sync("EXTD_prefix", ref EXTD_prefix); + ser.Sync("IXCB_prefetch", ref IXCB_prefetch); + ser.Sync("IYCB_prefetch", ref IYCB_prefetch); + ser.Sync("PF", ref PF); + + ser.EndSection(); + } + } +} \ No newline at end of file From fc0a251040d8208d68e0378811ea29a238f62e13 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 12 Oct 2017 20:21:32 -0400 Subject: [PATCH 169/219] Add files via upload --- .../Consoles/Sega/SMS/SMS.IDebuggable.cs | 116 +++++----- .../Consoles/Sega/SMS/SMS.IEmulator.cs | 16 +- .../Consoles/Sega/SMS/SMS.IStatable.cs | 206 +++++++++--------- .../Consoles/Sega/SMS/SMS.cs | 15 +- .../Consoles/Sega/SMS/VDP.cs | 25 ++- 5 files changed, 201 insertions(+), 177 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IDebuggable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IDebuggable.cs index 973f3e78b7..009cd5fd4c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IDebuggable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IDebuggable.cs @@ -12,36 +12,36 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem { return new Dictionary { - ["A"] = Cpu.RegisterA, - ["AF"] = Cpu.RegisterAF, - ["B"] = Cpu.RegisterB, - ["BC"] = Cpu.RegisterBC, - ["C"] = Cpu.RegisterC, - ["D"] = Cpu.RegisterD, - ["DE"] = Cpu.RegisterDE, - ["E"] = Cpu.RegisterE, - ["F"] = Cpu.RegisterF, - ["H"] = Cpu.RegisterH, - ["HL"] = Cpu.RegisterHL, - ["I"] = Cpu.RegisterI, - ["IX"] = Cpu.RegisterIX, - ["IY"] = Cpu.RegisterIY, - ["L"] = Cpu.RegisterL, - ["PC"] = Cpu.RegisterPC, - ["R"] = Cpu.RegisterR, - ["Shadow AF"] = Cpu.RegisterShadowAF, - ["Shadow BC"] = Cpu.RegisterShadowBC, - ["Shadow DE"] = Cpu.RegisterShadowDE, - ["Shadow HL"] = Cpu.RegisterShadowHL, - ["SP"] = Cpu.RegisterSP, - ["Flag C"] = Cpu.RegisterF.Bit(0), - ["Flag N"] = Cpu.RegisterF.Bit(1), - ["Flag P/V"] = Cpu.RegisterF.Bit(2), - ["Flag 3rd"] = Cpu.RegisterF.Bit(3), - ["Flag H"] = Cpu.RegisterF.Bit(4), - ["Flag 5th"] = Cpu.RegisterF.Bit(5), - ["Flag Z"] = Cpu.RegisterF.Bit(6), - ["Flag S"] = Cpu.RegisterF.Bit(7) + ["A"] = Cpu.Regs[Cpu.A], + ["AF"] = Cpu.Regs[Cpu.F] + (Cpu.Regs[Cpu.A] << 8), + ["B"] = Cpu.Regs[Cpu.B], + ["BC"] = Cpu.Regs[Cpu.C] + (Cpu.Regs[Cpu.B] << 8), + ["C"] = Cpu.Regs[Cpu.C], + ["D"] = Cpu.Regs[Cpu.D], + ["DE"] = Cpu.Regs[Cpu.E] + (Cpu.Regs[Cpu.D] << 8), + ["E"] = Cpu.Regs[Cpu.E], + ["F"] = Cpu.Regs[Cpu.F], + ["H"] = Cpu.Regs[Cpu.H], + ["HL"] = Cpu.Regs[Cpu.L] + (Cpu.Regs[Cpu.H] << 8), + ["I"] = Cpu.Regs[Cpu.I], + ["IX"] = Cpu.Regs[Cpu.Ixl] + (Cpu.Regs[Cpu.Ixh] << 8), + ["IY"] = Cpu.Regs[Cpu.Iyl] + (Cpu.Regs[Cpu.Iyh] << 8), + ["L"] = Cpu.Regs[Cpu.L], + ["PC"] = Cpu.Regs[Cpu.PCl] + (Cpu.Regs[Cpu.PCh] << 8), + ["R"] = Cpu.Regs[Cpu.R], + ["Shadow AF"] = Cpu.Regs[Cpu.F_s] + (Cpu.Regs[Cpu.A_s] << 8), + ["Shadow BC"] = Cpu.Regs[Cpu.C_s] + (Cpu.Regs[Cpu.B_s] << 8), + ["Shadow DE"] = Cpu.Regs[Cpu.E_s] + (Cpu.Regs[Cpu.D_s] << 8), + ["Shadow HL"] = Cpu.Regs[Cpu.L_s] + (Cpu.Regs[Cpu.H_s] << 8), + ["SP"] = Cpu.Regs[Cpu.Iyl] + (Cpu.Regs[Cpu.Iyh] << 8), + ["Flag C"] = Cpu.FlagC, + ["Flag N"] = Cpu.FlagN, + ["Flag P/V"] = Cpu.FlagP, + ["Flag 3rd"] = Cpu.Flag3, + ["Flag H"] = Cpu.FlagH, + ["Flag 5th"] = Cpu.Flag5, + ["Flag Z"] = Cpu.FlagZ, + ["Flag S"] = Cpu.FlagS }; } @@ -52,70 +52,82 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem default: throw new InvalidOperationException(); case "A": - Cpu.RegisterA = (byte)value; + Cpu.Regs[Cpu.A] = (ushort)value; break; case "AF": - Cpu.RegisterAF = (byte)value; + Cpu.Regs[Cpu.F] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.A] = (ushort)(value & 0xFF00); break; case "B": - Cpu.RegisterB = (byte)value; + Cpu.Regs[Cpu.B] = (ushort)value; break; case "BC": - Cpu.RegisterBC = (byte)value; + Cpu.Regs[Cpu.C] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.B] = (ushort)(value & 0xFF00); break; case "C": - Cpu.RegisterC = (byte)value; + Cpu.Regs[Cpu.C] = (ushort)value; break; case "D": - Cpu.RegisterD = (byte)value; + Cpu.Regs[Cpu.D] = (ushort)value; break; case "DE": - Cpu.RegisterDE = (byte)value; + Cpu.Regs[Cpu.E] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.D] = (ushort)(value & 0xFF00); break; case "E": - Cpu.RegisterE = (byte)value; + Cpu.Regs[Cpu.E] = (ushort)value; break; case "F": - Cpu.RegisterF = (byte)value; + Cpu.Regs[Cpu.F] = (ushort)value; break; case "H": - Cpu.RegisterH = (byte)value; + Cpu.Regs[Cpu.H] = (ushort)value; break; case "HL": - Cpu.RegisterHL = (byte)value; + Cpu.Regs[Cpu.L] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.H] = (ushort)(value & 0xFF00); break; case "I": - Cpu.RegisterI = (byte)value; + Cpu.Regs[Cpu.I] = (ushort)value; break; case "IX": - Cpu.RegisterIX = (byte)value; + Cpu.Regs[Cpu.Ixl] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.Ixh] = (ushort)(value & 0xFF00); break; case "IY": - Cpu.RegisterIY = (byte)value; + Cpu.Regs[Cpu.Iyl] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.Iyh] = (ushort)(value & 0xFF00); break; case "L": - Cpu.RegisterL = (byte)value; + Cpu.Regs[Cpu.L] = (ushort)value; break; case "PC": - Cpu.RegisterPC = (ushort)value; + Cpu.Regs[Cpu.PCl] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.PCh] = (ushort)(value & 0xFF00); break; case "R": - Cpu.RegisterR = (byte)value; + Cpu.Regs[Cpu.R] = (ushort)value; break; case "Shadow AF": - Cpu.RegisterShadowAF = (byte)value; + Cpu.Regs[Cpu.F_s] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.A_s] = (ushort)(value & 0xFF00); break; case "Shadow BC": - Cpu.RegisterShadowBC = (byte)value; + Cpu.Regs[Cpu.C_s] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.B_s] = (ushort)(value & 0xFF00); break; case "Shadow DE": - Cpu.RegisterShadowDE = (byte)value; + Cpu.Regs[Cpu.E_s] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.D_s] = (ushort)(value & 0xFF00); break; case "Shadow HL": - Cpu.RegisterShadowHL = (byte)value; + Cpu.Regs[Cpu.L_s] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.H_s] = (ushort)(value & 0xFF00); break; case "SP": - Cpu.RegisterSP = (byte)value; + Cpu.Regs[Cpu.SPl] = (ushort)(value & 0xFF); + Cpu.Regs[Cpu.SPh] = (ushort)(value & 0xFF00); break; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs index 86582d24ce..d6f398dccd 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs @@ -36,15 +36,19 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem _lagged = true; _frame++; PSG.BeginFrame(Cpu.TotalExecutedCycles); - Cpu.Debug = Tracer.Enabled; + if (!IsGameGear) { PSG.StereoPanning = Settings.ForceStereoSeparation ? ForceStereoByte : (byte)0xFF; - } - - if (Cpu.Debug && Cpu.Logger == null) // TODO, lets not do this on each frame. But lets refactor CoreComm/CoreComm first - { - Cpu.Logger = s => Tracer.Put(s); + } + + if (Tracer.Enabled) + { + Cpu.TraceCallback = s => Tracer.Put(s); + } + else + { + Cpu.TraceCallback = null; } if (IsGameGear == false) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs index 72f703980d..8f29ddaf9c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs @@ -1,106 +1,100 @@ -using System.IO; - -using BizHawk.Common; -using BizHawk.Emulation.Common; - - -namespace BizHawk.Emulation.Cores.Sega.MasterSystem -{ - public sealed partial class SMS : IStatable - { - public bool BinarySaveStatesPreferred - { - get { return false; } - } - - public void SaveStateBinary(BinaryWriter bw) - { - SyncState(Serializer.CreateBinaryWriter(bw)); - } - - public void LoadStateBinary(BinaryReader br) - { - SyncState(Serializer.CreateBinaryReader(br)); - } - - public void SaveStateText(TextWriter tw) - { - SyncState(Serializer.CreateTextWriter(tw)); - } - - public void LoadStateText(TextReader tr) - { - SyncState(Serializer.CreateTextReader(tr)); - } - - public byte[] SaveStateBinary() - { - if (_stateBuffer == null) - { - var stream = new MemoryStream(); - var writer = new BinaryWriter(stream); - SaveStateBinary(writer); - _stateBuffer = stream.ToArray(); - writer.Close(); - return _stateBuffer; - } - else - { - var stream = new MemoryStream(_stateBuffer); - var writer = new BinaryWriter(stream); - SaveStateBinary(writer); - writer.Close(); - return _stateBuffer; - } - } - - private byte[] _stateBuffer; - - private void SyncState(Serializer ser) - { - ser.BeginSection("SMS"); - Cpu.SyncState(ser); - Vdp.SyncState(ser); - PSG.SyncState(ser); - ser.Sync("RAM", ref SystemRam, false); - ser.Sync("RomBank0", ref RomBank0); - ser.Sync("RomBank1", ref RomBank1); - ser.Sync("RomBank2", ref RomBank2); - ser.Sync("RomBank3", ref RomBank3); - ser.Sync("Port01", ref Port01); - ser.Sync("Port02", ref Port02); - ser.Sync("Port3E", ref Port3E); - ser.Sync("Port3F", ref Port3F); - ser.Sync("Paddle1High", ref Paddle1High); - ser.Sync("Paddle2High", ref Paddle2High); - ser.Sync("LatchLightPhaser", ref LatchLightPhaser); - - if (SaveRAM != null) - { - ser.Sync("SaveRAM", ref SaveRAM, false); - ser.Sync("SaveRamBank", ref SaveRamBank); - } - - if (ExtRam != null) - { - ser.Sync("ExtRAM", ref ExtRam, true); - } - - if (HasYM2413) - { - YM2413.SyncState(ser); - } - - ser.Sync("Frame", ref _frame); - ser.Sync("LagCount", ref _lagCount); - ser.Sync("IsLag", ref _isLag); - - ser.EndSection(); - - if (ser.IsReader) - { - SyncAllByteArrayDomains(); - } - } - } -} +using System.IO; + +using BizHawk.Common; +using BizHawk.Emulation.Common; + + +namespace BizHawk.Emulation.Cores.Sega.MasterSystem +{ + public sealed partial class SMS : IStatable + { + public bool BinarySaveStatesPreferred + { + get { return true; } + } + + public void SaveStateText(TextWriter writer) + { + SyncState(new Serializer(writer)); + } + + public void LoadStateText(TextReader reader) + { + SyncState(new Serializer(reader)); + } + + public void SaveStateBinary(BinaryWriter bw) + { + SyncState(new Serializer(bw)); + } + + public void LoadStateBinary(BinaryReader br) + { + SyncState(new Serializer(br)); + } + + public byte[] SaveStateBinary() + { + MemoryStream ms = new MemoryStream(); + BinaryWriter bw = new BinaryWriter(ms); + SaveStateBinary(bw); + bw.Flush(); + return ms.ToArray(); + } + + private void SyncState(Serializer ser) + { + byte[] core = null; + if (ser.IsWriter) + { + var ms = new MemoryStream(); + ms.Close(); + core = ms.ToArray(); + } + Cpu.SyncState(ser); + + ser.BeginSection("SMS"); + Vdp.SyncState(ser); + PSG.SyncState(ser); + ser.Sync("RAM", ref SystemRam, false); + ser.Sync("RomBank0", ref RomBank0); + ser.Sync("RomBank1", ref RomBank1); + ser.Sync("RomBank2", ref RomBank2); + ser.Sync("RomBank3", ref RomBank3); + ser.Sync("Port01", ref Port01); + ser.Sync("Port02", ref Port02); + ser.Sync("Port3E", ref Port3E); + ser.Sync("Port3F", ref Port3F); + ser.Sync("Paddle1High", ref Paddle1High); + ser.Sync("Paddle2High", ref Paddle2High); + ser.Sync("LatchLightPhaser", ref LatchLightPhaser); + + if (SaveRAM != null) + { + ser.Sync("SaveRAM", ref SaveRAM, false); + ser.Sync("SaveRamBank", ref SaveRamBank); + } + + if (ExtRam != null) + { + ser.Sync("ExtRAM", ref ExtRam, true); + } + + if (HasYM2413) + { + YM2413.SyncState(ser); + } + + ser.Sync("Frame", ref _frame); + ser.Sync("LagCount", ref _lagCount); + ser.Sync("IsLag", ref _isLag); + + ser.EndSection(); + + if (ser.IsReader) + { + SyncAllByteArrayDomains(); + } + } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs index b3f51ba047..1e9b39381d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs @@ -4,7 +4,7 @@ using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; using BizHawk.Emulation.Common.Components; using BizHawk.Emulation.Cores.Components; -using BizHawk.Emulation.Cores.Components.Z80; +using BizHawk.Emulation.Common.Components.Z80A; /***************************************************** TODO: @@ -75,11 +75,12 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem HasYM2413 = true; } - Cpu = new Z80A + Cpu = new Z80A() { - RegisterSP = 0xDFF0, ReadHardware = ReadPort, WriteHardware = WritePort, + ReadMemory = ReadMemory, + WriteMemory = WriteMemory, MemoryCallbacks = MemoryCallbacks }; @@ -160,7 +161,10 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem } if (game["SRAM"]) + { SaveRAM = new byte[int.Parse(game.OptionValue("SRAM"))]; + Console.WriteLine(SaveRAM.Length); + } else if (game.NotInDatabase) SaveRAM = new byte[0x8000]; @@ -175,8 +179,11 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem var serviceProvider = ServiceProvider as BasicServiceProvider; serviceProvider.Register(Tracer); - serviceProvider.Register(new Disassembler()); + serviceProvider.Register(Cpu); Vdp.ProcessOverscan(); + + Cpu.ReadMemory = ReadMemory; + Cpu.WriteMemory = WriteMemory; } // Constants diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs index 7dcf21971b..f079d04608 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs @@ -4,7 +4,7 @@ using System.IO; using BizHawk.Common; using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Components.Z80; +using BizHawk.Emulation.Common.Components.Z80A; namespace BizHawk.Emulation.Cores.Sega.MasterSystem @@ -113,7 +113,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem StatusByte &= 0x1F; HIntPending = false; VIntPending = false; - Cpu.Interrupt = false; + Cpu.FlagI = false; return returnValue; } @@ -291,13 +291,13 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem { case 0: // Mode Control Register 1 CheckVideoMode(); - Cpu.Interrupt = (EnableLineInterrupts && HIntPending); - Cpu.Interrupt |= (EnableFrameInterrupts && VIntPending); + Cpu.FlagI = (EnableLineInterrupts && HIntPending); + Cpu.FlagI |= (EnableFrameInterrupts && VIntPending); break; case 1: // Mode Control Register 2 CheckVideoMode(); - Cpu.Interrupt = (EnableFrameInterrupts && VIntPending); - Cpu.Interrupt |= (EnableLineInterrupts && HIntPending); + Cpu.FlagI = (EnableFrameInterrupts && VIntPending); + Cpu.FlagI |= (EnableLineInterrupts && HIntPending); break; case 2: // Name Table Base Address NameTableBase = CalcNameTableBase(); @@ -347,7 +347,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem if (VIntPending && EnableFrameInterrupts) { - Cpu.Interrupt = true; + Cpu.FlagI = true; } } @@ -361,7 +361,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem HIntPending = true; if (EnableLineInterrupts) {; - Cpu.Interrupt = true; + Cpu.FlagI = true; } lineIntLinesRemaining = Registers[0x0A]; } @@ -383,7 +383,14 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem ProcessLineInterrupt(); Sms.ProcessLineControls(); - Cpu.ExecuteCycles(IPeriod); + //Console.Write(Cpu.cur_instr.Length); + //Console.Write(" "); + //Console.WriteLine(Cpu.instr_pntr); + for (int j = 0; j < IPeriod; j++) + { + Cpu.ExecuteOne(); + } + if (ScanLine == scanlinesPerFrame - 1) { From 73dfcf00bd7b6631009c3768c4e0fe2fc90350a7 Mon Sep 17 00:00:00 2001 From: Asnivor Date: Fri, 13 Oct 2017 11:09:08 +0100 Subject: [PATCH 170/219] DiscSystem - CDFS classes now also detect and consume CD-I (Green Book) disc images --- .../CDFS/EndianBitConverter.cs | 45 ++ .../CDFS/ISODirectoryNode.cs | 22 +- BizHawk.Emulation.DiscSystem/CDFS/ISOFile.cs | 139 +++-- .../CDFS/ISONodeRecord.cs | 123 +++- .../CDFS/ISOVolumeDescriptor.cs | 572 +++++++++++++----- 5 files changed, 700 insertions(+), 201 deletions(-) diff --git a/BizHawk.Emulation.DiscSystem/CDFS/EndianBitConverter.cs b/BizHawk.Emulation.DiscSystem/CDFS/EndianBitConverter.cs index 382cd7c39a..3ecee543b6 100644 --- a/BizHawk.Emulation.DiscSystem/CDFS/EndianBitConverter.cs +++ b/BizHawk.Emulation.DiscSystem/CDFS/EndianBitConverter.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; namespace BizHawk.Emulation.DiscSystem @@ -114,5 +115,49 @@ namespace BizHawk.Emulation.DiscSystem } #endregion + + // (asni 20171013) - Some methods I wrote that have been shoehorned in from another project to speed up development time + // If these are offensive in any way, tell me I suck and that I need to do more work with existing methods + #region Misc + + /// + /// Returns a byte array of any length + /// Not really anything endian going on, but I struggled to find a better place for it + /// + /// + /// + /// + /// + public byte[] ReadBytes(byte[] buffer, int offset, int length) + { + return buffer.Skip(offset).Take(length).ToArray(); + } + + /// + /// Returns an int32 value from any size byte array + /// (careful, data may/will be truncated) + /// + /// + /// + /// + /// + public int ReadIntValue(byte[] buffer, int offset, int length) + { + var bytes = buffer.Skip(offset).Take(length).ToArray(); + + if (swap) + Array.Reverse(bytes); + + if (length == 1) + return bytes.FirstOrDefault(); + + if (length == 2) + return BitConverter.ToInt16(bytes, 0); + + int result = BitConverter.ToInt32(bytes, 0); + return result; + } + + #endregion } } diff --git a/BizHawk.Emulation.DiscSystem/CDFS/ISODirectoryNode.cs b/BizHawk.Emulation.DiscSystem/CDFS/ISODirectoryNode.cs index 53cd7f09b1..2b40ebb9a0 100644 --- a/BizHawk.Emulation.DiscSystem/CDFS/ISODirectoryNode.cs +++ b/BizHawk.Emulation.DiscSystem/CDFS/ISODirectoryNode.cs @@ -48,21 +48,24 @@ namespace BizHawk.Emulation.DiscSystem s.Seek(this.Offset * ISOFile.SECTOR_SIZE, SeekOrigin.Begin); List records = new List(); - - // Read the directory entries - while (s.Position < ((this.Offset * ISOFile.SECTOR_SIZE) + this.Length)) + + // Read the directory entries + while (s.Position < ((this.Offset * ISOFile.SECTOR_SIZE) + this.Length)) { ISONode node; ISONodeRecord record; - + // Read the record record = new ISONodeRecord(); - record.Parse(s); + if (ISOFile.Format == ISOFile.ISOFormat.CDInteractive) + record.ParseCDInteractive(s); + if (ISOFile.Format == ISOFile.ISOFormat.ISO9660) + record.ParseISO9660(s); - //zero 24-jun-2013 - improved validity checks - //theres nothing here! - if (record.Length == 0) + //zero 24-jun-2013 - improved validity checks + //theres nothing here! + if (record.Length == 0) { break; } @@ -95,7 +98,8 @@ namespace BizHawk.Emulation.DiscSystem } // Add the node as a child - this.Children.Add(record.Name, node); + if (!this.Children.ContainsKey(record.Name)) + this.Children.Add(record.Name, node); } } diff --git a/BizHawk.Emulation.DiscSystem/CDFS/ISOFile.cs b/BizHawk.Emulation.DiscSystem/CDFS/ISOFile.cs index fb848fa2fe..d623740ef8 100644 --- a/BizHawk.Emulation.DiscSystem/CDFS/ISOFile.cs +++ b/BizHawk.Emulation.DiscSystem/CDFS/ISOFile.cs @@ -2,27 +2,51 @@ using System.Collections.Generic; using System.Text; using System.IO; +using System.Linq; namespace BizHawk.Emulation.DiscSystem { - /// - /// This class is meant to parse disk images as specified by ISO9660. - /// Specifically, it should work for most disk images that are created - /// by the stanard disk imaging software. This class is by no means - /// robust to all variations of ISO9660. - /// Also, this class does not currently support the UDF file system. - /// - /// TODO: Add functions to enumerate a directory or visit a file... - /// - /// The information for building class came from three primary sources: - /// 1. The ISO9660 wikipedia article: - /// http://en.wikipedia.org/wiki/ISO_9660 - /// 2. ISO9660 Simplified for DOS/Windows - /// http://alumnus.caltech.edu/~pje/iso9660.html - /// 3. The ISO 9660 File System - /// http://users.telenet.be/it3.consultants.bvba/handouts/ISO9960.html - /// - public class ISOFile + /// + /// This class is meant to parse disk images as specified by: + /// + /// ISO9660 + /// ------- + /// It should work for most disk images that are created + /// by the stanard disk imaging software. This class is by no means + /// robust to all variations of ISO9660. + /// Also, this class does not currently support the UDF file system. + /// + /// The information for building class came from three primary sources: + /// 1. The ISO9660 wikipedia article: + /// http://en.wikipedia.org/wiki/ISO_9660 + /// 2. ISO9660 Simplified for DOS/Windows + /// http://alumnus.caltech.edu/~pje/iso9660.html + /// 3. The ISO 9660 File System + /// http://users.telenet.be/it3.consultants.bvba/handouts/ISO9960.html + /// + /// + /// CD-I + /// ---- + /// (asni - 20171013) - Class modified to be able to detect and consume Green + /// Book disc images. + /// + /// The implemtation of CD-I in this class adds some (but not all) additional + /// properties to the class structures that CD-I brings. This means that + /// the same ISO class structures can be returned for both standards. + /// These small additions are readily found in ISOVolumeDescriptor.cs + /// + /// ISOFile.cs also now contains a public 'ISOFormat' enum that is set + /// during disc parsing. + /// + /// The main reference source for this implementation: + /// 1. The CD-I Full Functional Specification (aka Green Book) + /// https://www.lscdweb.com/data/downloadables/2/8/cdi_may94_r2.pdf + /// + /// + /// TODO: Add functions to enumerate a directory or visit a file... + /// + /// + public class ISOFile { #region Constants @@ -31,21 +55,37 @@ namespace BizHawk.Emulation.DiscSystem /// public const int SECTOR_SIZE = 2048; - #endregion + #endregion - #region Public Members + #region Static Members - /// - /// This is a list of all the volume descriptors in the disk image. - /// NOTE: The first entry should be the primary volume. - /// - public List VolumeDescriptors; + /// + /// Making this a static for now. Every other way I tried was fairly ineligant (asni) + /// + public static ISOFormat Format; + + public static List CDIPathTable; + + #endregion + + #region Public Members + + /// + /// This is a list of all the volume descriptors in the disk image. + /// NOTE: The first entry should be the primary volume. + /// + public List VolumeDescriptors; /// /// The Directory that is the root of this file system /// public ISODirectoryNode Root; + /// + /// The type of CDFS format detected + /// + public ISOFormat CDFSType; + #endregion #region Construction @@ -77,9 +117,9 @@ namespace BizHawk.Emulation.DiscSystem // Seek through the first volume descriptor s.Seek(startPosition + (SECTOR_SIZE * startSector), SeekOrigin.Begin); - - // Read one of more volume descriptors - do + + // Read one of more volume descriptors + do { //zero 24-jun-2013 - improved validity checks @@ -87,6 +127,8 @@ namespace BizHawk.Emulation.DiscSystem bool isValid = desc.Parse(s); if (!isValid) return false; + this.CDFSType = Format; + if (desc.IsTerminator()) break; else if (desc.Type < 4) @@ -98,16 +140,17 @@ namespace BizHawk.Emulation.DiscSystem } while (true); - //zero 24-jun-2013 - well, my very first test iso had 2 volume descriptors. - // Check to make sure we only read one volume descriptor - // Finding more could be an error with the disk. - //if (this.VolumeDescriptors.Count != 1) { - // Console.WriteLine("Strange ISO format..."); - // return; - //} + //zero 24-jun-2013 - well, my very first test iso had 2 volume descriptors. + // Check to make sure we only read one volume descriptor + // Finding more could be an error with the disk. + //if (this.VolumeDescriptors.Count != 1) { + // Console.WriteLine("Strange ISO format..."); + // return; + //} - //zero 24-jun-2013 - if theres no volume descriptors, we're gonna call this not a cdfs - if (VolumeDescriptors.Count == 0) return false; + + //zero 24-jun-2013 - if theres no volume descriptors, we're gonna call this not a cdfs + if (VolumeDescriptors.Count == 0) return false; // Visit all the directories and get the offset of each directory/file @@ -116,11 +159,12 @@ namespace BizHawk.Emulation.DiscSystem // Create (and visit) the root node this.Root = new ISODirectoryNode(this.VolumeDescriptors[0].RootDirectoryRecord); - visitedNodes.Add(this.Root.Offset, this.Root); - this.Root.Parse(s, visitedNodes); + + visitedNodes.Add(this.Root.Offset, this.Root); + this.Root.Parse(s, visitedNodes); return true; - } + } #endregion @@ -135,6 +179,17 @@ namespace BizHawk.Emulation.DiscSystem this.Root.Print(0); } - #endregion - } + #endregion + + #region Misc + + public enum ISOFormat + { + Unknown, + ISO9660, + CDInteractive + } + + #endregion + } } diff --git a/BizHawk.Emulation.DiscSystem/CDFS/ISONodeRecord.cs b/BizHawk.Emulation.DiscSystem/CDFS/ISONodeRecord.cs index 1913f3d897..72bb82cfff 100644 --- a/BizHawk.Emulation.DiscSystem/CDFS/ISONodeRecord.cs +++ b/BizHawk.Emulation.DiscSystem/CDFS/ISONodeRecord.cs @@ -31,10 +31,16 @@ namespace BizHawk.Emulation.DiscSystem /// public byte Length; - /// - /// The file offset of the data for this file/directory (in sectors). - /// - public long OffsetOfData; + /// + /// This is the number of blocks at the beginning of the file reserved for extended attribute information + /// The format of the extended attribute record is not defined and is reserved for application use + /// + public byte ExtendedAttribRecordLength; + + /// + /// The file offset of the data for this file/directory (in sectors). + /// + public long OffsetOfData; /// /// The length of the data for this file/directory (in bytes). /// @@ -148,14 +154,19 @@ namespace BizHawk.Emulation.DiscSystem // Put the array into a memory stream and pass to the main parsing function MemoryStream s = new MemoryStream(data); s.Seek(cursor, SeekOrigin.Begin); - this.Parse(s); + + if (ISOFile.Format == ISOFile.ISOFormat.ISO9660) + this.ParseISO9660(s); + + if (ISOFile.Format == ISOFile.ISOFormat.CDInteractive) + this.ParseCDInteractive(s); } /// - /// Parse the node record from the given stream. + /// Parse the node record from the given ISO9660 stream. /// /// The stream to parse from. - public void Parse(Stream s) + public void ParseISO9660(Stream s) { EndianBitConverter bc = EndianBitConverter.CreateForLittleEndian(); long startPosition = s.Position; @@ -212,6 +223,100 @@ namespace BizHawk.Emulation.DiscSystem s.Seek(startPosition + this.Length, SeekOrigin.Begin); } - #endregion - } + /// + /// Parse the node record from the given CD-I stream. + /// + /// The stream to parse from. + public void ParseCDInteractive(Stream s) + { + /* + BP Size in bytes Description + 1 1 Record length + 2 1 Extended Attribute record length + 3 4 Reserved + 7 4 File beginning LBN + 11 4 Reserved + 15 4 File size + 19 6 Creation date + 25 1 Reserved + 26 1 File flags + 27 2 Interleave + 29 2 Reserved + 31 2 Album Set Sequence number + 33 1 File name size + 34 (n) File name + 34+n 4 Owner ID + 38+n 2 Attributes + 40+n 2 Reserved + 42+n 1 File number + 43+n 1 Reserved + 43+n Total + */ + + EndianBitConverter bc = EndianBitConverter.CreateForLittleEndian(); + EndianBitConverter bcBig = EndianBitConverter.CreateForBigEndian(); + long startPosition = s.Position; + byte[] buffer = new byte[ISOFile.SECTOR_SIZE]; + + // Read the entire structure + s.Read(buffer, 0, ISOFile.SECTOR_SIZE); + s.Position -= ISOFile.SECTOR_SIZE; + + // Get the record length + this.Length = buffer[0]; + + // extended attribute record length + this.ExtendedAttribRecordLength = buffer[1]; + + // Read Data Offset + this.OffsetOfData = bcBig.ReadIntValue(buffer, 6, 4); + + // Read Data Length + this.LengthOfData = bcBig.ReadIntValue(buffer, 14, 4); + + // Read the time + var ti = bc.ReadBytes(buffer, 18, 6); + this.Year = ti[0]; + this.Month = ti[1]; + this.Day = ti[2]; + this.Hour = ti[3]; + this.Minute = ti[4]; + this.Second = ti[5]; + + // read interleave - still to do + + // read album (volume) set sequence number (we are ignoring this) + + // Read the name length + this.NameLength = buffer[32]; + + // Read the file/directory name + var name = bc.ReadBytes(buffer, 33, this.NameLength); + if (this.NameLength == 1 && (name[0] == 0 || name[0] == 1)) + { + if (name[0] == 0) + this.Name = ISONodeRecord.CURRENT_DIRECTORY; + else + this.Name = ISONodeRecord.PARENT_DIRECTORY; + } + else + { + this.Name = ASCIIEncoding.ASCII.GetString(name, 0, this.NameLength); + } + + // skip ownerID for now + + // read the flags - only really interested in the directory attribute (bit 15) + // (confusingly these are called 'attributes' in CD-I. the CD-I 'File Flags' entry is something else entirely) + this.Flags = buffer[37 + this.NameLength]; + + // skip filenumber + //this.FileNumber = buffer[41 + this.NameLength]; + + // Seek to end + s.Seek(startPosition + this.Length, SeekOrigin.Begin); + } + + #endregion + } } diff --git a/BizHawk.Emulation.DiscSystem/CDFS/ISOVolumeDescriptor.cs b/BizHawk.Emulation.DiscSystem/CDFS/ISOVolumeDescriptor.cs index 4dda3f59e4..e8b271e10f 100644 --- a/BizHawk.Emulation.DiscSystem/CDFS/ISOVolumeDescriptor.cs +++ b/BizHawk.Emulation.DiscSystem/CDFS/ISOVolumeDescriptor.cs @@ -25,14 +25,21 @@ namespace BizHawk.Emulation.DiscSystem private const int LENGTH_TIME = 17; private const int LENGTH_RESERVED = 512; - #endregion + #endregion - #region Public Properties + #region Private Properties - /// - /// The type of this volume description, only 1 and 255 are supported - /// - public byte Type; + private EndianBitConverter bc = EndianBitConverter.CreateForLittleEndian(); + private EndianBitConverter bcBig = EndianBitConverter.CreateForBigEndian(); + + #endregion + + #region Public Properties + + /// + /// The type of this volume description, only 1 and 255 are supported + /// + public byte Type; /// /// The system identifier @@ -66,21 +73,21 @@ namespace BizHawk.Emulation.DiscSystem /// public int PathTableSize; /// - /// Sector offset of the first path table + /// (ISO9660 only) Sector offset of the first path table /// public int OffsetOfFirstLittleEndianPathTable; - /// - /// Sector offset of the second path table - /// - public int OffsetOfSecondLittleEndianPathTable; - /// - /// Sector offset of the first path table - /// - public int OffsetOfFirstBigEndianPathTable; - /// - /// Sector offset of the second path table - /// - public int OffsetOfSecondBigEndianPathTable; + /// + /// (ISO9660 only) Sector offset of the second path table + /// + public int OffsetOfSecondLittleEndianPathTable; + /// + /// (ISO9660 only) Sector offset of the first path table + /// + public int OffsetOfFirstBigEndianPathTable; + /// + /// (ISO9660 only) Sector offset of the second path table + /// + public int OffsetOfSecondBigEndianPathTable; /// /// The root directory record @@ -134,19 +141,43 @@ namespace BizHawk.Emulation.DiscSystem /// public byte[] EffectiveDateTime; - /// - /// Extra reserved data - /// - public byte[] Reserved; + /// + /// (ISO9660 only) Extra reserved data + /// + public byte[] Reserved; - #endregion - #region Construction + // CD-Interactive only + + /// + /// The bits of this field are numbered from 0 to 7 starting with the least significant bit + /// BitPosition 0: A value of 0 = the coded character set identifier field specifies only an escape sequence registered according to ISO 2375 + /// A value of 1 = the coded character set identifier field specifies only an escape sequence NOT registered according to ISO 2375 + /// BitPostion 1-7: All bits are 0 (reserved for future standardization) + /// + public byte VolumeFlags; + /// + /// This field specifies one escape sequence according to the International Register of Coded Character Sets to be used with escape + /// sequence standards for recording.The ESC character, which is the first character of all sequences, shall be omitted when recording this field + /// + public byte[] CodedCharSetIdent; + /// + /// The block address of the first block of the system Path Table is kept in this field + /// + public int AddressOfPathTable; + /// + /// This number is used to indicate the revision number of the file structure standard to which the + /// directory search files conform. It is set to one + /// - /// - /// Constructor. - /// - public ISOVolumeDescriptor() + #endregion + + #region Construction + + /// + /// Constructor. + /// + public ISOVolumeDescriptor() { // Set everything to the default value this.Type = 0; @@ -183,6 +214,11 @@ namespace BizHawk.Emulation.DiscSystem this.EffectiveDateTime = new byte[LENGTH_TIME]; this.Reserved = new byte[LENGTH_RESERVED]; + + // CD-I specific + this.VolumeFlags = 0; + this.CodedCharSetIdent = new byte[LENGTH_SHORT_IDENTIFIER]; + this.AddressOfPathTable = 0; } #endregion @@ -190,137 +226,391 @@ namespace BizHawk.Emulation.DiscSystem #region Parsing /// - /// Parse the volume descriptor header. + /// Start parsing the volume descriptor header. /// /// The stream to parse from. public bool Parse(Stream s) { - EndianBitConverter bc = EndianBitConverter.CreateForLittleEndian(); - EndianBitConverter bcBig = EndianBitConverter.CreateForBigEndian(); long startPosition = s.Position; byte[] buffer = new byte[ISOFile.SECTOR_SIZE]; // Read the entire structure s.Read(buffer, 0, ISOFile.SECTOR_SIZE); - // Get the type - this.Type = buffer[0]; + // Parse based on format + byte[] header = bc.ReadBytes(buffer, 0, ISOFile.SECTOR_SIZE); + if (GetISO9660(header)) + { + ParseISO9660(s); + return true; + } + if (GetCDI(header)) + { + ParseCDInteractive(s); + return true; + } - //zero 24-jun-2013 - validate - // "CD001" + 0x01 - if (buffer[1] == 'C' && buffer[2] == 'D' && buffer[3] == '0' && buffer[4] == '0' && buffer[5] == '1' && buffer[6] == 0x01) - { - //it seems to be a valid volume descriptor - } - else - { - return false; - } - - // Handle the primary volume information - if (this.Type == 1) - { - int cursor = 8; - // Get the system identifier - Array.Copy(buffer, cursor, - this.SystemIdentifier, 0, LENGTH_SHORT_IDENTIFIER); - cursor += LENGTH_SHORT_IDENTIFIER; - - // Get the volume identifier - Array.Copy(buffer, cursor, - this.VolumeIdentifier, 0, LENGTH_SHORT_IDENTIFIER); - cursor += LENGTH_SHORT_IDENTIFIER; - - cursor += 8; - - // Get the total number of sectors - this.NumberOfSectors = bc.ToInt32(buffer, cursor); - cursor += 8; - - cursor += 32; - - this.VolumeSetSize = bc.ToInt16(buffer, cursor); - cursor += 4; - this.VolumeSequenceNumber = bc.ToInt16(buffer, cursor); - cursor += 4; - this.SectorSize = bc.ToInt16(buffer, cursor); - cursor += 4; - - this.PathTableSize = bc.ToInt32(buffer, cursor); - cursor += 8; - this.OffsetOfFirstLittleEndianPathTable = bc.ToInt32(buffer, cursor); - cursor += 4; - this.OffsetOfSecondLittleEndianPathTable = bc.ToInt32(buffer, cursor); - cursor += 4; - this.OffsetOfFirstLittleEndianPathTable = bcBig.ToInt32(buffer, cursor); - cursor += 4; - this.OffsetOfSecondLittleEndianPathTable = bcBig.ToInt32(buffer, cursor); - cursor += 4; - - this.RootDirectoryRecord.Parse(buffer, cursor); - cursor += LENGTH_ROOT_DIRECTORY_RECORD; - - Array.Copy(buffer, cursor, - this.VolumeSetIdentifier, 0, LENGTH_LONG_IDENTIFIER); - cursor += LENGTH_LONG_IDENTIFIER; - Array.Copy(buffer, cursor, - this.PublisherIdentifier, 0, LENGTH_LONG_IDENTIFIER); - cursor += LENGTH_LONG_IDENTIFIER; - Array.Copy(buffer, cursor, - this.DataPreparerIdentifier, 0, LENGTH_LONG_IDENTIFIER); - cursor += LENGTH_LONG_IDENTIFIER; - Array.Copy(buffer, cursor, - this.ApplicationIdentifier, 0, LENGTH_LONG_IDENTIFIER); - cursor += LENGTH_LONG_IDENTIFIER; - - Array.Copy(buffer, cursor, - this.CopyrightFileIdentifier, 0, LENGTH_IDENTIFIER); - cursor += LENGTH_IDENTIFIER; - Array.Copy(buffer, cursor, - this.AbstractFileIdentifier, 0, LENGTH_IDENTIFIER); - cursor += LENGTH_IDENTIFIER; - Array.Copy(buffer, cursor, - this.BibliographicalFileIdentifier, 0, LENGTH_IDENTIFIER); - cursor += LENGTH_IDENTIFIER; - - Array.Copy(buffer, cursor, - this.VolumeCreationDateTime, 0, LENGTH_TIME); - cursor += LENGTH_TIME; - Array.Copy(buffer, cursor, - this.LastModifiedDateTime, 0, LENGTH_TIME); - cursor += LENGTH_TIME; - Array.Copy(buffer, cursor, - this.ExpirationDateTime, 0, LENGTH_TIME); - cursor += LENGTH_TIME; - Array.Copy(buffer, cursor, - this.EffectiveDateTime, 0, LENGTH_TIME); - cursor += LENGTH_TIME; - - cursor += 1; - - cursor += 1; - - Array.Copy(buffer, cursor, - this.Reserved, 0, LENGTH_RESERVED); - cursor += LENGTH_RESERVED; - } - - return true; + return false; } - #endregion + public void ParseISO9660(Stream s) + { + long startPosition = s.Position; + byte[] buffer = new byte[ISOFile.SECTOR_SIZE]; + s.Position = startPosition - ISOFile.SECTOR_SIZE; - #region Type Information + // Read the entire structure + s.Read(buffer, 0, ISOFile.SECTOR_SIZE); - /// - /// Returns true if this is the terminator volume descriptor. - /// - /// True if the terminator. - public bool IsTerminator() + // Get the type + this.Type = buffer[0]; + + // Handle the primary volume information + if (this.Type == 1) + { + int cursor = 8; + // Get the system identifier + Array.Copy(buffer, cursor, + this.SystemIdentifier, 0, LENGTH_SHORT_IDENTIFIER); + cursor += LENGTH_SHORT_IDENTIFIER; + + // Get the volume identifier + Array.Copy(buffer, cursor, + this.VolumeIdentifier, 0, LENGTH_SHORT_IDENTIFIER); + cursor += LENGTH_SHORT_IDENTIFIER; + + cursor += 8; + + // Get the total number of sectors + this.NumberOfSectors = bc.ToInt32(buffer, cursor); + cursor += 8; + + cursor += 32; + + this.VolumeSetSize = bc.ToInt16(buffer, cursor); + cursor += 4; + this.VolumeSequenceNumber = bc.ToInt16(buffer, cursor); + cursor += 4; + this.SectorSize = bc.ToInt16(buffer, cursor); + cursor += 4; + + this.PathTableSize = bc.ToInt32(buffer, cursor); + cursor += 8; + this.OffsetOfFirstLittleEndianPathTable = bc.ToInt32(buffer, cursor); + cursor += 4; + this.OffsetOfSecondLittleEndianPathTable = bc.ToInt32(buffer, cursor); + cursor += 4; + this.OffsetOfFirstLittleEndianPathTable = bcBig.ToInt32(buffer, cursor); + cursor += 4; + this.OffsetOfSecondLittleEndianPathTable = bcBig.ToInt32(buffer, cursor); + cursor += 4; + + this.RootDirectoryRecord.Parse(buffer, cursor); + cursor += LENGTH_ROOT_DIRECTORY_RECORD; + + Array.Copy(buffer, cursor, + this.VolumeSetIdentifier, 0, LENGTH_LONG_IDENTIFIER); + cursor += LENGTH_LONG_IDENTIFIER; + Array.Copy(buffer, cursor, + this.PublisherIdentifier, 0, LENGTH_LONG_IDENTIFIER); + cursor += LENGTH_LONG_IDENTIFIER; + Array.Copy(buffer, cursor, + this.DataPreparerIdentifier, 0, LENGTH_LONG_IDENTIFIER); + cursor += LENGTH_LONG_IDENTIFIER; + Array.Copy(buffer, cursor, + this.ApplicationIdentifier, 0, LENGTH_LONG_IDENTIFIER); + cursor += LENGTH_LONG_IDENTIFIER; + + Array.Copy(buffer, cursor, + this.CopyrightFileIdentifier, 0, LENGTH_IDENTIFIER); + cursor += LENGTH_IDENTIFIER; + Array.Copy(buffer, cursor, + this.AbstractFileIdentifier, 0, LENGTH_IDENTIFIER); + cursor += LENGTH_IDENTIFIER; + Array.Copy(buffer, cursor, + this.BibliographicalFileIdentifier, 0, LENGTH_IDENTIFIER); + cursor += LENGTH_IDENTIFIER; + + Array.Copy(buffer, cursor, + this.VolumeCreationDateTime, 0, LENGTH_TIME); + cursor += LENGTH_TIME; + Array.Copy(buffer, cursor, + this.LastModifiedDateTime, 0, LENGTH_TIME); + cursor += LENGTH_TIME; + Array.Copy(buffer, cursor, + this.ExpirationDateTime, 0, LENGTH_TIME); + cursor += LENGTH_TIME; + Array.Copy(buffer, cursor, + this.EffectiveDateTime, 0, LENGTH_TIME); + cursor += LENGTH_TIME; + + cursor += 1; + + cursor += 1; + + Array.Copy(buffer, cursor, + this.Reserved, 0, LENGTH_RESERVED); + cursor += LENGTH_RESERVED; + } + } + + public void ParseCDInteractive(Stream s) + { + /* From the Green Book Spec + * BP (byte position) obviously is n+1 + + BP Size in Bytes Description + 1 1 Disc Label Record Type + 2 5 Volume Structure Standard ID + 7 1 Volume Structure Version number + 8 1 Volume flags + 9 32 System identifier + 41 32 Volume identifier + 73 12 Reserved + 85 4 Volume space size + 89 32 Coded Character Set identifier + 121 2 Reserved + 123 2 Number of Volumes in Album + 125 2 Reserved + 127 2 Album Set Sequence number + 129 2 Reserved + 131 2 Logical Block size + 133 4 Reserved + 137 4 Path Table size + 141 8 Reserved + 149 4 Address of Path Table + 153 38 Reserved + 191 128 Album identifier + 319 128 Publisher identifier + 447 128 Data Preparer identifier + 575 128 Application identifier + 703 32 Copyright file name + 735 5 Reserved + 740 32 Abstract file name + 772 5 Reserved + 777 32 Bibliographic file name + 809 5 Reserved + 814 16 Creation date and time + 830 1 Reserved + 831 16 Modification date and time + 847 1 Reserved + 848 16 Expiration date and time + 864 1 Reserved + 865 16 Effective date and time + 881 1 Reserved + 882 1 File Structure Standard Version number + 883 1 Reserved + 884 512 Application use + 1396 653 Reserved */ + + long startPosition = s.Position; + byte[] buffer = new byte[ISOFile.SECTOR_SIZE]; + s.Position = startPosition - ISOFile.SECTOR_SIZE; + + // Read the entire structure + s.Read(buffer, 0, ISOFile.SECTOR_SIZE); + + // Get the type + this.Type = buffer[0]; + + // Handle the primary volume information + if (this.Type == 1) + { + this.VolumeFlags = buffer[7]; + this.SystemIdentifier = bc.ReadBytes(buffer, 8, LENGTH_SHORT_IDENTIFIER); + this.VolumeIdentifier = bc.ReadBytes(buffer, 40, LENGTH_SHORT_IDENTIFIER); + this.NumberOfSectors = bcBig.ReadIntValue(buffer, 84, 4); + this.CodedCharSetIdent = bc.ReadBytes(buffer, 88, LENGTH_SHORT_IDENTIFIER); + this.VolumeSetSize = bcBig.ReadIntValue(buffer, 122, 2); + this.VolumeSequenceNumber = bcBig.ReadIntValue(buffer, 126, 2); + this.SectorSize = bcBig.ReadIntValue(buffer, 130, 2); + this.PathTableSize = bcBig.ReadIntValue(buffer, 136, 4); + this.AddressOfPathTable = bcBig.ReadIntValue(buffer, 148, 4); + + this.VolumeSetIdentifier = bc.ReadBytes(buffer, 190, LENGTH_LONG_IDENTIFIER); + this.PublisherIdentifier = bc.ReadBytes(buffer, 318, LENGTH_LONG_IDENTIFIER); + this.DataPreparerIdentifier = bc.ReadBytes(buffer, 446, LENGTH_LONG_IDENTIFIER); + this.ApplicationIdentifier = bc.ReadBytes(buffer, 574, LENGTH_LONG_IDENTIFIER); + + this.CopyrightFileIdentifier = bc.ReadBytes(buffer, 702, LENGTH_SHORT_IDENTIFIER); + this.AbstractFileIdentifier = bc.ReadBytes(buffer, 739, LENGTH_SHORT_IDENTIFIER); + this.BibliographicalFileIdentifier = bc.ReadBytes(buffer, 776, LENGTH_SHORT_IDENTIFIER); + + this.VolumeCreationDateTime = bc.ReadBytes(buffer, 813, 16); + this.LastModifiedDateTime = bc.ReadBytes(buffer, 830, 16); + this.ExpirationDateTime = bc.ReadBytes(buffer, 847, 16); + this.EffectiveDateTime = bc.ReadBytes(buffer, 864, 16); + + // save current position + long pos = s.Position; + + // get path table records + s.Position = ISOFile.SECTOR_SIZE * this.AddressOfPathTable; + ISOFile.CDIPathTable = CDIPathNode.ParsePathTable(s, this.PathTableSize); + + // read the root dir record + s.Position = ISOFile.SECTOR_SIZE * ISOFile.CDIPathTable[0].DirectoryBlockAddress; + s.Read(buffer, 0, ISOFile.SECTOR_SIZE); + this.RootDirectoryRecord.Parse(buffer, 0); + + // go back to where we were + s.Position = pos; + } + } + + /// + /// Detect ISO9660 + /// + /// + /// + public bool GetISO9660(byte[] buffer) + { + //zero 24-jun-2013 - validate ISO9660 + // "CD001" + 0x01 + if (buffer[1] == 'C' && buffer[2] == 'D' && buffer[3] == '0' && buffer[4] == '0' && buffer[5] == '1' && buffer[6] == 0x01) + { + ISOFile.Format = ISOFile.ISOFormat.ISO9660; + return true; + } + + return false; + } + + /// + /// Detect CD-I + /// + /// + /// + public bool GetCDI(byte[] buffer) + { + // CD-Interactive + if (Encoding.ASCII.GetString(bc.ReadBytes(buffer, 1, 5)).Contains("CD-I")) + { + ISOFile.Format = ISOFile.ISOFormat.CDInteractive; + return true; + } + + return false; + } + + #endregion + + #region Type Information + + /// + /// Returns true if this is the terminator volume descriptor. + /// + /// True if the terminator. + public bool IsTerminator() { return (this.Type == 255); } #endregion } + + /// + /// Represents a Directory Path Table entry on a CD-I disc + /// + public class CDIPathNode + { + #region Public Properties + + /// + /// The length of the directory name. + /// + public byte NameLength; + + /// + /// This is the length of the Extended Attribute record + /// + public byte ExtendedAttribRecordLength; + + /// + /// This field contains the beginning logical block number (LBN) of the directory file on disc + /// + public int DirectoryBlockAddress; + + /// + /// This is the number (relative to the beginning of the Path Table) of this directory's parent + /// + public int ParentDirectoryNumber; + + /// + /// The directory name. + /// This variable length field is used to store the actual text representing the name of the directory. + /// If the length of the file name is odd, a null padding byte is added to make the size of the Path Table record even. + /// The padding byte is not included in the name size field. + /// + public string Name; + + #endregion + + #region Construction + + /// + /// Empty Constructor + /// + public CDIPathNode() + { + + } + + #endregion + + #region Parsing + + /* + BP Size in bytes Description + 1 1 Name size + 2 1 Extended Attribute record length + 3 4 Directory block address + 7 2 Parent Directory number + 9 n Directory file name + */ + + public static List ParsePathTable(Stream s, int PathTableSize) + { + EndianBitConverter bc = EndianBitConverter.CreateForLittleEndian(); + EndianBitConverter bcBig = EndianBitConverter.CreateForBigEndian(); + + byte[] buffer = new byte[ISOFile.SECTOR_SIZE]; + + // Read the entire structure + s.Read(buffer, 0, ISOFile.SECTOR_SIZE); + + int startCursor = 0; + + List pathNodes = new List(); + + int pad = 0; + + do + { + CDIPathNode node = new CDIPathNode(); + byte[] data = bc.ReadBytes(buffer, startCursor, ISOFile.SECTOR_SIZE - startCursor); + node.NameLength = data[0]; + + node.ExtendedAttribRecordLength = data[1]; + node.DirectoryBlockAddress = bcBig.ReadIntValue(data, 2, 4); + node.ParentDirectoryNumber = bcBig.ReadIntValue(data, 6, 2); + node.Name = Encoding.ASCII.GetString(bc.ReadBytes(data, 8, data[0])); + + // if nameLength is odd a padding byte must be added + + if (node.NameLength % 2 != 0) + pad = 1; + + pathNodes.Add(node); + + startCursor += node.NameLength + 8; + + } while (startCursor < PathTableSize + pad); + + + return pathNodes; + } + + #endregion + } } From 3bbce67c10d68d98212a864416db6a97852c81a3 Mon Sep 17 00:00:00 2001 From: Asnivor Date: Fri, 13 Oct 2017 15:24:00 +0100 Subject: [PATCH 171/219] Added a small method to return all files recursively as a List> --- BizHawk.Emulation.DiscSystem/CDFS/ISOFile.cs | 57 +++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.DiscSystem/CDFS/ISOFile.cs b/BizHawk.Emulation.DiscSystem/CDFS/ISOFile.cs index d623740ef8..e81d6316a4 100644 --- a/BizHawk.Emulation.DiscSystem/CDFS/ISOFile.cs +++ b/BizHawk.Emulation.DiscSystem/CDFS/ISOFile.cs @@ -164,7 +164,62 @@ namespace BizHawk.Emulation.DiscSystem this.Root.Parse(s, visitedNodes); return true; - } + } + + + private List> fileNodes; + private List dirsParsed; + + /// + /// Returns a flat list of all recursed files + /// + /// + public List> EnumerateAllFilesRecursively() + { + fileNodes = new List>(); + dirsParsed = new List(); + + if (Root.Children == null) + return fileNodes; + + // get all folders + List> dirs = (from a in Root.Children + where a.Value.GetType() == typeof(ISODirectoryNode) + select a).ToList(); + // iterate through each folder + foreach (var d in dirs) + { + // process all files in this directory (and recursively process files in sub folders + ISODirectoryNode idn = d.Value as ISODirectoryNode; + if (dirsParsed.Where(a => a == idn).Count() > 0) + continue; + + dirsParsed.Add(idn); + ProcessDirectoryFiles(idn.Children); + } + + return fileNodes.Distinct().ToList(); + } + + private void ProcessDirectoryFiles(Dictionary idn) + { + foreach (var n in idn) + { + if (n.Value.GetType() == typeof(ISODirectoryNode)) + { + if (dirsParsed.Where(a => a == n.Value).Count() > 0) + continue; + + dirsParsed.Add(n.Value as ISODirectoryNode); + ProcessDirectoryFiles((n.Value as ISODirectoryNode).Children); + } + else + { + KeyValuePair f = new KeyValuePair(n.Key, n.Value as ISOFileNode); + fileNodes.Add(f); + } + } + } #endregion From 258688ebdd88604126b3883ccd6e4a7c59359d63 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 11:07:02 -0400 Subject: [PATCH 172/219] Add files via upload --- BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs | 2 +- .../CPUs/Z80A/Operations.cs | 28 +++++++++---------- BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs | 17 ++++++----- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs index ce3fb3f729..089185c7ca 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs @@ -593,7 +593,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A case 0x5C: INT_OP(NEG, A); break; // NEG case 0x5D: RETN_(); break; // RETI case 0x5E: INT_MODE_(2); break; // IM $0 - case 0x5F: REG_OP_IR(TR, A, R); break; // LD R, A + case 0x5F: REG_OP_IR(TR, A, R); break; // LD A, R case 0x60: IN_REG_(H, C); break; // IN H, (C) case 0x61: OUT_REG_(C, H); break; // OUT (C), H case 0x62: REG_OP_16_(SBC16, L, H, L, H); break; // SBC HL, HL diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs index 64ddc1ae5c..d80fb48022 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs @@ -12,17 +12,27 @@ namespace BizHawk.Emulation.Common.Components.Z80A public void I_Read_Func(ushort dest, ushort src_l, ushort src_h, ushort inc) { - Regs[dest] = ReadMemory((ushort)((Regs[src_l] | (Regs[src_h]) << 8) + inc)); + Regs[dest] = ReadMemory((ushort)((Regs[src_l] | (Regs[src_h] << 8)) + inc)); } public void Write_Func(ushort dest_l, ushort dest_h, ushort src) { - WriteMemory((ushort)(Regs[dest_l] | (Regs[dest_h]) << 8), (byte)Regs[src]); + WriteMemory((ushort)(Regs[dest_l] | (Regs[dest_h] << 8)), (byte)Regs[src]); } public void I_Write_Func(ushort dest_l, ushort dest_h, ushort inc, ushort src) { - WriteMemory((ushort)((Regs[dest_l] | (Regs[dest_h] + inc)) << 8), (byte)Regs[src]); + WriteMemory((ushort)((Regs[dest_l] | (Regs[dest_h] << 8)) + inc), (byte)Regs[src]); + } + + public void OUT_Func(ushort dest, ushort src) + { + WriteHardware(Regs[dest], (byte)(Regs[src])); + } + + public void IN_Func(ushort dest, ushort src) + { + Regs[dest] = ReadHardware(Regs[src]); } public void TR_Func(ushort dest, ushort src) @@ -260,7 +270,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A public void XOR8_Func(ushort dest, ushort src) { - Regs[dest] = (ushort)(Regs[dest] ^ Regs[src]); + Regs[dest] = (ushort)((Regs[dest] ^ Regs[src])); FlagZ = Regs[dest] == 0; FlagC = false; @@ -582,16 +592,6 @@ namespace BizHawk.Emulation.Common.Components.Z80A Regs[src_h] = temp; } - public void OUT_Func(ushort dest, ushort src) - { - WriteHardware(Regs[dest], (byte)(Regs[src])); - } - - public void IN_Func(ushort dest, ushort src) - { - Regs[dest] = ReadHardware(Regs[src]); - } - public void SBC_16_Func(ushort dest_l, ushort dest_h, ushort src_l, ushort src_h) { int Reg16_d = Regs[dest_l] | (Regs[dest_h] << 8); diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs index 0f640eb124..dd982d720c 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs @@ -138,6 +138,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A // Execute instructions public void ExecuteOne() { + if (Regs[A] > 255) { Console.WriteLine(RegPC); } switch (cur_instr[instr_pntr++]) { case IDLE: @@ -172,7 +173,6 @@ namespace BizHawk.Emulation.Common.Components.Z80A iff1 = false; NMI_(); NMICallback(); - } else if (iff1 && FlagI && NO_prefix) { @@ -213,6 +213,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A } instr_pntr = 0; Regs[R]++; + Regs[R] &= 0xFF; break; case OP_R: // determine if we repeat based on what operation we are doing @@ -243,7 +244,6 @@ namespace BizHawk.Emulation.Common.Components.Z80A // if we don't repeat, continue on as a normal opcode fetch if (repeat && temp3 > 0) { - instr_pntr = 0; cur_instr = new ushort[] {IDLE, DEC16, PCl, PCh, @@ -278,7 +278,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A { // Interrupts can occur at this point, so process them accordingly // Read the opcode of the next instruction - if (EI_pending > 0) + if (EI_pending > 0 && NO_prefix) { EI_pending--; if (EI_pending == 0) @@ -343,10 +343,11 @@ namespace BizHawk.Emulation.Common.Components.Z80A if (OnExecFetch != null) OnExecFetch(RegPC); if (TraceCallback != null) TraceCallback(State()); FetchInstruction(ReadMemory(RegPC++)); - instr_pntr = 0; Regs[R]++; + Regs[R] &= 0xFF; } } + instr_pntr = 0; break; case HALT: @@ -378,7 +379,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A iff1 = false; NMI_(); NMICallback(); - + halted = false; } else if (iff1 && FlagI && NO_prefix) { @@ -410,11 +411,13 @@ namespace BizHawk.Emulation.Common.Components.Z80A break; } IRQCallback(); + halted = false; } else { instr_pntr = 0; Regs[R]++; + Regs[R] &= 0xFF; cur_instr = new ushort[] {IDLE, IDLE, @@ -538,7 +541,6 @@ namespace BizHawk.Emulation.Common.Components.Z80A break; case DI: IFF1 = IFF2 = false; - EI_pending = 0; break; case EXCH: EXCH_16_Func(F_s, A_s, F, A); @@ -561,6 +563,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A if (prefix_src == IXCBpre) { IXCB_prefix = true; IXCB_prefetch = true; } if (prefix_src == IYCBpre) { IYCB_prefix = true; IYCB_prefetch = true; } Regs[R]++; + Regs[R] &= 0xFF; break; case ASGN: ASGN_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); @@ -577,7 +580,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A // Not currently implemented here break; case EI_RETN: - EI_pending = 1; + iff1 = iff2; break; case OUT: OUT_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); From 946c025cd62d1dbe55078294fca7f423c6f6cd48 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 16:26:32 -0400 Subject: [PATCH 173/219] Add files via upload --- .../Calculator/TI83.IDebuggable.cs | 206 +++++++++--------- .../Calculator/TI83.IEmulator.cs | 18 +- .../Calculator/TI83.IStatable.cs | 61 +++--- BizHawk.Emulation.Cores/Calculator/TI83.cs | 14 +- 4 files changed, 157 insertions(+), 142 deletions(-) diff --git a/BizHawk.Emulation.Cores/Calculator/TI83.IDebuggable.cs b/BizHawk.Emulation.Cores/Calculator/TI83.IDebuggable.cs index ab88799f79..9fc34a0121 100644 --- a/BizHawk.Emulation.Cores/Calculator/TI83.IDebuggable.cs +++ b/BizHawk.Emulation.Cores/Calculator/TI83.IDebuggable.cs @@ -12,36 +12,36 @@ namespace BizHawk.Emulation.Cores.Calculators { return new Dictionary { - ["A"] = _cpu.RegisterA, - ["AF"] = _cpu.RegisterAF, - ["B"] = _cpu.RegisterB, - ["BC"] = _cpu.RegisterBC, - ["C"] = _cpu.RegisterC, - ["D"] = _cpu.RegisterD, - ["DE"] = _cpu.RegisterDE, - ["E"] = _cpu.RegisterE, - ["F"] = _cpu.RegisterF, - ["H"] = _cpu.RegisterH, - ["HL"] = _cpu.RegisterHL, - ["I"] = _cpu.RegisterI, - ["IX"] = _cpu.RegisterIX, - ["IY"] = _cpu.RegisterIY, - ["L"] = _cpu.RegisterL, - ["PC"] = _cpu.RegisterPC, - ["R"] = _cpu.RegisterR, - ["Shadow AF"] = _cpu.RegisterShadowAF, - ["Shadow BC"] = _cpu.RegisterShadowBC, - ["Shadow DE"] = _cpu.RegisterShadowDE, - ["Shadow HL"] = _cpu.RegisterShadowHL, - ["SP"] = _cpu.RegisterSP, - ["Flag C"] = _cpu.RegisterF.Bit(0), - ["Flag N"] = _cpu.RegisterF.Bit(1), - ["Flag P/V"] = _cpu.RegisterF.Bit(2), - ["Flag 3rd"] = _cpu.RegisterF.Bit(3), - ["Flag H"] = _cpu.RegisterF.Bit(4), - ["Flag 5th"] = _cpu.RegisterF.Bit(5), - ["Flag Z"] = _cpu.RegisterF.Bit(6), - ["Flag S"] = _cpu.RegisterF.Bit(7) + ["A"] = _cpu.Regs[_cpu.A], + ["AF"] = _cpu.Regs[_cpu.F] + (_cpu.Regs[_cpu.A] << 8), + ["B"] = _cpu.Regs[_cpu.B], + ["BC"] = _cpu.Regs[_cpu.C] + (_cpu.Regs[_cpu.B] << 8), + ["C"] = _cpu.Regs[_cpu.C], + ["D"] = _cpu.Regs[_cpu.D], + ["DE"] = _cpu.Regs[_cpu.E] + (_cpu.Regs[_cpu.D] << 8), + ["E"] = _cpu.Regs[_cpu.E], + ["F"] = _cpu.Regs[_cpu.F], + ["H"] = _cpu.Regs[_cpu.H], + ["HL"] = _cpu.Regs[_cpu.L] + (_cpu.Regs[_cpu.H] << 8), + ["I"] = _cpu.Regs[_cpu.I], + ["IX"] = _cpu.Regs[_cpu.Ixl] + (_cpu.Regs[_cpu.Ixh] << 8), + ["IY"] = _cpu.Regs[_cpu.Iyl] + (_cpu.Regs[_cpu.Iyh] << 8), + ["L"] = _cpu.Regs[_cpu.L], + ["PC"] = _cpu.Regs[_cpu.PCl] + (_cpu.Regs[_cpu.PCh] << 8), + ["R"] = _cpu.Regs[_cpu.R], + ["Shadow AF"] = _cpu.Regs[_cpu.F_s] + (_cpu.Regs[_cpu.A_s] << 8), + ["Shadow BC"] = _cpu.Regs[_cpu.C_s] + (_cpu.Regs[_cpu.B_s] << 8), + ["Shadow DE"] = _cpu.Regs[_cpu.E_s] + (_cpu.Regs[_cpu.D_s] << 8), + ["Shadow HL"] = _cpu.Regs[_cpu.L_s] + (_cpu.Regs[_cpu.H_s] << 8), + ["SP"] = _cpu.Regs[_cpu.Iyl] + (_cpu.Regs[_cpu.Iyh] << 8), + ["Flag C"] = _cpu.FlagC, + ["Flag N"] = _cpu.FlagN, + ["Flag P/V"] = _cpu.FlagP, + ["Flag 3rd"] = _cpu.Flag3, + ["Flag H"] = _cpu.FlagH, + ["Flag 5th"] = _cpu.Flag5, + ["Flag Z"] = _cpu.FlagZ, + ["Flag S"] = _cpu.FlagS }; } @@ -49,73 +49,85 @@ namespace BizHawk.Emulation.Cores.Calculators { switch (register) { - default: - throw new InvalidOperationException(); - case "A": - _cpu.RegisterA = (byte)value; - break; - case "AF": - _cpu.RegisterAF = (byte)value; - break; - case "B": - _cpu.RegisterB = (byte)value; - break; - case "BC": - _cpu.RegisterBC = (byte)value; - break; - case "C": - _cpu.RegisterC = (byte)value; - break; - case "D": - _cpu.RegisterD = (byte)value; - break; - case "DE": - _cpu.RegisterDE = (byte)value; - break; - case "E": - _cpu.RegisterE = (byte)value; - break; - case "F": - _cpu.RegisterF = (byte)value; - break; - case "H": - _cpu.RegisterH = (byte)value; - break; - case "HL": - _cpu.RegisterHL = (byte)value; - break; - case "I": - _cpu.RegisterI = (byte)value; - break; - case "IX": - _cpu.RegisterIX = (byte)value; - break; - case "IY": - _cpu.RegisterIY = (byte)value; - break; - case "L": - _cpu.RegisterL = (byte)value; - break; - case "PC": - _cpu.RegisterPC = (ushort)value; - break; - case "R": - _cpu.RegisterR = (byte)value; - break; - case "Shadow AF": - _cpu.RegisterShadowAF = (byte)value; - break; - case "Shadow BC": - _cpu.RegisterShadowBC = (byte)value; - break; - case "Shadow DE": - _cpu.RegisterShadowDE = (byte)value; - break; - case "Shadow HL": - _cpu.RegisterShadowHL = (byte)value; - break; - case "SP": - _cpu.RegisterSP = (byte)value; + default: + throw new InvalidOperationException(); + case "A": + _cpu.Regs[_cpu.A] = (ushort)value; + break; + case "AF": + _cpu.Regs[_cpu.F] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.A] = (ushort)(value & 0xFF00); + break; + case "B": + _cpu.Regs[_cpu.B] = (ushort)value; + break; + case "BC": + _cpu.Regs[_cpu.C] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.B] = (ushort)(value & 0xFF00); + break; + case "C": + _cpu.Regs[_cpu.C] = (ushort)value; + break; + case "D": + _cpu.Regs[_cpu.D] = (ushort)value; + break; + case "DE": + _cpu.Regs[_cpu.E] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.D] = (ushort)(value & 0xFF00); + break; + case "E": + _cpu.Regs[_cpu.E] = (ushort)value; + break; + case "F": + _cpu.Regs[_cpu.F] = (ushort)value; + break; + case "H": + _cpu.Regs[_cpu.H] = (ushort)value; + break; + case "HL": + _cpu.Regs[_cpu.L] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.H] = (ushort)(value & 0xFF00); + break; + case "I": + _cpu.Regs[_cpu.I] = (ushort)value; + break; + case "IX": + _cpu.Regs[_cpu.Ixl] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.Ixh] = (ushort)(value & 0xFF00); + break; + case "IY": + _cpu.Regs[_cpu.Iyl] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.Iyh] = (ushort)(value & 0xFF00); + break; + case "L": + _cpu.Regs[_cpu.L] = (ushort)value; + break; + case "PC": + _cpu.Regs[_cpu.PCl] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.PCh] = (ushort)(value & 0xFF00); + break; + case "R": + _cpu.Regs[_cpu.R] = (ushort)value; + break; + case "Shadow AF": + _cpu.Regs[_cpu.F_s] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.A_s] = (ushort)(value & 0xFF00); + break; + case "Shadow BC": + _cpu.Regs[_cpu.C_s] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.B_s] = (ushort)(value & 0xFF00); + break; + case "Shadow DE": + _cpu.Regs[_cpu.E_s] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.D_s] = (ushort)(value & 0xFF00); + break; + case "Shadow HL": + _cpu.Regs[_cpu.L_s] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.H_s] = (ushort)(value & 0xFF00); + break; + case "SP": + _cpu.Regs[_cpu.SPl] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.SPh] = (ushort)(value & 0xFF00); break; } } diff --git a/BizHawk.Emulation.Cores/Calculator/TI83.IEmulator.cs b/BizHawk.Emulation.Cores/Calculator/TI83.IEmulator.cs index f1de9171dd..1d6b7be044 100644 --- a/BizHawk.Emulation.Cores/Calculator/TI83.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Calculator/TI83.IEmulator.cs @@ -13,11 +13,13 @@ namespace BizHawk.Emulation.Cores.Calculators _controller = controller; _lagged = true; - _cpu.Debug = _tracer.Enabled; - - if (_cpu.Debug && _cpu.Logger == null) // TODO, lets not do this on each frame. But lets refactor CoreComm/CoreComm first + if (_tracer.Enabled) { - _cpu.Logger = s => _tracer.Put(s); + _cpu.TraceCallback = s => _tracer.Put(s); + } + else + { + _cpu.TraceCallback = null; } // I eyeballed this speed @@ -26,8 +28,12 @@ namespace BizHawk.Emulation.Cores.Calculators _onPressed = controller.IsPressed("ON"); // and this was derived from other emus - _cpu.ExecuteCycles(10000); - _cpu.Interrupt = true; + for (int j = 0; j < 10000; j++) + { + _cpu.ExecuteOne(); + } + + _cpu.FlagI = true; } Frame++; diff --git a/BizHawk.Emulation.Cores/Calculator/TI83.IStatable.cs b/BizHawk.Emulation.Cores/Calculator/TI83.IStatable.cs index e6927d9962..0539da2ae0 100644 --- a/BizHawk.Emulation.Cores/Calculator/TI83.IStatable.cs +++ b/BizHawk.Emulation.Cores/Calculator/TI83.IStatable.cs @@ -7,55 +7,52 @@ namespace BizHawk.Emulation.Cores.Calculators { public partial class TI83 : IStatable { - private byte[] _stateBuffer; + public bool BinarySaveStatesPreferred + { + get { return true; } + } - public bool BinarySaveStatesPreferred => false; + public void SaveStateText(TextWriter writer) + { + SyncState(new Serializer(writer)); + } + + public void LoadStateText(TextReader reader) + { + SyncState(new Serializer(reader)); + } public void SaveStateBinary(BinaryWriter bw) { - SyncState(Serializer.CreateBinaryWriter(bw)); + SyncState(new Serializer(bw)); } public void LoadStateBinary(BinaryReader br) { - SyncState(Serializer.CreateBinaryReader(br)); - } - - public void SaveStateText(TextWriter tw) - { - SyncState(Serializer.CreateTextWriter(tw)); - } - - public void LoadStateText(TextReader tr) - { - SyncState(Serializer.CreateTextReader(tr)); + SyncState(new Serializer(br)); } public byte[] SaveStateBinary() { - if (_stateBuffer == null) - { - var stream = new MemoryStream(); - var writer = new BinaryWriter(stream); - SaveStateBinary(writer); - _stateBuffer = stream.ToArray(); - writer.Close(); - return _stateBuffer; - } - else - { - var stream = new MemoryStream(_stateBuffer); - var writer = new BinaryWriter(stream); - SaveStateBinary(writer); - writer.Close(); - return _stateBuffer; - } + MemoryStream ms = new MemoryStream(); + BinaryWriter bw = new BinaryWriter(ms); + SaveStateBinary(bw); + bw.Flush(); + return ms.ToArray(); } private void SyncState(Serializer ser) { - ser.BeginSection("TI83"); + byte[] core = null; + if (ser.IsWriter) + { + var ms = new MemoryStream(); + ms.Close(); + core = ms.ToArray(); + } _cpu.SyncState(ser); + + ser.BeginSection("TI83"); ser.Sync("RAM", ref _ram, false); ser.Sync("romPageLow3Bits", ref _romPageLow3Bits); ser.Sync("romPageHighBit", ref _romPageHighBit); diff --git a/BizHawk.Emulation.Cores/Calculator/TI83.cs b/BizHawk.Emulation.Cores/Calculator/TI83.cs index 53a69072b6..aa83616945 100644 --- a/BizHawk.Emulation.Cores/Calculator/TI83.cs +++ b/BizHawk.Emulation.Cores/Calculator/TI83.cs @@ -2,7 +2,7 @@ using System; using System.Globalization; using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Components.Z80; +using BizHawk.Emulation.Common.Components.Z80A; // http://www.ticalc.org/pub/text/calcinfo/ namespace BizHawk.Emulation.Cores.Calculators @@ -48,7 +48,7 @@ namespace BizHawk.Emulation.Cores.Calculators _tracer = new TraceBuffer { Header = _cpu.TraceHeader }; ser.Register(_tracer); - ser.Register(new Disassembler()); + ser.Register(_cpu); } private readonly TraceBuffer _tracer; @@ -151,7 +151,7 @@ namespace BizHawk.Emulation.Cores.Calculators if (LinkActive) { // Prevent rom calls from disturbing link port activity - if (LinkActive && _cpu.RegisterPC < 0x4000) + if (LinkActive && _cpu.RegPC < 0x4000) { return; } @@ -428,13 +428,13 @@ namespace BizHawk.Emulation.Cores.Calculators private void IRQCallback() { - // Console.WriteLine("IRQ with vec {0} and cpu.InterruptMode {1}", cpu.RegisterI, cpu.InterruptMode); - _cpu.Interrupt = false; + //Console.WriteLine("IRQ with vec {0} and cpu.InterruptMode {1}", _cpu.Regs[_cpu.I], _cpu.InterruptMode); + _cpu.FlagI = false; } private void NMICallback() { - Console.WriteLine("NMI"); + //Console.WriteLine("NMI"); _cpu.NonMaskableInterrupt = false; } @@ -447,7 +447,7 @@ namespace BizHawk.Emulation.Cores.Calculators _ram[i] = 0xFF; } - _cpu.RegisterPC = _startPC; + _cpu.RegPC = _startPC; _cpu.IFF1 = false; _cpu.IFF2 = false; From 3be21c583e39bca4a61ef779f6a0e8b3856c8ebf Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 16:27:41 -0400 Subject: [PATCH 174/219] Add files via upload --- .../CPUs/Z80A/Interrupts.cs | 19 ++++++++++--------- .../CPUs/Z80A/Registers.cs | 4 +--- .../CPUs/Z80A/Tables_Direct.cs | 13 ++----------- BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs | 6 +++++- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs index 33df2edf55..f658f1a09b 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs @@ -83,28 +83,28 @@ namespace BizHawk.Emulation.Common.Components.Z80A } // Interrupt mode 2 uses the I vector combined with a byte on the data bus - // Again for now we assume only a 0 on the data bus and jump to 0xI00 + // Again for now we assume only a 0 on the data bus and jump to (0xI00) private void INTERRUPT_2(ushort src) { cur_instr = new ushort[] {IDLE, IDLE, - IDLE, - IDLE, - IDLE, - IDLE, DEC16, SPl, SPh, - IDLE, WR, SPl, SPh, PCh, IDLE, DEC16, SPl, SPh, - IDLE, WR, SPl, SPh, PCl, - IDLE, + IDLE, ASGN, PCl, 0, - IDLE, TR, PCh, I, + IDLE, IDLE, + RD, Z, PCl, PCh, + INC16, PCl, PCh, + IDLE, + RD, W, PCl, PCh, + IDLE, + TR16, PCl, PCh, Z, W, OP }; } @@ -116,6 +116,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A IFF2 = false; NonMaskableInterrupt = false; NonMaskableInterruptPending = false; + FlagI = false; InterruptMode = 1; } } diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs index e2095693ec..11dfef24cd 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs @@ -43,8 +43,6 @@ namespace BizHawk.Emulation.Common.Components.Z80A public ushort[] Regs = new ushort[36]; - // The Z80 also has ports to communicate with external components - public bool FlagI; public bool FlagC @@ -107,7 +105,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A private void ResetRegisters() { - for (int i=0; i < 14; i++) + for (int i=0; i < 36; i++) { Regs[i] = 0; } diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs index a3ca05dcb0..2d069cd8b1 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs @@ -440,11 +440,9 @@ namespace BizHawk.Emulation.Common.Components.Z80A private void LD_SP_16(ushort src_l, ushort src_h) { cur_instr = new ushort[] - {IDLE, - IDLE, + {IDLE, IDLE, TR, SPl, src_l, - IDLE, TR, SPh, src_h, IDLE, OP }; @@ -526,6 +524,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A TR16, Z, W, dest_l, dest_h, INC16, Z, W, IDLE, + IDLE, op, dest_l, dest_h, src_l, src_h, IDLE, IDLE, @@ -546,12 +545,8 @@ namespace BizHawk.Emulation.Common.Components.Z80A cur_instr = new ushort[] {IDLE, IDLE, - IDLE, - IDLE, TR16, Z, W, L, H, IDLE, - IDLE, - IDLE, RD, ALU, Z, W, IDLE, RRD, ALU, A, @@ -569,12 +564,8 @@ namespace BizHawk.Emulation.Common.Components.Z80A cur_instr = new ushort[] {IDLE, IDLE, - IDLE, - IDLE, TR16, Z, W, L, H, IDLE, - IDLE, - IDLE, RD, ALU, Z, W, IDLE, RLD, ALU, A, diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs index dd982d720c..ff2bbf87e7 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs @@ -177,6 +177,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A else if (iff1 && FlagI && NO_prefix) { iff1 = iff2 = false; + EI_pending = 0; if (TraceCallback != null) { @@ -310,6 +311,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A else if (iff1 && FlagI && NO_prefix) { iff1 = iff2 = false; + EI_pending = 0; if (TraceCallback != null) { @@ -384,6 +386,7 @@ namespace BizHawk.Emulation.Common.Components.Z80A else if (iff1 && FlagI && NO_prefix) { iff1 = iff2 = false; + EI_pending = 0; if (TraceCallback != null) { @@ -415,7 +418,6 @@ namespace BizHawk.Emulation.Common.Components.Z80A } else { - instr_pntr = 0; Regs[R]++; Regs[R] &= 0xFF; cur_instr = new ushort[] @@ -424,6 +426,8 @@ namespace BizHawk.Emulation.Common.Components.Z80A IDLE, HALT }; } + + instr_pntr = 0; break; case RD: Read_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); From ce6dcab32378d88effdb07957453a5bb16db9fd9 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 17:50:54 -0400 Subject: [PATCH 175/219] Add files via upload --- .../Consoles/Coleco/ColecoControllers.cs | 2 +- .../Coleco/ColecoVision.IDebuggable.cs | 116 ++++++++++-------- .../Consoles/Coleco/ColecoVision.IEmulator.cs | 10 +- .../Consoles/Coleco/ColecoVision.IStatable.cs | 61 +++++---- .../Consoles/Coleco/ColecoVision.cs | 4 +- .../Consoles/Coleco/TMS9918A.cs | 13 +- 6 files changed, 111 insertions(+), 95 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoControllers.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoControllers.cs index a44baeb679..bf018db6b5 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoControllers.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoControllers.cs @@ -38,7 +38,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision public byte Read(IController c, bool left_mode, int wheel) { - return 0; // needs checking + return 0x7F; // needs checking } public ControllerDefinition Definition { get; } diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IDebuggable.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IDebuggable.cs index 1c4e048e64..c48bbabf8f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IDebuggable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IDebuggable.cs @@ -12,36 +12,36 @@ namespace BizHawk.Emulation.Cores.ColecoVision { return new Dictionary { - ["A"] = _cpu.RegisterA, - ["AF"] = _cpu.RegisterAF, - ["B"] = _cpu.RegisterB, - ["BC"] = _cpu.RegisterBC, - ["C"] = _cpu.RegisterC, - ["D"] = _cpu.RegisterD, - ["DE"] = _cpu.RegisterDE, - ["E"] = _cpu.RegisterE, - ["F"] = _cpu.RegisterF, - ["H"] = _cpu.RegisterH, - ["HL"] = _cpu.RegisterHL, - ["I"] = _cpu.RegisterI, - ["IX"] = _cpu.RegisterIX, - ["IY"] = _cpu.RegisterIY, - ["L"] = _cpu.RegisterL, - ["PC"] = _cpu.RegisterPC, - ["R"] = _cpu.RegisterR, - ["Shadow AF"] = _cpu.RegisterShadowAF, - ["Shadow BC"] = _cpu.RegisterShadowBC, - ["Shadow DE"] = _cpu.RegisterShadowDE, - ["Shadow HL"] = _cpu.RegisterShadowHL, - ["SP"] = _cpu.RegisterSP, - ["Flag C"] = _cpu.RegisterF.Bit(0), - ["Flag N"] = _cpu.RegisterF.Bit(1), - ["Flag P/V"] = _cpu.RegisterF.Bit(2), - ["Flag 3rd"] = _cpu.RegisterF.Bit(3), - ["Flag H"] = _cpu.RegisterF.Bit(4), - ["Flag 5th"] = _cpu.RegisterF.Bit(5), - ["Flag Z"] = _cpu.RegisterF.Bit(6), - ["Flag S"] = _cpu.RegisterF.Bit(7) + ["A"] = _cpu.Regs[_cpu.A], + ["AF"] = _cpu.Regs[_cpu.F] + (_cpu.Regs[_cpu.A] << 8), + ["B"] = _cpu.Regs[_cpu.B], + ["BC"] = _cpu.Regs[_cpu.C] + (_cpu.Regs[_cpu.B] << 8), + ["C"] = _cpu.Regs[_cpu.C], + ["D"] = _cpu.Regs[_cpu.D], + ["DE"] = _cpu.Regs[_cpu.E] + (_cpu.Regs[_cpu.D] << 8), + ["E"] = _cpu.Regs[_cpu.E], + ["F"] = _cpu.Regs[_cpu.F], + ["H"] = _cpu.Regs[_cpu.H], + ["HL"] = _cpu.Regs[_cpu.L] + (_cpu.Regs[_cpu.H] << 8), + ["I"] = _cpu.Regs[_cpu.I], + ["IX"] = _cpu.Regs[_cpu.Ixl] + (_cpu.Regs[_cpu.Ixh] << 8), + ["IY"] = _cpu.Regs[_cpu.Iyl] + (_cpu.Regs[_cpu.Iyh] << 8), + ["L"] = _cpu.Regs[_cpu.L], + ["PC"] = _cpu.Regs[_cpu.PCl] + (_cpu.Regs[_cpu.PCh] << 8), + ["R"] = _cpu.Regs[_cpu.R], + ["Shadow AF"] = _cpu.Regs[_cpu.F_s] + (_cpu.Regs[_cpu.A_s] << 8), + ["Shadow BC"] = _cpu.Regs[_cpu.C_s] + (_cpu.Regs[_cpu.B_s] << 8), + ["Shadow DE"] = _cpu.Regs[_cpu.E_s] + (_cpu.Regs[_cpu.D_s] << 8), + ["Shadow HL"] = _cpu.Regs[_cpu.L_s] + (_cpu.Regs[_cpu.H_s] << 8), + ["SP"] = _cpu.Regs[_cpu.Iyl] + (_cpu.Regs[_cpu.Iyh] << 8), + ["Flag C"] = _cpu.FlagC, + ["Flag N"] = _cpu.FlagN, + ["Flag P/V"] = _cpu.FlagP, + ["Flag 3rd"] = _cpu.Flag3, + ["Flag H"] = _cpu.FlagH, + ["Flag 5th"] = _cpu.Flag5, + ["Flag Z"] = _cpu.FlagZ, + ["Flag S"] = _cpu.FlagS }; } @@ -52,70 +52,82 @@ namespace BizHawk.Emulation.Cores.ColecoVision default: throw new InvalidOperationException(); case "A": - _cpu.RegisterA = (byte)value; + _cpu.Regs[_cpu.A] = (ushort)value; break; case "AF": - _cpu.RegisterAF = (byte)value; + _cpu.Regs[_cpu.F] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.A] = (ushort)(value & 0xFF00); break; case "B": - _cpu.RegisterB = (byte)value; + _cpu.Regs[_cpu.B] = (ushort)value; break; case "BC": - _cpu.RegisterBC = (byte)value; + _cpu.Regs[_cpu.C] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.B] = (ushort)(value & 0xFF00); break; case "C": - _cpu.RegisterC = (byte)value; + _cpu.Regs[_cpu.C] = (ushort)value; break; case "D": - _cpu.RegisterD = (byte)value; + _cpu.Regs[_cpu.D] = (ushort)value; break; case "DE": - _cpu.RegisterDE = (byte)value; + _cpu.Regs[_cpu.E] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.D] = (ushort)(value & 0xFF00); break; case "E": - _cpu.RegisterE = (byte)value; + _cpu.Regs[_cpu.E] = (ushort)value; break; case "F": - _cpu.RegisterF = (byte)value; + _cpu.Regs[_cpu.F] = (ushort)value; break; case "H": - _cpu.RegisterH = (byte)value; + _cpu.Regs[_cpu.H] = (ushort)value; break; case "HL": - _cpu.RegisterHL = (byte)value; + _cpu.Regs[_cpu.L] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.H] = (ushort)(value & 0xFF00); break; case "I": - _cpu.RegisterI = (byte)value; + _cpu.Regs[_cpu.I] = (ushort)value; break; case "IX": - _cpu.RegisterIX = (byte)value; + _cpu.Regs[_cpu.Ixl] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.Ixh] = (ushort)(value & 0xFF00); break; case "IY": - _cpu.RegisterIY = (byte)value; + _cpu.Regs[_cpu.Iyl] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.Iyh] = (ushort)(value & 0xFF00); break; case "L": - _cpu.RegisterL = (byte)value; + _cpu.Regs[_cpu.L] = (ushort)value; break; case "PC": - _cpu.RegisterPC = (ushort)value; + _cpu.Regs[_cpu.PCl] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.PCh] = (ushort)(value & 0xFF00); break; case "R": - _cpu.RegisterR = (byte)value; + _cpu.Regs[_cpu.R] = (ushort)value; break; case "Shadow AF": - _cpu.RegisterShadowAF = (byte)value; + _cpu.Regs[_cpu.F_s] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.A_s] = (ushort)(value & 0xFF00); break; case "Shadow BC": - _cpu.RegisterShadowBC = (byte)value; + _cpu.Regs[_cpu.C_s] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.B_s] = (ushort)(value & 0xFF00); break; case "Shadow DE": - _cpu.RegisterShadowDE = (byte)value; + _cpu.Regs[_cpu.E_s] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.D_s] = (ushort)(value & 0xFF00); break; case "Shadow HL": - _cpu.RegisterShadowHL = (byte)value; + _cpu.Regs[_cpu.L_s] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.H_s] = (ushort)(value & 0xFF00); break; case "SP": - _cpu.RegisterSP = (byte)value; + _cpu.Regs[_cpu.SPl] = (ushort)(value & 0xFF); + _cpu.Regs[_cpu.SPh] = (ushort)(value & 0xFF00); break; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs index a503350386..22e67db446 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs @@ -24,16 +24,18 @@ namespace BizHawk.Emulation.Cores.ColecoVision SoftReset(); } - _cpu.Debug = _tracer.Enabled; _frame++; _isLag = true; PSG.BeginFrame(_cpu.TotalExecutedCycles); - if (_cpu.Debug && _cpu.Logger == null) // TODO, lets not do this on each frame. But lets refactor CoreComm/CoreComm first + if (_tracer.Enabled) { - _cpu.Logger = (s) => _tracer.Put(s); + _cpu.TraceCallback = s => _tracer.Put(s); + } + else + { + _cpu.TraceCallback = null; } - byte tempRet1 = ControllerDeck.ReadPort1(controller, true, true); byte tempRet2 = ControllerDeck.ReadPort2(controller, true, true); diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IStatable.cs index 62b5297675..d079fa50f4 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IStatable.cs @@ -7,53 +7,52 @@ namespace BizHawk.Emulation.Cores.ColecoVision { public partial class ColecoVision : IStatable { - public bool BinarySaveStatesPreferred => false; + public bool BinarySaveStatesPreferred + { + get { return true; } + } + + public void SaveStateText(TextWriter writer) + { + SyncState(new Serializer(writer)); + } + + public void LoadStateText(TextReader reader) + { + SyncState(new Serializer(reader)); + } public void SaveStateBinary(BinaryWriter bw) { - SyncState(Serializer.CreateBinaryWriter(bw)); + SyncState(new Serializer(bw)); } public void LoadStateBinary(BinaryReader br) { - SyncState(Serializer.CreateBinaryReader(br)); - } - - public void SaveStateText(TextWriter tw) - { - SyncState(Serializer.CreateTextWriter(tw)); - } - - public void LoadStateText(TextReader tr) - { - SyncState(Serializer.CreateTextReader(tr)); + SyncState(new Serializer(br)); } public byte[] SaveStateBinary() { - if (_stateBuffer == null) - { - var stream = new MemoryStream(); - var writer = new BinaryWriter(stream); - SaveStateBinary(writer); - _stateBuffer = stream.ToArray(); - writer.Close(); - return _stateBuffer; - } - else - { - var stream = new MemoryStream(_stateBuffer); - var writer = new BinaryWriter(stream); - SaveStateBinary(writer); - writer.Close(); - return _stateBuffer; - } + MemoryStream ms = new MemoryStream(); + BinaryWriter bw = new BinaryWriter(ms); + SaveStateBinary(bw); + bw.Flush(); + return ms.ToArray(); } private void SyncState(Serializer ser) { - ser.BeginSection("Coleco"); + byte[] core = null; + if (ser.IsWriter) + { + var ms = new MemoryStream(); + ms.Close(); + core = ms.ToArray(); + } _cpu.SyncState(ser); + + ser.BeginSection("Coleco"); _vdp.SyncState(ser); PSG.SyncState(ser); ser.Sync("RAM", ref _ram, false); diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs index 2422f9a36f..f7d183f60d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs @@ -1,6 +1,6 @@ using BizHawk.Emulation.Common; using BizHawk.Emulation.Cores.Components; -using BizHawk.Emulation.Cores.Components.Z80; +using BizHawk.Emulation.Common.Components.Z80A; namespace BizHawk.Emulation.Cores.ColecoVision { @@ -53,7 +53,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision SetupMemoryDomains(); _tracer.Header = _cpu.TraceHeader; - ser.Register(new Disassembler()); + ser.Register(_cpu); ser.Register(_tracer); } diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/TMS9918A.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/TMS9918A.cs index 1e5abd1445..00049a5890 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/TMS9918A.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/TMS9918A.cs @@ -2,7 +2,7 @@ using BizHawk.Common; using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Components.Z80; +using BizHawk.Emulation.Common.Components.Z80A; namespace BizHawk.Emulation.Cores.ColecoVision { @@ -54,14 +54,17 @@ namespace BizHawk.Emulation.Cores.ColecoVision Cpu.NonMaskableInterrupt = true; } - Cpu.ExecuteCycles(228); - - Cpu.Interrupt = false; + for (int i = 0; i < 228; i++) + { + Cpu.ExecuteOne(); + } + + Cpu.FlagI = false; if (Int_pending && scanLine==50) { if (EnableInterrupts) { - Cpu.Interrupt = true; + Cpu.FlagI = true; Int_pending = false; } } From 438b3893e369819b33b4f42d88990a38521cc9b8 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 17:52:03 -0400 Subject: [PATCH 176/219] Delete Disassembler.cs --- .../CPUs/Z80/Disassembler.cs | 553 ------------------ 1 file changed, 553 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/CPUs/Z80/Disassembler.cs diff --git a/BizHawk.Emulation.Cores/CPUs/Z80/Disassembler.cs b/BizHawk.Emulation.Cores/CPUs/Z80/Disassembler.cs deleted file mode 100644 index d5b9c2c4e1..0000000000 --- a/BizHawk.Emulation.Cores/CPUs/Z80/Disassembler.cs +++ /dev/null @@ -1,553 +0,0 @@ -//http://www.zophar.net/fileuploads/2/10819kouzv/z80undoc.html - -//TODO: ex. (IX+00h) could be turned into (IX) - -//usage: -//VgMuseum.Z80.Disassembler disasm = new Disassembler(); -//ushort pc = RegPC.Word; -//string str = disasm.Disassemble(() => ReadMemory(pc++)); -//Console.WriteLine(str); - -//please note that however much youre tempted to, timings can't be put in a table here because they depend on how the instruction executes at runtime - -using System; -using System.Collections.Generic; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Emulation.Cores.Components.Z80 -{ - public class Disassembler : IDisassemblable - { - readonly static sbyte[,] opcodeSizes = new sbyte[7, 256]; - - public static void GenerateOpcodeSizes() - { - Disassembler disasm = new Disassembler(); - - for (int i = 0; i < 256; i++) - { - int pc = 0; - byte[] opcode = { (byte)i, 0, 0, 0 }; - disasm.Disassemble(() => opcode[pc++]); - opcodeSizes[0, i] = (sbyte)pc; - } - - opcodeSizes[0, 0xCB] = -1; - opcodeSizes[0, 0xED] = -2; - opcodeSizes[0, 0xDD] = -3; - opcodeSizes[0, 0xFD] = -4; - - for (int i = 0; i < 256; i++) - { - int pc = 0; - byte[] opcode = { 0xCB, (byte)i, 0, 0, 0 }; - disasm.Disassemble(() => opcode[pc++]); - opcodeSizes[1, i] = (sbyte)pc; - } - - for (int i = 0; i < 256; i++) - { - int pc = 0; - byte[] opcode = { 0xED, (byte)i, 0, 0, 0 }; - disasm.Disassemble(() => opcode[pc++]); - opcodeSizes[2, i] = (sbyte)pc; - } - - for (int i = 0; i < 256; i++) - { - int pc = 0; - byte[] opcode = { 0xDD, (byte)i, 0, 0, 0 }; - disasm.Disassemble(() => opcode[pc++]); - opcodeSizes[3, i] = (sbyte)pc; - } - - opcodeSizes[3, 0xCB] = -5; - opcodeSizes[3, 0xED] = -2; - - for (int i = 0; i < 256; i++) - { - int pc = 0; - byte[] opcode = { 0xFD, (byte)i, 0, 0, 0 }; - disasm.Disassemble(() => opcode[pc++]); - opcodeSizes[4, i] = (sbyte)pc; - } - - opcodeSizes[3, 0xCB] = -6; - opcodeSizes[3, 0xED] = -2; - - - for (int i = 0; i < 256; i++) - { - int pc = 0; - byte[] opcode = { 0xDD, 0xCB, (byte)i, 0, 0, 0 }; - disasm.Disassemble(() => opcode[pc++]); - opcodeSizes[5, i] = (sbyte)pc; - } - - for (int i = 0; i < 256; i++) - { - int pc = 0; - byte[] opcode = { 0xFD, 0xCB, (byte)i, 0, 0, 0 }; - disasm.Disassemble(() => opcode[pc++]); - opcodeSizes[6, i] = (sbyte)pc; - } - } - - static string Result(string format, Func read) - { - //d immediately succeeds the opcode - //n immediate succeeds the opcode and the displacement (if present) - //nn immediately succeeds the opcode and the displacement (if present) - if (format.IndexOf("nn") != -1) - { - byte B = read(); - byte C = read(); - format = format.Replace("nn", string.Format("{0:X4}h", B + C * 256)); - } - - if (format.IndexOf("n") != -1) - { - byte B = read(); - format = format.Replace("n", string.Format("{0:X2}h", B)); - } - - if (format.IndexOf("+d") != -1) format = format.Replace("+d", "d"); - - if (format.IndexOf("d") != -1) - { - byte B = read(); - bool neg = ((B & 0x80) != 0); - char sign = neg ? '-' : '+'; - int val = neg ? 256 - B : B; - format = format.Replace("d", string.Format("{0}{1:X2}h", sign, val)); - } - - return format; - } - - readonly static string[] mnemonics = new string[] - { - "NOP", "LD BC, nn", "LD (BC), A", "INC BC", //0x04 - "INC B", "DEC B", "LD B, n", "RLCA", //0x08 - "EX AF, AF'", "ADD HL, BC", "LD A, (BC)", "DEC BC", //0x0C - "INC C", "DEC C", "LD C, n", "RRCA", //0x10 - "DJNZ d", "LD DE, nn", "LD (DE), A", "INC DE", //0x14 - "INC D", "DEC D", "LD D, n", "RLA", //0x18 - "JR d", "ADD HL, DE", "LD A, (DE)", "DEC DE", //0x1C - "INC E", "DEC E", "LD E, n", "RRA", //0x20 - "JR NZ, d", "LD HL, nn", "LD (nn), HL", "INC HL", //0x24 - "INC H", "DEC H", "LD H, n", "DAA", //0x28 - "JR Z, d", "ADD HL, HL", "LD HL, (nn)", "DEC HL", //0x2C - "INC L", "DEC L", "LD L, n", "CPL", //0x30 - "JR NC, d", "LD SP, nn", "LD (nn), A", "INC SP", //0x34 - "INC (HL)", "DEC (HL)", "LD (HL), n", "SCF", //0x38 - "JR C, d", "ADD HL, SP", "LD A, (nn)", "DEC SP", //0x3C - "INC A", "DEC A", "LD A, n", "CCF", //0x40 - "LD B, B", "LD B, C", "LD B, D", "LD B, E", //0x44 - "LD B, H", "LD B, L", "LD B, (HL)", "LD B, A", //0x48 - "LD C, B", "LD C, C", "LD C, D", "LD C, E", //0x4C - "LD C, H", "LD C, L", "LD C, (HL)", "LD C, A", //0x50 - "LD D, B", "LD D, C", "LD D, D", "LD D, E", //0x54 - "LD D, H", "LD D, L", "LD D, (HL)", "LD D, A", //0x58 - "LD E, B", "LD E, C", "LD E, D", "LD E, E", //0x5C - "LD E, H", "LD E, L", "LD E, (HL)", "LD E, A", //0x60 - "LD H, B", "LD H, C", "LD H, D", "LD H, E", //0x64 - "LD H, H", "LD H, L", "LD H, (HL)", "LD H, A", //0x68 - "LD L, B", "LD L, B", "LD L, D", "LD L, E", //0x6C - "LD L, H", "LD L, L", "LD L, (HL)", "LD L, A", //0x70 - "LD (HL), B", "LD (HL), C", "LD (HL), D", "LD (HL), E", //0x74 - "LD (HL), H", "LD (HL), L", "HALT", "LD (HL), A", //0x78 - "LD A, B", "LD A, C", "LD A, D", "LD A, E", //0x7C - "LD A, H", "LD A, L", "LD A, (HL)", "LD A, A", //0x80 - "ADD A, B", "ADD A, C", "ADD A, D", "ADD A, E", //0x84 - "ADD A, H", "ADD A, L", "ADD A, (HL)", "ADD A, A", //0x88 - "ADC A, B", "ADC A, C", "ADC A, D", "ADC A, E", //0x8C - "ADC A, H", "ADC A, L", "ADC A, (HL)", "ADC A, A", //0x90 - "SUB A, B", "SUB A, C", "SUB A, D", "SUB A, E", //0x94 - "SUB A, H", "SUB A, L", "SUB A, (HL)", "SUB A, A", //0x98 - "SBC A, B", "SBC A, C", "SBC A, D", "SBC A, E", //0x9C - "SBC A, H", "SBC A, L", "SBC A, (HL)", "SBC A, A", //0xA0 - "AND B", "AND C", "AND D", "AND E", //0xA4 - "AND H", "AND L", "AND (HL)", "AND A", //0xA8 - "XOR B", "XOR C", "XOR D", "XOR E", //0xAC - "XOR H", "XOR L", "XOR (HL)", "XOR A", //0xB0 - "OR B", "OR C", "OR D", "OR E", //0xB4 - "OR H", "OR L", "OR (HL)", "OR A", //0xB8 - "CP B", "CP C", "CP D", "CP E", //0xBC - "CP H", "CP L", "CP (HL)", "CP A", //0xC0 - "RET NZ", "POP BC", "JP NZ, nn", "JP nn", //0xC4 - "CALL NZ, nn", "PUSH BC", "ADD A, n", "RST $00", //0xC8 - "RET Z", "RET", "JP Z, nn", "[CB]", //0xCC - "CALL Z, nn", "CALL nn", "ADC A, n", "RST $08", //0xD0 - "RET NC", "POP DE", "JP NC, nn", "OUT n, A", //0xD4 - "CALL NC, nn", "PUSH DE", "SUB n", "RST $10", //0xD8 - "RET C", "EXX", "JP C, nn", "IN A, n", //0xDC - "CALL C, nn", "[DD]", "SBC A, n", "RST $18", //0xE0 - "RET PO", "POP HL", "JP PO, nn", "EX (SP), HL", //0xE4 - "CALL C, nn", "PUSH HL", "AND n", "RST $20", //0xE8 - "RET PE", "JP HL", "JP PE, nn", "EX DE, HL", //0xEC - "CALL PE, nn", "[ED]", "XOR n", "RST $28", //0xF0 - "RET P", "POP AF", "JP P, nn", "DI", //0xF4 - "CALL P, nn", "PUSH AF", "OR n", "RST $30", //0xF8 - "RET M", "LD SP, HL", "JP M, nn", "EI", //0xFC - "CALL M, nn", "[FD]", "CP n", "RST $38", //0x100 - }; - - readonly static string[] mnemonicsDD = new string[] - { - "NOP", "LD BC, nn", "LD (BC), A", "INC BC", //0x04 - "INC B", "DEC B", "LD B, n", "RLCA", //0x08 - "EX AF, AF'", "ADD IX, BC", "LD A, (BC)", "DEC BC", //0x0C - "INC C", "DEC C", "LD C, n", "RRCA", //0x10 - "DJNZ d", "LD DE, nn", "LD (DE), A", "INC DE", //0x14 - "INC D", "DEC D", "LD D, n", "RLA", //0x18 - "JR d", "ADD IX, DE", "LD A, (DE)", "DEC DE", //0x1C - "INC E", "DEC E", "LD E, n", "RRA", //0x20 - "JR NZ, d", "LD IX, nn", "LD (nn), IX", "INC IX", //0x24 - "INC IXH", "DEC IXH", "LD IXH, n", "DAA", //0x28 - "JR Z, d", "ADD IX, IX", "LD IX, (nn)", "DEC IX", //0x2C - "INC IXL", "DEC IXL", "LD IXL, n", "CPL", //0x30 - "JR NC, d", "LD SP, nn", "LD (nn), A", "INC SP", //0x34 - "INC (IX+d)", "DEC (IX+d)", "LD (IX+d), n", "SCF", //0x38 - "JR C, d", "ADD IX, SP", "LD A, (nn)", "DEC SP", //0x3C - "INC A", "DEC A", "LD A, n", "CCF", //0x40 - "LD B, B", "LD B, C", "LD B, D", "LD B, E", //0x44 - "LD B, IXH", "LD B, IXL", "LD B, (IX+d)", "LD B, A", //0x48 - "LD C, B", "LD C, C", "LD C, D", "LD C, E", //0x4C - "LD C, IXH", "LD C, IXL", "LD C, (IX+d)", "LD C, A", //0x50 - "LD D, B", "LD D, C", "LD D, D", "LD D, E", //0x54 - "LD D, IXH", "LD D, IXL", "LD D, (IX+d)", "LD D, A", //0x58 - "LD E, B", "LD E, C", "LD E, D", "LD E, E", //0x5C - "LD E, IXH", "LD E, IXL", "LD E, (IX+d)", "LD E, A", //0x60 - "LD IXH, B", "LD IXH, C", "LD IXH, D", "LD IXH, E", //0x64 - "LD IXH, IXH", "LD IXH, IXL", "LD H, (IX+d)", "LD IXH, A", //0x68 - "LD IXL, B", "LD IXL, C", "LD IXL, D", "LD IXL, E", //0x6C - "LD IXL, IXH", "LD IXL, IXL", "LD L, (IX+d)", "LD IXL, A", //0x70 - "LD (IX+d), B", "LD (IX+d), C", "LD (IX+d), D", "LD (IX+d), E", //0x74 - "LD (IX+d), H", "LD (IX+d), L", "HALT", "LD (IX+d), A", //0x78 - "LD A, B", "LD A, C", "LD A, D", "LD A, E", //0x7C - "LD A, IXH", "LD A, IXL", "LD A, (IX+d)", "LD A, A", //0x80 - "ADD A, B", "ADD A, C", "ADD A, D", "ADD A, E", //0x84 - "ADD A, IXH", "ADD A, IXL", "ADD A, (IX+d)", "ADD A, A", //0x88 - "ADC A, B", "ADC A, C", "ADC A, D", "ADC A, E", //0x8C - "ADC A, IXH", "ADC A, IXL", "ADC A, (IX+d)", "ADC A, A", //0x90 - "SUB A, B", "SUB A, C", "SUB A, D", "SUB A, E", //0x94 - "SUB A, IXH", "SUB A, IXL", "SUB A, (IX+d)", "SUB A, A", //0x98 - "SBC A, B", "SBC A, C", "SBC A, D", "SBC A, E", //0x9C - "SBC A, IXH", "SBC A, IXL", "SBC A, (IX+d)", "SBC A, A", //0xA0 - "AND B", "AND C", "AND D", "AND E", //0xA4 - "AND IXH", "AND IXL", "AND (IX+d)", "AND A", //0xA8 - "XOR B", "XOR C", "XOR D", "XOR E", //0xAC - "XOR IXH", "XOR IXL", "XOR (IX+d)", "XOR A", //0xB0 - "OR B", "OR C", "OR D", "OR E", //0xB4 - "OR IXH", "OR IXL", "OR (IX+d)", "OR A", //0xB8 - "CP B", "CP C", "CP D", "CP E", //0xBC - "CP IXH", "CP IXL", "CP (IX+d)", "CP A", //0xC0 - "RET NZ", "POP BC", "JP NZ, nn", "JP nn", //0xC4 - "CALL NZ, nn", "PUSH BC", "ADD A, n", "RST $00", //0xC8 - "RET Z", "RET", "JP Z, nn", "[DD CB]", //0xCC - "CALL Z, nn", "CALL nn", "ADC A, n", "RST $08", //0xD0 - "RET NC", "POP DE", "JP NC, nn", "OUT n, A", //0xD4 - "CALL NC, nn", "PUSH DE", "SUB n", "RST $10", //0xD8 - "RET C", "EXX", "JP C, nn", "IN A, n", //0xDC - "CALL C, nn", "[!DD DD!]", "SBC A, n", "RST $18", //0xE0 - "RET PO", "POP IX", "JP PO, nn", "EX (SP), IX", //0xE4 - "CALL C, nn", "PUSH IX", "AND n", "RST $20", //0xE8 - "RET PE", "JP IX", "JP PE, nn", "EX DE, HL", //0xEC - "CALL PE, nn", "[DD ED]", "XOR n", "RST $28", //0xF0 - "RET P", "POP AF", "JP P, nn", "DI", //0xF4 - "CALL P, nn", "PUSH AF", "OR n", "RST $30", //0xF8 - "RET M", "LD SP, IX", "JP M, nn", "EI", //0xFC - "CALL M, nn", "[!!DD FD!!]", "CP n", "RST $38", //0x100 - }; - - readonly static string[] mnemonicsFD = new string[] - { - "NOP", "LD BC, nn", "LD (BC), A", "INC BC", //0x04 - "INC B", "DEC B", "LD B, n", "RLCA", //0x08 - "EX AF, AF'", "ADD IY, BC", "LD A, (BC)", "DEC BC", //0x0C - "INC C", "DEC C", "LD C, n", "RRCA", //0x10 - "DJNZ d", "LD DE, nn", "LD (DE), A", "INC DE", //0x14 - "INC D", "DEC D", "LD D, n", "RLA", //0x18 - "JR d", "ADD IY, DE", "LD A, (DE)", "DEC DE", //0x1C - "INC E", "DEC E", "LD E, n", "RRA", //0x20 - "JR NZ, d", "LD IY, nn", "LD (nn), IY", "INC IY", //0x24 - "INC IYH", "DEC IYH", "LD IYH, n", "DAA", //0x28 - "JR Z, d", "ADD IY, IY", "LD IY, (nn)", "DEC IY", //0x2C - "INC IYL", "DEC IYL", "LD IYL, n", "CPL", //0x30 - "JR NC, d", "LD SP, nn", "LD (nn), A", "INC SP", //0x34 - "INC (IY+d)", "DEC (IY+d)", "LD (IY+d), n", "SCF", //0x38 - "JR C, d", "ADD IY, SP", "LD A, (nn)", "DEC SP", //0x3C - "INC A", "DEC A", "LD A, n", "CCF", //0x40 - "LD B, B", "LD B, C", "LD B, D", "LD B, E", //0x44 - "LD B, IYH", "LD B, IYL", "LD B, (IY+d)", "LD B, A", //0x48 - "LD C, B", "LD C, C", "LD C, D", "LD C, E", //0x4C - "LD C, IYH", "LD C, IYL", "LD C, (IY+d)", "LD C, A", //0x50 - "LD D, B", "LD D, C", "LD D, D", "LD D, E", //0x54 - "LD D, IYH", "LD D, IYL", "LD D, (IY+d)", "LD D, A", //0x58 - "LD E, B", "LD E, C", "LD E, D", "LD E, E", //0x5C - "LD E, IYH", "LD E, IYL", "LD E, (IY+d)", "LD E, A", //0x60 - "LD IYH, B", "LD IYH, C", "LD IYH, D", "LD IYH, E", //0x64 - "LD IYH, IYH", "LD IYH, IYL", "LD H, (IY+d)", "LD IYH, A", //0x68 - "LD IYL, B", "LD IYL, C", "LD IYL, D", "LD IYL, E", //0x6C - "LD IYL, IYH", "LD IYL, IYL", "LD L, (IY+d)", "LD IYL, A", //0x70 - "LD (IY+d), B", "LD (IY+d), C", "LD (IY+d), D", "LD (IY+d), E", //0x74 - "LD (IY+d), H", "LD (IY+d), L", "HALT", "LD (IY+d), A", //0x78 - "LD A, B", "LD A, C", "LD A, D", "LD A, E", //0x7C - "LD A, IYH", "LD A, IYL", "LD A, (IY+d)", "LD A, A", //0x80 - "ADD A, B", "ADD A, C", "ADD A, D", "ADD A, E", //0x84 - "ADD A, IYH", "ADD A, IYL", "ADD A, (IY+d)", "ADD A, A", //0x88 - "ADC A, B", "ADC A, C", "ADC A, D", "ADC A, E", //0x8C - "ADC A, IYH", "ADC A, IYL", "ADC A, (IY+d)", "ADC A, A", //0x90 - "SUB A, B", "SUB A, C", "SUB A, D", "SUB A, E", //0x94 - "SUB A, IYH", "SUB A, IYL", "SUB A, (IY+d)", "SUB A, A", //0x98 - "SBC A, B", "SBC A, C", "SBC A, D", "SBC A, E", //0x9C - "SBC A, IYH", "SBC A, IYL", "SBC A, (IY+d)", "SBC A, A", //0xA0 - "AND B", "AND C", "AND D", "AND E", //0xA4 - "AND IYH", "AND IYL", "AND (IY+d)", "AND A", //0xA8 - "XOR B", "XOR C", "XOR D", "XOR E", //0xAC - "XOR IYH", "XOR IYL", "XOR (IY+d)", "XOR A", //0xB0 - "OR B", "OR C", "OR D", "OR E", //0xB4 - "OR IYH", "OR IYL", "OR (IY+d)", "OR A", //0xB8 - "CP B", "CP C", "CP D", "CP E", //0xBC - "CP IYH", "CP IYL", "CP (IY+d)", "CP A", //0xC0 - "RET NZ", "POP BC", "JP NZ, nn", "JP nn", //0xC4 - "CALL NZ, nn", "PUSH BC", "ADD A, n", "RST $00", //0xC8 - "RET Z", "RET", "JP Z, nn", "[DD CB]", //0xCC - "CALL Z, nn", "CALL nn", "ADC A, n", "RST $08", //0xD0 - "RET NC", "POP DE", "JP NC, nn", "OUT n, A", //0xD4 - "CALL NC, nn", "PUSH DE", "SUB n", "RST $10", //0xD8 - "RET C", "EXX", "JP C, nn", "IN A, n", //0xDC - "CALL C, nn", "[!FD DD!]", "SBC A, n", "RST $18", //0xE0 - "RET PO", "POP IY", "JP PO, nn", "EX (SP), IY", //0xE4 - "CALL C, nn", "PUSH IY", "AND n", "RST $20", //0xE8 - "RET PE", "JP IY", "JP PE, nn", "EX DE, HL", //0xEC - "CALL PE, nn", "[FD ED]", "XOR n", "RST $28", //0xF0 - "RET P", "POP AF", "JP P, nn", "DI", //0xF4 - "CALL P, nn", "PUSH AF", "OR n", "RST $30", //0xF8 - "RET M", "LD SP, IY", "JP M, nn", "EI", //0xFC - "CALL M, nn", "[!FD FD!]", "CP n", "RST $38", //0x100 - }; - - readonly static string[] mnemonicsDDCB = new string[] - { - "RLC (IX+d)->B", "RLC (IX+d)->C", "RLC (IX+d)->D", "RLC (IX+d)->E", "RLC (IX+d)->H", "RLC (IX+d)->L", "RLC (IX+d)", "RLC (IX+d)->A", - "RRC (IX+d)->B", "RRC (IX+d)->C", "RRC (IX+d)->D", "RRC (IX+d)->E", "RRC (IX+d)->H", "RRC (IX+d)->L", "RRC (IX+d)", "RRC (IX+d)->A", - "RL (IX+d)->B", "RL (IX+d)->C", "RL (IX+d)->D", "RL (IX+d)->E", "RL (IX+d)->H", "RL (IX+d)->L", "RL (IX+d)", "RL (IX+d)->A", - "RR (IX+d)->B", "RR (IX+d)->C", "RR (IX+d)->D", "RR (IX+d)->E", "RR (IX+d)->H", "RR (IX+d)->L", "RR (IX+d)", "RR (IX+d)->A", - "SLA (IX+d)->B", "SLA (IX+d)->C", "SLA (IX+d)->D", "SLA (IX+d)->E", "SLA (IX+d)->H", "SLA (IX+d)->L", "SLA (IX+d)", "SLA (IX+d)->A", - "SRA (IX+d)->B", "SRA (IX+d)->C", "SRA (IX+d)->D", "SRA (IX+d)->E", "SRA (IX+d)->H", "SRA (IX+d)->L", "SRA (IX+d)", "SRA (IX+d)->A", - "SL1 (IX+d)->B", "SL1 (IX+d)->C", "SL1 (IX+d)->D", "SL1 (IX+d)->E", "SL1 (IX+d)->H", "SL1 (IX+d)->L", "SL1 (IX+d)", "SL1 (IX+d)->A", - "SRL (IX+d)->B", "SRL (IX+d)->C", "SRL (IX+d)->D", "SRL (IX+d)->E", "SRL (IX+d)->H", "SRL (IX+d)->L", "SRL (IX+d)", "SRL (IX+d)->A", - "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", "BIT 0, (IX+d)", - "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", "BIT 1, (IX+d)", - "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", "BIT 2, (IX+d)", - "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", "BIT 3, (IX+d)", - "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", "BIT 4, (IX+d)", - "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", "BIT 5, (IX+d)", - "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", "BIT 6, (IX+d)", - "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", "BIT 7, (IX+d)", - "RES 0 (IX+d)->B", "RES 0 (IX+d)->C", "RES 0 (IX+d)->D", "RES 0 (IX+d)->E", "RES 0 (IX+d)->H", "RES 0 (IX+d)->L", "RES 0 (IX+d)", "RES 0 (IX+d)->A", - "RES 1 (IX+d)->B", "RES 1 (IX+d)->C", "RES 1 (IX+d)->D", "RES 1 (IX+d)->E", "RES 1 (IX+d)->H", "RES 1 (IX+d)->L", "RES 1 (IX+d)", "RES 1 (IX+d)->A", - "RES 2 (IX+d)->B", "RES 2 (IX+d)->C", "RES 2 (IX+d)->D", "RES 2 (IX+d)->E", "RES 2 (IX+d)->H", "RES 2 (IX+d)->L", "RES 2 (IX+d)", "RES 2 (IX+d)->A", - "RES 3 (IX+d)->B", "RES 3 (IX+d)->C", "RES 3 (IX+d)->D", "RES 3 (IX+d)->E", "RES 3 (IX+d)->H", "RES 3 (IX+d)->L", "RES 3 (IX+d)", "RES 3 (IX+d)->A", - "RES 4 (IX+d)->B", "RES 4 (IX+d)->C", "RES 4 (IX+d)->D", "RES 4 (IX+d)->E", "RES 4 (IX+d)->H", "RES 4 (IX+d)->L", "RES 4 (IX+d)", "RES 4 (IX+d)->A", - "RES 5 (IX+d)->B", "RES 5 (IX+d)->C", "RES 5 (IX+d)->D", "RES 5 (IX+d)->E", "RES 5 (IX+d)->H", "RES 5 (IX+d)->L", "RES 5 (IX+d)", "RES 5 (IX+d)->A", - "RES 6 (IX+d)->B", "RES 6 (IX+d)->C", "RES 6 (IX+d)->D", "RES 6 (IX+d)->E", "RES 6 (IX+d)->H", "RES 6 (IX+d)->L", "RES 6 (IX+d)", "RES 6 (IX+d)->A", - "RES 7 (IX+d)->B", "RES 7 (IX+d)->C", "RES 7 (IX+d)->D", "RES 7 (IX+d)->E", "RES 7 (IX+d)->H", "RES 7 (IX+d)->L", "RES 7 (IX+d)", "RES 7 (IX+d)->A", - "SET 0 (IX+d)->B", "SET 0 (IX+d)->C", "SET 0 (IX+d)->D", "SET 0 (IX+d)->E", "SET 0 (IX+d)->H", "SET 0 (IX+d)->L", "SET 0 (IX+d)", "SET 0 (IX+d)->A", - "SET 1 (IX+d)->B", "SET 1 (IX+d)->C", "SET 1 (IX+d)->D", "SET 1 (IX+d)->E", "SET 1 (IX+d)->H", "SET 1 (IX+d)->L", "SET 1 (IX+d)", "SET 1 (IX+d)->A", - "SET 2 (IX+d)->B", "SET 2 (IX+d)->C", "SET 2 (IX+d)->D", "SET 2 (IX+d)->E", "SET 2 (IX+d)->H", "SET 2 (IX+d)->L", "SET 2 (IX+d)", "SET 2 (IX+d)->A", - "SET 3 (IX+d)->B", "SET 3 (IX+d)->C", "SET 3 (IX+d)->D", "SET 3 (IX+d)->E", "SET 3 (IX+d)->H", "SET 3 (IX+d)->L", "SET 3 (IX+d)", "SET 3 (IX+d)->A", - "SET 4 (IX+d)->B", "SET 4 (IX+d)->C", "SET 4 (IX+d)->D", "SET 4 (IX+d)->E", "SET 4 (IX+d)->H", "SET 4 (IX+d)->L", "SET 4 (IX+d)", "SET 4 (IX+d)->A", - "SET 5 (IX+d)->B", "SET 5 (IX+d)->C", "SET 5 (IX+d)->D", "SET 5 (IX+d)->E", "SET 5 (IX+d)->H", "SET 5 (IX+d)->L", "SET 5 (IX+d)", "SET 5 (IX+d)->A", - "SET 6 (IX+d)->B", "SET 6 (IX+d)->C", "SET 6 (IX+d)->D", "SET 6 (IX+d)->E", "SET 6 (IX+d)->H", "SET 6 (IX+d)->L", "SET 6 (IX+d)", "SET 6 (IX+d)->A", - "SET 7 (IX+d)->B", "SET 7 (IX+d)->C", "SET 7 (IX+d)->D", "SET 7 (IX+d)->E", "SET 7 (IX+d)->H", "SET 7 (IX+d)->L", "SET 7 (IX+d)", "SET 7 (IX+d)->A", - }; - - readonly static string[] mnemonicsFDCB = new string[] - { - "RLC (IY+d)->B", "RLC (IY+d)->C", "RLC (IY+d)->D", "RLC (IY+d)->E", "RLC (IY+d)->H", "RLC (IY+d)->L", "RLC (IY+d)", "RLC (IY+d)->A", - "RRC (IY+d)->B", "RRC (IY+d)->C", "RRC (IY+d)->D", "RRC (IY+d)->E", "RRC (IY+d)->H", "RRC (IY+d)->L", "RRC (IY+d)", "RRC (IY+d)->A", - "RL (IY+d)->B", "RL (IY+d)->C", "RL (IY+d)->D", "RL (IY+d)->E", "RL (IY+d)->H", "RL (IY+d)->L", "RL (IY+d)", "RL (IY+d)->A", - "RR (IY+d)->B", "RR (IY+d)->C", "RR (IY+d)->D", "RR (IY+d)->E", "RR (IY+d)->H", "RR (IY+d)->L", "RR (IY+d)", "RR (IY+d)->A", - "SLA (IY+d)->B", "SLA (IY+d)->C", "SLA (IY+d)->D", "SLA (IY+d)->E", "SLA (IY+d)->H", "SLA (IY+d)->L", "SLA (IY+d)", "SLA (IY+d)->A", - "SRA (IY+d)->B", "SRA (IY+d)->C", "SRA (IY+d)->D", "SRA (IY+d)->E", "SRA (IY+d)->H", "SRA (IY+d)->L", "SRA (IY+d)", "SRA (IY+d)->A", - "SL1 (IY+d)->B", "SL1 (IY+d)->C", "SL1 (IY+d)->D", "SL1 (IY+d)->E", "SL1 (IY+d)->H", "SL1 (IY+d)->L", "SL1 (IY+d)", "SL1 (IY+d)->A", - "SRL (IY+d)->B", "SRL (IY+d)->C", "SRL (IY+d)->D", "SRL (IY+d)->E", "SRL (IY+d)->H", "SRL (IY+d)->L", "SRL (IY+d)", "SRL (IY+d)->A", - "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", "BIT 0, (IY+d)", - "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", "BIT 1, (IY+d)", - "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", "BIT 2, (IY+d)", - "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", "BIT 3, (IY+d)", - "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", "BIT 4, (IY+d)", - "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", "BIT 5, (IY+d)", - "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", "BIT 6, (IY+d)", - "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", "BIT 7, (IY+d)", - "RES 0 (IY+d)->B", "RES 0 (IY+d)->C", "RES 0 (IY+d)->D", "RES 0 (IY+d)->E", "RES 0 (IY+d)->H", "RES 0 (IY+d)->L", "RES 0 (IY+d)", "RES 0 (IY+d)->A", - "RES 1 (IY+d)->B", "RES 1 (IY+d)->C", "RES 1 (IY+d)->D", "RES 1 (IY+d)->E", "RES 1 (IY+d)->H", "RES 1 (IY+d)->L", "RES 1 (IY+d)", "RES 1 (IY+d)->A", - "RES 2 (IY+d)->B", "RES 2 (IY+d)->C", "RES 2 (IY+d)->D", "RES 2 (IY+d)->E", "RES 2 (IY+d)->H", "RES 2 (IY+d)->L", "RES 2 (IY+d)", "RES 2 (IY+d)->A", - "RES 3 (IY+d)->B", "RES 3 (IY+d)->C", "RES 3 (IY+d)->D", "RES 3 (IY+d)->E", "RES 3 (IY+d)->H", "RES 3 (IY+d)->L", "RES 3 (IY+d)", "RES 3 (IY+d)->A", - "RES 4 (IY+d)->B", "RES 4 (IY+d)->C", "RES 4 (IY+d)->D", "RES 4 (IY+d)->E", "RES 4 (IY+d)->H", "RES 4 (IY+d)->L", "RES 4 (IY+d)", "RES 4 (IY+d)->A", - "RES 5 (IY+d)->B", "RES 5 (IY+d)->C", "RES 5 (IY+d)->D", "RES 5 (IY+d)->E", "RES 5 (IY+d)->H", "RES 5 (IY+d)->L", "RES 5 (IY+d)", "RES 5 (IY+d)->A", - "RES 6 (IY+d)->B", "RES 6 (IY+d)->C", "RES 6 (IY+d)->D", "RES 6 (IY+d)->E", "RES 6 (IY+d)->H", "RES 6 (IY+d)->L", "RES 6 (IY+d)", "RES 6 (IY+d)->A", - "RES 7 (IY+d)->B", "RES 7 (IY+d)->C", "RES 7 (IY+d)->D", "RES 7 (IY+d)->E", "RES 7 (IY+d)->H", "RES 7 (IY+d)->L", "RES 7 (IY+d)", "RES 7 (IY+d)->A", - "SET 0 (IY+d)->B", "SET 0 (IY+d)->C", "SET 0 (IY+d)->D", "SET 0 (IY+d)->E", "SET 0 (IY+d)->H", "SET 0 (IY+d)->L", "SET 0 (IY+d)", "SET 0 (IY+d)->A", - "SET 1 (IY+d)->B", "SET 1 (IY+d)->C", "SET 1 (IY+d)->D", "SET 1 (IY+d)->E", "SET 1 (IY+d)->H", "SET 1 (IY+d)->L", "SET 1 (IY+d)", "SET 1 (IY+d)->A", - "SET 2 (IY+d)->B", "SET 2 (IY+d)->C", "SET 2 (IY+d)->D", "SET 2 (IY+d)->E", "SET 2 (IY+d)->H", "SET 2 (IY+d)->L", "SET 2 (IY+d)", "SET 2 (IY+d)->A", - "SET 3 (IY+d)->B", "SET 3 (IY+d)->C", "SET 3 (IY+d)->D", "SET 3 (IY+d)->E", "SET 3 (IY+d)->H", "SET 3 (IY+d)->L", "SET 3 (IY+d)", "SET 3 (IY+d)->A", - "SET 4 (IY+d)->B", "SET 4 (IY+d)->C", "SET 4 (IY+d)->D", "SET 4 (IY+d)->E", "SET 4 (IY+d)->H", "SET 4 (IY+d)->L", "SET 4 (IY+d)", "SET 4 (IY+d)->A", - "SET 5 (IY+d)->B", "SET 5 (IY+d)->C", "SET 5 (IY+d)->D", "SET 5 (IY+d)->E", "SET 5 (IY+d)->H", "SET 5 (IY+d)->L", "SET 5 (IY+d)", "SET 5 (IY+d)->A", - "SET 6 (IY+d)->B", "SET 6 (IY+d)->C", "SET 6 (IY+d)->D", "SET 6 (IY+d)->E", "SET 6 (IY+d)->H", "SET 6 (IY+d)->L", "SET 6 (IY+d)", "SET 6 (IY+d)->A", - "SET 7 (IY+d)->B", "SET 7 (IY+d)->C", "SET 7 (IY+d)->D", "SET 7 (IY+d)->E", "SET 7 (IY+d)->H", "SET 7 (IY+d)->L", "SET 7 (IY+d)", "SET 7 (IY+d)->A", - }; - - readonly static string[] mnemonicsCB = new string[] - { - "RLC B", "RLC C", "RLC D", "RLC E", "RLC H", "RLC L", "RLC (HL)", "RLC A", - "RRC B", "RRC C", "RRC D", "RRC E", "RRC H", "RRC L", "RRC (HL)", "RRC A", - "RL B", "RL C", "RL D", "RL E", "RL H", "RL L", "RL (HL)", "RL A", - "RR B", "RR C", "RR D", "RR E", "RR H", "RR L", "RR (HL)", "RR A", - "SLA B", "SLA C", "SLA D", "SLA E", "SLA H", "SLA L", "SLA (HL)", "SLA A", - "SRA B", "SRA C", "SRA D", "SRA E", "SRA H", "SRA L", "SRA (HL)", "SRA A", - "SL1 B", "SL1 C", "SL1 D", "SL1 E", "SL1 H", "SL1 L", "SL1 (HL)", "SL1 A", - "SRL B", "SRL C", "SRL D", "SRL E", "SRL H", "SRL L", "SRL (HL)", "SRL A", - "BIT 0, B", "BIT 0, C", "BIT 0, D", "BIT 0, E", "BIT 0, H", "BIT 0, L", "BIT 0, (HL)", "BIT 0, A", - "BIT 1, B", "BIT 1, C", "BIT 1, D", "BIT 1, E", "BIT 1, H", "BIT 1, L", "BIT 1, (HL)", "BIT 1, A", - "BIT 2, B", "BIT 2, C", "BIT 2, D", "BIT 2, E", "BIT 2, H", "BIT 2, L", "BIT 2, (HL)", "BIT 2, A", - "BIT 3, B", "BIT 3, C", "BIT 3, D", "BIT 3, E", "BIT 3, H", "BIT 3, L", "BIT 3, (HL)", "BIT 3, A", - "BIT 4, B", "BIT 4, C", "BIT 4, D", "BIT 4, E", "BIT 4, H", "BIT 4, L", "BIT 4, (HL)", "BIT 4, A", - "BIT 5, B", "BIT 5, C", "BIT 5, D", "BIT 5, E", "BIT 5, H", "BIT 5, L", "BIT 5, (HL)", "BIT 5, A", - "BIT 6, B", "BIT 6, C", "BIT 6, D", "BIT 6, E", "BIT 6, H", "BIT 6, L", "BIT 6, (HL)", "BIT 6, A", - "BIT 7, B", "BIT 7, C", "BIT 7, D", "BIT 7, E", "BIT 7, H", "BIT 7, L", "BIT 7, (HL)", "BIT 7, A", - "RES 0, B", "RES 0, C", "RES 0, D", "RES 0, E", "RES 0, H", "RES 0, L", "RES 0, (HL)", "RES 0, A", - "RES 1, B", "RES 1, C", "RES 1, D", "RES 1, E", "RES 1, H", "RES 1, L", "RES 1, (HL)", "RES 1, A", - "RES 2, B", "RES 2, C", "RES 2, D", "RES 2, E", "RES 2, H", "RES 2, L", "RES 2, (HL)", "RES 2, A", - "RES 3, B", "RES 3, C", "RES 3, D", "RES 3, E", "RES 3, H", "RES 3, L", "RES 3, (HL)", "RES 3, A", - "RES 4, B", "RES 4, C", "RES 4, D", "RES 4, E", "RES 4, H", "RES 4, L", "RES 4, (HL)", "RES 4, A", - "RES 5, B", "RES 5, C", "RES 5, D", "RES 5, E", "RES 5, H", "RES 5, L", "RES 5, (HL)", "RES 5, A", - "RES 6, B", "RES 6, C", "RES 6, D", "RES 6, E", "RES 6, H", "RES 6, L", "RES 6, (HL)", "RES 6, A", - "RES 7, B", "RES 7, C", "RES 7, D", "RES 7, E", "RES 7, H", "RES 7, L", "RES 7, (HL)", "RES 7, A", - "SET 0, B", "SET 0, C", "SET 0, D", "SET 0, E", "SET 0, H", "SET 0, L", "SET 0, (HL)", "SET 0, A", - "SET 1, B", "SET 1, C", "SET 1, D", "SET 1, E", "SET 1, H", "SET 1, L", "SET 1, (HL)", "SET 1, A", - "SET 2, B", "SET 2, C", "SET 2, D", "SET 2, E", "SET 2, H", "SET 2, L", "SET 2, (HL)", "SET 2, A", - "SET 3, B", "SET 3, C", "SET 3, D", "SET 3, E", "SET 3, H", "SET 3, L", "SET 3, (HL)", "SET 3, A", - "SET 4, B", "SET 4, C", "SET 4, D", "SET 4, E", "SET 4, H", "SET 4, L", "SET 4, (HL)", "SET 4, A", - "SET 5, B", "SET 5, C", "SET 5, D", "SET 5, E", "SET 5, H", "SET 5, L", "SET 5, (HL)", "SET 5, A", - "SET 6, B", "SET 6, C", "SET 6, D", "SET 6, E", "SET 6, H", "SET 6, L", "SET 6, (HL)", "SET 6, A", - "SET 7, B", "SET 7, C", "SET 7, D", "SET 7, E", "SET 7, H", "SET 7, L", "SET 7, (HL)", "SET 7, A", - }; - - readonly static string[] mnemonicsED = new string[] - { - "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", - "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", - "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", - "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", - - "IN B, C", "OUT C, B", "SBC HL, BC", "LD (nn), BC", //0x44 - "NEG", "RETN", "IM $0", "LD I, A", //0x48 - "IN C, C", "OUT C, C", "ADC HL, BC", "LD BC, (nn)", //0x4C - "NEG", "RETI", "IM $0", "LD R, A", //0x50 - "IN D, C", "OUT C, D", "SBC HL, DE", "LD (nn), DE", //0x54 - "NEG", "RETN", "IM $1", "LD A, I", //0x58 - "IN E, C", "OUT C, E", "ADC HL, DE", "LD DE, (nn)", //0x5C - "NEG", "RETI", "IM $2", "LD A, R", //0x60 - - "IN H, C", "OUT C, H", "SBC HL, HL", "LD (nn), HL", //0x64 - "NEG", "RETN", "IM $0", "RRD", //0x68 - "IN L, C", "OUT C, L", "ADC HL, HL", "LD HL, (nn)", //0x6C - "NEG", "RETI", "IM $0", "RLD", //0x70 - "IN 0, C", "OUT C, 0", "SBC HL, SP", "LD (nn), SP", //0x74 - "NEG", "RETN", "IM $1", "NOP", //0x78 - "IN A, C", "OUT C, A", "ADC HL, SP", "LD SP, (nn)", //0x7C - "NEG", "RETI", "IM $2", "NOP", //0x80 - - "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0x90 - "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0xA0 - "LDI", "CPI", "INI", "OUTI", //0xA4 - "NOP", "NOP", "NOP", "NOP", //0xA8 - "LDD", "CPD", "IND", "OUTD", //0xAC - "NOP", "NOP", "NOP", "NOP", //0xB0 - "LDIR", "CPIR", "INIR", "OTIR", //0xB4 - "NOP", "NOP", "NOP", "NOP", //0xB8 - "LDDR", "CPDR", "INDR", "OTDR", //0xBC - "NOP", "NOP", "NOP", "NOP", //0xC0 - - "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0xD0 - "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0xE0 - "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0xF0 - "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", "NOP", //0x100 - }; - - string DisassembleInternal(Func read) - { - byte A = read(); - string format; - switch (A) - { - case 0xCB: - A = read(); - format = mnemonicsCB[A]; - break; - case 0xDD: - A = read(); - switch (A) - { - case 0xCB: format = mnemonicsDDCB[A]; break; - case 0xED: format = mnemonicsED[A]; break; - default: format = mnemonicsDD[A]; break; - } - break; - case 0xED: - A = read(); - format = mnemonicsED[A]; - break; - case 0xFD: - A = read(); - switch (A) - { - case 0xCB: format = mnemonicsFDCB[A]; break; - case 0xED: format = mnemonicsED[A]; break; - default: format = mnemonicsFD[A]; break; - } - break; - default: format = mnemonics[A]; break; - } - return format; - } - - public string Disassemble(Func read) - { - return Result(DisassembleInternal(read), read); - } - - #region IDisassemblable - - public string Cpu - { - get { return "Z80"; } - set { } - } - - public string PCRegisterName - { - get { return "PC"; } - } - - public IEnumerable AvailableCpus - { - get { yield return "Z80"; } - } - - public string Disassemble(MemoryDomain m, uint addr, out int length) - { - int loc = (int)addr; - string ret = Disassemble(() => m.PeekByte(loc++)); - length = loc - (int)addr; - return ret; - } - - #endregion - } -} From 12e709e0451719380cfa38ac56a9d20025b04054 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 17:52:17 -0400 Subject: [PATCH 177/219] Delete Execute.cs --- BizHawk.Emulation.Cores/CPUs/Z80/Execute.cs | 12491 ------------------ 1 file changed, 12491 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/CPUs/Z80/Execute.cs diff --git a/BizHawk.Emulation.Cores/CPUs/Z80/Execute.cs b/BizHawk.Emulation.Cores/CPUs/Z80/Execute.cs deleted file mode 100644 index ee77ddde91..0000000000 --- a/BizHawk.Emulation.Cores/CPUs/Z80/Execute.cs +++ /dev/null @@ -1,12491 +0,0 @@ -using BizHawk.Common.NumberExtensions; -using BizHawk.Emulation.Common; -using System; - -namespace BizHawk.Emulation.Cores.Components.Z80 -{ - public partial class Z80A - { - private int totalExecutedCycles; - public int TotalExecutedCycles { get { return totalExecutedCycles; } set { totalExecutedCycles = value; } } - - private int expectedExecutedCycles; - public int ExpectedExecutedCycles { get { return expectedExecutedCycles; } set { expectedExecutedCycles = value; } } - - private int pendingCycles; - public int PendingCycles { get { return pendingCycles; } set { pendingCycles = value; } } - - private int EI_pending; - - private ushort temp_WZ; - - public bool Debug; - public Action Logger; - - /// - /// Runs the CPU for a particular number of clock cycles. - /// - /// The number of cycles to run the CPU emulator for. Specify -1 to run for a single instruction. - public void ExecuteCycles(int cycles) - { - expectedExecutedCycles += cycles; - pendingCycles += cycles; - - sbyte Displacement; - - byte TB; byte TBH; byte TBL; byte TB1; byte TB2; sbyte TSB; ushort TUS; int TI1; int TI2; int TIR; - - bool Interruptable; - - while (pendingCycles > 0) - { - Interruptable = true; - - if (halted) - { - ++RegR; - totalExecutedCycles += 4; pendingCycles -= 4; - } - else - { - if (Debug) - { - Logger(State()); - } - - if (MemoryCallbacks != null) - { - MemoryCallbacks.CallExecutes(RegPC.Word); - } - - ++RegR; - switch (FetchFirstMemoryWrapper(RegPC.Word++)) - { - case 0x00: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x01: // LD BC, nn - RegBC.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x02: // LD (BC), A - RegWZ.Low = (byte)((RegBC.Word + 1) & 0xFF); - RegWZ.High = RegAF.High; - WriteMemoryWrapper(RegBC.Word, RegAF.High); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x03: // INC BC - ++RegBC.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x04: // INC B - RegAF.Low = (byte)(TableInc[++RegBC.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x05: // DEC B - RegAF.Low = (byte)(TableDec[--RegBC.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x06: // LD B, n - RegBC.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x07: // RLCA - RegAF.Word = TableRotShift[0, 0, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x08: // EX AF, AF' - TUS = RegAF.Word; RegAF.Word = RegAltAF.Word; RegAltAF.Word = TUS; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x09: // ADD HL, BC - RegWZ = (ushort)(RegHL + 1); - TI1 = (short)RegHL.Word; TI2 = (short)RegBC.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0x0A: // LD A, (BC) - RegAF.High = ReadMemoryWrapper(RegBC.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - RegWZ = (ushort)(RegBC.Word + 1); - break; - case 0x0B: // DEC BC - --RegBC.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x0C: // INC C - RegAF.Low = (byte)(TableInc[++RegBC.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0D: // DEC C - RegAF.Low = (byte)(TableDec[--RegBC.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0E: // LD C, n - RegBC.Low = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x0F: // RRCA - RegAF.Word = TableRotShift[0, 1, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x10: // DJNZ d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (--RegBC.High != 0) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 13; pendingCycles -= 13; - } - else - { - totalExecutedCycles += 8; pendingCycles -= 8; - } - break; - case 0x11: // LD DE, nn - RegDE.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x12: // LD (DE), A - RegWZ.Low = (byte)((RegDE.Word + 1) & 0xFF); - RegWZ.High = RegAF.High; - WriteMemoryWrapper(RegDE.Word, RegAF.High); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x13: // INC DE - ++RegDE.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x14: // INC D - RegAF.Low = (byte)(TableInc[++RegDE.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x15: // DEC D - RegAF.Low = (byte)(TableDec[--RegDE.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x16: // LD D, n - RegDE.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x17: // RLA - RegAF.Word = TableRotShift[0, 2, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x18: // JR d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x19: // ADD HL, DE - RegWZ = (ushort)(RegHL + 1); - TI1 = (short)RegHL.Word; TI2 = (short)RegDE.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0x1A: // LD A, (DE) - RegAF.High = ReadMemoryWrapper(RegDE.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - RegWZ = (ushort)(RegDE.Word + 1); - break; - case 0x1B: // DEC DE - --RegDE.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x1C: // INC E - RegAF.Low = (byte)(TableInc[++RegDE.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1D: // DEC E - RegAF.Low = (byte)(TableDec[--RegDE.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1E: // LD E, n - RegDE.Low = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x1F: // RRA - RegAF.Word = TableRotShift[0, 3, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x20: // JR NZ, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (!RegFlagZ) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x21: // LD HL, nn - RegHL.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x22: // LD (nn), HL - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegHL.Low); - WriteMemoryWrapper(TUS, RegHL.High); - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0x23: // INC HL - ++RegHL.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x24: // INC H - RegAF.Low = (byte)(TableInc[++RegHL.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x25: // DEC H - RegAF.Low = (byte)(TableDec[--RegHL.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x26: // LD H, n - RegHL.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x27: // DAA - RegAF.Word = TableDaa[RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x28: // JR Z, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (RegFlagZ) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x29: // ADD HL, HL - RegWZ = (ushort)(RegHL + 1); - TI1 = (short)RegHL.Word; TI2 = (short)RegHL.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0x2A: // LD HL, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegHL.Low = ReadMemoryWrapper(TUS++); RegHL.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0x2B: // DEC HL - --RegHL.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x2C: // INC L - RegAF.Low = (byte)(TableInc[++RegHL.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2D: // DEC L - RegAF.Low = (byte)(TableDec[--RegHL.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2E: // LD L, n - RegHL.Low = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x2F: // CPL - RegAF.High ^= 0xFF; RegFlagH = true; RegFlagN = true; RegFlag3 = (RegAF.High & 0x08) != 0; RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x30: // JR NC, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (!RegFlagC) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x31: // LD SP, nn - RegSP.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x32: // LD (nn), A - temp_WZ = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ.Low = (byte)((temp_WZ + 1) & 0xFF); - RegWZ.High = RegAF.High; - WriteMemoryWrapper(temp_WZ, RegAF.High); - totalExecutedCycles += 13; pendingCycles -= 13; - break; - case 0x33: // INC SP - ++RegSP.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x34: // INC (HL) - TB = ReadMemoryWrapper(RegHL.Word); RegAF.Low = (byte)(TableInc[++TB] | (RegAF.Low & 1)); WriteMemoryWrapper(RegHL.Word, TB); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0x35: // DEC (HL) - TB = ReadMemoryWrapper(RegHL.Word); RegAF.Low = (byte)(TableDec[--TB] | (RegAF.Low & 1)); WriteMemoryWrapper(RegHL.Word, TB); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0x36: // LD (HL), n - WriteMemoryWrapper(RegHL.Word, FetchMemoryWrapper(RegPC.Word++)); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x37: // SCF - RegFlagH = false; RegFlagN = false; RegFlagC = true; RegFlag3 = (RegAF.High & 0x08) != 0; RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x38: // JR C, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (RegFlagC) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x39: // ADD HL, SP - RegWZ = (ushort)(RegHL + 1); - TI1 = (short)RegHL.Word; TI2 = (short)RegSP.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0x3A: // LD A, (nn) - temp_WZ = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegAF.High = ReadMemoryWrapper(temp_WZ); - totalExecutedCycles += 13; pendingCycles -= 13; - RegWZ.Word = (ushort)(temp_WZ + 1); - break; - case 0x3B: // DEC SP - --RegSP.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x3C: // INC A - RegAF.Low = (byte)(TableInc[++RegAF.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3D: // DEC A - RegAF.Low = (byte)(TableDec[--RegAF.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3E: // LD A, n - RegAF.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x3F: // CCF - RegFlagH = RegFlagC; RegFlagN = false; RegFlagC ^= true; RegFlag3 = (RegAF.High & 0x08) != 0; RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x40: // LD B, B - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x41: // LD B, C - RegBC.High = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x42: // LD B, D - RegBC.High = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x43: // LD B, E - RegBC.High = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x44: // LD B, H - RegBC.High = RegHL.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x45: // LD B, L - RegBC.High = RegHL.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x46: // LD B, (HL) - RegBC.High = ReadMemoryWrapper(RegHL.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x47: // LD B, A - RegBC.High = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x48: // LD C, B - RegBC.Low = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x49: // LD C, C - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4A: // LD C, D - RegBC.Low = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4B: // LD C, E - RegBC.Low = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4C: // LD C, H - RegBC.Low = RegHL.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4D: // LD C, L - RegBC.Low = RegHL.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4E: // LD C, (HL) - RegBC.Low = ReadMemoryWrapper(RegHL.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x4F: // LD C, A - RegBC.Low = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x50: // LD D, B - RegDE.High = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x51: // LD D, C - RegDE.High = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x52: // LD D, D - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x53: // LD D, E - RegDE.High = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x54: // LD D, H - RegDE.High = RegHL.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x55: // LD D, L - RegDE.High = RegHL.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x56: // LD D, (HL) - RegDE.High = ReadMemoryWrapper(RegHL.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x57: // LD D, A - RegDE.High = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x58: // LD E, B - RegDE.Low = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x59: // LD E, C - RegDE.Low = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5A: // LD E, D - RegDE.Low = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5B: // LD E, E - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5C: // LD E, H - RegDE.Low = RegHL.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5D: // LD E, L - RegDE.Low = RegHL.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5E: // LD E, (HL) - RegDE.Low = ReadMemoryWrapper(RegHL.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x5F: // LD E, A - RegDE.Low = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x60: // LD H, B - RegHL.High = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x61: // LD H, C - RegHL.High = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x62: // LD H, D - RegHL.High = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x63: // LD H, E - RegHL.High = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x64: // LD H, H - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x65: // LD H, L - RegHL.High = RegHL.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x66: // LD H, (HL) - RegHL.High = ReadMemoryWrapper(RegHL.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x67: // LD H, A - RegHL.High = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x68: // LD L, B - RegHL.Low = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x69: // LD L, C - RegHL.Low = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x6A: // LD L, D - RegHL.Low = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x6B: // LD L, E - RegHL.Low = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x6C: // LD L, H - RegHL.Low = RegHL.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x6D: // LD L, L - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x6E: // LD L, (HL) - RegHL.Low = ReadMemoryWrapper(RegHL.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x6F: // LD L, A - RegHL.Low = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x70: // LD (HL), B - WriteMemoryWrapper(RegHL.Word, RegBC.High); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x71: // LD (HL), C - WriteMemoryWrapper(RegHL.Word, RegBC.Low); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x72: // LD (HL), D - WriteMemoryWrapper(RegHL.Word, RegDE.High); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x73: // LD (HL), E - WriteMemoryWrapper(RegHL.Word, RegDE.Low); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x74: // LD (HL), H - WriteMemoryWrapper(RegHL.Word, RegHL.High); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x75: // LD (HL), L - WriteMemoryWrapper(RegHL.Word, RegHL.Low); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x76: // HALT - Halt(); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x77: // LD (HL), A - RegWZ.Low = (byte)((RegHL.Word + 1) & 0xFF); - RegWZ.High = RegAF.High; - WriteMemoryWrapper(RegHL.Word, RegAF.High); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x78: // LD A, B - RegAF.High = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x79: // LD A, C - RegAF.High = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7A: // LD A, D - RegAF.High = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7B: // LD A, E - RegAF.High = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7C: // LD A, H - RegAF.High = RegHL.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7D: // LD A, L - RegAF.High = RegHL.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7E: // LD A, (HL) - RegAF.High = ReadMemoryWrapper(RegHL.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - RegWZ = (ushort)(RegHL.Word + 1); - break; - case 0x7F: // LD A, A - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x80: // ADD A, B - RegAF.Word = TableALU[0, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x81: // ADD A, C - RegAF.Word = TableALU[0, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x82: // ADD A, D - RegAF.Word = TableALU[0, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x83: // ADD A, E - RegAF.Word = TableALU[0, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x84: // ADD A, H - RegAF.Word = TableALU[0, RegAF.High, RegHL.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x85: // ADD A, L - RegAF.Word = TableALU[0, RegAF.High, RegHL.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x86: // ADD A, (HL) - RegWZ = (ushort)(RegHL + 1); - RegAF.Word = TableALU[0, RegAF.High, ReadMemoryWrapper(RegHL.Word), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x87: // ADD A, A - RegAF.Word = TableALU[0, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x88: // ADC A, B - RegAF.Word = TableALU[1, RegAF.High, RegBC.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x89: // ADC A, C - RegAF.Word = TableALU[1, RegAF.High, RegBC.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8A: // ADC A, D - RegAF.Word = TableALU[1, RegAF.High, RegDE.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8B: // ADC A, E - RegAF.Word = TableALU[1, RegAF.High, RegDE.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8C: // ADC A, H - RegAF.Word = TableALU[1, RegAF.High, RegHL.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8D: // ADC A, L - RegAF.Word = TableALU[1, RegAF.High, RegHL.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8E: // ADC A, (HL) - RegAF.Word = TableALU[1, RegAF.High, ReadMemoryWrapper(RegHL.Word), RegFlagC ? 1 : 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x8F: // ADC A, A - RegAF.Word = TableALU[1, RegAF.High, RegAF.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x90: // SUB B - RegAF.Word = TableALU[2, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x91: // SUB C - RegAF.Word = TableALU[2, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x92: // SUB D - RegAF.Word = TableALU[2, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x93: // SUB E - RegAF.Word = TableALU[2, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x94: // SUB H - RegAF.Word = TableALU[2, RegAF.High, RegHL.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x95: // SUB L - RegAF.Word = TableALU[2, RegAF.High, RegHL.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x96: // SUB (HL) - RegAF.Word = TableALU[2, RegAF.High, ReadMemoryWrapper(RegHL.Word), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x97: // SUB A, A - RegAF.Word = TableALU[2, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x98: // SBC A, B - RegAF.Word = TableALU[3, RegAF.High, RegBC.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x99: // SBC A, C - RegAF.Word = TableALU[3, RegAF.High, RegBC.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9A: // SBC A, D - RegAF.Word = TableALU[3, RegAF.High, RegDE.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9B: // SBC A, E - RegAF.Word = TableALU[3, RegAF.High, RegDE.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9C: // SBC A, H - RegAF.Word = TableALU[3, RegAF.High, RegHL.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9D: // SBC A, L - RegAF.Word = TableALU[3, RegAF.High, RegHL.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9E: // SBC A, (HL) - RegAF.Word = TableALU[3, RegAF.High, ReadMemoryWrapper(RegHL.Word), RegFlagC ? 1 : 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x9F: // SBC A, A - RegAF.Word = TableALU[3, RegAF.High, RegAF.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA0: // AND B - RegAF.Word = TableALU[4, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA1: // AND C - RegAF.Word = TableALU[4, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA2: // AND D - RegAF.Word = TableALU[4, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA3: // AND E - RegAF.Word = TableALU[4, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA4: // AND H - RegAF.Word = TableALU[4, RegAF.High, RegHL.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA5: // AND L - RegAF.Word = TableALU[4, RegAF.High, RegHL.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA6: // AND (HL) - RegAF.Word = TableALU[4, RegAF.High, ReadMemoryWrapper(RegHL.Word), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xA7: // AND A - RegAF.Word = TableALU[4, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA8: // XOR B - RegAF.Word = TableALU[5, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA9: // XOR C - RegAF.Word = TableALU[5, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAA: // XOR D - RegAF.Word = TableALU[5, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAB: // XOR E - RegAF.Word = TableALU[5, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAC: // XOR H - RegAF.Word = TableALU[5, RegAF.High, RegHL.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAD: // XOR L - RegAF.Word = TableALU[5, RegAF.High, RegHL.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAE: // XOR (HL) - RegAF.Word = TableALU[5, RegAF.High, ReadMemoryWrapper(RegHL.Word), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xAF: // XOR A - RegAF.Word = TableALU[5, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB0: // OR B - RegAF.Word = TableALU[6, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB1: // OR C - RegAF.Word = TableALU[6, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB2: // OR D - RegAF.Word = TableALU[6, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB3: // OR E - RegAF.Word = TableALU[6, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB4: // OR H - RegAF.Word = TableALU[6, RegAF.High, RegHL.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB5: // OR L - RegAF.Word = TableALU[6, RegAF.High, RegHL.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB6: // OR (HL) - RegAF.Word = TableALU[6, RegAF.High, ReadMemoryWrapper(RegHL.Word), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xB7: // OR A - RegAF.Word = TableALU[6, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB8: // CP B - RegAF.Word = TableALU[7, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB9: // CP C - RegAF.Word = TableALU[7, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBA: // CP D - RegAF.Word = TableALU[7, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBB: // CP E - RegAF.Word = TableALU[7, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBC: // CP H - RegAF.Word = TableALU[7, RegAF.High, RegHL.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBD: // CP L - RegAF.Word = TableALU[7, RegAF.High, RegHL.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBE: // CP (HL) - RegAF.Word = TableALU[7, RegAF.High, ReadMemoryWrapper(RegHL.Word), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xBF: // CP A - RegAF.Word = TableALU[7, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC0: // RET NZ - if (!RegFlagZ) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xC1: // POP BC - RegBC.Low = ReadMemoryWrapper(RegSP.Word++); RegBC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xC2: // JP NZ, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagZ) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xC3: // JP nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - RegPC.Word = TUS; - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xC4: // CALL NZ, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagZ) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xC5: // PUSH BC - WriteMemoryWrapper(--RegSP.Word, RegBC.High); WriteMemoryWrapper(--RegSP.Word, RegBC.Low); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xC6: // ADD A, n - RegAF.Word = TableALU[0, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xC7: // RST $00 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x00; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xC8: // RET Z - if (RegFlagZ) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xC9: // RET - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xCA: // JP Z, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagZ) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xCB: // (Prefix) - ++RegR; - switch (FetchMemoryWrapper(RegPC.Word++)) - { - case 0x00: // RLC B - TUS = TableRotShift[1, 0, RegAF.Low + 256 * RegBC.High]; - RegBC.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x01: // RLC C - TUS = TableRotShift[1, 0, RegAF.Low + 256 * RegBC.Low]; - RegBC.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x02: // RLC D - TUS = TableRotShift[1, 0, RegAF.Low + 256 * RegDE.High]; - RegDE.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x03: // RLC E - TUS = TableRotShift[1, 0, RegAF.Low + 256 * RegDE.Low]; - RegDE.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x04: // RLC H - TUS = TableRotShift[1, 0, RegAF.Low + 256 * RegHL.High]; - RegHL.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x05: // RLC L - TUS = TableRotShift[1, 0, RegAF.Low + 256 * RegHL.Low]; - RegHL.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x06: // RLC (HL) - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper(RegHL.Word)]; - WriteMemoryWrapper(RegHL.Word, (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x07: // RLC A - TUS = TableRotShift[1, 0, RegAF.Low + 256 * RegAF.High]; - RegAF.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x08: // RRC B - TUS = TableRotShift[1, 1, RegAF.Low + 256 * RegBC.High]; - RegBC.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x09: // RRC C - TUS = TableRotShift[1, 1, RegAF.Low + 256 * RegBC.Low]; - RegBC.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x0A: // RRC D - TUS = TableRotShift[1, 1, RegAF.Low + 256 * RegDE.High]; - RegDE.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x0B: // RRC E - TUS = TableRotShift[1, 1, RegAF.Low + 256 * RegDE.Low]; - RegDE.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x0C: // RRC H - TUS = TableRotShift[1, 1, RegAF.Low + 256 * RegHL.High]; - RegHL.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x0D: // RRC L - TUS = TableRotShift[1, 1, RegAF.Low + 256 * RegHL.Low]; - RegHL.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x0E: // RRC (HL) - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper(RegHL.Word)]; - WriteMemoryWrapper(RegHL.Word, (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x0F: // RRC A - TUS = TableRotShift[1, 1, RegAF.Low + 256 * RegAF.High]; - RegAF.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x10: // RL B - TUS = TableRotShift[1, 2, RegAF.Low + 256 * RegBC.High]; - RegBC.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x11: // RL C - TUS = TableRotShift[1, 2, RegAF.Low + 256 * RegBC.Low]; - RegBC.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x12: // RL D - TUS = TableRotShift[1, 2, RegAF.Low + 256 * RegDE.High]; - RegDE.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x13: // RL E - TUS = TableRotShift[1, 2, RegAF.Low + 256 * RegDE.Low]; - RegDE.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x14: // RL H - TUS = TableRotShift[1, 2, RegAF.Low + 256 * RegHL.High]; - RegHL.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x15: // RL L - TUS = TableRotShift[1, 2, RegAF.Low + 256 * RegHL.Low]; - RegHL.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x16: // RL (HL) - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper(RegHL.Word)]; - WriteMemoryWrapper(RegHL.Word, (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x17: // RL A - TUS = TableRotShift[1, 2, RegAF.Low + 256 * RegAF.High]; - RegAF.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x18: // RR B - TUS = TableRotShift[1, 3, RegAF.Low + 256 * RegBC.High]; - RegBC.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x19: // RR C - TUS = TableRotShift[1, 3, RegAF.Low + 256 * RegBC.Low]; - RegBC.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x1A: // RR D - TUS = TableRotShift[1, 3, RegAF.Low + 256 * RegDE.High]; - RegDE.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x1B: // RR E - TUS = TableRotShift[1, 3, RegAF.Low + 256 * RegDE.Low]; - RegDE.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x1C: // RR H - TUS = TableRotShift[1, 3, RegAF.Low + 256 * RegHL.High]; - RegHL.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x1D: // RR L - TUS = TableRotShift[1, 3, RegAF.Low + 256 * RegHL.Low]; - RegHL.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x1E: // RR (HL) - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper(RegHL.Word)]; - WriteMemoryWrapper(RegHL.Word, (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x1F: // RR A - TUS = TableRotShift[1, 3, RegAF.Low + 256 * RegAF.High]; - RegAF.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x20: // SLA B - TUS = TableRotShift[1, 4, RegAF.Low + 256 * RegBC.High]; - RegBC.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x21: // SLA C - TUS = TableRotShift[1, 4, RegAF.Low + 256 * RegBC.Low]; - RegBC.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x22: // SLA D - TUS = TableRotShift[1, 4, RegAF.Low + 256 * RegDE.High]; - RegDE.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x23: // SLA E - TUS = TableRotShift[1, 4, RegAF.Low + 256 * RegDE.Low]; - RegDE.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x24: // SLA H - TUS = TableRotShift[1, 4, RegAF.Low + 256 * RegHL.High]; - RegHL.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x25: // SLA L - TUS = TableRotShift[1, 4, RegAF.Low + 256 * RegHL.Low]; - RegHL.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x26: // SLA (HL) - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper(RegHL.Word)]; - WriteMemoryWrapper(RegHL.Word, (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x27: // SLA A - TUS = TableRotShift[1, 4, RegAF.Low + 256 * RegAF.High]; - RegAF.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x28: // SRA B - TUS = TableRotShift[1, 5, RegAF.Low + 256 * RegBC.High]; - RegBC.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x29: // SRA C - TUS = TableRotShift[1, 5, RegAF.Low + 256 * RegBC.Low]; - RegBC.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x2A: // SRA D - TUS = TableRotShift[1, 5, RegAF.Low + 256 * RegDE.High]; - RegDE.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x2B: // SRA E - TUS = TableRotShift[1, 5, RegAF.Low + 256 * RegDE.Low]; - RegDE.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x2C: // SRA H - TUS = TableRotShift[1, 5, RegAF.Low + 256 * RegHL.High]; - RegHL.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x2D: // SRA L - TUS = TableRotShift[1, 5, RegAF.Low + 256 * RegHL.Low]; - RegHL.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x2E: // SRA (HL) - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper(RegHL.Word)]; - WriteMemoryWrapper(RegHL.Word, (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x2F: // SRA A - TUS = TableRotShift[1, 5, RegAF.Low + 256 * RegAF.High]; - RegAF.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x30: // SL1 B - TUS = TableRotShift[1, 6, RegAF.Low + 256 * RegBC.High]; - RegBC.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x31: // SL1 C - TUS = TableRotShift[1, 6, RegAF.Low + 256 * RegBC.Low]; - RegBC.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x32: // SL1 D - TUS = TableRotShift[1, 6, RegAF.Low + 256 * RegDE.High]; - RegDE.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x33: // SL1 E - TUS = TableRotShift[1, 6, RegAF.Low + 256 * RegDE.Low]; - RegDE.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x34: // SL1 H - TUS = TableRotShift[1, 6, RegAF.Low + 256 * RegHL.High]; - RegHL.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x35: // SL1 L - TUS = TableRotShift[1, 6, RegAF.Low + 256 * RegHL.Low]; - RegHL.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x36: // SL1 (HL) - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper(RegHL.Word)]; - WriteMemoryWrapper(RegHL.Word, (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x37: // SL1 A - TUS = TableRotShift[1, 6, RegAF.Low + 256 * RegAF.High]; - RegAF.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x38: // SRL B - TUS = TableRotShift[1, 7, RegAF.Low + 256 * RegBC.High]; - RegBC.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x39: // SRL C - TUS = TableRotShift[1, 7, RegAF.Low + 256 * RegBC.Low]; - RegBC.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x3A: // SRL D - TUS = TableRotShift[1, 7, RegAF.Low + 256 * RegDE.High]; - RegDE.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x3B: // SRL E - TUS = TableRotShift[1, 7, RegAF.Low + 256 * RegDE.Low]; - RegDE.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x3C: // SRL H - TUS = TableRotShift[1, 7, RegAF.Low + 256 * RegHL.High]; - RegHL.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x3D: // SRL L - TUS = TableRotShift[1, 7, RegAF.Low + 256 * RegHL.Low]; - RegHL.Low = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x3E: // SRL (HL) - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper(RegHL.Word)]; - WriteMemoryWrapper(RegHL.Word, (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x3F: // SRL A - TUS = TableRotShift[1, 7, RegAF.Low + 256 * RegAF.High]; - RegAF.High = (byte)(TUS >> 8); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x40: // BIT 0, B - RegFlagZ = (RegBC.High & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.High.Bit(3); - RegFlag5 = RegBC.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x41: // BIT 0, C - RegFlagZ = (RegBC.Low & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.Low.Bit(3); - RegFlag5 = RegBC.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x42: // BIT 0, D - RegFlagZ = (RegDE.High & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.High.Bit(3); - RegFlag5 = RegDE.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x43: // BIT 0, E - RegFlagZ = (RegDE.Low & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.Low.Bit(3); - RegFlag5 = RegDE.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x44: // BIT 0, H - RegFlagZ = (RegHL.High & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.High.Bit(3); - RegFlag5 = RegHL.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x45: // BIT 0, L - RegFlagZ = (RegHL.Low & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.Low.Bit(3); - RegFlag5 = RegHL.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x46: // BIT 0, (HL) - RegFlagZ = (ReadMemoryWrapper(RegHL.Word) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x47: // BIT 0, A - RegFlagZ = (RegAF.High & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegAF.High.Bit(3); - RegFlag5 = RegAF.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x48: // BIT 1, B - RegFlagZ = (RegBC.High & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.High.Bit(3); - RegFlag5 = RegBC.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x49: // BIT 1, C - RegFlagZ = (RegBC.Low & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.Low.Bit(3); - RegFlag5 = RegBC.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4A: // BIT 1, D - RegFlagZ = (RegDE.High & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.High.Bit(3); - RegFlag5 = RegDE.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4B: // BIT 1, E - RegFlagZ = (RegDE.Low & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.Low.Bit(3); - RegFlag5 = RegDE.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4C: // BIT 1, H - RegFlagZ = (RegHL.High & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.High.Bit(3); - RegFlag5 = RegHL.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4D: // BIT 1, L - RegFlagZ = (RegHL.Low & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.Low.Bit(3); - RegFlag5 = RegHL.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4E: // BIT 1, (HL) - RegFlagZ = (ReadMemoryWrapper(RegHL.Word) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x4F: // BIT 1, A - RegFlagZ = (RegAF.High & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegAF.High.Bit(3); - RegFlag5 = RegAF.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x50: // BIT 2, B - RegFlagZ = (RegBC.High & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.High.Bit(3); - RegFlag5 = RegBC.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x51: // BIT 2, C - RegFlagZ = (RegBC.Low & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.Low.Bit(3); - RegFlag5 = RegBC.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x52: // BIT 2, D - RegFlagZ = (RegDE.High & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.High.Bit(3); - RegFlag5 = RegDE.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x53: // BIT 2, E - RegFlagZ = (RegDE.Low & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.Low.Bit(3); - RegFlag5 = RegDE.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x54: // BIT 2, H - RegFlagZ = (RegHL.High & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.High.Bit(3); - RegFlag5 = RegHL.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x55: // BIT 2, L - RegFlagZ = (RegHL.Low & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.Low.Bit(3); - RegFlag5 = RegHL.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x56: // BIT 2, (HL) - RegFlagZ = (ReadMemoryWrapper(RegHL.Word) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x57: // BIT 2, A - RegFlagZ = (RegAF.High & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegAF.High.Bit(3); - RegFlag5 = RegAF.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x58: // BIT 3, B - RegFlagZ = (RegBC.High & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.High.Bit(3); - RegFlag5 = RegBC.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x59: // BIT 3, C - RegFlagZ = (RegBC.Low & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.Low.Bit(3); - RegFlag5 = RegBC.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5A: // BIT 3, D - RegFlagZ = (RegDE.High & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.High.Bit(3); - RegFlag5 = RegDE.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5B: // BIT 3, E - RegFlagZ = (RegDE.Low & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.Low.Bit(3); - RegFlag5 = RegDE.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5C: // BIT 3, H - RegFlagZ = (RegHL.High & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.High.Bit(3); - RegFlag5 = RegHL.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5D: // BIT 3, L - RegFlagZ = (RegHL.Low & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.Low.Bit(3); - RegFlag5 = RegHL.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5E: // BIT 3, (HL) - RegFlagZ = (ReadMemoryWrapper(RegHL.Word) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x5F: // BIT 3, A - RegFlagZ = (RegAF.High & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegAF.High.Bit(3); - RegFlag5 = RegAF.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x60: // BIT 4, B - RegFlagZ = (RegBC.High & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.High.Bit(3); - RegFlag5 = RegBC.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x61: // BIT 4, C - RegFlagZ = (RegBC.Low & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.Low.Bit(3); - RegFlag5 = RegBC.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x62: // BIT 4, D - RegFlagZ = (RegDE.High & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.High.Bit(3); - RegFlag5 = RegDE.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x63: // BIT 4, E - RegFlagZ = (RegDE.Low & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.Low.Bit(3); - RegFlag5 = RegDE.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x64: // BIT 4, H - RegFlagZ = (RegHL.High & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.High.Bit(3); - RegFlag5 = RegHL.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x65: // BIT 4, L - RegFlagZ = (RegHL.Low & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.Low.Bit(3); - RegFlag5 = RegHL.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x66: // BIT 4, (HL) - RegFlagZ = (ReadMemoryWrapper(RegHL.Word) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x67: // BIT 4, A - RegFlagZ = (RegAF.High & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegAF.High.Bit(3); - RegFlag5 = RegAF.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x68: // BIT 5, B - RegFlagZ = (RegBC.High & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.High.Bit(3); - RegFlag5 = RegBC.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x69: // BIT 5, C - RegFlagZ = (RegBC.Low & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.Low.Bit(3); - RegFlag5 = RegBC.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6A: // BIT 5, D - RegFlagZ = (RegDE.High & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.High.Bit(3); - RegFlag5 = RegDE.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6B: // BIT 5, E - RegFlagZ = (RegDE.Low & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.Low.Bit(3); - RegFlag5 = RegDE.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6C: // BIT 5, H - RegFlagZ = (RegHL.High & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.High.Bit(3); - RegFlag5 = RegHL.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6D: // BIT 5, L - RegFlagZ = (RegHL.Low & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.Low.Bit(3); - RegFlag5 = RegHL.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6E: // BIT 5, (HL) - RegFlagZ = (ReadMemoryWrapper(RegHL.Word) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x6F: // BIT 5, A - RegFlagZ = (RegAF.High & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegAF.High.Bit(3); - RegFlag5 = RegAF.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x70: // BIT 6, B - RegFlagZ = (RegBC.High & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.High.Bit(3); - RegFlag5 = RegBC.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x71: // BIT 6, C - RegFlagZ = (RegBC.Low & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegBC.Low.Bit(3); - RegFlag5 = RegBC.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x72: // BIT 6, D - RegFlagZ = (RegDE.High & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.High.Bit(3); - RegFlag5 = RegDE.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x73: // BIT 6, E - RegFlagZ = (RegDE.Low & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegDE.Low.Bit(3); - RegFlag5 = RegDE.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x74: // BIT 6, H - RegFlagZ = (RegHL.High & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.High.Bit(3); - RegFlag5 = RegHL.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x75: // BIT 6, L - RegFlagZ = (RegHL.Low & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegHL.Low.Bit(3); - RegFlag5 = RegHL.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x76: // BIT 6, (HL) - RegFlagZ = (ReadMemoryWrapper(RegHL.Word) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x77: // BIT 6, A - RegFlagZ = (RegAF.High & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegAF.High.Bit(3); - RegFlag5 = RegAF.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x78: // BIT 7, B - RegFlagZ = (RegBC.High & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegBC.High.Bit(3); - RegFlag5 = RegBC.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x79: // BIT 7, C - RegFlagZ = (RegBC.Low & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegBC.Low.Bit(3); - RegFlag5 = RegBC.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7A: // BIT 7, D - RegFlagZ = (RegDE.High & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegDE.High.Bit(3); - RegFlag5 = RegDE.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7B: // BIT 7, E - RegFlagZ = (RegDE.Low & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegDE.Low.Bit(3); - RegFlag5 = RegDE.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7C: // BIT 7, H - RegFlagZ = (RegHL.High & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegHL.High.Bit(3); - RegFlag5 = RegHL.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7D: // BIT 7, L - RegFlagZ = (RegHL.Low & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegHL.Low.Bit(3); - RegFlag5 = RegHL.Low.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7E: // BIT 7, (HL) - RegFlagZ = (ReadMemoryWrapper(RegHL.Word) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x7F: // BIT 7, A - RegFlagZ = (RegAF.High & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegAF.High.Bit(3); - RegFlag5 = RegAF.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x80: // RES 0, B - RegBC.High &= unchecked((byte)~0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x81: // RES 0, C - RegBC.Low &= unchecked((byte)~0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x82: // RES 0, D - RegDE.High &= unchecked((byte)~0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x83: // RES 0, E - RegDE.Low &= unchecked((byte)~0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x84: // RES 0, H - RegHL.High &= unchecked((byte)~0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x85: // RES 0, L - RegHL.Low &= unchecked((byte)~0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x86: // RES 0, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) & unchecked((byte)~0x01))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x87: // RES 0, A - RegAF.High &= unchecked((byte)~0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x88: // RES 1, B - RegBC.High &= unchecked((byte)~0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x89: // RES 1, C - RegBC.Low &= unchecked((byte)~0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x8A: // RES 1, D - RegDE.High &= unchecked((byte)~0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x8B: // RES 1, E - RegDE.Low &= unchecked((byte)~0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x8C: // RES 1, H - RegHL.High &= unchecked((byte)~0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x8D: // RES 1, L - RegHL.Low &= unchecked((byte)~0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x8E: // RES 1, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) & unchecked((byte)~0x02))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x8F: // RES 1, A - RegAF.High &= unchecked((byte)~0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x90: // RES 2, B - RegBC.High &= unchecked((byte)~0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x91: // RES 2, C - RegBC.Low &= unchecked((byte)~0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x92: // RES 2, D - RegDE.High &= unchecked((byte)~0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x93: // RES 2, E - RegDE.Low &= unchecked((byte)~0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x94: // RES 2, H - RegHL.High &= unchecked((byte)~0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x95: // RES 2, L - RegHL.Low &= unchecked((byte)~0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x96: // RES 2, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) & unchecked((byte)~0x04))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x97: // RES 2, A - RegAF.High &= unchecked((byte)~0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x98: // RES 3, B - RegBC.High &= unchecked((byte)~0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x99: // RES 3, C - RegBC.Low &= unchecked((byte)~0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x9A: // RES 3, D - RegDE.High &= unchecked((byte)~0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x9B: // RES 3, E - RegDE.Low &= unchecked((byte)~0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x9C: // RES 3, H - RegHL.High &= unchecked((byte)~0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x9D: // RES 3, L - RegHL.Low &= unchecked((byte)~0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x9E: // RES 3, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) & unchecked((byte)~0x08))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x9F: // RES 3, A - RegAF.High &= unchecked((byte)~0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA0: // RES 4, B - RegBC.High &= unchecked((byte)~0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA1: // RES 4, C - RegBC.Low &= unchecked((byte)~0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA2: // RES 4, D - RegDE.High &= unchecked((byte)~0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA3: // RES 4, E - RegDE.Low &= unchecked((byte)~0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA4: // RES 4, H - RegHL.High &= unchecked((byte)~0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA5: // RES 4, L - RegHL.Low &= unchecked((byte)~0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA6: // RES 4, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) & unchecked((byte)~0x10))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xA7: // RES 4, A - RegAF.High &= unchecked((byte)~0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA8: // RES 5, B - RegBC.High &= unchecked((byte)~0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA9: // RES 5, C - RegBC.Low &= unchecked((byte)~0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xAA: // RES 5, D - RegDE.High &= unchecked((byte)~0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xAB: // RES 5, E - RegDE.Low &= unchecked((byte)~0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xAC: // RES 5, H - RegHL.High &= unchecked((byte)~0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xAD: // RES 5, L - RegHL.Low &= unchecked((byte)~0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xAE: // RES 5, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) & unchecked((byte)~0x20))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xAF: // RES 5, A - RegAF.High &= unchecked((byte)~0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB0: // RES 6, B - RegBC.High &= unchecked((byte)~0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB1: // RES 6, C - RegBC.Low &= unchecked((byte)~0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB2: // RES 6, D - RegDE.High &= unchecked((byte)~0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB3: // RES 6, E - RegDE.Low &= unchecked((byte)~0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB4: // RES 6, H - RegHL.High &= unchecked((byte)~0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB5: // RES 6, L - RegHL.Low &= unchecked((byte)~0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB6: // RES 6, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) & unchecked((byte)~0x40))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xB7: // RES 6, A - RegAF.High &= unchecked((byte)~0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB8: // RES 7, B - RegBC.High &= unchecked((byte)~0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB9: // RES 7, C - RegBC.Low &= unchecked((byte)~0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xBA: // RES 7, D - RegDE.High &= unchecked((byte)~0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xBB: // RES 7, E - RegDE.Low &= unchecked((byte)~0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xBC: // RES 7, H - RegHL.High &= unchecked((byte)~0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xBD: // RES 7, L - RegHL.Low &= unchecked((byte)~0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xBE: // RES 7, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) & unchecked((byte)~0x80))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xBF: // RES 7, A - RegAF.High &= unchecked((byte)~0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xC0: // SET 0, B - RegBC.High |= unchecked((byte)0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xC1: // SET 0, C - RegBC.Low |= unchecked((byte)0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xC2: // SET 0, D - RegDE.High |= unchecked((byte)0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xC3: // SET 0, E - RegDE.Low |= unchecked((byte)0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xC4: // SET 0, H - RegHL.High |= unchecked((byte)0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xC5: // SET 0, L - RegHL.Low |= unchecked((byte)0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xC6: // SET 0, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) | unchecked((byte)0x01))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xC7: // SET 0, A - RegAF.High |= unchecked((byte)0x01); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xC8: // SET 1, B - RegBC.High |= unchecked((byte)0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xC9: // SET 1, C - RegBC.Low |= unchecked((byte)0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xCA: // SET 1, D - RegDE.High |= unchecked((byte)0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xCB: // SET 1, E - RegDE.Low |= unchecked((byte)0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xCC: // SET 1, H - RegHL.High |= unchecked((byte)0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xCD: // SET 1, L - RegHL.Low |= unchecked((byte)0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xCE: // SET 1, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) | unchecked((byte)0x02))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xCF: // SET 1, A - RegAF.High |= unchecked((byte)0x02); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xD0: // SET 2, B - RegBC.High |= unchecked((byte)0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xD1: // SET 2, C - RegBC.Low |= unchecked((byte)0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xD2: // SET 2, D - RegDE.High |= unchecked((byte)0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xD3: // SET 2, E - RegDE.Low |= unchecked((byte)0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xD4: // SET 2, H - RegHL.High |= unchecked((byte)0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xD5: // SET 2, L - RegHL.Low |= unchecked((byte)0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xD6: // SET 2, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) | unchecked((byte)0x04))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xD7: // SET 2, A - RegAF.High |= unchecked((byte)0x04); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xD8: // SET 3, B - RegBC.High |= unchecked((byte)0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xD9: // SET 3, C - RegBC.Low |= unchecked((byte)0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xDA: // SET 3, D - RegDE.High |= unchecked((byte)0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xDB: // SET 3, E - RegDE.Low |= unchecked((byte)0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xDC: // SET 3, H - RegHL.High |= unchecked((byte)0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xDD: // SET 3, L - RegHL.Low |= unchecked((byte)0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xDE: // SET 3, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) | unchecked((byte)0x08))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xDF: // SET 3, A - RegAF.High |= unchecked((byte)0x08); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xE0: // SET 4, B - RegBC.High |= unchecked((byte)0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xE1: // SET 4, C - RegBC.Low |= unchecked((byte)0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xE2: // SET 4, D - RegDE.High |= unchecked((byte)0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xE3: // SET 4, E - RegDE.Low |= unchecked((byte)0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xE4: // SET 4, H - RegHL.High |= unchecked((byte)0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xE5: // SET 4, L - RegHL.Low |= unchecked((byte)0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xE6: // SET 4, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) | unchecked((byte)0x10))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xE7: // SET 4, A - RegAF.High |= unchecked((byte)0x10); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xE8: // SET 5, B - RegBC.High |= unchecked((byte)0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xE9: // SET 5, C - RegBC.Low |= unchecked((byte)0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xEA: // SET 5, D - RegDE.High |= unchecked((byte)0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xEB: // SET 5, E - RegDE.Low |= unchecked((byte)0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xEC: // SET 5, H - RegHL.High |= unchecked((byte)0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xED: // SET 5, L - RegHL.Low |= unchecked((byte)0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xEE: // SET 5, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) | unchecked((byte)0x20))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xEF: // SET 5, A - RegAF.High |= unchecked((byte)0x20); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xF0: // SET 6, B - RegBC.High |= unchecked((byte)0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xF1: // SET 6, C - RegBC.Low |= unchecked((byte)0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xF2: // SET 6, D - RegDE.High |= unchecked((byte)0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xF3: // SET 6, E - RegDE.Low |= unchecked((byte)0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xF4: // SET 6, H - RegHL.High |= unchecked((byte)0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xF5: // SET 6, L - RegHL.Low |= unchecked((byte)0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xF6: // SET 6, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) | unchecked((byte)0x40))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xF7: // SET 6, A - RegAF.High |= unchecked((byte)0x40); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xF8: // SET 7, B - RegBC.High |= unchecked((byte)0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xF9: // SET 7, C - RegBC.Low |= unchecked((byte)0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xFA: // SET 7, D - RegDE.High |= unchecked((byte)0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xFB: // SET 7, E - RegDE.Low |= unchecked((byte)0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xFC: // SET 7, H - RegHL.High |= unchecked((byte)0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xFD: // SET 7, L - RegHL.Low |= unchecked((byte)0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xFE: // SET 7, (HL) - WriteMemoryWrapper(RegHL.Word, (byte)(ReadMemoryWrapper(RegHL.Word) | unchecked((byte)0x80))); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xFF: // SET 7, A - RegAF.High |= unchecked((byte)0x80); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - } - break; - case 0xCC: // CALL Z, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagZ) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xCD: // CALL nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - break; - case 0xCE: // ADC A, n - RegAF.Word = TableALU[1, RegAF.High, FetchMemoryWrapper(RegPC.Word++), RegFlagC ? 1 : 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xCF: // RST $08 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x08; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD0: // RET NC - if (!RegFlagC) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xD1: // POP DE - RegDE.Low = ReadMemoryWrapper(RegSP.Word++); RegDE.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xD2: // JP NC, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagC) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xD3: // OUT n, A - WriteHardware(FetchMemoryWrapper(RegPC.Word++), RegAF.High); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD4: // CALL NC, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagC) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xD5: // PUSH DE - WriteMemoryWrapper(--RegSP.Word, RegDE.High); WriteMemoryWrapper(--RegSP.Word, RegDE.Low); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD6: // SUB n - RegAF.Word = TableALU[2, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xD7: // RST $10 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x10; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD8: // RET C - if (RegFlagC) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xD9: // EXX - TUS = RegBC.Word; RegBC.Word = RegAltBC.Word; RegAltBC.Word = TUS; - TUS = RegDE.Word; RegDE.Word = RegAltDE.Word; RegAltDE.Word = TUS; - TUS = RegHL.Word; RegHL.Word = RegAltHL.Word; RegAltHL.Word = TUS; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDA: // JP C, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagC) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xDB: // IN A, n - RegAF.High = ReadHardware((ushort)FetchMemoryWrapper(RegPC.Word++)); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xDC: // CALL C, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagC) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xDD: // (Prefix) - ++RegR; - switch (FetchMemoryWrapper(RegPC.Word++)) - { - case 0x00: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x01: // LD BC, nn - RegBC.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x02: // LD (BC), A - RegWZ.Low = (byte)((RegBC.Word + 1) & 0xFF); - RegWZ.High = RegAF.High; - WriteMemoryWrapper(RegBC.Word, RegAF.High); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x03: // INC BC - ++RegBC.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x04: // INC B - RegAF.Low = (byte)(TableInc[++RegBC.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x05: // DEC B - RegAF.Low = (byte)(TableDec[--RegBC.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x06: // LD B, n - RegBC.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x07: // RLCA - RegAF.Word = TableRotShift[0, 0, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x08: // EX AF, AF' - TUS = RegAF.Word; RegAF.Word = RegAltAF.Word; RegAltAF.Word = TUS; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x09: // ADD IX, BC - RegWZ = (ushort)(RegIX + 1); - TI1 = (short)RegIX.Word; TI2 = (short)RegBC.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegIX.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x0A: // LD A, (BC) - RegAF.High = ReadMemoryWrapper(RegBC.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - RegWZ = (ushort)(RegBC.Word + 1); - break; - case 0x0B: // DEC BC - --RegBC.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x0C: // INC C - RegAF.Low = (byte)(TableInc[++RegBC.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0D: // DEC C - RegAF.Low = (byte)(TableDec[--RegBC.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0E: // LD C, n - RegBC.Low = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x0F: // RRCA - RegAF.Word = TableRotShift[0, 1, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x10: // DJNZ d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (--RegBC.High != 0) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 13; pendingCycles -= 13; - } - else - { - totalExecutedCycles += 8; pendingCycles -= 8; - } - break; - case 0x11: // LD DE, nn - RegDE.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x12: // LD (DE), A - RegWZ.Low = (byte)((RegDE.Word + 1) & 0xFF); - RegWZ.High = RegAF.High; - WriteMemoryWrapper(RegDE.Word, RegAF.High); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x13: // INC DE - ++RegDE.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x14: // INC D - RegAF.Low = (byte)(TableInc[++RegDE.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x15: // DEC D - RegAF.Low = (byte)(TableDec[--RegDE.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x16: // LD D, n - RegDE.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x17: // RLA - RegAF.Word = TableRotShift[0, 2, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x18: // JR d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x19: // ADD IX, DE - RegWZ = (ushort)(RegIX + 1); - TI1 = (short)RegIX.Word; TI2 = (short)RegDE.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegIX.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x1A: // LD A, (DE) - RegAF.High = ReadMemoryWrapper(RegDE.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - RegWZ = (ushort)(RegDE.Word + 1); - break; - case 0x1B: // DEC DE - --RegDE.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x1C: // INC E - RegAF.Low = (byte)(TableInc[++RegDE.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1D: // DEC E - RegAF.Low = (byte)(TableDec[--RegDE.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1E: // LD E, n - RegDE.Low = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x1F: // RRA - RegAF.Word = TableRotShift[0, 3, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x20: // JR NZ, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (!RegFlagZ) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x21: // LD IX, nn - RegIX.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x22: // LD (nn), IX - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegIX.Low); - WriteMemoryWrapper(TUS, RegIX.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x23: // INC IX - ++RegIX.Word; - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x24: // INC IXH - RegAF.Low = (byte)(TableInc[++RegIX.High] | (RegAF.Low & 1)); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x25: // DEC IXH - RegAF.Low = (byte)(TableDec[--RegIX.High] | (RegAF.Low & 1)); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x26: // LD IXH, n - RegIX.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0x27: // DAA - RegAF.Word = TableDaa[RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x28: // JR Z, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (RegFlagZ) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x29: // ADD IX, IX - RegWZ = (ushort)(RegIX + 1); - TI1 = (short)RegIX.Word; TI2 = (short)RegIX.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegIX.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x2A: // LD IX, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegIX.Low = ReadMemoryWrapper(TUS++); RegIX.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x2B: // DEC IX - --RegIX.Word; - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x2C: // INC IXL - RegAF.Low = (byte)(TableInc[++RegIX.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x2D: // DEC IXL - RegAF.Low = (byte)(TableDec[--RegIX.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x2E: // LD IXL, n - RegIX.Low = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0x2F: // CPL - RegAF.High ^= 0xFF; RegFlagH = true; RegFlagN = true; RegFlag3 = (RegAF.High & 0x08) != 0; RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x30: // JR NC, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (!RegFlagC) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x31: // LD SP, nn - RegSP.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x32: // LD (nn), A - temp_WZ = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ.Low = (byte)((temp_WZ + 1) & 0xFF); - RegWZ.High = RegAF.High; - WriteMemoryWrapper(temp_WZ, RegAF.High); - totalExecutedCycles += 13; pendingCycles -= 13; - break; - case 0x33: // INC SP - ++RegSP.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x34: // INC (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - TB = ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)); RegAF.Low = (byte)(TableInc[++TB] | (RegAF.Low & 1)); WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), TB); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x35: // DEC (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - TB = ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)); RegAF.Low = (byte)(TableDec[--TB] | (RegAF.Low & 1)); WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), TB); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x36: // LD (IX+d), n - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), FetchMemoryWrapper(RegPC.Word++)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x37: // SCF - RegFlagH = false; RegFlagN = false; RegFlagC = true; RegFlag3 = (RegAF.High & 0x08) != 0; RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x38: // JR C, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (RegFlagC) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x39: // ADD IX, SP - RegWZ = (ushort)(RegIX + 1); - TI1 = (short)RegIX.Word; TI2 = (short)RegSP.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegIX.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x3A: // LD A, (nn) - temp_WZ = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegAF.High = ReadMemoryWrapper(temp_WZ); - totalExecutedCycles += 13; pendingCycles -= 13; - RegWZ = (ushort)(temp_WZ + 1); - break; - case 0x3B: // DEC SP - --RegSP.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x3C: // INC A - RegAF.Low = (byte)(TableInc[++RegAF.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3D: // DEC A - RegAF.Low = (byte)(TableDec[--RegAF.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3E: // LD A, n - RegAF.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x3F: // CCF - RegFlagH = RegFlagC; RegFlagN = false; RegFlagC ^= true; RegFlag3 = (RegAF.High & 0x08) != 0; RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x40: // LD B, B - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x41: // LD B, C - RegBC.High = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x42: // LD B, D - RegBC.High = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x43: // LD B, E - RegBC.High = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x44: // LD B, IXH - RegBC.High = RegIX.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x45: // LD B, IXL - RegBC.High = RegIX.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x46: // LD B, (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegBC.High = ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x47: // LD B, A - RegBC.High = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x48: // LD C, B - RegBC.Low = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x49: // LD C, C - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4A: // LD C, D - RegBC.Low = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4B: // LD C, E - RegBC.Low = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4C: // LD C, IXH - RegBC.Low = RegIX.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4D: // LD C, IXL - RegBC.Low = RegIX.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4E: // LD C, (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegBC.Low = ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x4F: // LD C, A - RegBC.Low = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x50: // LD D, B - RegDE.High = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x51: // LD D, C - RegDE.High = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x52: // LD D, D - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x53: // LD D, E - RegDE.High = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x54: // LD D, IXH - RegDE.High = RegIX.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x55: // LD D, IXL - RegDE.High = RegIX.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x56: // LD D, (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegDE.High = ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x57: // LD D, A - RegDE.High = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x58: // LD E, B - RegDE.Low = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x59: // LD E, C - RegDE.Low = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5A: // LD E, D - RegDE.Low = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5B: // LD E, E - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5C: // LD E, IXH - RegDE.Low = RegIX.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5D: // LD E, IXL - RegDE.Low = RegIX.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5E: // LD E, (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegDE.Low = ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x5F: // LD E, A - RegDE.Low = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x60: // LD IXH, B - RegIX.High = RegBC.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x61: // LD IXH, C - RegIX.High = RegBC.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x62: // LD IXH, D - RegIX.High = RegDE.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x63: // LD IXH, E - RegIX.High = RegDE.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x64: // LD IXH, IXH - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x65: // LD IXH, IXL - RegIX.High = RegIX.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x66: // LD H, (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegHL.High = ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x67: // LD IXH, A - RegIX.High = RegAF.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x68: // LD IXL, B - RegIX.Low = RegBC.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x69: // LD IXL, C - RegIX.Low = RegBC.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6A: // LD IXL, D - RegIX.Low = RegDE.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6B: // LD IXL, E - RegIX.Low = RegDE.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6C: // LD IXL, IXH - RegIX.Low = RegIX.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6D: // LD IXL, IXL - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6E: // LD L, (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegHL.Low = ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x6F: // LD IXL, A - RegIX.Low = RegAF.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x70: // LD (IX+d), B - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x71: // LD (IX+d), C - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x72: // LD (IX+d), D - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x73: // LD (IX+d), E - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x74: // LD (IX+d), H - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x75: // LD (IX+d), L - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x76: // HALT - Halt(); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x77: // LD (IX+d), A - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x78: // LD A, B - RegAF.High = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x79: // LD A, C - RegAF.High = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7A: // LD A, D - RegAF.High = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7B: // LD A, E - RegAF.High = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7C: // LD A, IXH - RegAF.High = RegIX.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7D: // LD A, IXL - RegAF.High = RegIX.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7E: // LD A, (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegAF.High = ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x7F: // LD A, A - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x80: // ADD A, B - RegAF.Word = TableALU[0, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x81: // ADD A, C - RegAF.Word = TableALU[0, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x82: // ADD A, D - RegAF.Word = TableALU[0, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x83: // ADD A, E - RegAF.Word = TableALU[0, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x84: // ADD A, IXH - RegAF.Word = TableALU[0, RegAF.High, RegIX.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x85: // ADD A, IXL - RegAF.Word = TableALU[0, RegAF.High, RegIX.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x86: // ADD A, (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegAF.Word = TableALU[0, RegAF.High, ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x87: // ADD A, A - RegAF.Word = TableALU[0, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x88: // ADC A, B - RegAF.Word = TableALU[1, RegAF.High, RegBC.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x89: // ADC A, C - RegAF.Word = TableALU[1, RegAF.High, RegBC.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8A: // ADC A, D - RegAF.Word = TableALU[1, RegAF.High, RegDE.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8B: // ADC A, E - RegAF.Word = TableALU[1, RegAF.High, RegDE.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8C: // ADC A, IXH - RegAF.Word = TableALU[1, RegAF.High, RegIX.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x8D: // ADC A, IXL - RegAF.Word = TableALU[1, RegAF.High, RegIX.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x8E: // ADC A, (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegAF.Word = TableALU[1, RegAF.High, ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)), RegFlagC ? 1 : 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x8F: // ADC A, A - RegAF.Word = TableALU[1, RegAF.High, RegAF.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x90: // SUB B - RegAF.Word = TableALU[2, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x91: // SUB C - RegAF.Word = TableALU[2, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x92: // SUB D - RegAF.Word = TableALU[2, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x93: // SUB E - RegAF.Word = TableALU[2, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x94: // SUB IXH - RegAF.Word = TableALU[2, RegAF.High, RegIX.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x95: // SUB IXL - RegAF.Word = TableALU[2, RegAF.High, RegIX.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x96: // SUB (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegAF.Word = TableALU[2, RegAF.High, ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x97: // SUB A, A - RegAF.Word = TableALU[2, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x98: // SBC A, B - RegAF.Word = TableALU[3, RegAF.High, RegBC.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x99: // SBC A, C - RegAF.Word = TableALU[3, RegAF.High, RegBC.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9A: // SBC A, D - RegAF.Word = TableALU[3, RegAF.High, RegDE.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9B: // SBC A, E - RegAF.Word = TableALU[3, RegAF.High, RegDE.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9C: // SBC A, IXH - RegAF.Word = TableALU[3, RegAF.High, RegIX.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x9D: // SBC A, IXL - RegAF.Word = TableALU[3, RegAF.High, RegIX.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x9E: // SBC A, (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegAF.Word = TableALU[3, RegAF.High, ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)), RegFlagC ? 1 : 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x9F: // SBC A, A - RegAF.Word = TableALU[3, RegAF.High, RegAF.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA0: // AND B - RegAF.Word = TableALU[4, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA1: // AND C - RegAF.Word = TableALU[4, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA2: // AND D - RegAF.Word = TableALU[4, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA3: // AND E - RegAF.Word = TableALU[4, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA4: // AND IXH - RegAF.Word = TableALU[4, RegAF.High, RegIX.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA5: // AND IXL - RegAF.Word = TableALU[4, RegAF.High, RegIX.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA6: // AND (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegAF.Word = TableALU[4, RegAF.High, ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0xA7: // AND A - RegAF.Word = TableALU[4, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA8: // XOR B - RegAF.Word = TableALU[5, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA9: // XOR C - RegAF.Word = TableALU[5, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAA: // XOR D - RegAF.Word = TableALU[5, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAB: // XOR E - RegAF.Word = TableALU[5, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAC: // XOR IXH - RegAF.Word = TableALU[5, RegAF.High, RegIX.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xAD: // XOR IXL - RegAF.Word = TableALU[5, RegAF.High, RegIX.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xAE: // XOR (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegAF.Word = TableALU[5, RegAF.High, ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0xAF: // XOR A - RegAF.Word = TableALU[5, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB0: // OR B - RegAF.Word = TableALU[6, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB1: // OR C - RegAF.Word = TableALU[6, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB2: // OR D - RegAF.Word = TableALU[6, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB3: // OR E - RegAF.Word = TableALU[6, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB4: // OR IXH - RegAF.Word = TableALU[6, RegAF.High, RegIX.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB5: // OR IXL - RegAF.Word = TableALU[6, RegAF.High, RegIX.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB6: // OR (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegAF.Word = TableALU[6, RegAF.High, ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0xB7: // OR A - RegAF.Word = TableALU[6, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB8: // CP B - RegAF.Word = TableALU[7, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB9: // CP C - RegAF.Word = TableALU[7, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBA: // CP D - RegAF.Word = TableALU[7, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBB: // CP E - RegAF.Word = TableALU[7, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBC: // CP IXH - RegAF.Word = TableALU[7, RegAF.High, RegIX.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xBD: // CP IXL - RegAF.Word = TableALU[7, RegAF.High, RegIX.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xBE: // CP (IX+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - RegAF.Word = TableALU[7, RegAF.High, ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0xBF: // CP A - RegAF.Word = TableALU[7, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC0: // RET NZ - if (!RegFlagZ) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xC1: // POP BC - RegBC.Low = ReadMemoryWrapper(RegSP.Word++); RegBC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xC2: // JP NZ, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagZ) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xC3: // JP nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - RegPC.Word = TUS; - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xC4: // CALL NZ, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagZ) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xC5: // PUSH BC - WriteMemoryWrapper(--RegSP.Word, RegBC.High); WriteMemoryWrapper(--RegSP.Word, RegBC.Low); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xC6: // ADD A, n - RegAF.Word = TableALU[0, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xC7: // RST $00 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x00; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xC8: // RET Z - if (RegFlagZ) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xC9: // RET - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xCA: // JP Z, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagZ) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xCB: // (Prefix) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIX.Word + Displacement); - ++RegR; - switch (FetchMemoryWrapper(RegPC.Word++)) - { - case 0x00: // RLC (IX+d)→B - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x01: // RLC (IX+d)→C - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x02: // RLC (IX+d)→D - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x03: // RLC (IX+d)→E - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x04: // RLC (IX+d)→H - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x05: // RLC (IX+d)→L - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x06: // RLC (IX+d) - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x07: // RLC (IX+d)→A - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegAF.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x08: // RRC (IX+d)→B - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x09: // RRC (IX+d)→C - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0A: // RRC (IX+d)→D - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0B: // RRC (IX+d)→E - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0C: // RRC (IX+d)→H - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0D: // RRC (IX+d)→L - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0E: // RRC (IX+d) - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0F: // RRC (IX+d)→A - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegAF.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x10: // RL (IX+d)→B - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x11: // RL (IX+d)→C - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x12: // RL (IX+d)→D - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x13: // RL (IX+d)→E - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x14: // RL (IX+d)→H - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x15: // RL (IX+d)→L - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x16: // RL (IX+d) - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x17: // RL (IX+d)→A - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegAF.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x18: // RR (IX+d)→B - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x19: // RR (IX+d)→C - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1A: // RR (IX+d)→D - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1B: // RR (IX+d)→E - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1C: // RR (IX+d)→H - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1D: // RR (IX+d)→L - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1E: // RR (IX+d) - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1F: // RR (IX+d)→A - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegAF.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x20: // SLA (IX+d)→B - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x21: // SLA (IX+d)→C - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x22: // SLA (IX+d)→D - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x23: // SLA (IX+d)→E - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x24: // SLA (IX+d)→H - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x25: // SLA (IX+d)→L - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x26: // SLA (IX+d) - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x27: // SLA (IX+d)→A - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegAF.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x28: // SRA (IX+d)→B - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x29: // SRA (IX+d)→C - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2A: // SRA (IX+d)→D - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2B: // SRA (IX+d)→E - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2C: // SRA (IX+d)→H - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2D: // SRA (IX+d)→L - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2E: // SRA (IX+d) - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2F: // SRA (IX+d)→A - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegAF.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x30: // SL1 (IX+d)→B - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x31: // SL1 (IX+d)→C - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x32: // SL1 (IX+d)→D - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x33: // SL1 (IX+d)→E - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x34: // SL1 (IX+d)→H - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x35: // SL1 (IX+d)→L - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x36: // SL1 (IX+d) - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x37: // SL1 (IX+d)→A - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegAF.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x38: // SRL (IX+d)→B - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x39: // SRL (IX+d)→C - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegBC.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3A: // SRL (IX+d)→D - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3B: // SRL (IX+d)→E - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegDE.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3C: // SRL (IX+d)→H - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3D: // SRL (IX+d)→L - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegHL.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3E: // SRL (IX+d) - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3F: // SRL (IX+d)→A - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIX.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - RegAF.High = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x40: // BIT 0, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x41: // BIT 0, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x42: // BIT 0, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x43: // BIT 0, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x44: // BIT 0, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x45: // BIT 0, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x46: // BIT 0, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x47: // BIT 0, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x48: // BIT 1, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x49: // BIT 1, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4A: // BIT 1, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4B: // BIT 1, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4C: // BIT 1, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4D: // BIT 1, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4E: // BIT 1, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4F: // BIT 1, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x50: // BIT 2, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x51: // BIT 2, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x52: // BIT 2, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x53: // BIT 2, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x54: // BIT 2, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x55: // BIT 2, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x56: // BIT 2, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x57: // BIT 2, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x58: // BIT 3, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x59: // BIT 3, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5A: // BIT 3, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5B: // BIT 3, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5C: // BIT 3, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5D: // BIT 3, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5E: // BIT 3, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5F: // BIT 3, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x60: // BIT 4, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x61: // BIT 4, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x62: // BIT 4, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x63: // BIT 4, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x64: // BIT 4, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x65: // BIT 4, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x66: // BIT 4, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x67: // BIT 4, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x68: // BIT 5, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x69: // BIT 5, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6A: // BIT 5, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6B: // BIT 5, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6C: // BIT 5, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6D: // BIT 5, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6E: // BIT 5, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6F: // BIT 5, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x70: // BIT 6, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x71: // BIT 6, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x72: // BIT 6, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x73: // BIT 6, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x74: // BIT 6, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x75: // BIT 6, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x76: // BIT 6, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x77: // BIT 6, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x78: // BIT 7, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x79: // BIT 7, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7A: // BIT 7, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7B: // BIT 7, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7C: // BIT 7, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7D: // BIT 7, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7E: // BIT 7, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7F: // BIT 7, (IX+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x80: // RES 0, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x81: // RES 0, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x82: // RES 0, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x83: // RES 0, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x84: // RES 0, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x85: // RES 0, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x86: // RES 0, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x87: // RES 0, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x88: // RES 1, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x89: // RES 1, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8A: // RES 1, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8B: // RES 1, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8C: // RES 1, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8D: // RES 1, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8E: // RES 1, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8F: // RES 1, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x90: // RES 2, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x91: // RES 2, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x92: // RES 2, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x93: // RES 2, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x94: // RES 2, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x95: // RES 2, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x96: // RES 2, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x97: // RES 2, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x98: // RES 3, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x99: // RES 3, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9A: // RES 3, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9B: // RES 3, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9C: // RES 3, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9D: // RES 3, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9E: // RES 3, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9F: // RES 3, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA0: // RES 4, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA1: // RES 4, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA2: // RES 4, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA3: // RES 4, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA4: // RES 4, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA5: // RES 4, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA6: // RES 4, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA7: // RES 4, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA8: // RES 5, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA9: // RES 5, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAA: // RES 5, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAB: // RES 5, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAC: // RES 5, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAD: // RES 5, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAE: // RES 5, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAF: // RES 5, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB0: // RES 6, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB1: // RES 6, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB2: // RES 6, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB3: // RES 6, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB4: // RES 6, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB5: // RES 6, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB6: // RES 6, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB7: // RES 6, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB8: // RES 7, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB9: // RES 7, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBA: // RES 7, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBB: // RES 7, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBC: // RES 7, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBD: // RES 7, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBE: // RES 7, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBF: // RES 7, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) & unchecked((byte)~0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC0: // SET 0, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC1: // SET 0, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC2: // SET 0, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC3: // SET 0, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC4: // SET 0, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC5: // SET 0, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC6: // SET 0, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC7: // SET 0, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x01)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC8: // SET 1, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC9: // SET 1, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCA: // SET 1, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCB: // SET 1, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCC: // SET 1, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCD: // SET 1, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCE: // SET 1, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCF: // SET 1, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x02)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD0: // SET 2, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD1: // SET 2, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD2: // SET 2, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD3: // SET 2, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD4: // SET 2, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD5: // SET 2, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD6: // SET 2, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD7: // SET 2, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x04)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD8: // SET 3, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD9: // SET 3, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDA: // SET 3, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDB: // SET 3, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDC: // SET 3, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDD: // SET 3, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDE: // SET 3, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDF: // SET 3, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x08)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE0: // SET 4, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE1: // SET 4, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE2: // SET 4, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE3: // SET 4, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE4: // SET 4, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE5: // SET 4, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE6: // SET 4, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE7: // SET 4, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x10)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE8: // SET 5, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE9: // SET 5, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xEA: // SET 5, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xEB: // SET 5, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xEC: // SET 5, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xED: // SET 5, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xEE: // SET 5, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xEF: // SET 5, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x20)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF0: // SET 6, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF1: // SET 6, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF2: // SET 6, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF3: // SET 6, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF4: // SET 6, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF5: // SET 6, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF6: // SET 6, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF7: // SET 6, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x40)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF8: // SET 7, (IX+d)→B - RegBC.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF9: // SET 7, (IX+d)→C - RegBC.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegBC.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFA: // SET 7, (IX+d)→D - RegDE.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFB: // SET 7, (IX+d)→E - RegDE.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegDE.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFC: // SET 7, (IX+d)→H - RegHL.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFD: // SET 7, (IX+d)→L - RegHL.Low = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegHL.Low); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFE: // SET 7, (IX+d) - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFF: // SET 7, (IX+d)→A - RegAF.High = (byte)(ReadMemoryWrapper((ushort)(RegIX.Word + Displacement)) | unchecked((byte)0x80)); - WriteMemoryWrapper((ushort)(RegIX.Word + Displacement), RegAF.High); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - } - break; - case 0xCC: // CALL Z, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagZ) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xCD: // CALL nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - break; - case 0xCE: // ADC A, n - RegAF.Word = TableALU[1, RegAF.High, FetchMemoryWrapper(RegPC.Word++), RegFlagC ? 1 : 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xCF: // RST $08 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x08; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD0: // RET NC - if (!RegFlagC) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xD1: // POP DE - RegDE.Low = ReadMemoryWrapper(RegSP.Word++); RegDE.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xD2: // JP NC, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagC) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xD3: // OUT n, A - WriteHardware(FetchMemoryWrapper(RegPC.Word++), RegAF.High); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD4: // CALL NC, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagC) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xD5: // PUSH DE - WriteMemoryWrapper(--RegSP.Word, RegDE.High); WriteMemoryWrapper(--RegSP.Word, RegDE.Low); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD6: // SUB n - RegAF.Word = TableALU[2, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xD7: // RST $10 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x10; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD8: // RET C - if (RegFlagC) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xD9: // EXX - TUS = RegBC.Word; RegBC.Word = RegAltBC.Word; RegAltBC.Word = TUS; - TUS = RegDE.Word; RegDE.Word = RegAltDE.Word; RegAltDE.Word = TUS; - TUS = RegHL.Word; RegHL.Word = RegAltHL.Word; RegAltHL.Word = TUS; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDA: // JP C, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagC) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xDB: // IN A, n - RegAF.High = ReadHardware((ushort)FetchMemoryWrapper(RegPC.Word++)); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xDC: // CALL C, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagC) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xDD: // <- - // Invalid sequence. - totalExecutedCycles += 1337; pendingCycles -= 1337; - break; - case 0xDE: // SBC A, n - RegAF.Word = TableALU[3, RegAF.High, FetchMemoryWrapper(RegPC.Word++), RegFlagC ? 1 : 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xDF: // RST $18 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x18; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xE0: // RET PO - if (!RegFlagP) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xE1: // POP IX - RegIX.Low = ReadMemoryWrapper(RegSP.Word++); RegIX.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0xE2: // JP PO, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagP) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xE3: // EX (SP), IX - TUS = RegSP.Word; TBL = ReadMemoryWrapper(TUS++); TBH = ReadMemoryWrapper(TUS--); - WriteMemoryWrapper(TUS++, RegIX.Low); WriteMemoryWrapper(TUS, RegIX.High); - RegIX.Low = TBL; RegIX.High = TBH; - RegWZ = RegIX; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE4: // CALL C, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagC) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xE5: // PUSH IX - WriteMemoryWrapper(--RegSP.Word, RegIX.High); WriteMemoryWrapper(--RegSP.Word, RegIX.Low); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xE6: // AND n - RegAF.Word = TableALU[4, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xE7: // RST $20 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x20; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xE8: // RET PE - if (RegFlagP) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xE9: // JP IX - RegWZ = RegIX; - RegPC.Word = RegIX.Word; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xEA: // JP PE, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagP) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xEB: // EX DE, HL - TUS = RegDE.Word; RegDE.Word = RegHL.Word; RegHL.Word = TUS; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEC: // CALL PE, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagP) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xED: // (Prefix) - ++RegR; - switch (FetchMemoryWrapper(RegPC.Word++)) - { - case 0x00: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x01: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x02: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x03: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x04: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x05: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x06: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x07: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x08: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x09: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x10: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x11: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x12: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x13: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x14: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x15: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x16: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x17: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x18: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x19: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x20: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x21: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x22: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x23: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x24: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x25: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x26: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x27: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x28: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x29: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x30: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x31: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x32: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x33: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x34: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x35: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x36: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x37: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x38: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x39: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x40: // IN B, C - RegBC.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegBC.High > 127; - RegFlagZ = RegBC.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegBC.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x41: // OUT C, B - WriteHardware(RegBC.Low, RegBC.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x42: // SBC HL, BC - TI1 = (short)RegHL.Word; TI2 = (short)RegBC.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegBC.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegBC.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x43: // LD (nn), BC - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegBC.Low); - WriteMemoryWrapper(TUS, RegBC.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x44: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x45: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x46: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x47: // LD I, A - RegI = RegAF.High; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x48: // IN C, C - RegBC.Low = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegBC.Low > 127; - RegFlagZ = RegBC.Low == 0; - RegFlagH = false; - RegFlagP = TableParity[RegBC.Low]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x49: // OUT C, C - WriteHardware(RegBC.Low, RegBC.Low); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x4A: // ADC HL, BC - TI1 = (short)RegHL.Word; TI2 = (short)RegBC.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x4B: // LD BC, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegBC.Low = ReadMemoryWrapper(TUS++); RegBC.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x4E: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4F: // LD R, A - RegR = RegAF.High; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x50: // IN D, C - RegDE.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegDE.High > 127; - RegFlagZ = RegDE.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegDE.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x51: // OUT C, D - WriteHardware(RegBC.Low, RegDE.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x52: // SBC HL, DE - TI1 = (short)RegHL.Word; TI2 = (short)RegDE.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegDE.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegDE.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x53: // LD (nn), DE - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegDE.Low); - WriteMemoryWrapper(TUS, RegDE.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x54: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x55: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x56: // IM $1 - interruptMode = 1; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x57: // LD A, I - RegAF.High = RegI; - RegFlagS = RegI > 127; - RegFlagZ = RegI == 0; - RegFlagH = false; - RegFlagN = false; - RegFlagP = IFF2; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x58: // IN E, C - RegDE.Low = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegDE.Low > 127; - RegFlagZ = RegDE.Low == 0; - RegFlagH = false; - RegFlagP = TableParity[RegDE.Low]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x59: // OUT C, E - WriteHardware(RegBC.Low, RegDE.Low); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x5A: // ADC HL, DE - TI1 = (short)RegHL.Word; TI2 = (short)RegDE.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x5B: // LD DE, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegDE.Low = ReadMemoryWrapper(TUS++); RegDE.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x5E: // IM $2 - interruptMode = 2; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5F: // LD A, R - RegAF.High = (byte)(RegR & 0x7F); - RegFlagS = (byte)(RegR & 0x7F) > 127; - RegFlagZ = (byte)(RegR & 0x7F) == 0; - RegFlagH = false; - RegFlagN = false; - RegFlagP = IFF2; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x60: // IN H, C - RegHL.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegHL.High > 127; - RegFlagZ = RegHL.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegHL.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x61: // OUT C, H - WriteHardware(RegBC.Low, RegHL.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x62: // SBC HL, HL - TI1 = (short)RegHL.Word; TI2 = (short)RegHL.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegHL.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegHL.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x63: // LD (nn), HL - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegHL.Low); - WriteMemoryWrapper(TUS, RegHL.High); - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0x64: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x65: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x66: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x67: // RRD - RegWZ = (ushort)(RegHL + 1); - TB1 = RegAF.High; TB2 = ReadMemoryWrapper(RegHL.Word); - WriteMemoryWrapper(RegHL.Word, (byte)((TB2 >> 4) + (TB1 << 4))); - RegAF.High = (byte)((TB1 & 0xF0) + (TB2 & 0x0F)); - RegFlagS = RegAF.High > 127; - RegFlagZ = RegAF.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegAF.High]; - RegFlagN = false; - RegFlag3 = (RegAF.High & 0x08) != 0; - RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 18; pendingCycles -= 18; - break; - case 0x68: // IN L, C - RegHL.Low = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegHL.Low > 127; - RegFlagZ = RegHL.Low == 0; - RegFlagH = false; - RegFlagP = TableParity[RegHL.Low]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x69: // OUT C, L - WriteHardware(RegBC.Low, RegHL.Low); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x6A: // ADC HL, HL - TI1 = (short)RegHL.Word; TI2 = (short)RegHL.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x6B: // LD HL, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegHL.Low = ReadMemoryWrapper(TUS++); RegHL.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0x6C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x6E: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6F: // RLD - RegWZ = (ushort)(RegHL + 1); - TB1 = RegAF.High; TB2 = ReadMemoryWrapper(RegHL.Word); - WriteMemoryWrapper(RegHL.Word, (byte)((TB1 & 0x0F) + (TB2 << 4))); - RegAF.High = (byte)((TB1 & 0xF0) + (TB2 >> 4)); - RegFlagS = RegAF.High > 127; - RegFlagZ = RegAF.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegAF.High]; - RegFlagN = false; - RegFlag3 = (RegAF.High & 0x08) != 0; - RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 18; pendingCycles -= 18; - break; - case 0x70: // IN 0, C - TB = ReadHardware((ushort)RegBC.Low); - RegFlagS = TB > 127; - RegFlagZ = TB == 0; - RegFlagH = false; - RegFlagP = TableParity[TB]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x71: // OUT C, 0 - WriteHardware(RegBC.Low, 0); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x72: // SBC HL, SP - TI1 = (short)RegHL.Word; TI2 = (short)RegSP.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegSP.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegSP.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x73: // LD (nn), SP - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegSP.Low); - WriteMemoryWrapper(TUS, RegSP.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x74: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x75: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x76: // IM $1 - interruptMode = 1; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x77: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x78: // IN A, C - RegAF.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegAF.High > 127; - RegFlagZ = RegAF.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegAF.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x79: // OUT C, A - WriteHardware(RegBC.Low, RegAF.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x7A: // ADC HL, SP - TI1 = (short)RegHL.Word; TI2 = (short)RegSP.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x7B: // LD SP, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegSP.Low = ReadMemoryWrapper(TUS++); RegSP.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x7E: // IM $2 - interruptMode = 2; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x80: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x81: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x82: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x83: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x84: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x85: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x86: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x87: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x88: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x89: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x90: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x91: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x92: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x93: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x94: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x95: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x96: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x97: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x98: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x99: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA0: // LDI - WriteMemoryWrapper(RegDE.Word++, TB1 = ReadMemoryWrapper(RegHL.Word++)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA1: // CPI - RegWZ = (ushort)(RegWZ + 1); - TB1 = ReadMemoryWrapper(RegHL.Word++); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA2: // INI - RegWZ = (ushort)(RegBC + 1); - WriteMemoryWrapper(RegHL.Word++, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA3: // OUTI - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word++)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA8: // LDD - WriteMemoryWrapper(RegDE.Word--, TB1 = ReadMemoryWrapper(RegHL.Word--)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA9: // CPD - RegWZ = (ushort)(RegWZ - 1); - TB1 = ReadMemoryWrapper(RegHL.Word--); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xAA: // IND - RegWZ = (ushort)(RegBC - 1); - WriteMemoryWrapper(RegHL.Word--, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xAB: // OUTD - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word--)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xAC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB0: // LDIR - WriteMemoryWrapper(RegDE.Word++, TB1 = ReadMemoryWrapper(RegHL.Word++)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - if (RegBC.Word != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB1: // CPIR - TB1 = ReadMemoryWrapper(RegHL.Word++); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - if (RegBC.Word != 0 && !RegFlagZ) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB2: // INIR - WriteMemoryWrapper(RegHL.Word++, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB3: // OTIR - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word++)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB8: // LDDR - WriteMemoryWrapper(RegDE.Word--, TB1 = ReadMemoryWrapper(RegHL.Word--)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - if (RegBC.Word != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB9: // CPDR - TB1 = ReadMemoryWrapper(RegHL.Word--); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - if (RegBC.Word != 0 && !RegFlagZ) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xBA: // INDR - WriteMemoryWrapper(RegHL.Word--, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xBB: // OTDR - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word--)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xBC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xED: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - } - break; - case 0xEE: // XOR n - RegAF.Word = TableALU[5, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xEF: // RST $28 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x28; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xF0: // RET P - if (!RegFlagS) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xF1: // POP AF - RegAF.Low = ReadMemoryWrapper(RegSP.Word++); RegAF.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xF2: // JP P, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagS) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xF3: // DI - IFF1 = IFF2 = false; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF4: // CALL P, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagS) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xF5: // PUSH AF - WriteMemoryWrapper(--RegSP.Word, RegAF.High); WriteMemoryWrapper(--RegSP.Word, RegAF.Low); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xF6: // OR n - RegAF.Word = TableALU[6, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xF7: // RST $30 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x30; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xF8: // RET M - if (RegFlagS) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xF9: // LD SP, IX - RegSP.Word = RegIX.Word; - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xFA: // JP M, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagS) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xFB: // EI - EI_pending = 2; - Interruptable = false; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFC: // CALL M, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagS) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xFD: // <- - // Invalid sequence. - totalExecutedCycles += 1337; pendingCycles -= 1337; - break; - case 0xFE: // CP n - RegAF.Word = TableALU[7, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xFF: // RST $38 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x38; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - } - break; - case 0xDE: // SBC A, n - RegAF.Word = TableALU[3, RegAF.High, FetchMemoryWrapper(RegPC.Word++), RegFlagC ? 1 : 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xDF: // RST $18 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x18; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xE0: // RET PO - if (!RegFlagP) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xE1: // POP HL - RegHL.Low = ReadMemoryWrapper(RegSP.Word++); RegHL.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xE2: // JP PO, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagP) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xE3: // EX (SP), HL - TUS = RegSP.Word; TBL = ReadMemoryWrapper(TUS++); TBH = ReadMemoryWrapper(TUS--); - WriteMemoryWrapper(TUS++, RegHL.Low); WriteMemoryWrapper(TUS, RegHL.High); - RegHL.Low = TBL; RegHL.High = TBH; - RegWZ = RegHL; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0xE4: // CALL PO, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagP) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xE5: // PUSH HL - WriteMemoryWrapper(--RegSP.Word, RegHL.High); WriteMemoryWrapper(--RegSP.Word, RegHL.Low); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xE6: // AND n - RegAF.Word = TableALU[4, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xE7: // RST $20 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x20; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xE8: // RET PE - if (RegFlagP) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xE9: // JP HL - RegWZ = RegHL; - RegPC.Word = RegHL.Word; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEA: // JP PE, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagP) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xEB: // EX DE, HL - TUS = RegDE.Word; RegDE.Word = RegHL.Word; RegHL.Word = TUS; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEC: // CALL PE, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagP) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xED: // (Prefix) - ++RegR; - switch (FetchMemoryWrapper(RegPC.Word++)) - { - case 0x00: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x01: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x02: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x03: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x04: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x05: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x06: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x07: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x08: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x09: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x10: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x11: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x12: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x13: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x14: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x15: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x16: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x17: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x18: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x19: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x20: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x21: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x22: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x23: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x24: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x25: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x26: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x27: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x28: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x29: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x30: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x31: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x32: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x33: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x34: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x35: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x36: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x37: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x38: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x39: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x40: // IN B, C - RegBC.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegBC.High > 127; - RegFlagZ = RegBC.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegBC.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x41: // OUT C, B - WriteHardware(RegBC.Low, RegBC.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x42: // SBC HL, BC - TI1 = (short)RegHL.Word; TI2 = (short)RegBC.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegBC.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegBC.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x43: // LD (nn), BC - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegBC.Low); - WriteMemoryWrapper(TUS, RegBC.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x44: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x45: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x46: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x47: // LD I, A - RegI = RegAF.High; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x48: // IN C, C - RegBC.Low = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegBC.Low > 127; - RegFlagZ = RegBC.Low == 0; - RegFlagH = false; - RegFlagP = TableParity[RegBC.Low]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x49: // OUT C, C - WriteHardware(RegBC.Low, RegBC.Low); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x4A: // ADC HL, BC - TI1 = (short)RegHL.Word; TI2 = (short)RegBC.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x4B: // LD BC, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegBC.Low = ReadMemoryWrapper(TUS++); RegBC.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x4E: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4F: // LD R, A - RegR = RegAF.High; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x50: // IN D, C - RegDE.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegDE.High > 127; - RegFlagZ = RegDE.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegDE.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x51: // OUT C, D - WriteHardware(RegBC.Low, RegDE.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x52: // SBC HL, DE - TI1 = (short)RegHL.Word; TI2 = (short)RegDE.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegDE.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegDE.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x53: // LD (nn), DE - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegDE.Low); - WriteMemoryWrapper(TUS, RegDE.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x54: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x55: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x56: // IM $1 - interruptMode = 1; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x57: // LD A, I - RegAF.High = RegI; - RegFlagS = RegI > 127; - RegFlagZ = RegI == 0; - RegFlagH = false; - RegFlagN = false; - RegFlagP = IFF2; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x58: // IN E, C - RegDE.Low = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegDE.Low > 127; - RegFlagZ = RegDE.Low == 0; - RegFlagH = false; - RegFlagP = TableParity[RegDE.Low]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x59: // OUT C, E - WriteHardware(RegBC.Low, RegDE.Low); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x5A: // ADC HL, DE - TI1 = (short)RegHL.Word; TI2 = (short)RegDE.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x5B: // LD DE, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegDE.Low = ReadMemoryWrapper(TUS++); RegDE.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x5E: // IM $2 - interruptMode = 2; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5F: // LD A, R - RegAF.High = (byte)(RegR & 0x7F); - RegFlagS = (byte)(RegR & 0x7F) > 127; - RegFlagZ = (byte)(RegR & 0x7F) == 0; - RegFlagH = false; - RegFlagN = false; - RegFlagP = IFF2; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x60: // IN H, C - RegHL.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegHL.High > 127; - RegFlagZ = RegHL.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegHL.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x61: // OUT C, H - WriteHardware(RegBC.Low, RegHL.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x62: // SBC HL, HL - TI1 = (short)RegHL.Word; TI2 = (short)RegHL.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegHL.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegHL.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x63: // LD (nn), HL - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegHL.Low); - WriteMemoryWrapper(TUS, RegHL.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x64: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x65: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x66: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x67: // RRD - RegWZ = (ushort)(RegHL + 1); - TB1 = RegAF.High; TB2 = ReadMemoryWrapper(RegHL.Word); - WriteMemoryWrapper(RegHL.Word, (byte)((TB2 >> 4) + (TB1 << 4))); - RegAF.High = (byte)((TB1 & 0xF0) + (TB2 & 0x0F)); - RegFlagS = RegAF.High > 127; - RegFlagZ = RegAF.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegAF.High]; - RegFlagN = false; - RegFlag3 = (RegAF.High & 0x08) != 0; - RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 18; pendingCycles -= 18; - break; - case 0x68: // IN L, C - RegHL.Low = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegHL.Low > 127; - RegFlagZ = RegHL.Low == 0; - RegFlagH = false; - RegFlagP = TableParity[RegHL.Low]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x69: // OUT C, L - WriteHardware(RegBC.Low, RegHL.Low); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x6A: // ADC HL, HL - TI1 = (short)RegHL.Word; TI2 = (short)RegHL.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x6B: // LD HL, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegHL.Low = ReadMemoryWrapper(TUS++); RegHL.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x6E: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6F: // RLD - RegWZ = (ushort)(RegHL + 1); - TB1 = RegAF.High; TB2 = ReadMemoryWrapper(RegHL.Word); - WriteMemoryWrapper(RegHL.Word, (byte)((TB1 & 0x0F) + (TB2 << 4))); - RegAF.High = (byte)((TB1 & 0xF0) + (TB2 >> 4)); - RegFlagS = RegAF.High > 127; - RegFlagZ = RegAF.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegAF.High]; - RegFlagN = false; - RegFlag3 = (RegAF.High & 0x08) != 0; - RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 18; pendingCycles -= 18; - break; - case 0x70: // IN 0, C - TB = ReadHardware((ushort)RegBC.Low); - RegFlagS = TB > 127; - RegFlagZ = TB == 0; - RegFlagH = false; - RegFlagP = TableParity[TB]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x71: // OUT C, 0 - WriteHardware(RegBC.Low, 0); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x72: // SBC HL, SP - TI1 = (short)RegHL.Word; TI2 = (short)RegSP.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegSP.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegSP.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x73: // LD (nn), SP - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegSP.Low); - WriteMemoryWrapper(TUS, RegSP.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x74: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x75: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x76: // IM $1 - interruptMode = 1; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x77: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x78: // IN A, C - RegAF.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegAF.High > 127; - RegFlagZ = RegAF.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegAF.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x79: // OUT C, A - WriteHardware(RegBC.Low, RegAF.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x7A: // ADC HL, SP - TI1 = (short)RegHL.Word; TI2 = (short)RegSP.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x7B: // LD SP, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegSP.Low = ReadMemoryWrapper(TUS++); RegSP.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x7E: // IM $2 - interruptMode = 2; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x80: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x81: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x82: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x83: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x84: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x85: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x86: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x87: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x88: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x89: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x90: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x91: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x92: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x93: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x94: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x95: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x96: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x97: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x98: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x99: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA0: // LDI - WriteMemoryWrapper(RegDE.Word++, TB1 = ReadMemoryWrapper(RegHL.Word++)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA1: // CPI - RegWZ = (ushort)(RegWZ + 1); - TB1 = ReadMemoryWrapper(RegHL.Word++); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA2: // INI - RegWZ = (ushort)(RegBC + 1); - WriteMemoryWrapper(RegHL.Word++, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA3: // OUTI - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word++)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA8: // LDD - WriteMemoryWrapper(RegDE.Word--, TB1 = ReadMemoryWrapper(RegHL.Word--)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA9: // CPD - RegWZ = (ushort)(RegWZ - 1); - TB1 = ReadMemoryWrapper(RegHL.Word--); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xAA: // IND - RegWZ = (ushort)(RegBC - 1); - WriteMemoryWrapper(RegHL.Word--, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xAB: // OUTD - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word--)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xAC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB0: // LDIR - WriteMemoryWrapper(RegDE.Word++, TB1 = ReadMemoryWrapper(RegHL.Word++)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - if (RegBC.Word != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB1: // CPIR - TB1 = ReadMemoryWrapper(RegHL.Word++); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - if (RegBC.Word != 0 && !RegFlagZ) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB2: // INIR - WriteMemoryWrapper(RegHL.Word++, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB3: // OTIR - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word++)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB8: // LDDR - WriteMemoryWrapper(RegDE.Word--, TB1 = ReadMemoryWrapper(RegHL.Word--)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - if (RegBC.Word != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB9: // CPDR - TB1 = ReadMemoryWrapper(RegHL.Word--); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - if (RegBC.Word != 0 && !RegFlagZ) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xBA: // INDR - WriteMemoryWrapper(RegHL.Word--, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xBB: // OTDR - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word--)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xBC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xED: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - } - break; - case 0xEE: // XOR n - RegAF.Word = TableALU[5, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xEF: // RST $28 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x28; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xF0: // RET P - if (!RegFlagS) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xF1: // POP AF - RegAF.Low = ReadMemoryWrapper(RegSP.Word++); RegAF.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xF2: // JP P, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagS) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xF3: // DI - IFF1 = IFF2 = false; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF4: // CALL P, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagS) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xF5: // PUSH AF - WriteMemoryWrapper(--RegSP.Word, RegAF.High); WriteMemoryWrapper(--RegSP.Word, RegAF.Low); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xF6: // OR n - RegAF.Word = TableALU[6, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xF7: // RST $30 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x30; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xF8: // RET M - if (RegFlagS) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xF9: // LD SP, HL - RegSP.Word = RegHL.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0xFA: // JP M, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagS) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xFB: // EI - EI_pending = 2; - Interruptable = false; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFC: // CALL M, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagS) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xFD: // (Prefix) - ++RegR; - switch (FetchMemoryWrapper(RegPC.Word++)) - { - case 0x00: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x01: // LD BC, nn - RegBC.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x02: // LD (BC), A - RegWZ.Low = (byte)((RegBC.Word + 1) & 0xFF); - RegWZ.High = RegAF.High; - WriteMemoryWrapper(RegBC.Word, RegAF.High); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x03: // INC BC - ++RegBC.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x04: // INC B - RegAF.Low = (byte)(TableInc[++RegBC.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x05: // DEC B - RegAF.Low = (byte)(TableDec[--RegBC.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x06: // LD B, n - RegBC.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x07: // RLCA - RegAF.Word = TableRotShift[0, 0, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x08: // EX AF, AF' - TUS = RegAF.Word; RegAF.Word = RegAltAF.Word; RegAltAF.Word = TUS; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x09: // ADD IY, BC - RegWZ = (ushort)(RegIY + 1); - TI1 = (short)RegIY.Word; TI2 = (short)RegBC.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegIY.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x0A: // LD A, (BC) - RegAF.High = ReadMemoryWrapper(RegBC.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - RegWZ = (ushort)(RegBC.Word + 1); - break; - case 0x0B: // DEC BC - --RegBC.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x0C: // INC C - RegAF.Low = (byte)(TableInc[++RegBC.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0D: // DEC C - RegAF.Low = (byte)(TableDec[--RegBC.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0E: // LD C, n - RegBC.Low = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x0F: // RRCA - RegAF.Word = TableRotShift[0, 1, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x10: // DJNZ d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (--RegBC.High != 0) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 13; pendingCycles -= 13; - } - else - { - totalExecutedCycles += 8; pendingCycles -= 8; - } - break; - case 0x11: // LD DE, nn - RegDE.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x12: // LD (DE), A - RegWZ.Low = (byte)((RegDE.Word + 1) & 0xFF); - RegWZ.High = RegAF.High; - WriteMemoryWrapper(RegDE.Word, RegAF.High); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x13: // INC DE - ++RegDE.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x14: // INC D - RegAF.Low = (byte)(TableInc[++RegDE.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x15: // DEC D - RegAF.Low = (byte)(TableDec[--RegDE.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x16: // LD D, n - RegDE.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x17: // RLA - RegAF.Word = TableRotShift[0, 2, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x18: // JR d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x19: // ADD IY, DE - RegWZ = (ushort)(RegIY + 1); - TI1 = (short)RegIY.Word; TI2 = (short)RegDE.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegIY.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x1A: // LD A, (DE) - RegAF.High = ReadMemoryWrapper(RegDE.Word); - totalExecutedCycles += 7; pendingCycles -= 7; - RegWZ = (ushort)(RegDE.Word + 1); - break; - case 0x1B: // DEC DE - --RegDE.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x1C: // INC E - RegAF.Low = (byte)(TableInc[++RegDE.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1D: // DEC E - RegAF.Low = (byte)(TableDec[--RegDE.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1E: // LD E, n - RegDE.Low = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x1F: // RRA - RegAF.Word = TableRotShift[0, 3, RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x20: // JR NZ, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (!RegFlagZ) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x21: // LD IY, nn - RegIY.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x22: // LD (nn), IY - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegIY.Low); - WriteMemoryWrapper(TUS, RegIY.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x23: // INC IY - ++RegIY.Word; - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x24: // INC IYH - RegAF.Low = (byte)(TableInc[++RegIY.High] | (RegAF.Low & 1)); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x25: // DEC IYH - RegAF.Low = (byte)(TableDec[--RegIY.High] | (RegAF.Low & 1)); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x26: // LD IYH, n - RegIY.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0x27: // DAA - RegAF.Word = TableDaa[RegAF.Word]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x28: // JR Z, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (RegFlagZ) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x29: // ADD IY, IY - RegWZ = (ushort)(RegIY + 1); - TI1 = (short)RegIY.Word; TI2 = (short)RegIY.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegIY.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x2A: // LD IY, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegIY.Low = ReadMemoryWrapper(TUS++); RegIY.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x2B: // DEC IY - --RegIY.Word; - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x2C: // INC IYL - RegAF.Low = (byte)(TableInc[++RegIY.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x2D: // DEC IYL - RegAF.Low = (byte)(TableDec[--RegIY.Low] | (RegAF.Low & 1)); - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x2E: // LD IYL, n - RegIY.Low = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0x2F: // CPL - RegAF.High ^= 0xFF; RegFlagH = true; RegFlagN = true; RegFlag3 = (RegAF.High & 0x08) != 0; RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x30: // JR NC, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (!RegFlagC) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x31: // LD SP, nn - RegSP.Word = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0x32: // LD (nn), A - temp_WZ = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ.Low = (byte)((temp_WZ + 1) & 0xFF); - RegWZ.High = RegAF.High; - WriteMemoryWrapper(temp_WZ, RegAF.High); - totalExecutedCycles += 13; pendingCycles -= 13; - break; - case 0x33: // INC SP - ++RegSP.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x34: // INC (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - TB = ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)); RegAF.Low = (byte)(TableInc[++TB] | (RegAF.Low & 1)); WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), TB); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x35: // DEC (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - TB = ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)); RegAF.Low = (byte)(TableDec[--TB] | (RegAF.Low & 1)); WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), TB); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x36: // LD (IY+d), n - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), FetchMemoryWrapper(RegPC.Word++)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x37: // SCF - RegFlagH = false; RegFlagN = false; RegFlagC = true; RegFlag3 = (RegAF.High & 0x08) != 0; RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x38: // JR C, d - TSB = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegPC.Word + TSB); - if (RegFlagC) - { - RegPC.Word = (ushort)(RegPC.Word + TSB); - totalExecutedCycles += 12; pendingCycles -= 12; - } - else - { - totalExecutedCycles += 7; pendingCycles -= 7; - } - break; - case 0x39: // ADD IY, SP - RegWZ = (ushort)(RegIY + 1); - TI1 = (short)RegIY.Word; TI2 = (short)RegSP.Word; TIR = TI1 + TI2; - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegIY.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x3A: // LD A, (nn) - temp_WZ = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegAF.High = ReadMemoryWrapper(temp_WZ); - totalExecutedCycles += 13; pendingCycles -= 13; - RegWZ = (ushort)(temp_WZ + 1); - break; - case 0x3B: // DEC SP - --RegSP.Word; - totalExecutedCycles += 6; pendingCycles -= 6; - break; - case 0x3C: // INC A - RegAF.Low = (byte)(TableInc[++RegAF.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3D: // DEC A - RegAF.Low = (byte)(TableDec[--RegAF.High] | (RegAF.Low & 1)); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3E: // LD A, n - RegAF.High = FetchMemoryWrapper(RegPC.Word++); - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0x3F: // CCF - RegFlagH = RegFlagC; RegFlagN = false; RegFlagC ^= true; RegFlag3 = (RegAF.High & 0x08) != 0; RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x40: // LD B, B - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x41: // LD B, C - RegBC.High = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x42: // LD B, D - RegBC.High = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x43: // LD B, E - RegBC.High = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x44: // LD B, IYH - RegBC.High = RegIY.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x45: // LD B, IYL - RegBC.High = RegIY.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x46: // LD B, (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegBC.High = ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x47: // LD B, A - RegBC.High = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x48: // LD C, B - RegBC.Low = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x49: // LD C, C - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4A: // LD C, D - RegBC.Low = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4B: // LD C, E - RegBC.Low = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x4C: // LD C, IYH - RegBC.Low = RegIY.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4D: // LD C, IYL - RegBC.Low = RegIY.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4E: // LD C, (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegBC.Low = ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x4F: // LD C, A - RegBC.Low = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x50: // LD D, B - RegDE.High = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x51: // LD D, C - RegDE.High = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x52: // LD D, D - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x53: // LD D, E - RegDE.High = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x54: // LD D, IYH - RegDE.High = RegIY.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x55: // LD D, IYL - RegDE.High = RegIY.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x56: // LD D, (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegDE.High = ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x57: // LD D, A - RegDE.High = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x58: // LD E, B - RegDE.Low = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x59: // LD E, C - RegDE.Low = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5A: // LD E, D - RegDE.Low = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5B: // LD E, E - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x5C: // LD E, IYH - RegDE.Low = RegIY.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5D: // LD E, IYL - RegDE.Low = RegIY.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5E: // LD E, (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegDE.Low = ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x5F: // LD E, A - RegDE.Low = RegAF.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x60: // LD IYH, B - RegIY.High = RegBC.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x61: // LD IYH, C - RegIY.High = RegBC.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x62: // LD IYH, D - RegIY.High = RegDE.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x63: // LD IYH, E - RegIY.High = RegDE.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x64: // LD IYH, IYH - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x65: // LD IYH, IYL - RegIY.High = RegIY.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x66: // LD H, (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegHL.High = ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x67: // LD IYH, A - RegIY.High = RegAF.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x68: // LD IYL, B - RegIY.Low = RegBC.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x69: // LD IYL, C - RegIY.Low = RegBC.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6A: // LD IYL, D - RegIY.Low = RegDE.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6B: // LD IYL, E - RegIY.Low = RegDE.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6C: // LD IYL, IYH - RegIY.Low = RegIY.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6D: // LD IYL, IYL - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6E: // LD L, (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegHL.Low = ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x6F: // LD IYL, A - RegIY.Low = RegAF.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x70: // LD (IY+d), B - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), RegBC.High); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x71: // LD (IY+d), C - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), RegBC.Low); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x72: // LD (IY+d), D - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), RegDE.High); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x73: // LD (IY+d), E - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), RegDE.Low); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x74: // LD (IY+d), H - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), RegHL.High); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x75: // LD (IY+d), L - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), RegHL.Low); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x76: // HALT - Halt(); - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x77: // LD (IY+d), A - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), RegAF.High); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x78: // LD A, B - RegAF.High = RegBC.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x79: // LD A, C - RegAF.High = RegBC.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7A: // LD A, D - RegAF.High = RegDE.High; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7B: // LD A, E - RegAF.High = RegDE.Low; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x7C: // LD A, IYH - RegAF.High = RegIY.High; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7D: // LD A, IYL - RegAF.High = RegIY.Low; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7E: // LD A, (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegAF.High = ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x7F: // LD A, A - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x80: // ADD A, B - RegAF.Word = TableALU[0, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x81: // ADD A, C - RegAF.Word = TableALU[0, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x82: // ADD A, D - RegAF.Word = TableALU[0, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x83: // ADD A, E - RegAF.Word = TableALU[0, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x84: // ADD A, IYH - RegAF.Word = TableALU[0, RegAF.High, RegIY.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x85: // ADD A, IYL - RegAF.Word = TableALU[0, RegAF.High, RegIY.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x86: // ADD A, (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegAF.Word = TableALU[0, RegAF.High, ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x87: // ADD A, A - RegAF.Word = TableALU[0, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x88: // ADC A, B - RegAF.Word = TableALU[1, RegAF.High, RegBC.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x89: // ADC A, C - RegAF.Word = TableALU[1, RegAF.High, RegBC.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8A: // ADC A, D - RegAF.Word = TableALU[1, RegAF.High, RegDE.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8B: // ADC A, E - RegAF.Word = TableALU[1, RegAF.High, RegDE.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8C: // ADC A, IYH - RegAF.Word = TableALU[1, RegAF.High, RegIY.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x8D: // ADC A, IYL - RegAF.Word = TableALU[1, RegAF.High, RegIY.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x8E: // ADC A, (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegAF.Word = TableALU[1, RegAF.High, ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)), RegFlagC ? 1 : 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x8F: // ADC A, A - RegAF.Word = TableALU[1, RegAF.High, RegAF.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x90: // SUB B - RegAF.Word = TableALU[2, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x91: // SUB C - RegAF.Word = TableALU[2, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x92: // SUB D - RegAF.Word = TableALU[2, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x93: // SUB E - RegAF.Word = TableALU[2, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x94: // SUB IYH - RegAF.Word = TableALU[2, RegAF.High, RegIY.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x95: // SUB IYL - RegAF.Word = TableALU[2, RegAF.High, RegIY.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x96: // SUB (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegAF.Word = TableALU[2, RegAF.High, ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x97: // SUB A, A - RegAF.Word = TableALU[2, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x98: // SBC A, B - RegAF.Word = TableALU[3, RegAF.High, RegBC.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x99: // SBC A, C - RegAF.Word = TableALU[3, RegAF.High, RegBC.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9A: // SBC A, D - RegAF.Word = TableALU[3, RegAF.High, RegDE.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9B: // SBC A, E - RegAF.Word = TableALU[3, RegAF.High, RegDE.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9C: // SBC A, IYH - RegAF.Word = TableALU[3, RegAF.High, RegIY.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x9D: // SBC A, IYL - RegAF.Word = TableALU[3, RegAF.High, RegIY.Low, RegFlagC ? 1 : 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x9E: // SBC A, (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegAF.Word = TableALU[3, RegAF.High, ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)), RegFlagC ? 1 : 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0x9F: // SBC A, A - RegAF.Word = TableALU[3, RegAF.High, RegAF.High, RegFlagC ? 1 : 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA0: // AND B - RegAF.Word = TableALU[4, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA1: // AND C - RegAF.Word = TableALU[4, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA2: // AND D - RegAF.Word = TableALU[4, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA3: // AND E - RegAF.Word = TableALU[4, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA4: // AND IYH - RegAF.Word = TableALU[4, RegAF.High, RegIY.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA5: // AND IYL - RegAF.Word = TableALU[4, RegAF.High, RegIY.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xA6: // AND (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegAF.Word = TableALU[4, RegAF.High, ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0xA7: // AND A - RegAF.Word = TableALU[4, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA8: // XOR B - RegAF.Word = TableALU[5, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA9: // XOR C - RegAF.Word = TableALU[5, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAA: // XOR D - RegAF.Word = TableALU[5, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAB: // XOR E - RegAF.Word = TableALU[5, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAC: // XOR IYH - RegAF.Word = TableALU[5, RegAF.High, RegIY.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xAD: // XOR IYL - RegAF.Word = TableALU[5, RegAF.High, RegIY.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xAE: // XOR (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegAF.Word = TableALU[5, RegAF.High, ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0xAF: // XOR A - RegAF.Word = TableALU[5, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB0: // OR B - RegAF.Word = TableALU[6, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB1: // OR C - RegAF.Word = TableALU[6, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB2: // OR D - RegAF.Word = TableALU[6, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB3: // OR E - RegAF.Word = TableALU[6, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB4: // OR IYH - RegAF.Word = TableALU[6, RegAF.High, RegIY.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB5: // OR IYL - RegAF.Word = TableALU[6, RegAF.High, RegIY.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xB6: // OR (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegAF.Word = TableALU[6, RegAF.High, ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0xB7: // OR A - RegAF.Word = TableALU[6, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB8: // CP B - RegAF.Word = TableALU[7, RegAF.High, RegBC.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB9: // CP C - RegAF.Word = TableALU[7, RegAF.High, RegBC.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBA: // CP D - RegAF.Word = TableALU[7, RegAF.High, RegDE.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBB: // CP E - RegAF.Word = TableALU[7, RegAF.High, RegDE.Low, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBC: // CP IYH - RegAF.Word = TableALU[7, RegAF.High, RegIY.High, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xBD: // CP IYL - RegAF.Word = TableALU[7, RegAF.High, RegIY.Low, 0]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xBE: // CP (IY+d) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - RegAF.Word = TableALU[7, RegAF.High, ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)), 0]; - totalExecutedCycles += 19; pendingCycles -= 19; - break; - case 0xBF: // CP A - RegAF.Word = TableALU[7, RegAF.High, RegAF.High, 0]; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC0: // RET NZ - if (!RegFlagZ) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xC1: // POP BC - RegBC.Low = ReadMemoryWrapper(RegSP.Word++); RegBC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xC2: // JP NZ, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagZ) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xC3: // JP nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - RegPC.Word = TUS; - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xC4: // CALL NZ, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagZ) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xC5: // PUSH BC - WriteMemoryWrapper(--RegSP.Word, RegBC.High); WriteMemoryWrapper(--RegSP.Word, RegBC.Low); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xC6: // ADD A, n - RegAF.Word = TableALU[0, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xC7: // RST $00 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x00; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xC8: // RET Z - if (RegFlagZ) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xC9: // RET - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xCA: // JP Z, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagZ) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xCB: // (Prefix) - Displacement = (sbyte)FetchMemoryWrapper(RegPC.Word++); - RegWZ = (ushort)(RegIY.Word + Displacement); - ++RegR; - switch (FetchMemoryWrapper(RegPC.Word++)) - { - case 0x00: // RLC (IY+d) - RegWZ = (ushort)(RegIY.Word + Displacement); - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x01: // RLC (IY+d) - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x02: // RLC (IY+d) - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x03: // RLC (IY+d) - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x04: // RLC (IY+d) - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x05: // RLC (IY+d) - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x06: // RLC (IY+d) - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x07: // RLC (IY+d) - TUS = TableRotShift[1, 0, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x08: // RRC (IY+d) - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x09: // RRC (IY+d) - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0A: // RRC (IY+d) - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0B: // RRC (IY+d) - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0C: // RRC (IY+d) - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0D: // RRC (IY+d) - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0E: // RRC (IY+d) - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x0F: // RRC (IY+d) - TUS = TableRotShift[1, 1, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x10: // RL (IY+d) - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x11: // RL (IY+d) - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x12: // RL (IY+d) - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x13: // RL (IY+d) - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x14: // RL (IY+d) - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x15: // RL (IY+d) - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x16: // RL (IY+d) - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x17: // RL (IY+d) - TUS = TableRotShift[1, 2, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x18: // RR (IY+d) - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x19: // RR (IY+d) - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1A: // RR (IY+d) - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1B: // RR (IY+d) - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1C: // RR (IY+d) - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1D: // RR (IY+d) - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1E: // RR (IY+d) - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x1F: // RR (IY+d) - TUS = TableRotShift[1, 3, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x20: // SLA (IY+d) - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x21: // SLA (IY+d) - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x22: // SLA (IY+d) - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x23: // SLA (IY+d) - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x24: // SLA (IY+d) - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x25: // SLA (IY+d) - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x26: // SLA (IY+d) - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x27: // SLA (IY+d) - TUS = TableRotShift[1, 4, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x28: // SRA (IY+d) - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x29: // SRA (IY+d) - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2A: // SRA (IY+d) - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2B: // SRA (IY+d) - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2C: // SRA (IY+d) - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2D: // SRA (IY+d) - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2E: // SRA (IY+d) - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x2F: // SRA (IY+d) - TUS = TableRotShift[1, 5, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x30: // SL1 (IY+d) - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x31: // SL1 (IY+d) - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x32: // SL1 (IY+d) - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x33: // SL1 (IY+d) - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x34: // SL1 (IY+d) - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x35: // SL1 (IY+d) - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x36: // SL1 (IY+d) - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x37: // SL1 (IY+d) - TUS = TableRotShift[1, 6, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x38: // SRL (IY+d) - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x39: // SRL (IY+d) - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3A: // SRL (IY+d) - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3B: // SRL (IY+d) - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3C: // SRL (IY+d) - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3D: // SRL (IY+d) - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3E: // SRL (IY+d) - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x3F: // SRL (IY+d) - TUS = TableRotShift[1, 7, RegAF.Low + 256 * ReadMemoryWrapper((ushort)(RegIY.Word + Displacement))]; - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(TUS >> 8)); - RegAF.Low = (byte)TUS; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x40: // BIT 0, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x41: // BIT 0, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x42: // BIT 0, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x43: // BIT 0, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x44: // BIT 0, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x45: // BIT 0, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x46: // BIT 0, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x47: // BIT 0, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x01) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x48: // BIT 1, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x49: // BIT 1, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4A: // BIT 1, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4B: // BIT 1, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4C: // BIT 1, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4D: // BIT 1, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4E: // BIT 1, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4F: // BIT 1, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x02) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x50: // BIT 2, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x51: // BIT 2, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x52: // BIT 2, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x53: // BIT 2, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x54: // BIT 2, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x55: // BIT 2, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x56: // BIT 2, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x57: // BIT 2, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x04) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x58: // BIT 3, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x59: // BIT 3, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5A: // BIT 3, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5B: // BIT 3, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5C: // BIT 3, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5D: // BIT 3, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5E: // BIT 3, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5F: // BIT 3, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x08) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x60: // BIT 4, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x61: // BIT 4, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x62: // BIT 4, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x63: // BIT 4, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x64: // BIT 4, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x65: // BIT 4, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x66: // BIT 4, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x67: // BIT 4, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x10) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x68: // BIT 5, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x69: // BIT 5, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6A: // BIT 5, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6B: // BIT 5, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6C: // BIT 5, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6D: // BIT 5, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6E: // BIT 5, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x6F: // BIT 5, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x20) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x70: // BIT 6, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x71: // BIT 6, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x72: // BIT 6, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x73: // BIT 6, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x74: // BIT 6, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x75: // BIT 6, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x76: // BIT 6, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x77: // BIT 6, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x40) == 0; - RegFlagP = RegFlagZ; - RegFlagS = false; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x78: // BIT 7, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x79: // BIT 7, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7A: // BIT 7, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7B: // BIT 7, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7C: // BIT 7, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7D: // BIT 7, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7E: // BIT 7, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7F: // BIT 7, (IY+d) - RegFlagZ = (ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & 0x80) == 0; - RegFlagP = RegFlagZ; - RegFlagS = !RegFlagZ; - RegFlag3 = RegWZ.High.Bit(3); - RegFlag5 = RegWZ.High.Bit(5); - RegFlagH = true; - RegFlagN = false; - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x80: // RES 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x81: // RES 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x82: // RES 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x83: // RES 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x84: // RES 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x85: // RES 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x86: // RES 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x87: // RES 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x88: // RES 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x89: // RES 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8A: // RES 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8B: // RES 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8C: // RES 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8D: // RES 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8E: // RES 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x8F: // RES 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x90: // RES 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x91: // RES 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x92: // RES 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x93: // RES 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x94: // RES 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x95: // RES 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x96: // RES 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x97: // RES 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x98: // RES 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x99: // RES 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9A: // RES 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9B: // RES 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9C: // RES 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9D: // RES 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9E: // RES 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0x9F: // RES 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA0: // RES 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA1: // RES 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA2: // RES 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA3: // RES 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA4: // RES 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA5: // RES 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA6: // RES 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA7: // RES 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA8: // RES 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xA9: // RES 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAA: // RES 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAB: // RES 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAC: // RES 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAD: // RES 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAE: // RES 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xAF: // RES 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB0: // RES 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB1: // RES 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB2: // RES 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB3: // RES 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB4: // RES 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB5: // RES 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB6: // RES 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB7: // RES 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB8: // RES 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xB9: // RES 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBA: // RES 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBB: // RES 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBC: // RES 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBD: // RES 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBE: // RES 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xBF: // RES 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) & unchecked((byte)~0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC0: // SET 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC1: // SET 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC2: // SET 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC3: // SET 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC4: // SET 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC5: // SET 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC6: // SET 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC7: // SET 0, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x01))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC8: // SET 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xC9: // SET 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCA: // SET 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCB: // SET 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCC: // SET 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCD: // SET 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCE: // SET 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xCF: // SET 1, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x02))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD0: // SET 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD1: // SET 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD2: // SET 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD3: // SET 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD4: // SET 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD5: // SET 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD6: // SET 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD7: // SET 2, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x04))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD8: // SET 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xD9: // SET 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDA: // SET 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDB: // SET 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDC: // SET 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDD: // SET 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDE: // SET 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xDF: // SET 3, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x08))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE0: // SET 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE1: // SET 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE2: // SET 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE3: // SET 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE4: // SET 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE5: // SET 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE6: // SET 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE7: // SET 4, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x10))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE8: // SET 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE9: // SET 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xEA: // SET 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xEB: // SET 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xEC: // SET 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xED: // SET 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xEE: // SET 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xEF: // SET 5, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x20))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF0: // SET 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF1: // SET 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF2: // SET 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF3: // SET 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF4: // SET 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF5: // SET 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF6: // SET 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF7: // SET 6, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x40))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF8: // SET 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xF9: // SET 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFA: // SET 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFB: // SET 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFC: // SET 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFD: // SET 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFE: // SET 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xFF: // SET 7, (IY+d) - WriteMemoryWrapper((ushort)(RegIY.Word + Displacement), (byte)(ReadMemoryWrapper((ushort)(RegIY.Word + Displacement)) | unchecked((byte)0x80))); - totalExecutedCycles += 23; pendingCycles -= 23; - break; - } - break; - case 0xCC: // CALL Z, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagZ) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xCD: // CALL nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - break; - case 0xCE: // ADC A, n - RegAF.Word = TableALU[1, RegAF.High, FetchMemoryWrapper(RegPC.Word++), RegFlagC ? 1 : 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xCF: // RST $08 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x08; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD0: // RET NC - if (!RegFlagC) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xD1: // POP DE - RegDE.Low = ReadMemoryWrapper(RegSP.Word++); RegDE.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xD2: // JP NC, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagC) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xD3: // OUT n, A - WriteHardware(FetchMemoryWrapper(RegPC.Word++), RegAF.High); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD4: // CALL NC, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagC) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xD5: // PUSH DE - WriteMemoryWrapper(--RegSP.Word, RegDE.High); WriteMemoryWrapper(--RegSP.Word, RegDE.Low); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD6: // SUB n - RegAF.Word = TableALU[2, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xD7: // RST $10 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x10; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xD8: // RET C - if (RegFlagC) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xD9: // EXX - TUS = RegBC.Word; RegBC.Word = RegAltBC.Word; RegAltBC.Word = TUS; - TUS = RegDE.Word; RegDE.Word = RegAltDE.Word; RegAltDE.Word = TUS; - TUS = RegHL.Word; RegHL.Word = RegAltHL.Word; RegAltHL.Word = TUS; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDA: // JP C, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagC) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xDB: // IN A, n - RegAF.High = ReadHardware((ushort)FetchMemoryWrapper(RegPC.Word++)); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xDC: // CALL C, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagC) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xDD: // <- - // Invalid sequence. - totalExecutedCycles += 1337; pendingCycles -= 1337; - break; - case 0xDE: // SBC A, n - RegAF.Word = TableALU[3, RegAF.High, FetchMemoryWrapper(RegPC.Word++), RegFlagC ? 1 : 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xDF: // RST $18 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x18; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xE0: // RET PO - if (!RegFlagP) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xE1: // POP IY - RegIY.Low = ReadMemoryWrapper(RegSP.Word++); RegIY.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0xE2: // JP PO, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagP) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xE3: // EX (SP), IY - TUS = RegSP.Word; TBL = ReadMemoryWrapper(TUS++); TBH = ReadMemoryWrapper(TUS--); - WriteMemoryWrapper(TUS++, RegIY.Low); WriteMemoryWrapper(TUS, RegIY.High); - RegIY.Low = TBL; RegIY.High = TBH; - RegWZ = RegIY; - totalExecutedCycles += 23; pendingCycles -= 23; - break; - case 0xE4: // CALL C, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagC) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xE5: // PUSH IY - WriteMemoryWrapper(--RegSP.Word, RegIY.High); WriteMemoryWrapper(--RegSP.Word, RegIY.Low); - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0xE6: // AND n - RegAF.Word = TableALU[4, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xE7: // RST $20 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x20; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xE8: // RET PE - if (RegFlagP) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xE9: // JP IY - RegWZ = RegIY; - RegPC.Word = RegIY.Word; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0xEA: // JP PE, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagP) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xEB: // EX DE, HL - TUS = RegDE.Word; RegDE.Word = RegHL.Word; RegHL.Word = TUS; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEC: // CALL PE, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagP) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xED: // (Prefix) - ++RegR; - switch (FetchMemoryWrapper(RegPC.Word++)) - { - case 0x00: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x01: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x02: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x03: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x04: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x05: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x06: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x07: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x08: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x09: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x0F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x10: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x11: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x12: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x13: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x14: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x15: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x16: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x17: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x18: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x19: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x1F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x20: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x21: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x22: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x23: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x24: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x25: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x26: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x27: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x28: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x29: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x2F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x30: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x31: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x32: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x33: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x34: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x35: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x36: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x37: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x38: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x39: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x3F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x40: // IN B, C - RegBC.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegBC.High > 127; - RegFlagZ = RegBC.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegBC.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x41: // OUT C, B - WriteHardware(RegBC.Low, RegBC.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x42: // SBC HL, BC - TI1 = (short)RegHL.Word; TI2 = (short)RegBC.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegBC.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegBC.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x43: // LD (nn), BC - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegBC.Low); - WriteMemoryWrapper(TUS, RegBC.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x44: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x45: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x46: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x47: // LD I, A - RegI = RegAF.High; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x48: // IN C, C - RegBC.Low = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegBC.Low > 127; - RegFlagZ = RegBC.Low == 0; - RegFlagH = false; - RegFlagP = TableParity[RegBC.Low]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x49: // OUT C, C - WriteHardware(RegBC.Low, RegBC.Low); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x4A: // ADC HL, BC - TI1 = (short)RegHL.Word; TI2 = (short)RegBC.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x4B: // LD BC, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegBC.Low = ReadMemoryWrapper(TUS++); RegBC.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x4C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x4E: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x4F: // LD R, A - RegR = RegAF.High; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x50: // IN D, C - RegDE.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegDE.High > 127; - RegFlagZ = RegDE.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegDE.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x51: // OUT C, D - WriteHardware(RegBC.Low, RegDE.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x52: // SBC HL, DE - TI1 = (short)RegHL.Word; TI2 = (short)RegDE.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegDE.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegDE.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x53: // LD (nn), DE - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegDE.Low); - WriteMemoryWrapper(TUS, RegDE.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x54: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x55: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x56: // IM $1 - interruptMode = 1; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x57: // LD A, I - RegAF.High = RegI; - RegFlagS = RegI > 127; - RegFlagZ = RegI == 0; - RegFlagH = false; - RegFlagN = false; - RegFlagP = IFF2; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x58: // IN E, C - RegDE.Low = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegDE.Low > 127; - RegFlagZ = RegDE.Low == 0; - RegFlagH = false; - RegFlagP = TableParity[RegDE.Low]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x59: // OUT C, E - WriteHardware(RegBC.Low, RegDE.Low); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x5A: // ADC HL, DE - TI1 = (short)RegHL.Word; TI2 = (short)RegDE.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x5B: // LD DE, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegDE.Low = ReadMemoryWrapper(TUS++); RegDE.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x5C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x5E: // IM $2 - interruptMode = 2; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x5F: // LD A, R - RegAF.High = (byte)(RegR & 0x7F); - RegFlagS = (byte)(RegR & 0x7F) > 127; - RegFlagZ = (byte)(RegR & 0x7F) == 0; - RegFlagH = false; - RegFlagN = false; - RegFlagP = IFF2; - totalExecutedCycles += 9; pendingCycles -= 9; - break; - case 0x60: // IN H, C - RegHL.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegHL.High > 127; - RegFlagZ = RegHL.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegHL.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x61: // OUT C, H - WriteHardware(RegBC.Low, RegHL.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x62: // SBC HL, HL - TI1 = (short)RegHL.Word; TI2 = (short)RegHL.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegHL.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegHL.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x63: // LD (nn), HL - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegHL.Low); - WriteMemoryWrapper(TUS, RegHL.High); - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0x64: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x65: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x66: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x67: // RRD - RegWZ = (ushort)(RegHL + 1); - TB1 = RegAF.High; TB2 = ReadMemoryWrapper(RegHL.Word); - WriteMemoryWrapper(RegHL.Word, (byte)((TB2 >> 4) + (TB1 << 4))); - RegAF.High = (byte)((TB1 & 0xF0) + (TB2 & 0x0F)); - RegFlagS = RegAF.High > 127; - RegFlagZ = RegAF.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegAF.High]; - RegFlagN = false; - RegFlag3 = (RegAF.High & 0x08) != 0; - RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 18; pendingCycles -= 18; - break; - case 0x68: // IN L, C - RegHL.Low = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegHL.Low > 127; - RegFlagZ = RegHL.Low == 0; - RegFlagH = false; - RegFlagP = TableParity[RegHL.Low]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x69: // OUT C, L - WriteHardware(RegBC.Low, RegHL.Low); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x6A: // ADC HL, HL - TI1 = (short)RegHL.Word; TI2 = (short)RegHL.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x6B: // LD HL, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegHL.Low = ReadMemoryWrapper(TUS++); RegHL.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0x6C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x6E: // IM $0 - interruptMode = 0; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x6F: // RLD - RegWZ = (ushort)(RegHL + 1); - TB1 = RegAF.High; TB2 = ReadMemoryWrapper(RegHL.Word); - WriteMemoryWrapper(RegHL.Word, (byte)((TB1 & 0x0F) + (TB2 << 4))); - RegAF.High = (byte)((TB1 & 0xF0) + (TB2 >> 4)); - RegFlagS = RegAF.High > 127; - RegFlagZ = RegAF.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegAF.High]; - RegFlagN = false; - RegFlag3 = (RegAF.High & 0x08) != 0; - RegFlag5 = (RegAF.High & 0x20) != 0; - totalExecutedCycles += 18; pendingCycles -= 18; - break; - case 0x70: // IN 0, C - TB = ReadHardware((ushort)RegBC.Low); - RegFlagS = TB > 127; - RegFlagZ = TB == 0; - RegFlagH = false; - RegFlagP = TableParity[TB]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x71: // OUT C, 0 - WriteHardware(RegBC.Low, 0); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x72: // SBC HL, SP - TI1 = (short)RegHL.Word; TI2 = (short)RegSP.Word; TIR = TI1 - TI2; - if (RegFlagC) { --TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((RegHL.Word ^ RegSP.Word ^ TUS) & 0x1000) != 0; - RegFlagN = true; - RegFlagC = (((int)RegHL.Word - (int)RegSP.Word - (RegFlagC ? 1 : 0)) & 0x10000) != 0; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x73: // LD (nn), SP - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - WriteMemoryWrapper(TUS++, RegSP.Low); - WriteMemoryWrapper(TUS, RegSP.High); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x74: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x75: // RETN - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - IFF1 = IFF2; - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x76: // IM $1 - interruptMode = 1; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x77: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x78: // IN A, C - RegAF.High = ReadHardware((ushort)RegBC.Low); - RegFlagS = RegAF.High > 127; - RegFlagZ = RegAF.High == 0; - RegFlagH = false; - RegFlagP = TableParity[RegAF.High]; - RegFlagN = false; - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x79: // OUT C, A - WriteHardware(RegBC.Low, RegAF.High); - totalExecutedCycles += 12; pendingCycles -= 12; - break; - case 0x7A: // ADC HL, SP - TI1 = (short)RegHL.Word; TI2 = (short)RegSP.Word; TIR = TI1 + TI2; - if (RegFlagC) { ++TIR; ++TI2; } - TUS = (ushort)TIR; - RegFlagH = ((TI1 & 0xFFF) + (TI2 & 0xFFF)) > 0xFFF; - RegFlagN = false; - RegFlagC = ((ushort)TI1 + (ushort)TI2) > 0xFFFF; - RegFlagP = TIR > 32767 || TIR < -32768; - RegFlagS = TUS > 32767; - RegFlagZ = TUS == 0; - RegHL.Word = TUS; - RegFlag3 = (TUS & 0x0800) != 0; - RegFlag5 = (TUS & 0x2000) != 0; - totalExecutedCycles += 15; pendingCycles -= 15; - break; - case 0x7B: // LD SP, (nn) - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = (ushort)(TUS + 1); - RegSP.Low = ReadMemoryWrapper(TUS++); RegSP.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 20; pendingCycles -= 20; - break; - case 0x7C: // NEG - RegAF.Word = TableNeg[RegAF.Word]; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7D: // RETI - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 14; pendingCycles -= 14; - break; - case 0x7E: // IM $2 - interruptMode = 2; - totalExecutedCycles += 8; pendingCycles -= 8; - break; - case 0x7F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x80: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x81: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x82: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x83: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x84: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x85: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x86: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x87: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x88: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x89: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x8F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x90: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x91: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x92: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x93: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x94: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x95: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x96: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x97: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x98: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x99: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9A: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9B: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9C: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9D: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9E: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0x9F: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA0: // LDI - WriteMemoryWrapper(RegDE.Word++, TB1 = ReadMemoryWrapper(RegHL.Word++)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA1: // CPI - RegWZ = (ushort)(RegWZ + 1); - TB1 = ReadMemoryWrapper(RegHL.Word++); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA2: // INI - RegWZ = (ushort)(RegBC + 1); - WriteMemoryWrapper(RegHL.Word++, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA3: // OUTI - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word++)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xA8: // LDD - WriteMemoryWrapper(RegDE.Word--, TB1 = ReadMemoryWrapper(RegHL.Word--)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xA9: // CPD - RegWZ = (ushort)(RegWZ - 1); - TB1 = ReadMemoryWrapper(RegHL.Word--); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xAA: // IND - RegWZ = (ushort)(RegBC - 1); - WriteMemoryWrapper(RegHL.Word--, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xAB: // OUTD - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word--)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - totalExecutedCycles += 16; pendingCycles -= 16; - break; - case 0xAC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xAF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB0: // LDIR - WriteMemoryWrapper(RegDE.Word++, TB1 = ReadMemoryWrapper(RegHL.Word++)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - if (RegBC.Word != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB1: // CPIR - TB1 = ReadMemoryWrapper(RegHL.Word++); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - if (RegBC.Word != 0 && !RegFlagZ) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB2: // INIR - WriteMemoryWrapper(RegHL.Word++, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB3: // OTIR - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word++)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xB8: // LDDR - WriteMemoryWrapper(RegDE.Word--, TB1 = ReadMemoryWrapper(RegHL.Word--)); - TB1 += RegAF.High; RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - RegFlagH = false; - RegFlagN = false; - if (RegBC.Word != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xB9: // CPDR - TB1 = ReadMemoryWrapper(RegHL.Word--); TB2 = (byte)(RegAF.High - TB1); - RegFlagN = true; - RegFlagH = TableHalfBorrow[RegAF.High, TB1]; - RegFlagZ = TB2 == 0; - RegFlagS = TB2 > 127; - TB1 = (byte)(RegAF.High - TB1 - (RegFlagH ? 1 : 0)); RegFlag5 = (TB1 & 0x02) != 0; RegFlag3 = (TB1 & 0x08) != 0; - --RegBC.Word; - RegFlagP = RegBC.Word != 0; - if (RegBC.Word != 0 && !RegFlagZ) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xBA: // INDR - WriteMemoryWrapper(RegHL.Word--, ReadHardware(RegBC.Word)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xBB: // OTDR - WriteHardware(RegBC.Word, ReadMemoryWrapper(RegHL.Word--)); - --RegBC.High; - RegFlagZ = RegBC.High == 0; - RegFlagN = true; - if (RegBC.High != 0) - { - RegPC.Word -= 2; - totalExecutedCycles += 21; pendingCycles -= 21; - } - else - { - totalExecutedCycles += 16; pendingCycles -= 16; - } - break; - case 0xBC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xBF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xC9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xCF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xD9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xDF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xE9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xED: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xEF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF0: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF1: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF2: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF3: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF4: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF5: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF6: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF7: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF8: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF9: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFA: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFB: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFC: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFD: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFE: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFF: // NOP - totalExecutedCycles += 4; pendingCycles -= 4; - break; - } - break; - case 0xEE: // XOR n - RegAF.Word = TableALU[5, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xEF: // RST $28 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x28; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xF0: // RET P - if (!RegFlagS) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xF1: // POP AF - RegAF.Low = ReadMemoryWrapper(RegSP.Word++); RegAF.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xF2: // JP P, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagS) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xF3: // DI - IFF1 = IFF2 = false; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xF4: // CALL P, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (!RegFlagS) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xF5: // PUSH AF - WriteMemoryWrapper(--RegSP.Word, RegAF.High); WriteMemoryWrapper(--RegSP.Word, RegAF.Low); - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xF6: // OR n - RegAF.Word = TableALU[6, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xF7: // RST $30 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x30; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - case 0xF8: // RET M - if (RegFlagS) - { - RegPC.Low = ReadMemoryWrapper(RegSP.Word++); RegPC.High = ReadMemoryWrapper(RegSP.Word++); - totalExecutedCycles += 11; pendingCycles -= 11; - } - else - { - totalExecutedCycles += 5; pendingCycles -= 5; - } - break; - case 0xF9: // LD SP, IY - RegSP.Word = RegIY.Word; - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xFA: // JP M, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagS) - { - RegPC.Word = TUS; - } - totalExecutedCycles += 10; pendingCycles -= 10; - break; - case 0xFB: // EI - EI_pending = 2; - Interruptable = false; - totalExecutedCycles += 4; pendingCycles -= 4; - break; - case 0xFC: // CALL M, nn - TUS = (ushort)(FetchMemoryWrapper(RegPC.Word++) + FetchMemoryWrapper(RegPC.Word++) * 256); - RegWZ = TUS; - if (RegFlagS) - { - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = TUS; - totalExecutedCycles += 17; pendingCycles -= 17; - } - else - { - totalExecutedCycles += 10; pendingCycles -= 10; - } - break; - case 0xFD: // <- - // Invalid sequence. - totalExecutedCycles += 1337; pendingCycles -= 1337; - break; - case 0xFE: // CP n - RegAF.Word = TableALU[7, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xFF: // RST $38 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x38; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - } - break; - case 0xFE: // CP n - RegAF.Word = TableALU[7, RegAF.High, FetchMemoryWrapper(RegPC.Word++), 0]; - totalExecutedCycles += 7; pendingCycles -= 7; - break; - case 0xFF: // RST $38 - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x38; - totalExecutedCycles += 11; pendingCycles -= 11; - break; - } - - } - - //EI (enable interrupts) actually takes effect after the NEXT instruction - if (EI_pending > 0) - { - EI_pending--; - if (EI_pending == 0) - { - IFF1 = IFF2 = true; - } - } - - // Process interrupt requests. - if (nonMaskableInterruptPending) - { - halted = false; - - totalExecutedCycles += 11; pendingCycles -= 11; - nonMaskableInterruptPending = false; - - iff2 = iff1; - iff1 = false; - - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x66; - NMICallback(); - - } - else if (iff1 && interrupt && Interruptable) - { - Halted = false; - - iff1 = iff2 = false; - - switch (interruptMode) - { - case 0: - totalExecutedCycles += 13; pendingCycles -= 13; - break; - case 1: - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Word = 0x38; - totalExecutedCycles += 13; pendingCycles -= 13; - break; - case 2: - TUS = (ushort)(RegI * 256 + 0); - WriteMemoryWrapper(--RegSP.Word, RegPC.High); WriteMemoryWrapper(--RegSP.Word, RegPC.Low); - RegPC.Low = ReadMemoryWrapper(TUS++); RegPC.High = ReadMemoryWrapper(TUS); - totalExecutedCycles += 19; pendingCycles -= 19; - break; - } - IRQCallback(); - } - - - } - } - - // TODO, not super thrilled with the existing Z80 disassembler, lets see if we can find something decent to replace it with - Disassembler Disassembler = new Disassembler(); - - public string TraceHeader - { - get { return "Z80: PC, machine code, mnemonic, operands, registers (AF, BC, DE, HL, IX, IY, SP, Cy), flags (CNP3H5ZS)"; } - } - - public TraceInfo State() - { - ushort tempPC = RegPC.Word; - - return new TraceInfo - { - Disassembly = string.Format( - "{0:X4}: {1:X2} {2}", - RegPC.Word, - FetchMemoryWrapper(RegPC.Word), - Disassembler.Disassemble(() => ReadMemoryWrapper(tempPC++))).PadRight(26), - RegisterInfo = string.Format( - "AF:{0:X4} BC:{1:X4} DE:{2:X4} HL:{3:X4} IX:{4:X4} IY:{5:X4} SP:{6:X4} Cy:{7} {8}{9}{10}{11}{12}{13}{14}{15}", - RegAF.Word, - RegBC.Word, - RegDE.Word, - RegHL.Word, - RegIX.Word, - RegIY.Word, - RegSP.Word, - TotalExecutedCycles, - RegFlagC ? "C" : "c", - RegFlagN ? "N" : "n", - RegFlagP ? "P" : "p", - RegFlag3 ? "3" : "-", - RegFlagH ? "H" : "h", - RegFlag5 ? "5" : "-", - RegFlagZ ? "Z" : "z", - RegFlagS ? "S" : "s" - ) - }; - } - } -} From 33079bed48781be6d7ba84f48bb29634667259c9 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 17:52:27 -0400 Subject: [PATCH 178/219] Delete Interrupts.cs --- .../CPUs/Z80/Interrupts.cs | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/CPUs/Z80/Interrupts.cs diff --git a/BizHawk.Emulation.Cores/CPUs/Z80/Interrupts.cs b/BizHawk.Emulation.Cores/CPUs/Z80/Interrupts.cs deleted file mode 100644 index 738f1dad74..0000000000 --- a/BizHawk.Emulation.Cores/CPUs/Z80/Interrupts.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; - -namespace BizHawk.Emulation.Cores.Components.Z80 -{ - public partial class Z80A - { - private bool iff1; - public bool IFF1 { get { return iff1; } set { iff1 = value; } } - - private bool iff2; - public bool IFF2 { get { return iff2; } set { iff2 = value; } } - - private bool interrupt; - public bool Interrupt { get { return interrupt; } set { interrupt = value; } } - - private bool nonMaskableInterrupt; - public bool NonMaskableInterrupt - { - get { return nonMaskableInterrupt; } - set { if (value && !nonMaskableInterrupt) NonMaskableInterruptPending = true; nonMaskableInterrupt = value; } - } - - private bool nonMaskableInterruptPending; - public bool NonMaskableInterruptPending { get { return nonMaskableInterruptPending; } set { nonMaskableInterruptPending = value; } } - - private int interruptMode; - public int InterruptMode - { - get { return interruptMode; } - set { if (value < 0 || value > 2) throw new ArgumentOutOfRangeException(); interruptMode = value; } - } - - private bool halted; - public bool Halted { get { return halted; } set { halted = value; } } - - public Action IRQCallback = delegate() { }; - public Action NMICallback = delegate() { }; - - private void ResetInterrupts() - { - IFF1 = false; - IFF2 = false; - Interrupt = false; - NonMaskableInterrupt = false; - NonMaskableInterruptPending = false; - InterruptMode = 1; - Halted = false; - } - - private void Halt() - { - Halted = true; - } - } -} \ No newline at end of file From 9776e65719a4467b75c231cbc352f7f3f51ff0f7 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 17:52:36 -0400 Subject: [PATCH 179/219] Delete Registers.cs --- BizHawk.Emulation.Cores/CPUs/Z80/Registers.cs | 270 ------------------ 1 file changed, 270 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/CPUs/Z80/Registers.cs diff --git a/BizHawk.Emulation.Cores/CPUs/Z80/Registers.cs b/BizHawk.Emulation.Cores/CPUs/Z80/Registers.cs deleted file mode 100644 index bd5fe98cbc..0000000000 --- a/BizHawk.Emulation.Cores/CPUs/Z80/Registers.cs +++ /dev/null @@ -1,270 +0,0 @@ -using System.Runtime.InteropServices; -using System; - -namespace BizHawk.Emulation.Cores.Components.Z80 -{ - public partial class Z80A - { - [StructLayout(LayoutKind.Explicit)] - [Serializable()] - public struct RegisterPair - { - [FieldOffset(0)] - public ushort Word; - - [FieldOffset(0)] - public byte Low; - - [FieldOffset(1)] - public byte High; - - public RegisterPair(ushort value) - { - Word = value; - Low = (byte)(Word); - High = (byte)(Word >> 8); - } - - public static implicit operator ushort(RegisterPair rp) - { - return rp.Word; - } - - public static implicit operator RegisterPair(ushort value) - { - return new RegisterPair(value); - } - } - - private bool RegFlagC - { - get { return (RegAF.Low & 0x01) != 0; } - set { RegAF.Low = (byte)((RegAF.Low & ~0x01) | (value ? 0x01 : 0x00)); } - } - - private bool RegFlagN - { - get { return (RegAF.Low & 0x02) != 0; } - set { RegAF.Low = (byte)((RegAF.Low & ~0x02) | (value ? 0x02 : 0x00)); } - } - - private bool RegFlagP - { - get { return (RegAF.Low & 0x04) != 0; } - set { RegAF.Low = (byte)((RegAF.Low & ~0x04) | (value ? 0x04 : 0x00)); } - } - - private bool RegFlag3 - { - get { return (RegAF.Low & 0x08) != 0; } - set { RegAF.Low = (byte)((RegAF.Low & ~0x08) | (value ? 0x08 : 0x00)); } - } - - private bool RegFlagH - { - get { return (RegAF.Low & 0x10) != 0; } - set { RegAF.Low = (byte)((RegAF.Low & ~0x10) | (value ? 0x10 : 0x00)); } - } - - private bool RegFlag5 - { - get { return (RegAF.Low & 0x20) != 0; } - set { RegAF.Low = (byte)((RegAF.Low & ~0x20) | (value ? 0x20 : 0x00)); } - } - - private bool RegFlagZ - { - get { return (RegAF.Low & 0x40) != 0; } - set { RegAF.Low = (byte)((RegAF.Low & ~0x40) | (value ? 0x40 : 0x00)); } - } - - private bool RegFlagS - { - get { return (RegAF.Low & 0x80) != 0; } - set { RegAF.Low = (byte)((RegAF.Low & ~0x80) | (value ? 0x80 : 0x00)); } - } - - private RegisterPair RegAF; - private RegisterPair RegBC; - private RegisterPair RegDE; - private RegisterPair RegHL; - private RegisterPair RegWZ; - - private RegisterPair RegAltAF; // Shadow for A and F - private RegisterPair RegAltBC; // Shadow for B and C - private RegisterPair RegAltDE; // Shadow for D and E - private RegisterPair RegAltHL; // Shadow for H and L - // NOTE: There is no AltWZ register (despite it being shown on various block diagrams) - - private byte RegI; // I (interrupt vector) - private byte RegR; // R (memory refresh) - - private RegisterPair RegIX; // IX (index register x) - private RegisterPair RegIY; // IY (index register y) - - private RegisterPair RegSP; // SP (stack pointer) - private RegisterPair RegPC; // PC (program counter) - - private void ResetRegisters() - { - // Clear main registers - RegAF = 0; RegBC = 0; RegDE = 0; RegHL = 0; RegWZ = 0; - // Clear alternate registers - RegAltAF = 0; RegAltBC = 0; RegAltDE = 0; RegAltHL = 0; - // Clear special purpose registers - RegI = 0; RegR = 0; - RegIX.Word = 0; RegIY.Word = 0; - RegSP.Word = 0; RegPC.Word = 0; - } - - public byte RegisterA - { - get { return RegAF.High; } - set { RegAF.High = value; } - } - - public byte RegisterF - { - get { return RegAF.Low; } - set { RegAF.Low = value; } - } - - public ushort RegisterAF - { - get { return RegAF.Word; } - set { RegAF.Word = value; } - } - - public byte RegisterB - { - get { return RegBC.High; } - set { RegBC.High = value; } - } - - public byte RegisterC - { - get { return RegBC.Low; } - set { RegBC.Low = value; } - } - - public ushort RegisterBC - { - get { return RegBC.Word; } - set { RegBC.Word = value; } - } - - public byte RegisterD - { - get { return RegDE.High; } - set { RegDE.High = value; } - } - - public byte RegisterE - { - get { return RegDE.Low; } - set { RegDE.Low = value; } - } - - public ushort RegisterDE - { - get { return RegDE.Word; } - set { RegDE.Word = value; } - } - - public byte RegisterH - { - get { return RegHL.High; } - set { RegHL.High = value; } - } - - public byte RegisterL - { - get { return RegHL.Low; } - set { RegHL.Low = value; } - } - - public ushort RegisterHL - { - get { return RegHL.Word; } - set { RegHL.Word = value; } - } - - public byte RegisterW - { - get { return RegWZ.High; } - set { RegWZ.High = value; } - } - - public byte RegisterZ - { - get { return RegWZ.Low; } - set { RegWZ.Low = value; } - } - - public ushort RegisterWZ - { - get { return RegWZ.Word; } - set { RegWZ.Word = value; } - } - - public ushort RegisterPC - { - get { return RegPC.Word; } - set { RegPC.Word = value; } - } - - public ushort RegisterSP - { - get { return RegSP.Word; } - set { RegSP.Word = value; } - } - - public ushort RegisterIX - { - get { return RegIX.Word; } - set { RegIX.Word = value; } - } - - public ushort RegisterIY - { - get { return RegIY.Word; } - set { RegIY.Word = value; } - } - - public byte RegisterI - { - get { return RegI; } - set { RegI = value; } - } - - public byte RegisterR - { - get { return RegR; } - set { RegR = value; } - } - - public ushort RegisterShadowAF - { - get { return RegAltAF.Word; } - set { RegAltAF.Word = value; } - } - - public ushort RegisterShadowBC - { - get { return RegAltBC.Word; } - set { RegAltBC.Word = value; } - } - - public ushort RegisterShadowDE - { - get { return RegAltDE.Word; } - set { RegAltDE.Word = value; } - } - - public ushort RegisterShadowHL - { - get { return RegAltHL.Word; } - set { RegAltHL.Word = value; } - } - } -} \ No newline at end of file From ac2c6a46e0e8e54f56868edecb63745ff2cb3f71 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 17:52:45 -0400 Subject: [PATCH 180/219] Delete Tables.cs --- BizHawk.Emulation.Cores/CPUs/Z80/Tables.cs | 331 --------------------- 1 file changed, 331 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/CPUs/Z80/Tables.cs diff --git a/BizHawk.Emulation.Cores/CPUs/Z80/Tables.cs b/BizHawk.Emulation.Cores/CPUs/Z80/Tables.cs deleted file mode 100644 index a50e9a1aeb..0000000000 --- a/BizHawk.Emulation.Cores/CPUs/Z80/Tables.cs +++ /dev/null @@ -1,331 +0,0 @@ -namespace BizHawk.Emulation.Cores.Components.Z80 -{ - public partial class Z80A - { - private void InitialiseTables() - { - InitTableInc(); - InitTableDec(); - InitTableParity(); - InitTableALU(); - InitTableRotShift(); - InitTableHalfBorrow(); - InitTableHalfCarry(); - InitTableNeg(); - InitTableDaa(); - } - - private byte[] TableInc; - private void InitTableInc() - { - TableInc = new byte[256]; - for (int i = 0; i < 256; ++i) - TableInc[i] = FlagByte(false, false, i == 0x80, UndocumentedX(i), (i & 0xF) == 0x0, UndocumentedY(i), i == 0, i > 127); - } - - private byte[] TableDec; - private void InitTableDec() - { - TableDec = new byte[256]; - for (int i = 0; i < 256; ++i) - TableDec[i] = FlagByte(false, true, i == 0x7F, UndocumentedX(i), (i & 0xF) == 0xF, UndocumentedY(i), i == 0, i > 127); - } - - private bool[] TableParity; - private void InitTableParity() - { - TableParity = new bool[256]; - for (int i = 0; i < 256; ++i) - { - int Bits = 0; - for (int j = 0; j < 8; ++j) - { - Bits += (i >> j) & 1; - } - TableParity[i] = (Bits & 1) == 0; - } - } - - private ushort[, , ,] TableALU; - private void InitTableALU() - { - TableALU = new ushort[8, 256, 256, 2]; // Class, OP1, OP2, Carry - - for (int i = 0; i < 8; ++i) - { - for (int op1 = 0; op1 < 256; ++op1) - { - for (int op2 = 0; op2 < 256; ++op2) - { - for (int c = 0; c < 2; ++c) - { - - int ac = (i == 1 || i == 3) ? c : 0; - - bool S = false; - bool Z = false; - bool C = false; - bool H = false; - bool N = false; - bool P = false; - - byte result_b = 0; - int result_si = 0; - int result_ui = 0; - - // Fetch result - switch (i) - { - case 0: - case 1: - result_si = (sbyte)op1 + (sbyte)op2 + ac; - result_ui = op1 + op2 + ac; - break; - case 2: - case 3: - case 7: - result_si = (sbyte)op1 - (sbyte)op2 - ac; - result_ui = op1 - op2 - ac; - break; - case 4: - result_si = op1 & op2; - break; - case 5: - result_si = op1 ^ op2; - break; - case 6: - result_si = op1 | op2; - break; - } - - result_b = (byte)result_si; - - // Parity/Carry - - switch (i) - { - case 0: - case 1: - case 2: - case 3: - case 7: - P = result_si < -128 || result_si > 127; - C = result_ui < 0 || result_ui > 255; - break; - case 4: - case 5: - case 6: - P = TableParity[result_b]; - C = false; - break; - } - - // Subtraction - N = i == 2 || i == 3 || i == 7; - - // Half carry - switch (i) - { - case 0: - case 1: - H = ((op1 & 0xF) + (op2 & 0xF) + (ac & 0xF)) > 0xF; - break; - case 2: - case 3: - case 7: - H = ((op1 & 0xF) - (op2 & 0xF) - (ac & 0xF)) < 0x0; - break; - case 4: - H = true; - break; - case 5: - case 6: - H = false; - break; - } - - // Undocumented - byte UndocumentedFlags = (byte)(result_b & 0x28); - if (i == 7) UndocumentedFlags = (byte)(op2 & 0x28); - - S = result_b > 127; - Z = result_b == 0; - - if (i == 7) result_b = (byte)op1; - - TableALU[i, op1, op2, c] = (ushort)( - result_b * 256 + - ((C ? 0x01 : 0) + (N ? 0x02 : 0) + (P ? 0x04 : 0) + (H ? 0x10 : 0) + (Z ? 0x40 : 0) + (S ? 0x80 : 0)) + - (UndocumentedFlags)); - - } - } - } - } - } - - private bool[,] TableHalfBorrow; - private void InitTableHalfBorrow() - { - TableHalfBorrow = new bool[256, 256]; - for (int i = 0; i < 256; i++) - { - for (int j = 0; j < 256; j++) - { - TableHalfBorrow[i, j] = ((i & 0xF) - (j & 0xF)) < 0; - } - } - } - - private bool[,] TableHalfCarry; - private void InitTableHalfCarry() - { - TableHalfCarry = new bool[256, 256]; - for (int i = 0; i < 256; i++) - { - for (int j = 0; j < 256; j++) - { - TableHalfCarry[i, j] = ((i & 0xF) + (j & 0xF)) > 0xF; - } - } - } - - private ushort[, ,] TableRotShift; - private void InitTableRotShift() - { - TableRotShift = new ushort[2, 8, 65536]; // All, operation, AF - for (int all = 0; all < 2; all++) - { - for (int y = 0; y < 8; ++y) - { - for (int af = 0; af < 65536; af++) - { - byte Old = (byte)(af >> 8); - bool OldCarry = (af & 0x01) != 0; - - ushort newAf = (ushort)(af & ~(0x13)); // Clear HALF-CARRY, SUBTRACT and CARRY flags - - byte New = Old; - if ((y & 1) == 0) - { - if ((Old & 0x80) != 0) ++newAf; - - New <<= 1; - - if ((y & 0x04) == 0) - { - if (((y & 0x02) == 0) ? ((newAf & 0x01) != 0) : OldCarry) New |= 0x01; - } - else - { - if ((y & 0x02) != 0) New |= 0x01; - } - - } - else - { - - if ((Old & 0x01) != 0) ++newAf; - - New >>= 1; - - if ((y & 0x04) == 0) - { - if (((y & 0x02) == 0) ? ((newAf & 0x01) != 0) : OldCarry) New |= 0x80; - } - else - { - if ((y & 0x02) == 0) New |= (byte)(Old & 0x80); - } - } - - newAf &= 0xFF; - newAf |= (ushort)(New * 256); - - if (all == 1) - { - newAf &= unchecked((ushort)~0xC4); // Clear S, Z, P - if (New > 127) newAf |= 0x80; - if (New == 0) newAf |= 0x40; - if (TableParity[New]) newAf |= 0x04; - } - - TableRotShift[all, y, af] = (ushort)((newAf & ~0x28) | ((newAf >> 8) & 0x28)); - } - } - } - } - - private ushort[] TableNeg; - private void InitTableNeg() - { - TableNeg = new ushort[65536]; - for (int af = 0; af < 65536; af++) - { - ushort raf = 0; - byte b = (byte)(af >> 8); - byte a = (byte)-b; - raf |= (ushort)(a * 256); - raf |= FlagByte(b != 0x00, true, b == 0x80, UndocumentedX(a), TableHalfCarry[a, b], UndocumentedY(a), a == 0, a > 127); - TableNeg[af] = raf; - } - } - - private ushort[] TableDaa; - private void InitTableDaa() - { - TableDaa = new ushort[65536]; - for (int af = 0; af < 65536; ++af) - { - byte a = (byte)(af >> 8); - byte tmp = a; - - if (IsN(af)) - { - if (IsH(af) || ((a & 0x0F) > 0x09)) tmp -= 0x06; - if (IsC(af) || a > 0x99) tmp -= 0x60; - } - else - { - if (IsH(af) || ((a & 0x0F) > 0x09)) tmp += 0x06; - if (IsC(af) || a > 0x99) tmp += 0x60; - } - - TableDaa[af] = (ushort)((tmp * 256) + FlagByte(IsC(af) || a > 0x99, IsN(af), TableParity[tmp], UndocumentedX(tmp), ((a ^ tmp) & 0x10) != 0, UndocumentedY(tmp), tmp == 0, tmp > 127)); - } - } - - private byte FlagByte(bool C, bool N, bool P, bool X, bool H, bool Y, bool Z, bool S) - { - return (byte)( - (C ? 0x01 : 0) + - (N ? 0x02 : 0) + - (P ? 0x04 : 0) + - (X ? 0x08 : 0) + - (H ? 0x10 : 0) + - (Y ? 0x20 : 0) + - (Z ? 0x40 : 0) + - (S ? 0x80 : 0) - ); - } - - private bool UndocumentedX(int value) - { - return (value & 0x08) != 0; - } - - private bool UndocumentedY(int value) - { - return (value & 0x20) != 0; - } - - private bool IsC(int value) { return (value & 0x01) != 0; } - private bool IsN(int value) { return (value & 0x02) != 0; } - private bool IsP(int value) { return (value & 0x04) != 0; } - private bool IsX(int value) { return (value & 0x08) != 0; } - private bool IsH(int value) { return (value & 0x10) != 0; } - private bool IsY(int value) { return (value & 0x20) != 0; } - private bool IsZ(int value) { return (value & 0x40) != 0; } - private bool IsS(int value) { return (value & 0x80) != 0; } - } -} From 7984eecd990debd1595e5d182babf02268651085 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 17:52:53 -0400 Subject: [PATCH 181/219] Delete Z80A.cs --- BizHawk.Emulation.Cores/CPUs/Z80/Z80A.cs | 142 ----------------------- 1 file changed, 142 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/CPUs/Z80/Z80A.cs diff --git a/BizHawk.Emulation.Cores/CPUs/Z80/Z80A.cs b/BizHawk.Emulation.Cores/CPUs/Z80/Z80A.cs deleted file mode 100644 index 35b7d7038c..0000000000 --- a/BizHawk.Emulation.Cores/CPUs/Z80/Z80A.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.Globalization; -using System.IO; - -using BizHawk.Common; -using BizHawk.Emulation.Common; - -// This Z80 emulator is a modified version of Ben Ryves 'Brazil' emulator. -// It is MIT licensed. - -// for WZ register details, see: http://www.grimware.org/lib/exe/fetch.php/documentations/devices/z80/z80.memptr.eng.txt - -namespace BizHawk.Emulation.Cores.Components.Z80 -{ - public sealed partial class Z80A - { - public Z80A() - { - InitialiseTables(); - Reset(); - } - - public void Reset() - { - ResetRegisters(); - ResetInterrupts(); - PendingCycles = 0; - ExpectedExecutedCycles = 0; - TotalExecutedCycles = 0; - } - - public void SoftReset() - { - ResetRegisters(); - ResetInterrupts(); - } - - // Memory Access - - public Func FetchMemory; - public Func ReadMemory; - public Action WriteMemory; - - public byte ReadMemoryWrapper(ushort addr) - { - if (MemoryCallbacks != null) - { - MemoryCallbacks.CallReads(addr); - } - - return ReadMemory(addr); - } - - public byte FetchFirstMemoryWrapper(ushort addr) - { - if (MemoryCallbacks != null) - { - MemoryCallbacks.CallReads(addr); - } - - if (FetchMemory != null) - { - return FetchMemory(addr, true); - } - - return ReadMemory(addr); - } - - public byte FetchMemoryWrapper(ushort addr) - { - if (MemoryCallbacks != null) - { - MemoryCallbacks.CallReads(addr); - } - - if (FetchMemory != null) - { - return FetchMemory(addr, false); - } - - return ReadMemory(addr); - } - - public void WriteMemoryWrapper(ushort addr, byte value) - { - if (MemoryCallbacks != null) - { - MemoryCallbacks.CallWrites(addr); - } - - WriteMemory(addr, value); - } - - public IMemoryCallbackSystem MemoryCallbacks { get; set; } - - // Utility function, not used by core - public ushort ReadWord(ushort addr) - { - ushort value = ReadMemory(addr++); - value |= (ushort)(ReadMemory(addr) << 8); - return value; - } - - // Hardware I/O Port Access - - public Func ReadHardware; - public Action WriteHardware; - - // State Save/Load - - public void SyncState(Serializer ser) - { - ser.BeginSection("Z80"); - ser.Sync("AF", ref RegAF.Word); - ser.Sync("BC", ref RegBC.Word); - ser.Sync("DE", ref RegDE.Word); - ser.Sync("HL", ref RegHL.Word); - ser.Sync("WZ", ref RegWZ.Word); - ser.Sync("ShadowAF", ref RegAltAF.Word); - ser.Sync("ShadowBC", ref RegAltBC.Word); - ser.Sync("ShadowDE", ref RegAltDE.Word); - ser.Sync("ShadowHL", ref RegAltHL.Word); - ser.Sync("I", ref RegI); - ser.Sync("R", ref RegR); - ser.Sync("IX", ref RegIX.Word); - ser.Sync("IY", ref RegIY.Word); - ser.Sync("SP", ref RegSP.Word); - ser.Sync("PC", ref RegPC.Word); - ser.Sync("IRQ", ref interrupt); - ser.Sync("NMI", ref nonMaskableInterrupt); - ser.Sync("NMIPending", ref nonMaskableInterruptPending); - ser.Sync("IM", ref interruptMode); - ser.Sync("IFF1", ref iff1); - ser.Sync("IFF2", ref iff2); - ser.Sync("Halted", ref halted); - ser.Sync("ExecutedCycles", ref totalExecutedCycles); - ser.Sync("PendingCycles", ref pendingCycles); - ser.Sync("EI_pending", ref EI_pending); - ser.EndSection(); - } - } -} \ No newline at end of file From 0fda518cb749a9a55a6e724bfa7ecc53cbc6dc21 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 17:58:36 -0400 Subject: [PATCH 182/219] Add files via upload --- BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs | 2 +- BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs | 2 +- BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs | 2 +- BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs | 2 +- BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs | 2 +- BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs | 2 +- BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Indirect.cs | 2 +- BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs index 089185c7ca..b513acfca4 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs @@ -1,6 +1,6 @@ using System; -namespace BizHawk.Emulation.Common.Components.Z80A +namespace BizHawk.Emulation.Cores.Components.Z80A { public partial class Z80A { diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs index f658f1a09b..8dc1cd24ce 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Interrupts.cs @@ -1,6 +1,6 @@ using System; -namespace BizHawk.Emulation.Common.Components.Z80A +namespace BizHawk.Emulation.Cores.Components.Z80A { public partial class Z80A { diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs index 62c546ca6e..44d53780c3 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using BizHawk.Emulation.Common; -namespace BizHawk.Emulation.Common.Components.Z80A +namespace BizHawk.Emulation.Cores.Components.Z80A { public sealed partial class Z80A : IDisassemblable { diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs index d80fb48022..d618c2bdcd 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs @@ -1,7 +1,7 @@ using BizHawk.Common.NumberExtensions; using System; -namespace BizHawk.Emulation.Common.Components.Z80A +namespace BizHawk.Emulation.Cores.Components.Z80A { public partial class Z80A { diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs index 11dfef24cd..628243c19e 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Registers.cs @@ -1,7 +1,7 @@ using System.Runtime.InteropServices; using System; -namespace BizHawk.Emulation.Common.Components.Z80A +namespace BizHawk.Emulation.Cores.Components.Z80A { public partial class Z80A { diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs index 2d069cd8b1..ad8bed179b 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs @@ -1,6 +1,6 @@ using System; -namespace BizHawk.Emulation.Common.Components.Z80A +namespace BizHawk.Emulation.Cores.Components.Z80A { public partial class Z80A { diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Indirect.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Indirect.cs index 38890f7918..4a1c46cc03 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Indirect.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Indirect.cs @@ -1,4 +1,4 @@ -namespace BizHawk.Emulation.Common.Components.Z80A +namespace BizHawk.Emulation.Cores.Components.Z80A { public partial class Z80A { diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs index ff2bbf87e7..53d85bb25b 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs @@ -7,7 +7,7 @@ using BizHawk.Emulation.Common; using BizHawk.Common.NumberExtensions; // Z80A CPU -namespace BizHawk.Emulation.Common.Components.Z80A +namespace BizHawk.Emulation.Cores.Components.Z80A { public sealed partial class Z80A { From 8b2b796b53e02e7db96cfaf97643038323ec1327 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 17:59:14 -0400 Subject: [PATCH 183/219] Add files via upload --- BizHawk.Emulation.Cores/Calculator/TI83.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Calculator/TI83.cs b/BizHawk.Emulation.Cores/Calculator/TI83.cs index aa83616945..dc70edff41 100644 --- a/BizHawk.Emulation.Cores/Calculator/TI83.cs +++ b/BizHawk.Emulation.Cores/Calculator/TI83.cs @@ -2,7 +2,7 @@ using System; using System.Globalization; using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.Components.Z80A; +using BizHawk.Emulation.Cores.Components.Z80A; // http://www.ticalc.org/pub/text/calcinfo/ namespace BizHawk.Emulation.Cores.Calculators From 9d9133720c9ec67e901f923e1e5b0dd8f3575f19 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 18:00:08 -0400 Subject: [PATCH 184/219] Add files via upload --- BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs | 2 +- BizHawk.Emulation.Cores/Consoles/Coleco/TMS9918A.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs index f7d183f60d..83c175ef78 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs @@ -1,6 +1,6 @@ using BizHawk.Emulation.Common; using BizHawk.Emulation.Cores.Components; -using BizHawk.Emulation.Common.Components.Z80A; +using BizHawk.Emulation.Cores.Components.Z80A; namespace BizHawk.Emulation.Cores.ColecoVision { diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/TMS9918A.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/TMS9918A.cs index 00049a5890..c86bd515c1 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/TMS9918A.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/TMS9918A.cs @@ -2,7 +2,7 @@ using BizHawk.Common; using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.Components.Z80A; +using BizHawk.Emulation.Cores.Components.Z80A; namespace BizHawk.Emulation.Cores.ColecoVision { From 09ce28d2bd6ed70ad9fb9e4080d516f478d6f84d Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 18:01:14 -0400 Subject: [PATCH 185/219] Add files via upload --- .../Consoles/Sega/SMS/SMS.IEmulator.cs | 180 +++++++++--------- .../Consoles/Sega/SMS/SMS.cs | 2 +- .../Consoles/Sega/SMS/VDP.cs | 2 +- 3 files changed, 92 insertions(+), 92 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs index d6f398dccd..fe2a9222a3 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs @@ -1,45 +1,45 @@ -using BizHawk.Emulation.Common; - -namespace BizHawk.Emulation.Cores.Sega.MasterSystem -{ - public sealed partial class SMS : IEmulator - { - public IEmulatorServiceProvider ServiceProvider { get; } - - public ControllerDefinition ControllerDefinition - { - get - { - if (IsGameGear) - { - return GGController; - } - - switch(Settings.ControllerType) - { - case "Paddle": - return SMSPaddleController; - case "Light Phaser": - // scale the vertical to the display mode - SMSLightPhaserController.FloatRanges[1] = new ControllerDefinition.FloatRange(0, Vdp.FrameHeight / 2, Vdp.FrameHeight - 1); - - return SMSLightPhaserController; - default: - return SmsController; - } - } - } - - public void FrameAdvance(IController controller, bool render, bool rendersound) - { - _controller = controller; - _lagged = true; - _frame++; - PSG.BeginFrame(Cpu.TotalExecutedCycles); - - if (!IsGameGear) - { - PSG.StereoPanning = Settings.ForceStereoSeparation ? ForceStereoByte : (byte)0xFF; +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Sega.MasterSystem +{ + public sealed partial class SMS : IEmulator + { + public IEmulatorServiceProvider ServiceProvider { get; } + + public ControllerDefinition ControllerDefinition + { + get + { + if (IsGameGear) + { + return GGController; + } + + switch(Settings.ControllerType) + { + case "Paddle": + return SMSPaddleController; + case "Light Phaser": + // scale the vertical to the display mode + SMSLightPhaserController.FloatRanges[1] = new ControllerDefinition.FloatRange(0, Vdp.FrameHeight / 2, Vdp.FrameHeight - 1); + + return SMSLightPhaserController; + default: + return SmsController; + } + } + } + + public void FrameAdvance(IController controller, bool render, bool rendersound) + { + _controller = controller; + _lagged = true; + _frame++; + PSG.BeginFrame(Cpu.TotalExecutedCycles); + + if (!IsGameGear) + { + PSG.StereoPanning = Settings.ForceStereoSeparation ? ForceStereoByte : (byte)0xFF; } if (Tracer.Enabled) @@ -49,51 +49,51 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem else { Cpu.TraceCallback = null; - } - - if (IsGameGear == false) - { - Cpu.NonMaskableInterrupt = controller.IsPressed("Pause"); - } - - if (IsGame3D && Settings.Fix3D) - { - Vdp.ExecFrame((Frame & 1) == 0); - } - else - { - Vdp.ExecFrame(render); - } - - PSG.EndFrame(Cpu.TotalExecutedCycles); - if (_lagged) - { - _lagCount++; - _isLag = true; - } - else - { - _isLag = false; - } - } - - public int Frame => _frame; - - public string SystemId => "SMS"; - - public bool DeterministicEmulation => true; - - public void ResetCounters() - { - _frame = 0; - _lagCount = 0; - _isLag = false; - } - - public CoreComm CoreComm { get; } - - public void Dispose() - { - } - } -} + } + + if (IsGameGear == false) + { + Cpu.NonMaskableInterrupt = controller.IsPressed("Pause"); + } + + if (IsGame3D && Settings.Fix3D) + { + Vdp.ExecFrame((Frame & 1) == 0); + } + else + { + Vdp.ExecFrame(render); + } + + PSG.EndFrame(Cpu.TotalExecutedCycles); + if (_lagged) + { + _lagCount++; + _isLag = true; + } + else + { + _isLag = false; + } + } + + public int Frame => _frame; + + public string SystemId => "SMS"; + + public bool DeterministicEmulation => true; + + public void ResetCounters() + { + _frame = 0; + _lagCount = 0; + _isLag = false; + } + + public CoreComm CoreComm { get; } + + public void Dispose() + { + } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs index 1e9b39381d..3030c8084d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs @@ -4,7 +4,7 @@ using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; using BizHawk.Emulation.Common.Components; using BizHawk.Emulation.Cores.Components; -using BizHawk.Emulation.Common.Components.Z80A; +using BizHawk.Emulation.Cores.Components.Z80A; /***************************************************** TODO: diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs index f079d04608..adccda7fd3 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/VDP.cs @@ -4,7 +4,7 @@ using System.IO; using BizHawk.Common; using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.Components.Z80A; +using BizHawk.Emulation.Cores.Components.Z80A; namespace BizHawk.Emulation.Cores.Sega.MasterSystem From 74fbe5a261d9af4ed6c0d07c5008358bad105e66 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 13 Oct 2017 18:04:06 -0400 Subject: [PATCH 186/219] Update BizHawk.Emulation.Cores.csproj --- .../BizHawk.Emulation.Cores.csproj | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 7958b5be1a..59a4958220 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -1186,12 +1186,14 @@ - - - - - - + + + + + + + + True True @@ -1314,4 +1316,4 @@ --> - \ No newline at end of file + From 4f63cadb4a7d620cf636cec5e174a1278b2a1a33 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 14 Oct 2017 14:07:17 -0400 Subject: [PATCH 187/219] Z80 Corrections and Bug Fixes --- BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs | 12 ++++++------ .../CPUs/Z80A/NewDisassembler.cs | 1 + BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs | 15 +++++++++++++++ .../CPUs/Z80A/Tables_Direct.cs | 2 +- BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs | 5 +++++ 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs index b513acfca4..299d84dd0f 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs @@ -874,7 +874,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case 0xDA: JP_COND(FlagC); break; // JP C case 0xDB: IN_(); break; // IN A case 0xDC: CALL_COND(FlagC); break; // CALL C - case 0xDD: JAM_(); break; // Jam (invalid) + case 0xDD: PREFIX_(IXpre); break; // IX Prefix case 0xDE: REG_OP_IND_INC(SBC8, A, PCl, PCh); break; // SBC A, n case 0xDF: RST_(0x18); break; // RST 0x18 case 0xE0: RET_COND(!FlagP); break; // RET Po @@ -890,7 +890,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case 0xEA: JP_COND(FlagP); break; // JP Pe case 0xEB: EXCH_16_(E, D, L, H); break; // ex DE, HL case 0xEC: CALL_COND(FlagP); break; // CALL Pe - case 0xED: JAM_(); break; // Jam (invalid) + case 0xED: PREFIX_(EXTDpre); break; // EXTD Prefix case 0xEE: REG_OP_IND_INC(XOR8, A, PCl, PCh); break; // XOR A, n case 0xEF: RST_(0x28); break; // RST 0x28 case 0xF0: RET_COND(!FlagS); break; // RET p @@ -906,7 +906,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case 0xFA: JP_COND(FlagS); break; // JP M case 0xFB: EI_(); break; // EI case 0xFC: CALL_COND(FlagS); break; // CALL M - case 0xFD: JAM_(); break; // Jam (invalid) + case 0xFD: PREFIX_(IYpre); break; // IY Prefix case 0xFE: REG_OP_IND_INC(CP8, A, PCl, PCh); break; // CP A, n case 0xFF: RST_(0x38); break; // RST $38 } @@ -1139,7 +1139,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case 0xDA: JP_COND(FlagC); break; // JP C case 0xDB: IN_(); break; // IN A case 0xDC: CALL_COND(FlagC); break; // CALL C - case 0xDD: JAM_(); break; // Jam (invalid) + case 0xDD: PREFIX_(IXpre); break; // IX Prefix case 0xDE: REG_OP_IND_INC(SBC8, A, PCl, PCh); break; // SBC A, n case 0xDF: RST_(0x18); break; // RST 0x18 case 0xE0: RET_COND(!FlagP); break; // RET Po @@ -1155,7 +1155,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case 0xEA: JP_COND(FlagP); break; // JP Pe case 0xEB: EXCH_16_(E, D, L, H); break; // ex DE, HL case 0xEC: CALL_COND(FlagP); break; // CALL Pe - case 0xED: JAM_(); break; // Jam (invalid) + case 0xED: PREFIX_(EXTDpre); break; // EXTD Prefix case 0xEE: REG_OP_IND_INC(XOR8, A, PCl, PCh); break; // XOR A, n case 0xEF: RST_(0x28); break; // RST 0x28 case 0xF0: RET_COND(!FlagS); break; // RET p @@ -1171,7 +1171,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case 0xFA: JP_COND(FlagS); break; // JP M case 0xFB: EI_(); break; // EI case 0xFC: CALL_COND(FlagS); break; // CALL M - case 0xFD: JAM_(); break; // Jam (invalid) + case 0xFD: PREFIX_(IYpre); break; // IY Prefix case 0xFE: REG_OP_IND_INC(CP8, A, PCl, PCh); break; // CP A, n case 0xFF: RST_(0x38); break; // RST $38 } diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs index 44d53780c3..c19459c741 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs @@ -34,6 +34,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A char sign = neg ? '-' : '+'; int val = neg ? 256 - B : B; format = format.Replace("d", string.Format("{0}{1:X2}h", sign, val)); + addr++; } return format; diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs index d618c2bdcd..cfaf517ec7 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Operations.cs @@ -723,5 +723,20 @@ namespace BizHawk.Emulation.Cores.Components.Z80A Flag5 = (temp & 0x02) != 0; Flag3 = (temp & 0x08) != 0; } + + // set flags for LD A, I/R + public void SET_FL_IR_Func(ushort dest) + { + if (dest == A) + { + FlagN = false; + FlagH = false; + FlagZ = Regs[A] == 0; + FlagS = Regs[A] > 127; + FlagP = iff2; + Flag5 = (Regs[A] & 0x02) != 0; + Flag3 = (Regs[A] & 0x08) != 0; + } + } } } diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs index ad8bed179b..ce40eea385 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs @@ -103,7 +103,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A {operation, dest, src, IDLE, IDLE, - IDLE, + SET_FL_IR, dest, OP }; } diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs index 53d85bb25b..2fb1103373 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs @@ -74,6 +74,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A public const ushort SET_FL_CP = 59; public const ushort I_BIT = 60; public const ushort HL_BIT = 61; + public const ushort SET_FL_IR = 62; public Z80A() @@ -582,6 +583,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case EI_RETI: // NOTE: This is needed for systems using multiple interrupt sources, it triggers the next interrupt // Not currently implemented here + iff1 = iff2; break; case EI_RETN: iff1 = iff2; @@ -610,6 +612,9 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case SET_FL_CP: SET_FL_CP_Func(); break; + case SET_FL_IR: + SET_FL_IR_Func(cur_instr[instr_pntr++]); + break; } totalExecutedCycles++; } From af9c813c5bda5867094921331fb1610c51e8bec6 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 19 Oct 2017 09:48:27 -0400 Subject: [PATCH 189/219] Add files via upload --- BizHawk.Client.Common/tools/Cheat.cs | 66 +++++++++++++++++++++------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/BizHawk.Client.Common/tools/Cheat.cs b/BizHawk.Client.Common/tools/Cheat.cs index 15ec5fb62a..4680168276 100644 --- a/BizHawk.Client.Common/tools/Cheat.cs +++ b/BizHawk.Client.Common/tools/Cheat.cs @@ -284,29 +284,61 @@ namespace BizHawk.Client.Common case WatchSize.Byte: return (byte?)_val; case WatchSize.Word: - if (addr == _watch.Address) + if (_watch.BigEndian) { + if (addr == _watch.Address) + { + return (byte)(_val & 0xFF); + } return (byte)(_val >> 8); } - - return (byte)(_val & 0xFF); - case WatchSize.DWord: - if (addr == _watch.Address) + else { + if (addr == _watch.Address) + { + return (byte)(_val >> 8); + } + return (byte)(_val & 0xFF); + } + case WatchSize.DWord: + if (_watch.BigEndian) + { + if (addr == _watch.Address) + { + return (byte)((_val >> 24) & 0xFF); + } + + if (addr == _watch.Address + 1) + { + return (byte)((_val >> 16) & 0xFF); + } + + if (addr == _watch.Address + 2) + { + return (byte)((_val >> 8) & 0xFF); + } + + return (byte)(_val & 0xFF); + } + else + { + if (addr == _watch.Address) + { + return (byte)(_val & 0xFF); + } + + if (addr == _watch.Address + 1) + { + return (byte)((_val >> 8) & 0xFF); + } + + if (addr == _watch.Address + 2) + { + return (byte)((_val >> 16) & 0xFF); + } + return (byte)((_val >> 24) & 0xFF); } - - if (addr == _watch.Address + 1) - { - return (byte)((_val >> 16) & 0xFF); - } - - if (addr == _watch.Address + 2) - { - return (byte)((_val >> 8) & 0xFF); - } - - return (byte)(_val & 0xFF); } } From be6aa52bc8b7ef9111a86fbd0227888f49ede0e9 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 19 Oct 2017 10:55:17 -0400 Subject: [PATCH 190/219] Z80: Remove JAM The relevent opcodes behave as NOPs --- BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs | 7 +++---- .../CPUs/Z80A/Tables_Direct.cs | 9 --------- BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs | 19 +++++++------------ 3 files changed, 10 insertions(+), 25 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs index 299d84dd0f..4159f31d7a 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs @@ -23,7 +23,6 @@ namespace BizHawk.Emulation.Cores.Components.Z80A public bool NO_prefix, CB_prefix, IX_prefix, EXTD_prefix, IY_prefix, IXCB_prefix, IYCB_prefix; public bool IXCB_prefetch, IYCB_prefetch; // value is fetched before opcode public bool halted; - public bool jammed; public ushort PF; public void FetchInstruction(byte opcode) @@ -617,7 +616,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case 0x74: INT_OP(NEG, A); break; // NEG case 0x75: RETN_(); break; // RETN case 0x76: INT_MODE_(1); break; // IM $1 - case 0x77: JAM_(); break; // JAM + case 0x77: NOP_(); break; // NOP case 0x78: IN_REG_(A, C); break; // IN A, (C) case 0x79: OUT_REG_(C, A); break; // OUT (C), A case 0x7A: REG_OP_16_(ADC16, L, H, SPl, SPh); break; // ADC HL, SP @@ -625,7 +624,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case 0x7C: INT_OP(NEG, A); break; // NEG case 0x7D: RETN_(); break; // RETI case 0x7E: INT_MODE_(2); break; // IM $2 - case 0x7F: JAM_(); break; // JAM + case 0x7F: NOP_(); break; // NOP case 0xA0: LD_OP_R(INC16, 0); break; // LDI case 0xA1: CP_OP_R(INC16, 0); break; // CPI case 0xA2: IN_OP_R(INC16, 0); break; // INI @@ -642,7 +641,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case 0xB9: CP_OP_R(DEC16, 1); break; // CPDR case 0xBA: IN_OP_R(DEC16, 1); break; // INDR case 0xBB: OUT_OP_R(DEC16, 1); break; // OTDR - default: JAM_(); break; // JAM + default: NOP_(); break; // NOP } } diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs index ce40eea385..8e473d1527 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs @@ -448,15 +448,6 @@ namespace BizHawk.Emulation.Cores.Components.Z80A OP }; } - private void JAM_() - { - cur_instr = new ushort[] - {JAM, - IDLE, - IDLE, - IDLE }; - } - private void OUT_() { cur_instr = new ushort[] diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs index 2fb1103373..9155aeb178 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs @@ -61,20 +61,20 @@ namespace BizHawk.Emulation.Cores.Components.Z80A public const ushort PREFETCH = 46; public const ushort ASGN = 47; public const ushort ADDS = 48; // signed 16 bit operation used in 2 instructions - public const ushort JAM = 49; // all undocumented opcodes jam the machine + public const ushort INT_MODE = 49; public const ushort EI_RETN = 50; public const ushort EI_RETI = 51; // reti has no delay in interrupt enable public const ushort OUT = 52; public const ushort IN = 53; public const ushort NEG = 54; - public const ushort INT_MODE = 55; - public const ushort RRD = 56; - public const ushort RLD = 57; - public const ushort SET_FL_LD = 58; - public const ushort SET_FL_CP = 59; + public const ushort RRD = 55; + public const ushort RLD = 56; + public const ushort SET_FL_LD = 57; + public const ushort SET_FL_CP = 58; + public const ushort SET_FL_IR = 59; public const ushort I_BIT = 60; public const ushort HL_BIT = 61; - public const ushort SET_FL_IR = 62; + public Z80A() @@ -576,10 +576,6 @@ namespace BizHawk.Emulation.Cores.Components.Z80A case ADDS: ADDS_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]); break; - case JAM: - jammed = true; - instr_pntr--; - break; case EI_RETI: // NOTE: This is needed for systems using multiple interrupt sources, it triggers the next interrupt // Not currently implemented here @@ -689,7 +685,6 @@ namespace BizHawk.Emulation.Cores.Components.Z80A ser.Sync("instruction_pointer", ref instr_pntr); ser.Sync("current instruction", ref cur_instr, false); ser.Sync("opcode", ref opcode); - ser.Sync("jammped", ref jammed); ser.Sync("FlagI", ref FlagI); ser.Sync("NO Preifx", ref NO_prefix); From 28cce355bf33d96a1cb68894fbe449aa4864eed2 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 19 Oct 2017 12:08:34 -0400 Subject: [PATCH 191/219] Z80: Fix R register operation --- BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs | 4 +- .../CPUs/Z80A/NewDisassembler.cs | 8 +- .../CPUs/Z80A/Tables_Direct.cs | 6 +- BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs | 107 ++++++++---------- 4 files changed, 55 insertions(+), 70 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs index 4159f31d7a..c70e4aa503 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Execute.cs @@ -15,6 +15,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A public const ushort IYpre = 3; public const ushort IXCBpre = 4; public const ushort IYCBpre = 5; + public const ushort IXYprefetch = 6; // variables for executing instructions public int instr_pntr = 0; @@ -1194,8 +1195,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A IYCB_prefetch = false; PF = opcode; Regs[ALU] = PF; - PREFETCH_(Iyl, Iyh); - + PREFETCH_(Iyl, Iyh); return; } diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs index c19459c741..596e0ff66d 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs @@ -34,7 +34,6 @@ namespace BizHawk.Emulation.Cores.Components.Z80A char sign = neg ? '-' : '+'; int val = neg ? 256 - B : B; format = format.Replace("d", string.Format("{0}{1:X2}h", sign, val)); - addr++; } return format; @@ -397,6 +396,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A public string Disassemble(ushort addr, Func read, out ushort size) { ushort start_addr = addr; + ushort extra_inc = 0; byte A = read(addr++); string format; switch (A) @@ -409,7 +409,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A A = read(addr++); switch (A) { - case 0xCB: format = mnemonicsDDCB[A]; break; + case 0xCB: format = mnemonicsDDCB[A]; extra_inc = 1; break; case 0xED: format = mnemonicsED[A]; break; default: format = mnemonicsDD[A]; break; } @@ -422,7 +422,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A A = read(addr++); switch (A) { - case 0xCB: format = mnemonicsFDCB[A]; break; + case 0xCB: format = mnemonicsFDCB[A]; extra_inc = 1; break; case 0xED: format = mnemonicsED[A]; break; default: format = mnemonicsFD[A]; break; } @@ -432,6 +432,8 @@ namespace BizHawk.Emulation.Cores.Components.Z80A string temp = Result(format, read, ref addr); + addr += extra_inc; + size = (ushort)(addr - start_addr); return temp; } diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs index 8e473d1527..71b39d6018 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Tables_Direct.cs @@ -395,10 +395,10 @@ namespace BizHawk.Emulation.Cores.Components.Z80A private void PREFIX_(ushort src) { cur_instr = new ushort[] - {PREFIX, src, + {IDLE, IDLE, IDLE, - OP }; + PREFIX, src}; } private void PREFETCH_(ushort src_l, ushort src_h) @@ -407,7 +407,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A {TR16, Z, W, src_l, src_h, ADDS, Z, W, ALU, ZERO, IDLE, - OP }; + PREFIX, IXYprefetch }; } private void DI_() diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs index 9155aeb178..2f13b0e6c7 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs @@ -75,7 +75,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A public const ushort I_BIT = 60; public const ushort HL_BIT = 61; - + public byte temp_R; public Z80A() { @@ -147,27 +147,20 @@ namespace BizHawk.Emulation.Cores.Components.Z80A break; case OP: // Read the opcode of the next instruction - if (EI_pending > 0 && NO_prefix) + if (EI_pending > 0) { EI_pending--; - if (EI_pending == 0) - { - IFF1 = IFF2 = true; - } + if (EI_pending == 0) { IFF1 = IFF2 = true; } } // Process interrupt requests. - if (nonMaskableInterruptPending && NO_prefix) + if (nonMaskableInterruptPending) { nonMaskableInterruptPending = false; if (TraceCallback != null) { - TraceCallback(new TraceInfo - { - Disassembly = "====NMI====", - RegisterInfo = "" - }); + TraceCallback(new TraceInfo{Disassembly = "====NMI====", RegisterInfo = ""}); } iff2 = iff1; @@ -175,18 +168,14 @@ namespace BizHawk.Emulation.Cores.Components.Z80A NMI_(); NMICallback(); } - else if (iff1 && FlagI && NO_prefix) + else if (iff1 && FlagI) { iff1 = iff2 = false; EI_pending = 0; if (TraceCallback != null) { - TraceCallback(new TraceInfo - { - Disassembly = "====IRQ====", - RegisterInfo = "" - }); + TraceCallback(new TraceInfo{Disassembly = "====IRQ====", RegisterInfo = ""}); } switch (interruptMode) @@ -210,12 +199,15 @@ namespace BizHawk.Emulation.Cores.Components.Z80A else { if (OnExecFetch != null) OnExecFetch(RegPC); - if (TraceCallback != null && NO_prefix) TraceCallback(State()); + if (TraceCallback != null) TraceCallback(State()); FetchInstruction(ReadMemory(RegPC++)); } instr_pntr = 0; - Regs[R]++; - Regs[R] &= 0xFF; + + temp_R = (byte)(Regs[R] & 0x7F); + temp_R++; + temp_R &= 0x7F; + Regs[R] = (byte)((Regs[R] & 0x80) | temp_R); break; case OP_R: // determine if we repeat based on what operation we are doing @@ -280,47 +272,35 @@ namespace BizHawk.Emulation.Cores.Components.Z80A { // Interrupts can occur at this point, so process them accordingly // Read the opcode of the next instruction - if (EI_pending > 0 && NO_prefix) + if (EI_pending > 0) { EI_pending--; - if (EI_pending == 0) - { - IFF1 = IFF2 = true; - } + if (EI_pending == 0) { IFF1 = IFF2 = true; } } // Process interrupt requests. - if (nonMaskableInterruptPending && NO_prefix) + if (nonMaskableInterruptPending) { nonMaskableInterruptPending = false; if (TraceCallback != null) { - TraceCallback(new TraceInfo - { - Disassembly = "====NMI====", - RegisterInfo = "" - }); + TraceCallback(new TraceInfo{Disassembly = "====NMI====", RegisterInfo = ""}); } iff2 = iff1; iff1 = false; NMI_(); NMICallback(); - } - else if (iff1 && FlagI && NO_prefix) + else if (iff1 && FlagI) { iff1 = iff2 = false; EI_pending = 0; if (TraceCallback != null) { - TraceCallback(new TraceInfo - { - Disassembly = "====IRQ====", - RegisterInfo = "" - }); + TraceCallback(new TraceInfo{Disassembly = "====IRQ====", RegisterInfo = ""}); } switch (interruptMode) @@ -346,36 +326,32 @@ namespace BizHawk.Emulation.Cores.Components.Z80A if (OnExecFetch != null) OnExecFetch(RegPC); if (TraceCallback != null) TraceCallback(State()); FetchInstruction(ReadMemory(RegPC++)); - Regs[R]++; - Regs[R] &= 0xFF; } + + temp_R = (byte)(Regs[R] & 0x7F); + temp_R++; + temp_R &= 0x7F; + Regs[R] = (byte)((Regs[R] & 0x80) | temp_R); } instr_pntr = 0; break; case HALT: halted = true; - if (EI_pending > 0 && NO_prefix) + if (EI_pending > 0) { EI_pending--; - if (EI_pending == 0) - { - IFF1 = IFF2 = true; - } + if (EI_pending == 0) { IFF1 = IFF2 = true; } } // Process interrupt requests. - if (nonMaskableInterruptPending && NO_prefix) + if (nonMaskableInterruptPending) { nonMaskableInterruptPending = false; if (TraceCallback != null) { - TraceCallback(new TraceInfo - { - Disassembly = "====NMI====", - RegisterInfo = "" - }); + TraceCallback(new TraceInfo{Disassembly = "====NMI====", RegisterInfo = ""}); } iff2 = iff1; @@ -384,18 +360,14 @@ namespace BizHawk.Emulation.Cores.Components.Z80A NMICallback(); halted = false; } - else if (iff1 && FlagI && NO_prefix) + else if (iff1 && FlagI) { iff1 = iff2 = false; EI_pending = 0; if (TraceCallback != null) { - TraceCallback(new TraceInfo - { - Disassembly = "====IRQ====", - RegisterInfo = "" - }); + TraceCallback(new TraceInfo{Disassembly = "====IRQ====", RegisterInfo = ""}); } switch (interruptMode) @@ -419,14 +391,16 @@ namespace BizHawk.Emulation.Cores.Components.Z80A } else { - Regs[R]++; - Regs[R] &= 0xFF; cur_instr = new ushort[] {IDLE, IDLE, IDLE, HALT }; } + temp_R = (byte)(Regs[R] & 0x7F); + temp_R++; + temp_R &= 0x7F; + Regs[R] = (byte)((Regs[R] & 0x80) | temp_R); instr_pntr = 0; break; @@ -567,8 +541,17 @@ namespace BizHawk.Emulation.Cores.Components.Z80A if (prefix_src == IYpre) { IY_prefix = true; } if (prefix_src == IXCBpre) { IXCB_prefix = true; IXCB_prefetch = true; } if (prefix_src == IYCBpre) { IYCB_prefix = true; IYCB_prefetch = true; } - Regs[R]++; - Regs[R] &= 0xFF; + + FetchInstruction(ReadMemory(RegPC++)); + instr_pntr = 0; + // only the first prefix in a double prefix increases R, although I don't know how / why + if (prefix_src < 4) + { + temp_R = (byte)(Regs[R] & 0x7F); + temp_R++; + temp_R &= 0x7F; + Regs[R] = (byte)((Regs[R] & 0x80) | temp_R); + } break; case ASGN: ASGN_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); From 5e0a373c6f3361d3f459b76bf0c752a22e926458 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Fri, 20 Oct 2017 00:42:02 -0400 Subject: [PATCH 192/219] SMS Bart vs Space Mutants needs to run in PAL --- Assets/gamedb/gamedb_sega_sms.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/gamedb/gamedb_sega_sms.txt b/Assets/gamedb/gamedb_sega_sms.txt index 1f16380c3b..b3a7102c79 100644 --- a/Assets/gamedb/gamedb_sega_sms.txt +++ b/Assets/gamedb/gamedb_sega_sms.txt @@ -106,7 +106,7 @@ F2535DF9BDC3A84221303FA62D61AD6E Back to the Future Part II (E) SMS Europe 3D24A52E98E6C85D7C059386451CE749 Back to the Future Part III (E) SMS PAL Europe 8A94DED3D95AA46DAE8800B92E66D3EE Baku Baku (B) SMS Brazil 7A5D3B9963E316CB7F73BBDC2A7311C6 Bank Panic (E) SMS Europe -26DF4404950CB8DA47235833C0C101C6 Bart vs. the Space Mutants (E) SMS Europe +26DF4404950CB8DA47235833C0C101C6 Bart vs. the Space Mutants (E) SMS PAL Europe CBA2EC2940619956359801618E7AAB17 Bart vs. the World (E) SMS Europe 0069B1BD9C5B6B88ACE6324D7E61539F Basketball Nightmare (E) SMS Sports;Basketball Europe 215876A62D3CA48D28E98CD8A2C70A15 Batman Returns (E) SMS Europe From 3c6dcf1dc3952a7e80ed9f9aa412dbba92be661a Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 20 Oct 2017 10:32:22 -0400 Subject: [PATCH 193/219] TI-83 Upgrade - Fix power on Behaviour - Fix cycle timing - Fix timer interrupt frequency - NOTE: 'ON' buton on virtual calculator doesn't work since it's only a 'click', need to use shortcut key to turn the calculator on --- .../Calculator/TI83.IEmulator.cs | 35 +++++--- .../Calculator/TI83.IStatable.cs | 9 ++ BizHawk.Emulation.Cores/Calculator/TI83.cs | 86 +++++++++++++++---- 3 files changed, 101 insertions(+), 29 deletions(-) diff --git a/BizHawk.Emulation.Cores/Calculator/TI83.IEmulator.cs b/BizHawk.Emulation.Cores/Calculator/TI83.IEmulator.cs index 1d6b7be044..622664bcc7 100644 --- a/BizHawk.Emulation.Cores/Calculator/TI83.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Calculator/TI83.IEmulator.cs @@ -22,20 +22,35 @@ namespace BizHawk.Emulation.Cores.Calculators _cpu.TraceCallback = null; } - // I eyeballed this speed - for (int i = 0; i < 5; i++) - { - _onPressed = controller.IsPressed("ON"); + _onPressed = controller.IsPressed("ON"); - // and this was derived from other emus - for (int j = 0; j < 10000; j++) - { - _cpu.ExecuteOne(); - } - + if (_onPressed && ON_key_int_EN && !ON_key_int) + { + ON_key_int = true; _cpu.FlagI = true; } + // see: http://wikiti.brandonw.net/index.php?title=83:Ports:04 + // for timer interrupt frequency + + // CPU frequency is 6MHz + for (int i = 0; i < 100000; i++) + { + _cpu.ExecuteOne(); + + TIM_count++; + if (TIM_count >= TIM_hit) + { + TIM_count = 0; + + if (TIM_1_int_EN) + { + TIM_1_int = true; + _cpu.FlagI = true; + } + } + } + Frame++; if (_lagged) diff --git a/BizHawk.Emulation.Cores/Calculator/TI83.IStatable.cs b/BizHawk.Emulation.Cores/Calculator/TI83.IStatable.cs index 0539da2ae0..d2bd9192ca 100644 --- a/BizHawk.Emulation.Cores/Calculator/TI83.IStatable.cs +++ b/BizHawk.Emulation.Cores/Calculator/TI83.IStatable.cs @@ -69,6 +69,15 @@ namespace BizHawk.Emulation.Cores.Calculators ser.Sync("Frame", ref _frame); ser.Sync("LagCount", ref _lagCount); ser.Sync("IsLag", ref _isLag); + ser.Sync("ON_key_int", ref ON_key_int); + ser.Sync("ON_key_int_EN", ref ON_key_int_EN); + ser.Sync("TIM_1_int", ref TIM_1_int); + ser.Sync("TIM_1_int_EN", ref TIM_1_int_EN); + ser.Sync("TIM_frq", ref TIM_frq); + ser.Sync("TIM_mult", ref TIM_mult); + ser.Sync("TIM_count", ref TIM_count); + ser.Sync("TIM_hit", ref TIM_hit); + ser.EndSection(); if (ser.IsReader) diff --git a/BizHawk.Emulation.Cores/Calculator/TI83.cs b/BizHawk.Emulation.Cores/Calculator/TI83.cs index dc70edff41..09b0928449 100644 --- a/BizHawk.Emulation.Cores/Calculator/TI83.cs +++ b/BizHawk.Emulation.Cores/Calculator/TI83.cs @@ -34,14 +34,6 @@ namespace BizHawk.Emulation.Cores.Calculators _rom = rom; LinkPort = new TI83LinkPort(this); - // different calculators (different revisions?) have different initPC. we track this in the game database by rom hash - // if( *(unsigned long *)(m_pRom + 0x6ce) == 0x04D3163E ) m_Regs.PC.W = 0x6ce; //KNOWN - // else if( *(unsigned long *)(m_pRom + 0x6f6) == 0x04D3163E ) m_Regs.PC.W = 0x6f6; //UNKNOWN - if (game["initPC"]) - { - _startPC = ushort.Parse(game.OptionValue("initPC"), NumberStyles.HexNumber); - } - HardReset(); SetupMemoryDomains(); @@ -57,8 +49,6 @@ namespace BizHawk.Emulation.Cores.Calculators private readonly byte[] _rom; // configuration - private readonly ushort _startPC; - private IController _controller; private byte[] _ram; @@ -75,6 +65,10 @@ namespace BizHawk.Emulation.Cores.Calculators private bool _cursorMoved; private int _frame; + public bool ON_key_int, ON_key_int_EN; + public bool TIM_1_int, TIM_1_int_EN; + public int TIM_frq, TIM_mult, TIM_count, TIM_hit; + // Link Cable public TI83LinkPort LinkPort { get; } @@ -169,7 +163,60 @@ namespace BizHawk.Emulation.Cores.Calculators _romPageLow3Bits = value & 0x7; break; case 3: // PORT_STATUS - _maskOn = (byte)(value & 1); + // controls ON key interrupts + if ((value & 0x1) == 0) + { + ON_key_int = false; + ON_key_int_EN = false; + } + else + { + ON_key_int_EN = true; + } + + // controls first timer interrupts + if ((value & 0x2) == 0) + { + TIM_1_int = false; + TIM_1_int_EN = false; + } + else + { + TIM_1_int_EN = true; + } + + // controls second timer, not yet implemented and unclear how to differentiate + if ((value & 0x4) == 0) + { + } + else + { + } + + // controls low power mode, not yet implemeneted + if ((value & 0x8) == 0) + { + } + else + { + } + break; + case 4: // PORT_INTCTRL + // controls ON key interrupts + TIM_frq = value & 6; + + TIM_mult = ((value & 0x10) == 0x10) ? 1800 : 1620; + + TIM_hit = (int)Math.Floor((double)TIM_mult / (3 + TIM_frq * 2)); + + TIM_hit = (int)Math.Floor((double)6000000 / TIM_hit); + + // Bit 0 is some form of memory mapping + + // Bit 5 controls reset + + // Bit 6-7 controls battery power compare (not implemented, will always return full power) + break; case 16: // PORT_DISPCTRL ////Console.WriteLine("write PORT_DISPCTRL {0}",value); @@ -198,22 +245,23 @@ namespace BizHawk.Emulation.Cores.Calculators { // Console.WriteLine("read PORT_STATUS"); // Bits: - // 0 - Set if ON key is down and ON key is trapped + // 0 - Set if ON key Interrupt generated // 1 - Update things (keyboard etc) // 2 - Unknown, but used // 3 - Set if ON key is up // 4-7 - Unknown - ////if (onPressed && maskOn) ret |= 1; - ////if (!onPressed) ret |= 0x8; - return (byte)((_controller.IsPressed("ON") ? _maskOn : 8) | (LinkActive ? 0 : 2)); + + return (byte)((_controller.IsPressed("ON") ? 0 : 8) | + (TIM_1_int ? 2 : 0) | + (ON_key_int ? 1 : 0)); } case 4: // PORT_INTCTRL - ////Console.WriteLine("read PORT_INTCTRL"); - return 0xFF; + // returns mirror of link port + return (byte)((_romPageHighBit << 4) | (LinkState << 2) | LinkOutput); case 16: // PORT_DISPCTRL - ////Console.WriteLine("read DISPCTRL"); + // Console.WriteLine("read DISPCTRL"); break; case 17: // PORT_DISPDATA @@ -447,7 +495,7 @@ namespace BizHawk.Emulation.Cores.Calculators _ram[i] = 0xFF; } - _cpu.RegPC = _startPC; + _cpu.RegPC = 0; _cpu.IFF1 = false; _cpu.IFF2 = false; From 745e42a753e0190ed36d4461e5ded21d1c13ff86 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 21 Oct 2017 09:52:07 -0400 Subject: [PATCH 194/219] Hex Editor: Fix Cheat display Fixes #1026 --- .../tools/HexEditor/HexEditor.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs b/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs index 02752e22b6..049dd1057b 100644 --- a/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs +++ b/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs @@ -526,7 +526,21 @@ namespace BizHawk.Client.EmuHawk { if (_addr + j + DataSize <= _domain.Size) { - rowStr.AppendFormat(_digitFormatString, MakeValue(_addr + j)); + int t_val = 0; + int t_next = 0; + + for (int k = 0; k < DataSize; k++) + { + t_next = MakeValue(1, _addr + j + k); + t_val += (t_next << ((DataSize - k - 1) * 8)); + + if (_addr + j + k == 0x0020 || _addr + j + k == 0x0021) + { + Console.WriteLine(t_next); + } + } + + rowStr.AppendFormat(_digitFormatString, t_val);// MakeValue(_addr + j)); } else { @@ -569,7 +583,7 @@ namespace BizHawk.Client.EmuHawk { if (Global.CheatList.IsActive(_domain, address)) { - return Global.CheatList.GetCheatValue(_domain, address, (WatchSize)DataSize ).Value; + return Global.CheatList.GetCheatValue(_domain, address, (WatchSize)dataSize ).Value; } switch (dataSize) From 0fd046de0d1a665582fad13fddd1fd44132f7fee Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 21 Oct 2017 09:55:03 -0400 Subject: [PATCH 195/219] Update HexEditor.cs --- BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs b/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs index 049dd1057b..b237bf0a68 100644 --- a/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs +++ b/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs @@ -533,14 +533,9 @@ namespace BizHawk.Client.EmuHawk { t_next = MakeValue(1, _addr + j + k); t_val += (t_next << ((DataSize - k - 1) * 8)); - - if (_addr + j + k == 0x0020 || _addr + j + k == 0x0021) - { - Console.WriteLine(t_next); - } } - rowStr.AppendFormat(_digitFormatString, t_val);// MakeValue(_addr + j)); + rowStr.AppendFormat(_digitFormatString, t_val); } else { From edc40edd46fcb955b9e94d452b142bc37c0ee84c Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 22 Oct 2017 13:21:37 -0400 Subject: [PATCH 196/219] NESHawk: FCEUX palette update --- Assets/NES/Palettes/FCEUX (2.2.0).pal | Bin 0 -> 192 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Assets/NES/Palettes/FCEUX (2.2.0).pal diff --git a/Assets/NES/Palettes/FCEUX (2.2.0).pal b/Assets/NES/Palettes/FCEUX (2.2.0).pal new file mode 100644 index 0000000000000000000000000000000000000000..7bf9128fb5fad8d07059f217f9c4f61a886da9a8 GIT binary patch literal 192 zcmXwx5f_6{0EI6O2Eia43)Gs_$%@0k|dcXqpy0JmTgU% Wk&gP#PO-1vtdt!~bEP%LO#UB@`&Kys literal 0 HcmV?d00001 From b367f28971ab5c01d0177eca97e9014032443f4d Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 22 Oct 2017 13:22:21 -0400 Subject: [PATCH 197/219] Delete FCEUX.pal --- Assets/NES/Palettes/FCEUX.pal | Bin 192 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Assets/NES/Palettes/FCEUX.pal diff --git a/Assets/NES/Palettes/FCEUX.pal b/Assets/NES/Palettes/FCEUX.pal deleted file mode 100644 index 2b8ea5d63eed04734189df388a053361ca4dc6ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmXwx5f_6{0EI6O2Eia43F4Z3BiM45C*{@2nNC6;b8diK`QA!~l*4~iADySZ@ z*`ke>MG92o4RH357qbqMzG6}_DEQ4tai=)4_N?;rrxU&Q@vp|mWLY*%Mql>S9lMs) WBZlfmBiT1^HqwseaiP^(PyQcXXH~5L From 5e87b45df070b8c3b33c928a1caeda0973952a76 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sat, 21 Oct 2017 21:18:23 -0400 Subject: [PATCH 198/219] EEPROM (93c46) support for SMS --- Assets/gamedb/gamedb_sega_gg.txt | 8 +- .../BizHawk.Emulation.Cores.csproj | 8 +- .../Consoles/Sega/SMS/EEPROM.93c46.cs | 222 ++++++++++++++++++ .../Consoles/Sega/SMS/MemoryMap.EEPROM.cs | 136 +++++++++++ .../Consoles/Sega/SMS/SMS.cs | 2 + 5 files changed, 369 insertions(+), 7 deletions(-) create mode 100644 BizHawk.Emulation.Cores/Consoles/Sega/SMS/EEPROM.93c46.cs create mode 100644 BizHawk.Emulation.Cores/Consoles/Sega/SMS/MemoryMap.EEPROM.cs diff --git a/Assets/gamedb/gamedb_sega_gg.txt b/Assets/gamedb/gamedb_sega_gg.txt index 82224fb10d..a8a1d105bb 100644 --- a/Assets/gamedb/gamedb_sega_gg.txt +++ b/Assets/gamedb/gamedb_sega_gg.txt @@ -231,7 +231,7 @@ B19256C6716147A9744F5BD528F14450 Magic Knight Rayearth 2 - Making of Magic Knig 846D48D0F4024C8094117599D0E1EEF1 Magic Knight Rayearth (J) GG SRAM=8192 Japan E496FF2196C372F4D6111538950D25CA Magical Puzzle Popils (W) (En,Ja) GG Puzzle SRAM=8192 World 3AF0C6DDF5F00A493E1F159FCEDC0933 Magical Taruruuto-kun (J) GG Japan -B0C35BC53AB7C184D34E5624F69AAD24 The Majors Pro Baseball (U) GG Sports;Baseball SRAM=128;GGLink USA +B0C35BC53AB7C184D34E5624F69AAD24 The Majors Pro Baseball (U) GG Sports;Baseball SRAM=128;GGLink;EEPROM USA A15C5219F766D516D1B8D9A09B9A2BB4 Mappy (J) GG Japan B83F36FD113A8F75F1A29652ACB641FC Marble Madness (UE) GG Arcade USA;Europe BA846684A66E90372C3C234955EE28BC Marko's Magic Football (E) (En,Fr,De,Es) GG Europe @@ -461,9 +461,9 @@ A23E89266DDAD3C856E7401D04A49C6C Woody Pop (W) (Rev 1) GG World 13F72ACFEA47587F9AA9F655BF98653C World Class Leader Board Golf (UE) GG Sports;Golf USA;Europe D95D381C6AFFB8345EE5457655E393D1 World Cup USA 94 (UE) (En,Fr,De,Es,It,Nl,Pt,Sv) GG Sports;Soccer USA;Europe D8939B64458FAF174CDC1241F777CB59 World Derby (J) GG GGLink Japan -E7EABBFC7A1F1339C4720249AEA92A32 World Series Baseball '95 (U) GG Sports;Baseball SRAM=128;GGLink USA -59359FC38865CFF00C90D6EB148DDC2F World Series Baseball (U) GG Sports;Baseball SRAM=128;GGLink USA -05CAC33029F0CAAC27774504C1AA8597 World Series Baseball (U) (Rev 1) GG Sports;Baseball SRAM=128;GGLink USA +E7EABBFC7A1F1339C4720249AEA92A32 World Series Baseball '95 (U) GG Sports;Baseball SRAM=128;GGLink;EEPROM USA +59359FC38865CFF00C90D6EB148DDC2F World Series Baseball (U) GG Sports;Baseball SRAM=128;GGLink;EEPROM USA +05CAC33029F0CAAC27774504C1AA8597 World Series Baseball (U) (Rev 1) GG Sports;Baseball SRAM=128;GGLink;EEPROM USA D810E851AD60ED5BA50B6246C2CE12F2 WWF Raw (UE) GG Sports;Wrestling USA;Europe 571AC03B80E3075C699CD583BF8651FD X-Men - Gamemaster's Legacy (UE) GG Marvel USA;Europe CA15F2BA2507EBD836C42D9D10231EB1 X-Men - Mojo World (UE) GG Marvel USA;Europe diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 59a4958220..f22d02380d 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -1071,6 +1071,8 @@ + + SMS.cs @@ -1190,9 +1192,9 @@ - + - + True @@ -1316,4 +1318,4 @@ --> - + \ No newline at end of file diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/EEPROM.93c46.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/EEPROM.93c46.cs new file mode 100644 index 0000000000..9a6c841359 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/EEPROM.93c46.cs @@ -0,0 +1,222 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BizHawk.Emulation.Cores.Sega.MasterSystem +{ + class EEPROM93c46 + { + enum EEPROMWriteMode + { + Instruction, + WriteData, + WriteAll, + Read + } + + enum EEPROMReadMode + { + ReadNew, + ReadOld, + Hold + } + + [Flags] + enum EEPROMFlags : byte + { + Ready = 1, + Clock = 2, + ChipSelect = 4 + } + + ushort Address = 0; + ushort Value = 0; + int BitsWritten = 0; + int BitsRead = 0; + bool WriteEnable = false; + EEPROMWriteMode WriteMode = EEPROMWriteMode.Instruction; + EEPROMReadMode ReadMode = EEPROMReadMode.Hold; + EEPROMFlags Flags = 0; + + public byte Read(byte[] saveRAM) + { + switch (ReadMode) + { + case EEPROMReadMode.ReadNew: + // A new value clocking out + + ReadMode = EEPROMReadMode.ReadOld; + byte ret = Read(saveRAM); + + if (++BitsRead == 8) + { + // Increment address + BitsRead = 0; + ++Address; + + if(Address % 2 == 0) + { + WriteMode = EEPROMWriteMode.Instruction; + ReadMode = EEPROMReadMode.Hold; + BitsWritten = 0; + Value = 0; + } + } + + return ret; + case EEPROMReadMode.ReadOld: + // repeat old value + + byte bit = (byte)((saveRAM[Address % saveRAM.Length] >> (7 - BitsRead)) & 1); + + return (byte)((byte)(Flags | EEPROMFlags.Clock) | bit); + default: + // ready/busy flag is always ready in this emulation + return (byte)(Flags | EEPROMFlags.Clock | EEPROMFlags.Ready); + } + } + + public void Write(byte bit, byte[] saveRAM) + { + // new instruction? + if ((bit & 4) == 0) + { + WriteMode = EEPROMWriteMode.Instruction; + ReadMode = EEPROMReadMode.Hold; + BitsWritten = 0; + Value = 0; + + Flags = (EEPROMFlags)bit & ~EEPROMFlags.Ready; + return; + } + + // clock low to high? + if ((bit & (byte)EEPROMFlags.Clock) != 0 && (Flags & EEPROMFlags.Clock) == 0) + { + // all modes shift in a larger value + Value = (ushort)((Value << 1) | (bit & 1)); + ++BitsWritten; + + switch (WriteMode) + { + case EEPROMWriteMode.Instruction: + // Process opcode including start bit + + // check start bit + if ((Value & 0x100) == 0) + return; + + byte op = (byte)Value; + Value = 0; + BitsWritten = 0; + + switch (op & 0xC0) + { + case 0x00: + // non-addressed commands + switch (op & 0xF0) + { + case 0x00: + // EWDS: write disable + WriteEnable = false; + return; + case 0x10: + // WRAL: write to all addresses (silly) + WriteMode = EEPROMWriteMode.WriteAll; + ReadMode = EEPROMReadMode.Hold; + return; + case 0x20: + // ERAL: erase all addresses + if (WriteEnable) + { + for (int i = 0; i < saveRAM.Length; ++i) + { + saveRAM[i] = 0xFF; + } + } + ReadMode = EEPROMReadMode.Hold; + return; + case 0x30: + // EWEN: write enable + WriteEnable = true; + return; + default: + // impossible + return; + } + case 0x40: + // WRITE + Address = (ushort)((op & 0x3F) << 1); + WriteMode = EEPROMWriteMode.WriteData; + ReadMode = EEPROMReadMode.Hold; + return; + case 0x80: + // READ + Address = (ushort)((op & 0x3F) << 1); + ReadMode = EEPROMReadMode.Hold; + WriteMode = EEPROMWriteMode.Read; + BitsRead = 0; + return; + case 0xC0: + // ERASE + Address = (ushort)((op & 0x3F) << 1); + if (WriteEnable) + { + saveRAM[Address % saveRAM.Length] = 0xFF; + saveRAM[(Address + 1) % saveRAM.Length] = 0xFF; + } + ReadMode = EEPROMReadMode.Hold; + return; + default: + // impossible + return; + } + case EEPROMWriteMode.WriteData: + // Write bits + + if (BitsWritten < 16) + return; + + if (WriteEnable) + { + saveRAM[Address % saveRAM.Length] = (byte)(Value >> 8); + saveRAM[(Address + 1) % saveRAM.Length] = (byte)Value; + } + WriteMode = EEPROMWriteMode.Instruction; + + Value = 0; + BitsWritten = 0; + return; + case EEPROMWriteMode.WriteAll: + // write to ALL addresses + + if (BitsWritten < 16) + return; + + Value = 0; + BitsWritten = 0; + + if (WriteEnable) + { + for (int i = 0; i < saveRAM.Length; i += 2) + { + saveRAM[i % saveRAM.Length] = (byte)Value; + saveRAM[(i + 1) % saveRAM.Length] = (byte)(Value >> 8); + } + } + WriteMode = EEPROMWriteMode.Instruction; + return; + case EEPROMWriteMode.Read: + // Clock a new value out + ReadMode = EEPROMReadMode.ReadNew; + + return; + } + } + + Flags = (EEPROMFlags)bit & ~EEPROMFlags.Ready; + } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/MemoryMap.EEPROM.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/MemoryMap.EEPROM.cs new file mode 100644 index 0000000000..2e5c544c11 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/MemoryMap.EEPROM.cs @@ -0,0 +1,136 @@ +using System; + +namespace BizHawk.Emulation.Cores.Sega.MasterSystem +{ + public partial class SMS + { + // The 93c46-connected mapper is assumed to be equivalent to the Sega mapper except for $8000-.. + // The Sega memory mapper layout looks like so: + // $0000-$03FF - ROM (unpaged) + // $0400-$3FFF - ROM mapper slot 0 + // $4000-$7FFF - ROM mapper slot 1 + // $8000-$BFFF - ROM mapper slot 2 - OR - EEPROM + // $C000-$DFFF - System RAM + // $E000-$FFFF - System RAM (mirror) + // $FFFC - SaveRAM mapper control + // $FFFD - Mapper slot 0 control + // $FFFE - Mapper slot 1 control + // $FFFF - Mapper slot 2 control + + EEPROM93c46 EEPROM; + + byte ReadMemoryEEPROM(ushort address) + { + byte ret = 0xFF; + + if (address < 0xC000) + { + if ((Port3E & 0x48) == 0x48) // cart and bios disabled, return empty bus + ret = 0xFF; + else if (BiosMapped && BiosRom != null) + ret = BiosRom[address & 0x1FFF]; + else if (address < 1024) + ret = RomData[address]; + else if (address < 0x4000) + ret = RomData[(RomBank0 * BankSize) + address]; + else if (address < 0x8000) + ret = RomData[(RomBank1 * BankSize) + (address & BankSizeMask)]; + else + { + switch (SaveRamBank) + { + case 0: ret = RomData[(RomBank2 * BankSize) + (address & BankSizeMask)]; break; + case 1: if (SaveRAM != null && EEPROM != null) ret = EEPROM.Read(SaveRAM); break; + default: + ret = SystemRam[address & RamSizeMask]; + break; + } + } + } + else + { + ret = SystemRam[address & RamSizeMask]; + } + + return ret; + } + + CDLog_MapResults MapMemoryEEPROM(ushort address, bool write) + { + if (address < 0xC000) + { + if ((Port3E & 0x48) == 0x48) // cart and bios disabled, return empty bus + return new CDLog_MapResults(); + else if (BiosMapped && BiosRom != null) + return new CDLog_MapResults(); //bios tracking of CDL is not supported + else if (address < 1024) + return new CDLog_MapResults() { Type = CDLog_AddrType.ROM, Address = address }; + else if (address < 0x4000) + return new CDLog_MapResults() { Type = CDLog_AddrType.ROM, Address = (RomBank0 * BankSize) + address }; + else if (address < 0x8000) + return new CDLog_MapResults() { Type = CDLog_AddrType.ROM, Address = (RomBank1 * BankSize) + (address & BankSizeMask) }; + else + { + switch (SaveRamBank) + { + case 0: return new CDLog_MapResults() { Type = CDLog_AddrType.ROM, Address = (RomBank2 * BankSize) + (address & BankSizeMask) }; + case 1: return new CDLog_MapResults(); // a serial IO port + case 2: return new CDLog_MapResults(); // a serial IO port + default: + return new CDLog_MapResults() { Type = CDLog_AddrType.MainRAM, Address = address & RamSizeMask }; + } + } + } + else + { + return new CDLog_MapResults() { Type = CDLog_AddrType.MainRAM, Address = address & RamSizeMask }; + } + } + + void WriteMemoryEEPROM(ushort address, byte value) + { + if (address >= 0xC000) + SystemRam[address & RamSizeMask] = value; + + else if (address >= 0x8000) + { + if (SaveRAM != null) + { + SaveRamModified = true; + EEPROM.Write(value, SaveRAM); + return; + } + else System.Console.WriteLine("Game attempt to use SRAM but SRAM not present"); + } + + if (address >= 0xFFFC) + { + if (address == 0xFFFC) + { + if ((value & 8) != 0) + SaveRamBank = (byte)((value & 4) == 0 ? 1 : 2); // SaveRAM selected + else + SaveRamBank = 0; // ROM bank selected + + } + else if (address == 0xFFFD) RomBank0 = (byte)(value % RomBanks); + else if (address == 0xFFFE) RomBank1 = (byte)(value % RomBanks); + else if (address == 0xFFFF) RomBank2 = (byte)(value % RomBanks); + return; + } + } + + void InitEEPROMMapper() + { + ReadMemory = ReadMemoryEEPROM; + WriteMemory = WriteMemoryEEPROM; + MapMemory = MapMemoryEEPROM; + WriteMemoryEEPROM(0xFFFC, 0); + WriteMemoryEEPROM(0xFFFD, 0); + WriteMemoryEEPROM(0xFFFE, 1); + WriteMemoryEEPROM(0xFFFF, 2); + + EEPROM = new EEPROM93c46(); + } + } +} \ No newline at end of file diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs index 3030c8084d..423b11b965 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs @@ -114,6 +114,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem InitNemesisMapper(); else if (game["TerebiOekaki"]) InitTerebiOekaki(); + else if (game["EEPROM"]) + InitEEPROMMapper(); else InitSegaMapper(); From c594e48175eeae5d630734f7e7885d49a79b58d7 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Mon, 23 Oct 2017 11:49:07 -0400 Subject: [PATCH 199/219] Save stating for the 93c46 too --- .../Consoles/Sega/SMS/EEPROM.93c46.cs | 19 +++++++++++++++---- .../Consoles/Sega/SMS/SMS.IStatable.cs | 5 +++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/EEPROM.93c46.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/EEPROM.93c46.cs index 9a6c841359..ec0acddec1 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/EEPROM.93c46.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/EEPROM.93c46.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using BizHawk.Common; namespace BizHawk.Emulation.Cores.Sega.MasterSystem { @@ -218,5 +215,19 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem Flags = (EEPROMFlags)bit & ~EEPROMFlags.Ready; } + + public void SyncState(Serializer ser) + { + ser.BeginSection("93c46"); + ser.Sync("Address", ref Address); + ser.Sync("Value", ref Value); + ser.Sync("BitsWritten", ref BitsWritten); + ser.Sync("BitsRead", ref BitsRead); + ser.Sync("WriteEnable", ref WriteEnable); + ser.SyncEnum("WriteMode", ref WriteMode); + ser.SyncEnum("ReadMode", ref ReadMode); + ser.SyncEnum("Flags", ref Flags); + ser.EndSection(); + } } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs index 8f29ddaf9c..0ba7d4293d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs @@ -84,6 +84,11 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem { YM2413.SyncState(ser); } + + if (EEPROM != null) + { + EEPROM.SyncState(ser); + } ser.Sync("Frame", ref _frame); ser.Sync("LagCount", ref _lagCount); From 9498206980b0ab6c3092947e4c395bade5291d7b Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Mon, 23 Oct 2017 17:15:08 -0400 Subject: [PATCH 200/219] NESHawk: FDS Timer IRQ's --- .../Consoles/Nintendo/NES/FDS/FDS.cs | 38 +++++++++---------- .../Consoles/Nintendo/NES/FDS/RamAdapter.cs | 7 +++- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/FDS.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/FDS.cs index 9f46fdf560..e649c730e5 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/FDS.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/FDS.cs @@ -255,19 +255,29 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES case 0x0020: timerlatch &= 0xff00; timerlatch |= value; - //timerirq = false; break; case 0x0021: timerlatch &= 0x00ff; timerlatch |= value << 8; - //timerirq = false; break; case 0x0022: - timerreg = (byte)(value & 3); - timervalue = timerlatch; + if (diskenable) + { + timerreg = (byte)(value & 3); + if ((value & 0x02) == 0x02) + { + timervalue = timerlatch; + } + else + { + _timerirq = false; + } + } + break; case 0x0023: diskenable = (value & 1) != 0; + if (!diskenable) { _timerirq = false; } soundenable = (value & 2) != 0; break; case 0x0024: @@ -344,7 +354,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public override void ClockCPU() { - if ((timerreg & 2) != 0)// && timervalue > 0) + if ((timerreg & 2) != 0 && diskenable) { if (timervalue!=0) { @@ -352,22 +362,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } if (timervalue == 0) { - - /* - if ((timerreg & 1) != 0) - { - timervalue = timerlatch; - //timervalue = 0xFFFF; - } - else - { - timerreg &= unchecked((byte)~2); - timervalue = 0; - timerlatch = 0; - } - */ timervalue = timerlatch; timerirq = true; + if ((timerreg & 1) == 0) + { + timerreg -= 2; + } } } audio.Clock(); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/RamAdapter.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/RamAdapter.cs index 4861d49708..9c86f953e7 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/RamAdapter.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/FDS/RamAdapter.cs @@ -67,14 +67,17 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES byte[] fileheader = br.ReadBytes(16); if (fileheader[0] != 0x03) { - throw new Exception("Corrupt FDS block 3"); + // Instead of exceptions, display strong warnings + Console.WriteLine("WARNING: INVALID FILE, BLOCK 3 ERROR"); + //throw new Exception("Corrupt FDS block 3"); } int filesize = fileheader[13] + fileheader[14] * 256; byte[] file = br.ReadBytes(filesize + 1); if (file[0] != 0x04) { - throw new Exception("Corrupt FDS block 4"); + Console.WriteLine("WARNING: INVALID FILE, BLOCK 4 ERROR"); + //throw new Exception("Corrupt FDS block 4"); } WriteBlock(ret, fileheader, 122); From 6d87be1396eb6b9ba41370bce76a7019774d826e Mon Sep 17 00:00:00 2001 From: Asnivor Date: Wed, 25 Oct 2017 17:06:16 +0100 Subject: [PATCH 201/219] Experiemental MDS/MDF Support --- BizHawk.Client.Common/RomLoader.cs | 4 +- BizHawk.Client.DiscoHawk/MainDiscoForm.cs | 2 +- BizHawk.Client.EmuHawk/FileLoader.cs | 2 +- BizHawk.Client.EmuHawk/MainForm.cs | 6 +- .../BizHawk.Emulation.DiscSystem.csproj | 1 + .../DiscFormats/MDS_Format.cs | 907 ++++++++++++++++++ BizHawk.Emulation.DiscSystem/DiscMountJob.cs | 5 + 7 files changed, 920 insertions(+), 7 deletions(-) create mode 100644 BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 6de9d9cdc3..b8754a9bcb 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -470,7 +470,7 @@ namespace BizHawk.Client.Common System = "PSX" }; } - else if (ext == ".iso" || ext == ".cue" || ext == ".ccd") + else if (ext == ".iso" || ext == ".cue" || ext == ".ccd" || ext == ".mds") { if (file.IsArchive) { @@ -494,7 +494,7 @@ namespace BizHawk.Client.Common throw new InvalidOperationException("\r\n" + discMountJob.OUT_Log); } - var disc = discMountJob.OUT_Disc; + var disc = discMountJob.OUT_Disc; // ----------- // TODO - use more sophisticated IDer diff --git a/BizHawk.Client.DiscoHawk/MainDiscoForm.cs b/BizHawk.Client.DiscoHawk/MainDiscoForm.cs index f74b095c74..cdd2c1a0f7 100644 --- a/BizHawk.Client.DiscoHawk/MainDiscoForm.cs +++ b/BizHawk.Client.DiscoHawk/MainDiscoForm.cs @@ -111,7 +111,7 @@ namespace BizHawk.Client.DiscoHawk foreach (string str in files) { string ext = Path.GetExtension(str).ToUpper(); - if(!ext.In(new string[]{".CUE",".ISO",".CCD"})) + if(!ext.In(new string[]{".CUE",".ISO",".CCD", ".MDS"})) { return new List(); } diff --git a/BizHawk.Client.EmuHawk/FileLoader.cs b/BizHawk.Client.EmuHawk/FileLoader.cs index 1e6d123c78..2071de742d 100644 --- a/BizHawk.Client.EmuHawk/FileLoader.cs +++ b/BizHawk.Client.EmuHawk/FileLoader.cs @@ -51,7 +51,7 @@ namespace BizHawk.Client.EmuHawk return new[] { ".NES", ".FDS", ".UNF", ".SMS", ".GG", ".SG", ".GB", ".GBC", ".GBA", ".PCE", ".SGX", ".BIN", ".SMD", ".GEN", ".MD", ".SMC", ".SFC", ".A26", ".A78", ".LNX", ".COL", ".ROM", ".M3U", ".CUE", ".CCD", ".SGB", ".Z64", ".V64", ".N64", ".WS", ".WSC", ".XML", ".DSK", ".DO", ".PO", ".PSF", ".MINIPSF", ".NSF", - ".EXE", ".PRG", ".D64", "*G64", ".CRT", ".TAP", ".32X" + ".EXE", ".PRG", ".D64", "*G64", ".CRT", ".TAP", ".32X", ".MDS" }; } diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 7929f31a90..4fda942f31 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -2077,9 +2077,9 @@ namespace BizHawk.Client.EmuHawk if (VersionInfo.DeveloperBuild) { return FormatFilter( - "Rom Files", "*.nes;*.fds;*.unf;*.sms;*.gg;*.sg;*.pce;*.sgx;*.bin;*.smd;*.rom;*.a26;*.a78;*.lnx;*.m3u;*.cue;*.ccd;*.exe;*.gb;*.gbc;*.gba;*.gen;*.md;*.32x;*.col;*.int;*.smc;*.sfc;*.prg;*.d64;*.g64;*.crt;*.tap;*.sgb;*.xml;*.z64;*.v64;*.n64;*.ws;*.wsc;*.dsk;*.do;*.po;*.vb;*.ngp;*.ngc;*.psf;*.minipsf;*.nsf;%ARCH%", + "Rom Files", "*.nes;*.fds;*.unf;*.sms;*.gg;*.sg;*.pce;*.sgx;*.bin;*.smd;*.rom;*.a26;*.a78;*.lnx;*.m3u;*.cue;*.ccd;*.mds;*.exe;*.gb;*.gbc;*.gba;*.gen;*.md;*.32x;*.col;*.int;*.smc;*.sfc;*.prg;*.d64;*.g64;*.crt;*.tap;*.sgb;*.xml;*.z64;*.v64;*.n64;*.ws;*.wsc;*.dsk;*.do;*.po;*.vb;*.ngp;*.ngc;*.psf;*.minipsf;*.nsf;%ARCH%", "Music Files", "*.psf;*.minipsf;*.sid;*.nsf", - "Disc Images", "*.cue;*.ccd;*.m3u", + "Disc Images", "*.cue;*.ccd;*.mds;*.m3u", "NES", "*.nes;*.fds;*.unf;*.nsf;%ARCH%", "Super NES", "*.smc;*.sfc;*.xml;%ARCH%", "Master System", "*.sms;*.gg;*.sg;%ARCH%", @@ -2095,7 +2095,7 @@ namespace BizHawk.Client.EmuHawk "Gameboy Advance", "*.gba;%ARCH%", "Colecovision", "*.col;%ARCH%", "Intellivision", "*.int;*.bin;*.rom;%ARCH%", - "PlayStation", "*.cue;*.ccd;*.m3u", + "PlayStation", "*.cue;*.ccd;*.mds;*.m3u", "PSX Executables (experimental)", "*.exe", "PSF Playstation Sound File", "*.psf;*.minipsf", "Commodore 64", "*.prg; *.d64, *.g64; *.crt; *.tap;%ARCH%", diff --git a/BizHawk.Emulation.DiscSystem/BizHawk.Emulation.DiscSystem.csproj b/BizHawk.Emulation.DiscSystem/BizHawk.Emulation.DiscSystem.csproj index 4f34ffd071..9ad6e73985 100644 --- a/BizHawk.Emulation.DiscSystem/BizHawk.Emulation.DiscSystem.csproj +++ b/BizHawk.Emulation.DiscSystem/BizHawk.Emulation.DiscSystem.csproj @@ -70,6 +70,7 @@ + diff --git a/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs b/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs new file mode 100644 index 0000000000..59ba49d5a5 --- /dev/null +++ b/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs @@ -0,0 +1,907 @@ +using System; +using System.Text; +using System.IO; +using System.Globalization; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; + +namespace BizHawk.Emulation.DiscSystem +{ + /// + /// Parsing Alcohol 120% files + /// Info taken from: + /// * http://forum.redump.org/post/41803/#p41803 + /// * Libmirage image-mds parser - https://sourceforge.net/projects/cdemu/files/libmirage/ + /// * DiscImageChef - https://github.com/claunia/DiscImageChef/blob/master/DiscImageChef.DiscImages/Alcohol120.cs + /// + public class MDS_Format + { + /// + /// A loose representation of an Alcohol 120 .mds file (with a few extras) + /// + public class AFile + { + /// + /// Full path to the MDS file + /// + public string MDSPath; + + /// + /// MDS Header + /// + public AHeader Header = new AHeader(); + + /// + /// List of MDS session blocks + /// + public List Sessions = new List(); + + /// + /// List of track blocks + /// + public List Tracks = new List(); + + /// + /// Current parsed session objects + /// + public List ParsedSession = new List(); + + /// + /// Calculated MDS TOC entries (still to be parsed into BizHawk) + /// + public List TOCEntries = new List(); + + } + + public class AHeader + { + /// + /// Standard alcohol 120% signature - usually "MEDIA DESCRIPTOR" + /// + public string Signature; // 16 bytes + + /// + /// Alcohol version? + /// + public byte[] Version; // 2 bytes + + /// + /// The medium type + /// * 0x00 - CD + /// * 0x01 - CD-R + /// * 0x02 - CD-RW + /// * 0x10 - DVD + /// * 0x12 - DVD-R + /// + public int Medium; + + /// + /// Number of sessions + /// + public int SessionCount; + + /// + /// Burst Cutting Area length + /// + public int BCALength; + + /// + /// Burst Cutting Area data offset + /// + public Int64 BCAOffset; + + /// + /// Offset to disc (DVD?) structures + /// + public Int64 StructureOffset; + + /// + /// Offset to the first session block + /// + public Int64 SessionOffset; + + /// + /// Data Position Measurement offset + /// + public Int64 DPMOffset; + + /// + /// Parse mds stream for the header + /// + /// + /// + public AHeader Parse(Stream stream) + { + EndianBitConverter bc = EndianBitConverter.CreateForLittleEndian(); + EndianBitConverter bcBig = EndianBitConverter.CreateForBigEndian(); + + byte[] header = new byte[88]; + stream.Read(header, 0, 88); + + this.Signature = Encoding.ASCII.GetString(header.Take(16).ToArray()); + this.Version = header.Skip(16).Take(2).ToArray(); + this.Medium = bc.ToInt16(header.Skip(18).Take(2).ToArray()); + this.SessionCount = bc.ToInt16(header.Skip(20).Take(2).ToArray()); + this.BCALength = bc.ToInt16(header.Skip(26).Take(2).ToArray()); + this.BCAOffset = bc.ToInt32(header.Skip(36).Take(4).ToArray()); + this.StructureOffset = bc.ToInt32(header.Skip(64).Take(4).ToArray()); + this.SessionOffset = bc.ToInt32(header.Skip(80).Take(4).ToArray()); + this.DPMOffset = bc.ToInt32(header.Skip(84).Take(4).ToArray()); + + return this; + } + } + + /// + /// MDS session block representation + /// + public class ASession + { + public int SessionStart; /* Session's start address */ + public int SessionEnd; /* Session's end address */ + public int SessionNumber; /* Session number */ + public byte AllBlocks; /* Number of all data blocks. */ + public byte NonTrackBlocks; /* Number of lead-in data blocks */ + public int FirstTrack; /* First track in session */ + public int LastTrack; /* Last track in session */ + public Int64 TrackOffset; /* Offset of lead-in+regular track data blocks. */ + } + + /// + /// Representation of an MDS track block + /// For convenience (and extra confusion) this also holds the track extrablock, filename(footer) block infos + /// as well as the calculated image filepath as specified in the MDS file + /// + public class ATrack + { + /// + /// The specified data mode + /// 0x00 - None (no data) + /// 0x02 - DVD + /// 0xA9 - Audio + /// 0xAA - Mode1 + /// 0xAB - Mode2 + /// 0xAC - Mode2 Form1 + /// 0xAD - Mode2 Form2 + /// + public byte Mode; /* Track mode */ + + /// + /// Subchannel mode for the track (0x00 = None, 0x08 = Interleaved) + /// + public byte SubMode; /* Subchannel mode */ + + /* These are the fields from Sub-channel Q information, which are + also returned in full TOC by READ TOC/PMA/ATIP command */ + public int ADR_Control; /* Adr/Ctl */ + public int TrackNo; /* Track number field */ + public int Point; /* Point field (= track number for track entries) */ + public int AMin; /* Min */ + public int ASec; /* Sec */ + public int AFrame; /* Frame */ + public int Zero; /* Zero */ + public int PMin; /* PMin */ + public int PSec; /* PSec */ + public int PFrame; /* PFrame */ + + public Int64 ExtraOffset; /* Start offset of this track's extra block. */ + public int SectorSize; /* Sector size. */ + public Int64 PLBA; /* Track start sector (PLBA). */ + public ulong StartOffset; /* Track start offset (from beginning of MDS file) */ + public Int64 Files; /* Number of filenames for this track */ + public Int64 FooterOffset; /* Start offset of footer (from beginning of MDS file) */ + + /// + /// Track extra block + /// + public ATrackExtra ExtraBlock = new ATrackExtra(); + + /// + /// List of footer(filename) blocks for this track + /// + public List FooterBlocks = new List(); + + /// + /// List of the calculated full paths to this track's image file + /// The MDS file itself may contain a filename, or just an *.extension + /// + public List ImageFileNamePaths = new List(); + + public int BlobIndex; + } + + /// + /// Extra track block + /// + public class ATrackExtra + { + public Int64 Pregap; /* Number of sectors in pregap. */ + public Int64 Sectors; /* Number of sectors in track. */ + } + + /// + /// Footer (filename) block - potentially one for every track + /// + public class AFooter + { + public Int64 FilenameOffset; /* Start offset of image filename string (from beginning of mds file) */ + public Int64 WideChar; /* Seems to be set to 1 if widechar filename is used */ + } + + /// + /// Represents a parsed MDS TOC entry + /// + public class ATOCEntry + { + public ATOCEntry(int entryNum) + { + EntryNum = entryNum; + } + + /// + /// these should be 0-indexed + /// + public int EntryNum; + + + /// + /// 1-indexed - the session that this entry belongs to + /// + public int Session; + + /// + /// this seems just to be the LBA corresponding to AMIN:ASEC:AFRAME (give or take 150). It's not stored on the disc, and it's redundant. + /// + //public int ALBA; + + /// + /// this seems just to be the LBA corresponding to PMIN:PSEC:PFRAME (give or take 150). + /// + public int PLBA; + + //these correspond pretty directly to values in the Q subchannel fields + //NOTE: they're specified as absolute MSF. That means, they're 2 seconds off from what they should be when viewed as final TOC values + public int ADR_Control; + public int TrackNo; + public int Point; + public int AMin; + public int ASec; + public int AFrame; + public int Zero; + public int PMin; + public int PSec; + public int PFrame; + + + public int SectorSize; + public long TrackOffset; + + /// + /// List of the calculated full paths to this track's image file + /// The MDS file itself may contain a filename, or just an *.extension + /// + public List ImageFileNamePaths = new List(); + + /// + /// Track extra block + /// + public ATrackExtra ExtraBlock = new ATrackExtra(); + + public int BlobIndex; + } + + public AFile Parse(Stream stream) + { + EndianBitConverter bc = EndianBitConverter.CreateForLittleEndian(); + EndianBitConverter bcBig = EndianBitConverter.CreateForBigEndian(); + bool isDvd = false; + + AFile aFile = new AFile(); + + aFile.MDSPath = (stream as FileStream).Name; + + stream.Seek(0, SeekOrigin.Begin); + + // check whether the header in the mds file is long enough + if (stream.Length < 88) throw new MDSParseException("Malformed MDS format: The descriptor file does not appear to be long enough."); + + // parse header + aFile.Header = aFile.Header.Parse(stream); + + // parse sessions + Dictionary aSessions = new Dictionary(); + + stream.Seek(aFile.Header.SessionOffset, SeekOrigin.Begin); + for (int se = 0; se < aFile.Header.SessionCount; se++) + { + byte[] sessionHeader = new byte[24]; + stream.Read(sessionHeader, 0, 24); + //sessionHeader.Reverse().ToArray(); + + ASession session = new ASession(); + + session.SessionStart = bc.ToInt32(sessionHeader.Take(4).ToArray()); + session.SessionEnd = bc.ToInt32(sessionHeader.Skip(4).Take(4).ToArray()); + session.SessionNumber = bc.ToInt16(sessionHeader.Skip(8).Take(2).ToArray()); + session.AllBlocks = sessionHeader[10]; + session.NonTrackBlocks = sessionHeader[11]; + session.FirstTrack = bc.ToInt16(sessionHeader.Skip(12).Take(2).ToArray()); + session.LastTrack = bc.ToInt16(sessionHeader.Skip(14).Take(2).ToArray()); + session.TrackOffset = bc.ToInt32(sessionHeader.Skip(20).Take(4).ToArray()); + + + //mdsf.Sessions.Add(session); + aSessions.Add(session.SessionNumber, session); + } + + long footerOffset = 0; + + // parse track blocks + Dictionary aTracks = new Dictionary(); + + // iterate through each session block + foreach (ASession session in aSessions.Values) + { + stream.Seek(session.TrackOffset, SeekOrigin.Begin); + //Dictionary sessionToc = new Dictionary(); + + // iterate through every block specified in each session + for (int bl = 0; bl < session.AllBlocks; bl++) + { + byte[] trackHeader; + ATrack track = new ATrack(); + + trackHeader = new byte[80]; + + stream.Read(trackHeader, 0, 80); + + track.Mode = trackHeader[0]; + track.SubMode = trackHeader[1]; + track.ADR_Control = trackHeader[2]; + track.TrackNo = trackHeader[3]; + track.Point = trackHeader[4]; + track.AMin = trackHeader[5]; + track.ASec = trackHeader[6]; + track.AFrame = trackHeader[7]; + track.Zero = trackHeader[8]; + track.PMin = trackHeader[9]; + track.PSec = trackHeader[10]; + track.PFrame = trackHeader[11]; + track.ExtraOffset = bc.ToInt32(trackHeader.Skip(12).Take(4).ToArray()); + track.SectorSize = bc.ToInt16(trackHeader.Skip(16).Take(2).ToArray()); + track.PLBA = bc.ToInt32(trackHeader.Skip(36).Take(4).ToArray()); + track.StartOffset = BitConverter.ToUInt64(trackHeader.Skip(40).Take(8).ToArray(), 0); + track.Files = bc.ToInt32(trackHeader.Skip(48).Take(4).ToArray()); + track.FooterOffset = bc.ToInt32(trackHeader.Skip(52).Take(4).ToArray()); + + if (track.Mode == 0x02) + { + isDvd = true; + throw new MDSParseException("DVD Detected. Not currently supported!"); + } + + + // check for track extra block - this can probably be handled in a separate loop, + // but I'll just store the current stream position then seek forward to the extra block for this track + Int64 currPos = stream.Position; + + // Only CDs have extra blocks - for DVDs ExtraOffset = track length + if (track.ExtraOffset > 0 && !isDvd) + { + byte[] extHeader = new byte[8]; + stream.Seek(track.ExtraOffset, SeekOrigin.Begin); + stream.Read(extHeader, 0, 8); + track.ExtraBlock.Pregap = bc.ToInt32(extHeader.Take(4).ToArray()); + track.ExtraBlock.Sectors = bc.ToInt32(extHeader.Skip(4).Take(4).ToArray()); + stream.Seek(currPos, SeekOrigin.Begin); + } + else if (isDvd == true) + { + track.ExtraBlock.Sectors = track.ExtraOffset; + } + + // read the footer/filename block for this track + currPos = stream.Position; + long numOfFilenames = track.Files; + for (long fi = 1; fi <= numOfFilenames; fi++) + { + // skip leadin/out info tracks + if (track.FooterOffset == 0) + continue; + + byte[] foot = new byte[16]; + stream.Seek(track.FooterOffset, SeekOrigin.Begin); + stream.Read(foot, 0, 16); + + AFooter f = new AFooter(); + f.FilenameOffset = bc.ToInt32(foot.Take(4).ToArray()); + f.WideChar = bc.ToInt32(foot.Skip(4).Take(4).ToArray()); + track.FooterBlocks.Add(f); + track.FooterBlocks = track.FooterBlocks.Distinct().ToList(); + + // parse the filename string + string fileName = "*.mdf"; + if (f.FilenameOffset > 0) + { + // filename offset is present + stream.Seek(f.FilenameOffset, SeekOrigin.Begin); + byte[] fname; + + if (numOfFilenames == 1) + { + if (aFile.Header.DPMOffset == 0) + { + // filename is in the remaining space to EOF + fname = new byte[stream.Length - stream.Position]; + } + else + { + // filename is in the remaining space to EOF + dpm offset + fname = new byte[aFile.Header.DPMOffset - stream.Position]; + } + } + + else + { + // looks like each filename string is 6 bytes with a trailing \0 + fname = new byte[6]; + } + + + // read the filename + stream.Read(fname, 0, fname.Length); + + // if widechar is 1 filename is stored using 16-bit, otherwise 8-bit is used + if (f.WideChar == 1) + fileName = Encoding.Unicode.GetString(fname).TrimEnd('\0'); + else + fileName = Encoding.Default.GetString(fname).TrimEnd('\0'); + } + + else + { + // assume an MDF file with the same name as the MDS + } + + string dir = Path.GetDirectoryName(aFile.MDSPath); + + if (f.FilenameOffset == 0 || + string.Compare(fileName, "*.mdf", StringComparison.InvariantCultureIgnoreCase) == 0) + { + fileName = dir + @"\" + Path.GetFileNameWithoutExtension(aFile.MDSPath) + ".mdf"; + } + else + { + fileName = dir + @"\" + fileName; + } + + track.ImageFileNamePaths.Add(fileName); + track.ImageFileNamePaths = track.ImageFileNamePaths.Distinct().ToList(); + } + + stream.Position = currPos; + + + aTracks.Add(track.Point, track); + aFile.Tracks.Add(track); + + if (footerOffset == 0) + footerOffset = track.FooterOffset; + } + } + + + // build custom session object + aFile.ParsedSession = new List(); + foreach (var s in aSessions.Values) + { + Session session = new Session(); + ATrack startTrack; + ATrack endTrack; + + if (!aTracks.TryGetValue(s.FirstTrack, out startTrack)) + { + break; + } + + if (!aTracks.TryGetValue(s.LastTrack, out endTrack)) + { + break; + } + + session.StartSector = startTrack.PLBA; + session.StartTrack = s.FirstTrack; + session.SessionSequence = s.SessionNumber; + session.EndSector = endTrack.PLBA + endTrack.ExtraBlock.Sectors - 1; + session.EndTrack = s.LastTrack; + + aFile.ParsedSession.Add(session); + } + + // now build the TOC object + foreach (var se in aFile.ParsedSession) + { + // get the first and last tracks + int sTrack = se.StartTrack; + int eTrack = se.EndTrack; + + // get list of all tracks from aTracks for this session + var tracks = (from a in aTracks.Values + where a.TrackNo >= sTrack || a.TrackNo <= eTrack + orderby a.TrackNo + select a).ToList(); + + // create the TOC entries + foreach (var t in tracks) + { + ATOCEntry toc = new ATOCEntry(t.Point); + toc.ADR_Control = t.ADR_Control; + toc.AFrame = t.AFrame; + toc.AMin = t.AMin; + toc.ASec = t.ASec; + toc.EntryNum = t.TrackNo; + toc.PFrame = t.PFrame; + toc.PLBA = Convert.ToInt32(t.PLBA); + toc.PMin = t.PMin; + toc.Point = t.Point; + toc.PSec = t.PSec; + toc.SectorSize = t.SectorSize; + toc.Zero = t.Zero; + toc.TrackOffset = Convert.ToInt64(t.StartOffset); + toc.Session = se.SessionSequence; + toc.ImageFileNamePaths = t.ImageFileNamePaths; + toc.ExtraBlock = t.ExtraBlock; + toc.BlobIndex = t.BlobIndex; + aFile.TOCEntries.Add(toc); + } + + } + + return aFile; + } + + /// + /// Custom session object + /// + public class Session + { + public long StartSector; + public int StartTrack; + public int SessionSequence; + public long EndSector; + public int EndTrack; + } + + + public class MDSParseException : Exception + { + public MDSParseException(string message) : base(message) { } + } + + + public class LoadResults + { + public List RawTOCEntries; + public AFile ParsedMDSFile; + public bool Valid; + public Exception FailureException; + public string MdsPath; + } + + public static LoadResults LoadMDSPath(string path) + { + LoadResults ret = new LoadResults(); + ret.MdsPath = path; + //ret.MdfPath = Path.ChangeExtension(path, ".mdf"); + try + { + if (!File.Exists(path)) throw new MDSParseException("Malformed MDS format: nonexistent MDS file!"); + + AFile mdsf; + using (var infMDS = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) + mdsf = new MDS_Format().Parse(infMDS); + + ret.ParsedMDSFile = mdsf; + + ret.Valid = true; + } + catch (MDSParseException ex) + { + ret.FailureException = ex; + } + + return ret; + } + + Dictionary MountBlobs(AFile mdsf, Disc disc) + { + Dictionary BlobIndex = new Dictionary(); + + int count = 0; + foreach (var track in mdsf.Tracks) + { + foreach (var file in track.ImageFileNamePaths.Distinct()) + { + if (!File.Exists(file)) + throw new MDSParseException("Malformed MDS format: nonexistent image file: " + file); + + IBlob mdfBlob = null; + long mdfLen = -1; + + //mount the file + if (mdfBlob == null) + { + var mdfFile = new Disc.Blob_RawFile() { PhysicalPath = file }; + mdfLen = mdfFile.Length; + mdfBlob = mdfFile; + } + + bool dupe = false; + foreach (var re in disc.DisposableResources) + { + if (re.ToString() == mdfBlob.ToString()) + dupe = true; + } + + if (!dupe) + { + // wrap in zeropadadapter + disc.DisposableResources.Add(mdfBlob); + BlobIndex[count] = mdfBlob; + } + } + } + + return BlobIndex; + } + + RawTOCEntry EmitRawTOCEntry(ATOCEntry entry) + { + BCD2 tno, ino; + + //this should actually be zero. im not sure if this is stored as BCD2 or not + tno = BCD2.FromDecimal(entry.TrackNo); + + //these are special values.. I think, taken from this: + //http://www.staff.uni-mainz.de/tacke/scsi/SCSI2-14.html + //the CCD will contain Points as decimal values except for these specially converted decimal values which should stay as BCD. + //Why couldn't they all be BCD? I don't know. I guess because BCD is inconvenient, but only A0 and friends have special meaning. It's confusing. + ino = BCD2.FromDecimal(entry.Point); + if (entry.Point == 0xA0) ino.BCDValue = 0xA0; + else if (entry.Point == 0xA1) ino.BCDValue = 0xA1; + else if (entry.Point == 0xA2) ino.BCDValue = 0xA2; + + // get ADR & Control from ADR_Control byte + byte adrc = Convert.ToByte(entry.ADR_Control); + var Control = adrc & 0x0F; + var ADR = adrc >> 4; + + var q = new SubchannelQ + { + q_status = SubchannelQ.ComputeStatus(ADR, (EControlQ)(Control & 0xF)), + q_tno = tno, + q_index = ino, + min = BCD2.FromDecimal(entry.AMin), + sec = BCD2.FromDecimal(entry.ASec), + frame = BCD2.FromDecimal(entry.AFrame), + zero = (byte)entry.Zero, + ap_min = BCD2.FromDecimal(entry.PMin), + ap_sec = BCD2.FromDecimal(entry.PSec), + ap_frame = BCD2.FromDecimal(entry.PFrame), + q_crc = 0, //meaningless + }; + + return new RawTOCEntry { QData = q }; + } + + + /// + /// Loads a MDS at the specified path to a Disc object + /// + public Disc LoadMDSToDisc(string mdsPath, DiscMountPolicy IN_DiscMountPolicy) + { + var loadResults = LoadMDSPath(mdsPath); + if (!loadResults.Valid) + throw loadResults.FailureException; + + Disc disc = new Disc(); + + // load all blobs + Dictionary BlobIndex = MountBlobs(loadResults.ParsedMDSFile, disc); + + var mdsf = loadResults.ParsedMDSFile; + + //generate DiscTOCRaw items from the ones specified in the MDS file + disc.RawTOCEntries = new List(); + foreach (var entry in mdsf.TOCEntries) + { + disc.RawTOCEntries.Add(EmitRawTOCEntry(entry)); + } + + //analyze the RAWTocEntries to figure out what type of track track 1 is + var tocSynth = new Synthesize_DiscTOC_From_RawTOCEntries_Job() { Entries = disc.RawTOCEntries }; + tocSynth.Run(); + + // now build the sectors + int currBlobIndex = 0; + foreach (var session in mdsf.ParsedSession) + { + for (int i = session.StartTrack; i <= session.EndTrack; i++) + { + int relMSF = -1; + + var track = mdsf.TOCEntries.Where(t => t.Point == i).FirstOrDefault(); + if (track == null) + break; + + // ignore the info entries + if (track.Point == 0xA0 || + track.Point == 0xA1 || + track.Point == 0xA2) + { + continue; + } + + // get the blob(s) for this track + // its probably a safe assumption that there will be only one blob per track, + // but i'm still not 100% sure on this + var tr = (from a in mdsf.TOCEntries + where a.Point == i + select a).FirstOrDefault(); + + if (tr == null) + throw new MDSParseException("BLOB Error!"); + + List blobstrings = new List(); + foreach (var t in tr.ImageFileNamePaths) + { + if (!blobstrings.Contains(t)) + blobstrings.Add(t); + } + + var tBlobs = (from a in tr.ImageFileNamePaths + select a).ToList(); + + if (tBlobs.Count < 1) + throw new MDSParseException("BLOB Error!"); + + // is the currBlob valid for this track, or do we need to increment? + string bString = tBlobs.First(); + + IBlob mdfBlob = null; + + // check for track pregap and create if neccessary + // this is specified in the track extras block + if (track.ExtraBlock.Pregap > 0) + { + CUE.CueTrackType pregapTrackType = CUE.CueTrackType.Audio; + if (tocSynth.Result.TOCItems[1].IsData) + { + if (tocSynth.Result.Session1Format == SessionFormat.Type20_CDXA) + pregapTrackType = CUE.CueTrackType.Mode2_2352; + else if (tocSynth.Result.Session1Format == SessionFormat.Type10_CDI) + pregapTrackType = CUE.CueTrackType.CDI_2352; + else if (tocSynth.Result.Session1Format == SessionFormat.Type00_CDROM_CDDA) + pregapTrackType = CUE.CueTrackType.Mode1_2352; + } + for (int pre = 0; pre < track.ExtraBlock.Pregap; pre++) + { + relMSF++; + + var ss_gap = new CUE.SS_Gap() + { + Policy = IN_DiscMountPolicy, + TrackType = pregapTrackType + }; + disc._Sectors.Add(ss_gap); + + int qRelMSF = pre - Convert.ToInt32(track.ExtraBlock.Pregap); + + //tweak relMSF due to ambiguity/contradiction in yellowbook docs + if (!IN_DiscMountPolicy.CUE_PregapContradictionModeA) + qRelMSF++; + + //setup subQ + byte ADR = 1; //absent some kind of policy for how to set it, this is a safe assumption: + ss_gap.sq.SetStatus(ADR, tocSynth.Result.TOCItems[1].Control); + ss_gap.sq.q_tno = BCD2.FromDecimal(1); + ss_gap.sq.q_index = BCD2.FromDecimal(0); + ss_gap.sq.AP_Timestamp = pre; + ss_gap.sq.Timestamp = qRelMSF; + + //setup subP + ss_gap.Pause = true; + } + // pregap processing completed + } + + + + // create track sectors + long currBlobOffset = track.TrackOffset; + for (long sector = session.StartSector; sector <= session.EndSector; sector++) + { + CUE.SS_Base sBase = null; + + // get the current blob from the BlobIndex + Disc.Blob_RawFile currBlob = BlobIndex[currBlobIndex] as Disc.Blob_RawFile; + long currBlobLength = currBlob.Length; + long currBlobPosition = sector; + if (currBlobPosition == currBlobLength) + currBlobIndex++; + mdfBlob = disc.DisposableResources[currBlobIndex] as Disc.Blob_RawFile; + + int userSector = 2048; + switch (track.SectorSize) + { + case 2448: + sBase = new CUE.SS_2352() + { + Policy = IN_DiscMountPolicy + }; + userSector = 2352; + break; + case 2048: + default: + sBase = new CUE.SS_Mode1_2048() + { + Policy = IN_DiscMountPolicy + }; + userSector = 2048; + break; + + //throw new Exception("Not supported: Sector Size " + track.SectorSize); + } + + // configure blob + sBase.Blob = mdfBlob; + sBase.BlobOffset = currBlobOffset; + + currBlobOffset += track.SectorSize; // userSector; + + // add subchannel data + relMSF++; + BCD2 tno, ino; + + //this should actually be zero. im not sure if this is stored as BCD2 or not + tno = BCD2.FromDecimal(track.TrackNo); + + //these are special values.. I think, taken from this: + //http://www.staff.uni-mainz.de/tacke/scsi/SCSI2-14.html + //the CCD will contain Points as decimal values except for these specially converted decimal values which should stay as BCD. + //Why couldn't they all be BCD? I don't know. I guess because BCD is inconvenient, but only A0 and friends have special meaning. It's confusing. + ino = BCD2.FromDecimal(track.Point); + if (track.Point == 0xA0) ino.BCDValue = 0xA0; + else if (track.Point == 0xA1) ino.BCDValue = 0xA1; + else if (track.Point == 0xA2) ino.BCDValue = 0xA2; + + // get ADR & Control from ADR_Control byte + byte adrc = Convert.ToByte(track.ADR_Control); + var Control = adrc & 0x0F; + var ADR = adrc >> 4; + + var q = new SubchannelQ + { + q_status = SubchannelQ.ComputeStatus(ADR, (EControlQ)(Control & 0xF)), + q_tno = BCD2.FromDecimal(track.Point), + q_index = ino, + AP_Timestamp = disc._Sectors.Count, + Timestamp = relMSF - Convert.ToInt32(track.ExtraBlock.Pregap) + }; + + sBase.sq = q; + + disc._Sectors.Add(sBase); + + } + } + } + + return disc; + } + + } //class MDS_Format +} + + diff --git a/BizHawk.Emulation.DiscSystem/DiscMountJob.cs b/BizHawk.Emulation.DiscSystem/DiscMountJob.cs index dab08a7dbf..7282d00f74 100644 --- a/BizHawk.Emulation.DiscSystem/DiscMountJob.cs +++ b/BizHawk.Emulation.DiscSystem/DiscMountJob.cs @@ -187,6 +187,11 @@ namespace BizHawk.Emulation.DiscSystem CCD_Format ccdLoader = new CCD_Format(); OUT_Disc = ccdLoader.LoadCCDToDisc(IN_FromPath, IN_DiscMountPolicy); } + else if (ext == ".mds") + { + MDS_Format mdsLoader = new MDS_Format(); + OUT_Disc = mdsLoader.LoadMDSToDisc(IN_FromPath, IN_DiscMountPolicy); + } DONE: From 166edd7cbacd40935c6d897f110dccce4f1ddfcd Mon Sep 17 00:00:00 2001 From: Asnivor Date: Wed, 25 Oct 2017 17:10:26 +0100 Subject: [PATCH 202/219] Added mds to file filters --- BizHawk.Client.EmuHawk/FileLoader.cs | 2 +- BizHawk.Client.EmuHawk/MainForm.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/BizHawk.Client.EmuHawk/FileLoader.cs b/BizHawk.Client.EmuHawk/FileLoader.cs index 2071de742d..0009646fb4 100644 --- a/BizHawk.Client.EmuHawk/FileLoader.cs +++ b/BizHawk.Client.EmuHawk/FileLoader.cs @@ -55,7 +55,7 @@ namespace BizHawk.Client.EmuHawk }; } - return new[] { ".NES", ".FDS", ".UNF", ".SMS", ".GG", ".SG", ".GB", ".GBC", ".GBA", ".PCE", ".SGX", ".BIN", ".SMD", ".GEN", ".MD", ".SMC", ".SFC", ".A26", ".A78", ".LNX", ".COL", ".ROM", ".M3U", ".CUE", ".CCD", ".SGB", ".Z64", ".V64", ".N64", ".WS", ".WSC", ".XML", ".DSK", ".DO", ".PO", ".PSF", ".MINIPSF", ".NSF", ".32X" }; + return new[] { ".NES", ".FDS", ".UNF", ".SMS", ".GG", ".SG", ".GB", ".GBC", ".GBA", ".PCE", ".SGX", ".BIN", ".SMD", ".GEN", ".MD", ".SMC", ".SFC", ".A26", ".A78", ".LNX", ".COL", ".ROM", ".M3U", ".CUE", ".CCD", ".SGB", ".Z64", ".V64", ".N64", ".WS", ".WSC", ".XML", ".DSK", ".DO", ".PO", ".PSF", ".MINIPSF", ".NSF", ".32X", ".MDS" }; } } diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 4fda942f31..170dbb2322 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -2083,7 +2083,7 @@ namespace BizHawk.Client.EmuHawk "NES", "*.nes;*.fds;*.unf;*.nsf;%ARCH%", "Super NES", "*.smc;*.sfc;*.xml;%ARCH%", "Master System", "*.sms;*.gg;*.sg;%ARCH%", - "PC Engine", "*.pce;*.sgx;*.cue;*.ccd;%ARCH%", + "PC Engine", "*.pce;*.sgx;*.cue;*.ccd;*.mds;%ARCH%", "TI-83", "*.rom;%ARCH%", "Archive Files", "%ARCH%", "Savestate", "*.state", @@ -2109,17 +2109,17 @@ namespace BizHawk.Client.EmuHawk } return FormatFilter( - "Rom Files", "*.nes;*.fds;*.unf;*.sms;*.gg;*.sg;*.gb;*.gbc;*.gba;*.pce;*.sgx;*.bin;*.smd;*.gen;*.md;*.32x;*.smc;*.sfc;*.a26;*.a78;*.lnx;*.col;*.int;*.rom;*.m3u;*.cue;*.ccd;*.sgb;*.z64;*.v64;*.n64;*.ws;*.wsc;*.xml;*.dsk;*.do;*.po;*.psf;*.ngp;*.ngc;*.prg;*.d64;*.g64;*.minipsf;*.nsf;%ARCH%", - "Disc Images", "*.cue;*.ccd;*.m3u", + "Rom Files", "*.nes;*.fds;*.unf;*.sms;*.gg;*.sg;*.gb;*.gbc;*.gba;*.pce;*.sgx;*.bin;*.smd;*.gen;*.md;*.32x;*.smc;*.sfc;*.a26;*.a78;*.lnx;*.col;*.int;*.rom;*.m3u;*.cue;*.ccd;*.mds;*.sgb;*.z64;*.v64;*.n64;*.ws;*.wsc;*.xml;*.dsk;*.do;*.po;*.psf;*.ngp;*.ngc;*.prg;*.d64;*.g64;*.minipsf;*.nsf;%ARCH%", + "Disc Images", "*.cue;*.ccd;*.mds;*.m3u", "NES", "*.nes;*.fds;*.unf;*.nsf;%ARCH%", "Super NES", "*.smc;*.sfc;*.xml;%ARCH%", - "PlayStation", "*.cue;*.ccd;*.m3u", + "PlayStation", "*.cue;*.ccd;*.mds;*.m3u", "PSF Playstation Sound File", "*.psf;*.minipsf", "Nintendo 64", "*.z64;*.v64;*.n64", "Gameboy", "*.gb;*.gbc;*.sgb;%ARCH%", "Gameboy Advance", "*.gba;%ARCH%", "Master System", "*.sms;*.gg;*.sg;%ARCH%", - "PC Engine", "*.pce;*.sgx;*.cue;*.ccd;%ARCH%", + "PC Engine", "*.pce;*.sgx;*.cue;*.ccd;*.mds;%ARCH%", "Atari 2600", "*.a26;%ARCH%", "Atari 7800", "*.a78;%ARCH%", "Atari Lynx", "*.lnx;%ARCH%", From e64d00bf7d1acc09f7aca62fbf08cfe7e3cf8302 Mon Sep 17 00:00:00 2001 From: zeromus Date: Wed, 25 Oct 2017 12:21:57 -0400 Subject: [PATCH 203/219] psx - fix bug where saving the state cleared the memcard dirty flags. not 100% sure we'll keep this logic, need to revisit it on the date of the great automatic-flushing-deprecation. fixes #1031 --- output/dll/octoshock.dll | Bin 1138688 -> 1139712 bytes psx/octoshock/psx/input/memcard.cpp | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/output/dll/octoshock.dll b/output/dll/octoshock.dll index 292d2536eb06783d091f922e066dd029091a121a..3e80c9454eb135bd4efc83dd1a39c5dfce491afc 100644 GIT binary patch delta 165419 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
aPH?e!34!J~94J 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 ^BDjmQ;PB@6ipTD&rz<_CxR`eqkC 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 TZrYsLY_^2A)DM~K?8^Ed)yL$* delta 164642 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 i_oqVJf9h zlB6(U$CorXSsE-HjYG`Y`0+9tmgnx(9r=6wtb-xN#U&)&&`*0z#a{z3T zrJPXuN*Ae_cfU{3W~8p6G_Q*kFZhPiJzb=RL67IKMA$eOU#7TbEs^VqJ@AEy3H&#vs|t3nikkrfrBWe-w<{< zyD6Nt!aoO~W*TL(>N{(0Cu9Z4)0e|~<%^>tb@*hcEMeah@a0V%s=CFAYw$ngv{mEW zXzq+-e>+36iNc;G_WQ3$Q*}adZ91Ws)Koi$F6kvj^j(fBM@#wvj@kP9MaXWB>b(Y` z@5NIBkcETT_%$7`IpP#Gh#`+SUG*B^ovC_5;FTBJ>%AuV>I^{1talmz#U?@*7S=$Qc*h$SBjI>B}BHwkHN;=F7X!t zv!c0aR(?6_aLhH!?5%4Hz{=(ptN`MQL~84c&i=!iRh@k<#!r2vo&g}k30e(QCtP(R z5^2kRQnoOE4qeet8Wr3DdBa&wrYPpYCmvIC=E44VQ_T)Ew!aiETqgAO{?a#oy=_Pk zm$PT+uvP_=QZ}j`0EMnaXv6@iXVAr|=(Y8)K$W0WkL_Li~}#lsjcZ}1ErkW;WbbKHnvZ{ zZ61CXa=zY*Mhudg3;jQ)uMd(!wXNvHLDF_1eKKt^Sc(u{olN@ zn+k7yF9puYVs=C_x)#Q!5xqJDY-)MYh@oK9f_5G%+3Fwv(2Y$OkAz~CO#x$bWg@*Z zRH`j_ccY%e5cRG|(}p2xEFCdS`c4=^uiP8gVt|OZ@(dxV;#fUH>E*Xf!lVt6x}37r|BwtD5>#NV%r(= z@Dc)(EY9apqTrU8$6e*j7EumklPo%WxHL&PHlBLDCBi)mGunW5|?y7)@ zXe(l&`D0Z=QnU3(g=I!+g=V%T8JX!mN=4ldk8LAtkSC_Vt)xaM58! zZb+QNAiZiyexft4qvrE$+G3}`UOg_ z9?)4HNM7dP_;L6&?1al4OYw7=Ck4LMPjSS8`##LFino=P8ZZTf`)7DwNU*o!+$$|s1mYL0e3lpxNBGLV?Zal44PgyPq-v;Q@b9mk8} zewAhSs_9woc=8wi5uGetQp z&PozLU~$&3Va?*K@4|fABIO+0Eu1e>He{@yu6Elcnc^&Godzz<ml@B_K2>f% zoYVRO#>0eVi8#5z|Ml-LNyUq&9sQxZq%nYD-x;@;D+QxdF)J^}7jMqRJ$=ri_r7r! zC8WNOv%Gb4vd+&R@r+(?C zN~jdw|4``c`r5~oD--NPX7IlsR|eWM$MFGADDT+EUdfL<(ZSUj>3gTg@xkFEt^W3Z zD@h6V7q8$;R--YQ{X0TGwnn%rAUSnH0|c2>ZCB)mA0;V7$t3 zq|!x`{Cuw}$%7$66)# z!oNRM!~EkOwJFIkJFZDuHHjCJLz?7sO;Q5MX`0Kenj{EGdQ<(OwaP;_`ErB!XgY_R0_lQ*Zf{_Pbz zy>iPI-t;1-teel|zr3g{wSRpkzx5?tUd!La?Jq0;wcp*J?|K=_pY!{3?|Sg0{``{l z$`t#n{rH;oN^jqT{e+v(F^`Nn_4(b6iw_i?`FGLClec8x28mPY|LVuTTd&+;clP7O z8?dnZHjgjdpw!xMxig|1wx9Jnx4oj=>Ammwlj8oWk}bG1`0%0D=lR30D2GzN6|rs= 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
  • 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

    2)uqCnV_1mv!-(RyXe1Sh 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 z Date: Wed, 25 Oct 2017 19:16:05 -0400 Subject: [PATCH 204/219] Update TI83.cs --- BizHawk.Emulation.Cores/Calculator/TI83.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Calculator/TI83.cs b/BizHawk.Emulation.Cores/Calculator/TI83.cs index 09b0928449..cfe82f74eb 100644 --- a/BizHawk.Emulation.Cores/Calculator/TI83.cs +++ b/BizHawk.Emulation.Cores/Calculator/TI83.cs @@ -23,6 +23,7 @@ namespace BizHawk.Emulation.Cores.Calculators PutSettings((TI83Settings)settings ?? new TI83Settings()); CoreComm = comm; + _cpu.FetchMemory = ReadMemory; _cpu.ReadMemory = ReadMemory; _cpu.WriteMemory = WriteMemory; _cpu.ReadHardware = ReadHardware; @@ -511,4 +512,4 @@ namespace BizHawk.Emulation.Cores.Calculators _displayX = _displayY = 0; } } -} \ No newline at end of file +} From cf9bfbe726cce2829385e08a8b17d18c3a61b4c4 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 25 Oct 2017 19:17:00 -0400 Subject: [PATCH 205/219] Update ColecoVision.cs --- BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs index 83c175ef78..69028be88d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs @@ -24,6 +24,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision _cpu = new Z80A { + FetchMemory = ReadMemory, ReadMemory = ReadMemory, WriteMemory = WriteMemory, ReadHardware = ReadPort, @@ -236,4 +237,4 @@ namespace BizHawk.Emulation.Cores.ColecoVision _cpu.Reset(); } } -} \ No newline at end of file +} From 8e7d8fbff5b357c6aa6d9a485fb7ca62dd8b16fe Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 25 Oct 2017 19:18:45 -0400 Subject: [PATCH 206/219] Update SMS.cs --- BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs index 423b11b965..76fe7b8474 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs @@ -79,6 +79,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem { ReadHardware = ReadPort, WriteHardware = WritePort, + FetchMemory = ReadMemory, ReadMemory = ReadMemory, WriteMemory = WriteMemory, MemoryCallbacks = MemoryCallbacks @@ -262,7 +263,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem ///

    /// A dummy FetchMemory that simply reads the memory /// - private byte FetchMemory_StubThunk(ushort address, bool first) + private byte FetchMemory_StubThunk(ushort address) { return ReadMemory(address); } @@ -355,4 +356,4 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem private readonly string[] validRegions = { "Export", "Japan", "Auto" }; } -} \ No newline at end of file +} From c593cb4c47e32452de219694c4282cb895d718cf Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 25 Oct 2017 19:19:30 -0400 Subject: [PATCH 207/219] Update SMS CodeDataLogger --- .../Consoles/Sega/SMS/SMS.ICodeDataLogger.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ICodeDataLogger.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ICodeDataLogger.cs index 3c5d438faf..888b0a3a2a 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ICodeDataLogger.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ICodeDataLogger.cs @@ -94,9 +94,9 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem /// /// A wrapper for FetchMemory which inserts CDL logic /// - private byte FetchMemory_CDL(ushort address, bool first) + private byte FetchMemory_CDL(ushort address) { - RunCDL(address, first ? CDLog_Flags.ExecFirst : CDLog_Flags.ExecOperand); + RunCDL(address, CDLog_Flags.ExecFirst); return ReadMemory(address); } From f94d3f58c6464e4b975190a9095d33d4160e1a6e Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 25 Oct 2017 19:21:30 -0400 Subject: [PATCH 208/219] Z80: Fix CDL Use FetchMemory for opcodes and ReadMemory for everything else Also fix Dis-assembling --- BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs | 4 ++-- BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs index 596e0ff66d..6ac1a76444 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/NewDisassembler.cs @@ -409,7 +409,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A A = read(addr++); switch (A) { - case 0xCB: format = mnemonicsDDCB[A]; extra_inc = 1; break; + case 0xCB: format = mnemonicsDDCB[read((ushort)(addr + 1))]; extra_inc = 1; break; case 0xED: format = mnemonicsED[A]; break; default: format = mnemonicsDD[A]; break; } @@ -422,7 +422,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A A = read(addr++); switch (A) { - case 0xCB: format = mnemonicsFDCB[A]; extra_inc = 1; break; + case 0xCB: format = mnemonicsFDCB[read((ushort)(addr + 1))]; extra_inc = 1; break; case 0xED: format = mnemonicsED[A]; break; default: format = mnemonicsFD[A]; break; } diff --git a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs index 2f13b0e6c7..d8743a7eab 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80A/Z80A.cs @@ -95,7 +95,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A public IMemoryCallbackSystem MemoryCallbacks { get; set; } // Memory Access - public Func FetchMemory; + public Func FetchMemory; public Func ReadMemory; public Action WriteMemory; public Func PeekMemory; @@ -200,7 +200,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A { if (OnExecFetch != null) OnExecFetch(RegPC); if (TraceCallback != null) TraceCallback(State()); - FetchInstruction(ReadMemory(RegPC++)); + FetchInstruction(FetchMemory(RegPC++)); } instr_pntr = 0; @@ -325,7 +325,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A { if (OnExecFetch != null) OnExecFetch(RegPC); if (TraceCallback != null) TraceCallback(State()); - FetchInstruction(ReadMemory(RegPC++)); + FetchInstruction(FetchMemory(RegPC++)); } temp_R = (byte)(Regs[R] & 0x7F); @@ -542,7 +542,7 @@ namespace BizHawk.Emulation.Cores.Components.Z80A if (prefix_src == IXCBpre) { IXCB_prefix = true; IXCB_prefetch = true; } if (prefix_src == IYCBpre) { IYCB_prefix = true; IYCB_prefetch = true; } - FetchInstruction(ReadMemory(RegPC++)); + FetchInstruction(FetchMemory(RegPC++)); instr_pntr = 0; // only the first prefix in a double prefix increases R, although I don't know how / why if (prefix_src < 4) From fef2c131f888cdab29c1179bbc82c5ddafa0badd Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Wed, 25 Oct 2017 16:38:37 -0400 Subject: [PATCH 209/219] Adds memory.hash_region to aid in detecting RAM changes --- .../lua/EmuLuaLibrary.Memory.cs | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs index 1b9670dafc..69a04d4028 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs @@ -4,6 +4,7 @@ using System.ComponentModel; using NLua; using BizHawk.Emulation.Common; using BizHawk.Emulation.Common.IEmulatorExtensions; +using BizHawk.Common.BufferExtensions; namespace BizHawk.Client.Common { @@ -108,6 +109,37 @@ namespace BizHawk.Client.Common return false; } + [LuaMethod("hash_region", "Returns a hash as a string of a region of memory, starting from addr, through count bytes. If the domain is unspecified, it uses the current region.")] + public string HashRegion(int addr, int count, string domain = null) + { + var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)]; + + // checks + if (addr < 0 || addr >= d.Size) + { + string error = $"Address {addr} is outside the bounds of domain {d.Name}"; + Log(error); + throw new ArgumentOutOfRangeException(error); + } + if (addr + count > d.Size) + { + string error = $"Address {addr} + count {count} is outside the bounds of domain {d.Name}"; + Log(error); + throw new ArgumentOutOfRangeException(error); + } + + byte[] data = new byte[count]; + for (int i = 0; i < count; i++) + { + data[i] = d.PeekByte(addr + i); + } + + using (var hasher = System.Security.Cryptography.SHA256.Create()) + { + return hasher.ComputeHash(data).BytesToHexString(); + } + } + #endregion #region Common Special and Legacy Methods From c96ea0d23dcdb5cadf694d69a4b3c433a4856d33 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 25 Oct 2017 21:51:53 -0400 Subject: [PATCH 210/219] Update PPU.run.cs --- BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs index 402f9ef6a4..7886a1ab22 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs @@ -42,7 +42,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public byte[] soam = new byte[512]; // in a real nes, this would only be 32, but we wish to allow more then 8 sprites per scanline public bool reg_2001_color_disable_latch; // the value used here is taken public bool ppu_was_on; - public unsafe byte[] sl_sprites = new byte[3 * 256]; + public byte[] sl_sprites = new byte[3 * 256]; // installing vram address is delayed after second write to 2006, set this up here public int install_2006; From 6ea1171ab7ab02dd8bb70feea27c7630f41266ce Mon Sep 17 00:00:00 2001 From: Asnivor Date: Thu, 26 Oct 2017 14:55:31 +0100 Subject: [PATCH 211/219] RomLoader: graceful disc failures --- BizHawk.Client.Common/RomLoader.cs | 34 ++++++++++++++++--- .../EmulationExceptions.cs | 14 ++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index b8754a9bcb..d20e74a845 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -514,7 +514,9 @@ namespace BizHawk.Client.Common // try to use our wizard methods game = new GameInfo { Name = Path.GetFileNameWithoutExtension(file.Name), Hash = discHash }; - switch (new DiscIdentifier(disc).DetectDiscType()) + var dt = new DiscIdentifier(disc).DetectDiscType(); + + switch (dt) { case DiscType.SegaSaturn: game.System = "SAT"; @@ -532,9 +534,23 @@ namespace BizHawk.Client.Common case DiscType.PCFX: game.System = "PCFX"; break; + case DiscType.TurboCD: + game.System = "PCECD"; + break; + + case DiscType.Amiga: + case DiscType.CDi: + case DiscType.Dreamcast: + case DiscType.GameCube: + case DiscType.NeoGeoCD: + case DiscType.Panasonic3DO: + case DiscType.Playdia: + case DiscType.Wii: + // no supported emulator core for these (yet) + game.System = dt.ToString(); + throw new NoAvailableCoreException(dt.ToString()); case DiscType.AudioDisc: - case DiscType.TurboCD: case DiscType.UnknownCDFS: case DiscType.UnknownFormat: if (PreferredPlatformIsDefined(ext)) @@ -543,7 +559,7 @@ namespace BizHawk.Client.Common } else { - game.System = "PCECD"; + game.System = "NULL"; // "PCECD"; } break; @@ -552,6 +568,9 @@ namespace BizHawk.Client.Common switch (game.System) { + case "NULL": + nextEmulator = null; + break; case "GEN": var genesis = new GPGX(nextComm, null, new[] { disc }, GetCoreSettings(), GetCoreSyncSettings()); nextEmulator = genesis; @@ -1029,7 +1048,14 @@ namespace BizHawk.Client.Common DoMessageCallback("Failed to load a GB rom in SGB mode. Disabling SGB Mode."); return LoadRom(path, nextComm, false, recursiveCount + 1); } - else + + // handle exceptions thrown by the new detected systems that bizhawk does not have cores for + else if (ex is NoAvailableCoreException) + { + DoLoadErrorCallback(ex.Message + "\n\n" + ex, system); + } + + else { DoLoadErrorCallback("A core accepted the rom, but threw an exception while loading it:\n\n" + ex, system); } diff --git a/BizHawk.Emulation.Common/EmulationExceptions.cs b/BizHawk.Emulation.Common/EmulationExceptions.cs index f0bc2a5860..ea85be6924 100644 --- a/BizHawk.Emulation.Common/EmulationExceptions.cs +++ b/BizHawk.Emulation.Common/EmulationExceptions.cs @@ -20,6 +20,20 @@ namespace BizHawk.Emulation.Common } } + public class NoAvailableCoreException : Exception + { + public NoAvailableCoreException() + : base("System is currently NOT emulated") + { + } + + public NoAvailableCoreException(string message) + : base ("System is currently NOT emulated: " + message) + { + + } + } + public class CGBNotSupportedException : Exception { public CGBNotSupportedException() From 7b8a61b8e4d25a4be039aca316e3671c67afe22b Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 26 Oct 2017 09:58:24 -0400 Subject: [PATCH 212/219] NESHawk Cleanup --- .../Consoles/Nintendo/NES/APU.cs | 5 +- .../Consoles/Nintendo/NES/NES.Core.cs | 12 +- .../Nintendo/NES/NES.ICodeDataLogger.cs | 113 ++++++++++++++++++ .../Consoles/Nintendo/NES/NES.IStatable.cs | 1 - .../Consoles/Nintendo/NES/NES.cs | 9 +- .../Consoles/Nintendo/NES/PPU.cs | 11 ++ .../Consoles/Nintendo/NES/PPU.regs.cs | 12 +- .../Consoles/Nintendo/NES/PPU.run.cs | 36 ++---- 8 files changed, 144 insertions(+), 55 deletions(-) create mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.ICodeDataLogger.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/APU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/APU.cs index 2b755f983c..72cbcba367 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/APU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/APU.cs @@ -20,8 +20,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { public sealed class APU { - public static bool CFG_DECLICK = true; - public int m_vol = 1; public int dmc_dma_countdown = -1; @@ -1330,8 +1328,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } SyncIRQ(); - nes.irq_apu = irq_pending; - + // since the units run concurrently, the APU frame sequencer is ran last because // it can change the ouput values of the pulse/triangle channels // we want the changes to affect it on the *next* cycle. diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs index 67617348eb..69943117e5 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs @@ -13,7 +13,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { //hardware/state public MOS6502X cpu; - int cpu_accumulate; //cpu timekeeper public PPU ppu; public APU apu; public byte[] ram; @@ -26,12 +25,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES int sprdma_countdown; bool _irq_apu; //various irq signals that get merged to the cpu irq pin - /// clock speed of the main cpu in hz + + /// clock speed of the main cpu in hz public int cpuclockrate { get; private set; } - //irq state management - public bool irq_apu { get { return _irq_apu; } set { _irq_apu = value; } } - //user configuration int[] palette_compiled = new int[64 * 8]; @@ -362,8 +359,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES VS_coin_inserted &= 1; } - FrameGo = true; - if (ppu.ppudead > 0) { while (ppu.ppudead > 0) @@ -416,10 +411,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES num_cheats = 0; } - public bool FrameGo; - //PAL: - //0 15 30 45 60 -> 12 27 42 57 -> 9 24 39 54 -> 6 21 36 51 -> 3 18 33 48 -> 0 //sequence of ppu clocks per cpu clock: 3,3,3,3,4 //at least it should be, but something is off with that (start up time?) so it is 3,3,3,4,3 for now //NTSC: diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.ICodeDataLogger.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.ICodeDataLogger.cs new file mode 100644 index 0000000000..c1f2a5b4fa --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.ICodeDataLogger.cs @@ -0,0 +1,113 @@ +using System; +using System.IO; +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Nintendo.NES +{ + public sealed partial class NES : ICodeDataLogger + { + public void SetCDL(ICodeDataLog cdl) + { + CDL = cdl; + if (cdl == null) + { + cpu.ReadMemory = ReadMemory; + cpu.WriteMemory = WriteMemory; + cpu.PeekMemory = PeekMemory; + } + else + { + cpu.ReadMemory = ReadMemory_CDL; + cpu.WriteMemory = WriteMemory; + cpu.PeekMemory = FetchMemory_CDL; + } + } + + public void NewCDL(ICodeDataLog cdl) + { + cdl["RAM"] = new byte[_memoryDomains["RAM"].Size]; + + if (_memoryDomains.Has("Save RAM")) + { + cdl["Save RAM"] = new byte[_memoryDomains["Save RAM"].Size]; + } + + if (_memoryDomains.Has("Battery RAM")) + { + cdl["Battery RAM"] = new byte[_memoryDomains["Battery RAM"].Size]; + } + + if (_memoryDomains.Has("Battery RAM")) + { + cdl["Battery RAM"] = new byte[_memoryDomains["Battery RAM"].Size]; + } + + cdl.SubType = "NES"; + cdl.SubVer = 0; + } + + [FeatureNotImplemented] + public void DisassembleCDL(Stream s, ICodeDataLog cdl) + { + + } + + private enum CDLog_AddrType + { + None, + ROM, + MainRAM, + SaveRAM, + } + + [Flags] + private enum CDLog_Flags + { + ExecFirst = 0x01, + ExecOperand = 0x02, + Data = 0x04 + }; + + private struct CDLog_MapResults + { + public CDLog_AddrType Type; + public int Address; + } + + private delegate CDLog_MapResults MapMemoryDelegate(ushort addr, bool write); + private MapMemoryDelegate MapMemory; + private ICodeDataLog CDL; + + private void RunCDL(ushort address, CDLog_Flags flags) + { + if (MapMemory != null) + { + CDLog_MapResults results = MapMemory(address, false); + switch (results.Type) + { + case CDLog_AddrType.None: break; + case CDLog_AddrType.MainRAM: CDL["Main RAM"][results.Address] |= (byte)flags; break; + case CDLog_AddrType.SaveRAM: CDL["Save RAM"][results.Address] |= (byte)flags; break; + } + } + } + + /// + /// A wrapper for FetchMemory which inserts CDL logic + /// + private byte FetchMemory_CDL(ushort address) + { + RunCDL(address, CDLog_Flags.ExecFirst); + return PeekMemory(address); + } + + /// + /// A wrapper for ReadMemory which inserts CDL logic + /// + private byte ReadMemory_CDL(ushort address) + { + RunCDL(address, CDLog_Flags.Data); + return ReadMemory(address); + } + } +} \ No newline at end of file diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.IStatable.cs index e5ac4f54b9..e2dd212602 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.IStatable.cs @@ -57,7 +57,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES cpu.SyncState(ser); ser.Sync("ram", ref ram, false); ser.Sync("CIRAM", ref CIRAM, false); - ser.Sync("cpu_accumulate", ref cpu_accumulate); ser.Sync("_irq_apu", ref _irq_apu); ser.Sync("sprdma_countdown", ref sprdma_countdown); ser.Sync("cpu_deadcounter", ref cpu_deadcounter); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs index 3549facdd3..c5e1fbc725 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs @@ -15,7 +15,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES isPorted: false, isReleased: true)] public partial class NES : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable, - IBoardInfo, ISettable + IBoardInfo, ISettable, ICodeDataLogger { [CoreConstructor("NES")] public NES(CoreComm comm, GameInfo game, byte[] rom, object settings, object syncSettings) @@ -876,10 +876,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES //todo //http://blog.ntrq.net/?p=428 -//cpu bus junk bits - -//UBER DOC -//http://nocash.emubase.de/everynes.htm //A VERY NICE board assignments list //http://personales.epsg.upv.es/~jogilmo1/nes/TEXTOS/ARXIUS/BOARDTABLE.TXT @@ -889,6 +885,3 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES //a mappers list //http://tuxnes.sourceforge.net/nesmapper.txt - -//some ppu tests -//http://nesdev.parodius.com/bbs/viewtopic.php?p=4571&sid=db4c7e35316cc5d734606dd02f11dccb diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs index a8484758c0..320113d52f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.cs @@ -218,12 +218,22 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ser.Sync("VRAMBuffer", ref VRAMBuffer); ser.Sync("ppu_addr_temp", ref ppu_addr_temp); + ser.Sync("spr_true_count", ref spr_true_count); + ser.Sync("sprite_eval_write", ref sprite_eval_write); ser.Sync("Read_Value", ref read_value); ser.Sync("Prev_soam_index", ref soam_index_prev); ser.Sync("Spr_Zero_Go", ref sprite_zero_go); ser.Sync("Spr_zero_in_Range", ref sprite_zero_in_range); ser.Sync("Is_even_cycle", ref is_even_cycle); ser.Sync("soam_index", ref soam_index); + ser.Sync("soam_m_index", ref soam_m_index); + ser.Sync("oam_index", ref oam_index); + ser.Sync("oam_index_aux", ref oam_index_aux); + ser.Sync("soam_index_aux", ref soam_index_aux); + ser.Sync("yp", ref yp); + ser.Sync("target", ref target); + ser.Sync("ppu_was_on", ref ppu_was_on); + ser.Sync("spriteHeight", ref spriteHeight); ser.Sync("install_2006", ref install_2006); ser.Sync("race_2006", ref race_2006); ser.Sync("install_2001", ref install_2001); @@ -236,6 +246,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ser.Sync("glitchy_reads_2003", ref glitchy_reads_2003, false); ser.Sync("OAM", ref OAM, false); + ser.Sync("soam", ref soam, false); ser.Sync("PALRAM", ref PALRAM, false); ser.Sync("Reg2002_objoverflow", ref Reg2002_objoverflow); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs index 28b54729da..a0aed3f502 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs @@ -1,10 +1,10 @@ //blargg: Reading from $2007 when the VRAM address is $3fxx will fill the internal read buffer with the contents at VRAM address $3fxx, in addition to reading the palette RAM. - //static const byte powerUpPalette[] = - //{ - // 0x3F,0x01,0x00,0x01, 0x00,0x02,0x02,0x0D, 0x08,0x10,0x08,0x24, 0x00,0x00,0x04,0x2C, - // 0x09,0x01,0x34,0x03, 0x00,0x04,0x00,0x14, 0x08,0x3A,0x00,0x02, 0x00,0x20,0x2C,0x08 - //}; +//static const byte powerUpPalette[] = +//{ +// 0x3F,0x01,0x00,0x01, 0x00,0x02,0x02,0x0D, 0x08,0x10,0x08,0x24, 0x00,0x00,0x04,0x2C, +// 0x09,0x01,0x34,0x03, 0x00,0x04,0x00,0x14, 0x08,0x3A,0x00,0x02, 0x00,0x20,0x2C,0x08 +//}; using System; using BizHawk.Common; @@ -90,8 +90,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ser.Sync("_ht", ref _ht); ser.Sync("fh", ref fh); ser.Sync("status.cycle", ref status.cycle); - int junk = 0; - ser.Sync("status.end_cycle", ref junk); ser.Sync("status.sl", ref status.sl); } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs index 7886a1ab22..768c95f13b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs @@ -8,9 +8,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { sealed partial class PPU { - const int kFetchTime = 2; - const int kLineTime = 341; - struct BGDataRecord { public byte nt, at; @@ -29,8 +26,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public int soam_index_prev; public int soam_m_index; public int oam_index; - public byte read_value_aux; - public int soam_m_index_aux; public int oam_index_aux; public int soam_index_aux; public bool is_even_cycle; @@ -39,8 +34,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public int yp; public int target; public int spriteHeight; - public byte[] soam = new byte[512]; // in a real nes, this would only be 32, but we wish to allow more then 8 sprites per scanline - public bool reg_2001_color_disable_latch; // the value used here is taken + public byte[] soam = new byte[256]; // in a real nes, this would only be 32, but we wish to allow more then 8 sprites per scanline public bool ppu_was_on; public byte[] sl_sprites = new byte[3 * 256]; @@ -69,7 +63,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES // experimental int pixelcolor_latch_1; int pixelcolor_latch_2; - void pipeline(int pixelcolor, int target, int row_check) + void pipeline(int pixelcolor, int row_check) { if (row_check > 1) { @@ -81,11 +75,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES xbuf[(target - 2)] = (short)(pixelcolor_latch_2 | reg_2001.intensity_lsl_6); } - if (row_check >= 1) - { - pixelcolor_latch_2 = pixelcolor_latch_1; - } - + pixelcolor_latch_2 = pixelcolor_latch_1; pixelcolor_latch_1 = pixelcolor; } @@ -203,7 +193,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES spr_true_count = 0; soam_index = 0; soam_m_index = 0; - soam_m_index_aux = 0; oam_index_aux = 0; oam_index = 0; is_even_cycle = true; @@ -252,7 +241,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES if (ppur.status.sl != 0) { ///////////////////////////////////////////// - // Sprite Evaluation End + // Sprite Evaluation Start ///////////////////////////////////////////// if (sprite_eval_cycle <= 63 && !is_even_cycle) @@ -479,7 +468,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES } //oamcount loop - pipeline(pixelcolor, target, xt * 8 + xp); + pipeline(pixelcolor, xt * 8 + xp); target++; // clear out previous sprites from scanline buffer @@ -557,8 +546,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { //look for sprites soam[soam_index_aux * 4] = OAM[oam_index_aux * 4]; - read_value_aux = OAM[oam_index_aux * 4]; - if (yp >= read_value_aux && yp < read_value_aux + spriteHeight) + if (yp >= OAM[oam_index_aux * 4] && yp < OAM[oam_index_aux * 4] + spriteHeight) { soam[soam_index_aux * 4 + 1] = OAM[oam_index_aux * 4 + 1]; soam[soam_index_aux * 4 + 2] = OAM[oam_index_aux * 4 + 2]; @@ -637,7 +625,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES if (target <= 61441 && target > 0 && s == 0) { - pipeline(0, target, 256); + pipeline(0, 256); target++; } @@ -648,14 +636,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES if (target <= 61441 && target > 0 && s == 0) { - pipeline(0, target, 257); // last pipeline call option 1 of 2 + pipeline(0, 257); // last pipeline call option 1 of 2 } } else { if (target <= 61441 && target > 0 && s == 0) { - pipeline(0, target, 256); + pipeline(0, 256); target++; } @@ -664,7 +652,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES if (target <= 61441 && target > 0 && s == 0) { - pipeline(0, target, 257); // last pipeline call option 2 of 2 + pipeline(0, 257); // last pipeline call option 2 of 2 } } break; @@ -772,7 +760,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES sl_sprites[temp_x + i] = (byte)s; sl_sprites[256 + temp_x + i] = (byte)spixel; sl_sprites[512 + temp_x + i] = t_oam[s].oam_attr; - } } } @@ -870,7 +857,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES sl_sprites[temp_x + i] = (byte)s; sl_sprites[256 + temp_x + i] = (byte)spixel; sl_sprites[512 + temp_x + i] = t_oam[s].oam_attr; - } } } @@ -974,7 +960,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { runppu(); - if (ppur.status.cycle == 241 * kLineTime - 3) + if (ppur.status.cycle == 241 * 341 - 3) { ppudead--; } From 50c69c90ef65f80d2c9a7a431a2d72bb79f10079 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 26 Oct 2017 09:59:07 -0400 Subject: [PATCH 213/219] Update BizHawk.Emulation.Cores.csproj --- BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index f22d02380d..a158337377 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -879,6 +879,9 @@ NES.cs + + + NES.cs NES.cs @@ -1318,4 +1321,4 @@ --> - \ No newline at end of file + From fcfebcaf37a7fd1cfe276eebe52d20e687c4251a Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 26 Oct 2017 10:10:42 -0400 Subject: [PATCH 214/219] Update BizHawk.Emulation.Cores.csproj --- BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index a158337377..a1696cecb0 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -880,7 +880,7 @@ NES.cs - + NES.cs From 12d002fcf1508bc248316327067a38cc359b6a32 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 26 Oct 2017 21:11:21 -0400 Subject: [PATCH 215/219] NESHawk: Add mapper 114 Aladdin Super Game --- .../NES/Boards/MMC3_family/Mapper114.cs | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/MMC3_family/Mapper114.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/MMC3_family/Mapper114.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/MMC3_family/Mapper114.cs new file mode 100644 index 0000000000..9405823f0d --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/MMC3_family/Mapper114.cs @@ -0,0 +1,104 @@ +using BizHawk.Common; +using System; + +namespace BizHawk.Emulation.Cores.Nintendo.NES +{ + // Mapper for Aladdin Super Game + public sealed class Mapper114 : MMC3Board_Base + { + private ByteBuffer EXPREGS = new ByteBuffer(2); + + private byte[] sec = { 0, 3, 1, 5, 6, 7, 2, 4 }; + + public override bool Configure(NES.EDetectionOrigin origin) + { + switch (Cart.board_type) + { + case "MAPPER114": + break; + default: + return false; + } + + BaseSetup(); + SetMirrorType(EMirrorType.Horizontal); + mmc3.MMC3Type = MMC3.EMMC3Type.MMC3A; + return true; + } + + public override void Dispose() + { + EXPREGS.Dispose(); + base.Dispose(); + } + + public override void SyncState(Serializer ser) + { + base.SyncState(ser); + ser.Sync("expregs", ref EXPREGS); + } + + public override void WriteEXP(int addr, byte value) + { + if ((addr & 0x7) == 0 && addr >= 0x1000) + { + EXPREGS[0] = value; + } + } + + public override void WriteWRAM(int addr, byte value) + { + if ((addr & 0x7) == 0) + { + EXPREGS[0] = value; + } + } + + public override void WritePRG(int addr, byte value) + { + switch (addr & 0x6000) + { + case 0x0000: //$8000 + base.SetMirrorType((value & 1) == 1 ? EMirrorType.Horizontal : EMirrorType.Vertical); + break; + case 0x2000: //$A000 + value = (byte)((value & 0xC0) | sec[value & 0x07]); + EXPREGS[1] = 1; + base.WritePRG(0, value); + break; + case 0x4000: //$C000 + if(EXPREGS[1] == 1) + { + EXPREGS[1] = 0; + base.WritePRG(1, value); + } + break; + case 0x6000: //$E000 + if (value > 0) + { + base.WritePRG(0x6001, value); + base.WritePRG(0x4000, value); + base.WritePRG(0x4001, value); + } + else + { + base.WritePRG(0x6000, value); + } + break; + } + } + + public override byte ReadPRG(int addr) + { + if ((EXPREGS[0] & 0x80) > 0) + { + var bank = (EXPREGS[0] & 0x1F); + return ROM[(bank << 14) + (addr & 0x3FFF)]; + } + else + { + return base.ReadPRG(addr); + } + } + } +} From 03dcc6346743270825dcb574b3e45a711cc43b89 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 26 Oct 2017 21:12:18 -0400 Subject: [PATCH 216/219] Update BizHawk.Emulation.Cores.csproj --- BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index a1696cecb0..0acda8f08e 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -752,6 +752,7 @@ + From 9693d812d28291a7ea12d6037ad566753c0a8358 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Fri, 27 Oct 2017 19:57:18 -0400 Subject: [PATCH 217/219] Adds SEGA Sports Pad for SMS support, also make controller syncsetting --- Assets/defctrl.json | 38 ++ BizHawk.Client.EmuHawk/MainForm.Designer.cs | 24 +- BizHawk.Client.EmuHawk/MainForm.Events.cs | 26 +- .../Consoles/Sega/SMS/Compat.txt | 4 - .../Consoles/Sega/SMS/SMS.IEmulator.cs | 4 +- .../Consoles/Sega/SMS/SMS.ISettable.cs | 5 +- .../Consoles/Sega/SMS/SMS.IStatable.cs | 4 +- .../Consoles/Sega/SMS/SMS.Input.cs | 467 ++++++++++++++---- .../Consoles/Sega/SMS/SMS.cs | 1 - 9 files changed, 454 insertions(+), 119 deletions(-) diff --git a/Assets/defctrl.json b/Assets/defctrl.json index b7454b80f0..e213cfae5f 100644 --- a/Assets/defctrl.json +++ b/Assets/defctrl.json @@ -754,6 +754,22 @@ "P1 Trigger": "Z, J1 B1, X1 X, WMouse L", "Reset": "J1 B9, X1 Back", "Pause": "J1 B10, X1 Start" + }, + "SMS Sports Pad Controller": { + "P1 Up": "UpArrow, J1 POV1U", + "P1 Down": "DownArrow, J1 POV1D", + "P1 Left": "LeftArrow, J1 POV1L", + "P1 Right": "RightArrow, J1 POV1R", + "P1 B1": "Z, J1 B1, X1 X", + "P1 B2": "X, J1 B2, X1 A", + "Reset": "J1 B9, X1 Back", + "Pause": "J1 B10, X1 Start", + "P2 Up": "", + "P2 Down": "", + "P2 Left": "", + "P2 Right": "", + "P2 B1": "", + "P2 B2": "" }, "GG Controller": { "P1 Up": "UpArrow, J1 POV1U, X1 DpadUp, X1 LStickUp", @@ -1598,6 +1614,28 @@ "Mult": 1.0, "Deadzone": 0.0 } + }, + "SMS Sports Pad Controller": { + "P1 X": { + "Value": "X1 LeftThumbX", + "Mult": 1.0, + "Deadzone": 0.1 + }, + "P1 Y": { + "Value": "X1 LeftThumbY", + "Mult": -1.0, + "Deadzone": 0.1 + }, + "P2 X": { + "Value": "X2 LeftThumbX", + "Mult": 1.0, + "Deadzone": 0.1 + }, + "P2 Y": { + "Value": "X2 LeftThumbY", + "Mult": -1.0, + "Deadzone": 0.1 + } } } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/MainForm.Designer.cs b/BizHawk.Client.EmuHawk/MainForm.Designer.cs index f497c44fca..9d6774638e 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Designer.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Designer.cs @@ -446,7 +446,8 @@ this.SMSControllerStandardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.SMSControllerPaddleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.SMSControllerLightPhaserToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MainformMenu.SuspendLayout(); + this.SMSControllerSportsPadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MainformMenu.SuspendLayout(); this.MainStatusBar.SuspendLayout(); this.MainFormContextMenu.SuspendLayout(); this.SuspendLayout(); @@ -2480,7 +2481,7 @@ this.SMSregionToolStripMenuItem, this.SMSdisplayToolStripMenuItem, this.SMSControllerToolStripMenuItem, - this.SMStoolStripMenuItem2, + this.SMStoolStripMenuItem2, this.SMSenableBIOSToolStripMenuItem, this.SMSEnableFMChipMenuItem, this.SMSOverclockMenuItem, @@ -2554,7 +2555,8 @@ this.SMSControllerToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SMSControllerStandardToolStripMenuItem, this.SMSControllerPaddleToolStripMenuItem, - this.SMSControllerLightPhaserToolStripMenuItem}); + this.SMSControllerLightPhaserToolStripMenuItem, + this.SMSControllerSportsPadToolStripMenuItem}); // // SMSControllerStandardToolStripMenuItem // @@ -2573,10 +2575,17 @@ this.SMSControllerLightPhaserToolStripMenuItem.Name = "SMSControllerLightPhaserToolStripMenuItem"; this.SMSControllerLightPhaserToolStripMenuItem.Text = "Light Phaser"; this.SMSControllerLightPhaserToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerLightPhaserToolStripMenuItem_Click); - // - // SMSdisplayPalToolStripMenuItem - // - this.SMSdisplayPalToolStripMenuItem.Name = "SMSdisplayPalToolStripMenuItem"; + // + // SMSControllerSportsPadToolStripMenuItem + // + this.SMSControllerSportsPadToolStripMenuItem.Name = "SMSControllerSportsPadToolStripMenuItem"; + this.SMSControllerSportsPadToolStripMenuItem.Text = "Sports Pad"; + this.SMSControllerSportsPadToolStripMenuItem.Click += new System.EventHandler(this.SMSControllerSportsPadToolStripMenuItem_Click); + + // + // SMSdisplayPalToolStripMenuItem + // + this.SMSdisplayPalToolStripMenuItem.Name = "SMSdisplayPalToolStripMenuItem"; this.SMSdisplayPalToolStripMenuItem.Size = new System.Drawing.Size(104, 22); this.SMSdisplayPalToolStripMenuItem.Text = "PAL"; this.SMSdisplayPalToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayPAL_Click); @@ -4404,5 +4413,6 @@ private System.Windows.Forms.ToolStripMenuItem SMSControllerStandardToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem SMSControllerPaddleToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem SMSControllerLightPhaserToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem SMSControllerSportsPadToolStripMenuItem; } } diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index c5f4bc22dd..fd1d42f241 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -1745,9 +1745,10 @@ namespace BizHawk.Client.EmuHawk SMSdisplayNtscToolStripMenuItem.Checked = ss.DisplayType == "NTSC"; SMSdisplayPalToolStripMenuItem.Checked = ss.DisplayType == "PAL"; SMSdisplayAutoToolStripMenuItem.Checked = ss.DisplayType == "Auto"; - SMSControllerStandardToolStripMenuItem.Checked = s.ControllerType == "Standard"; - SMSControllerPaddleToolStripMenuItem.Checked = s.ControllerType == "Paddle"; - SMSControllerLightPhaserToolStripMenuItem.Checked = s.ControllerType == "Light Phaser"; + SMSControllerStandardToolStripMenuItem.Checked = ss.ControllerType == "Standard"; + SMSControllerPaddleToolStripMenuItem.Checked = ss.ControllerType == "Paddle"; + SMSControllerLightPhaserToolStripMenuItem.Checked = ss.ControllerType == "Light Phaser"; + SMSControllerSportsPadToolStripMenuItem.Checked = ss.ControllerType == "Sports Pad"; SMSenableBIOSToolStripMenuItem.Checked = ss.UseBIOS; SMSEnableFMChipMenuItem.Checked = ss.EnableFM; SMSOverclockMenuItem.Checked = ss.AllowOverlock; @@ -1904,23 +1905,30 @@ namespace BizHawk.Client.EmuHawk private void SMSControllerStandardToolStripMenuItem_Click(object sender, EventArgs e) { - var s = ((SMS)Emulator).GetSettings(); + var s = ((SMS)Emulator).GetSyncSettings(); s.ControllerType = "Standard"; - PutCoreSettings(s); + PutCoreSyncSettings(s); } private void SMSControllerPaddleToolStripMenuItem_Click(object sender, EventArgs e) { - var s = ((SMS)Emulator).GetSettings(); + var s = ((SMS)Emulator).GetSyncSettings(); s.ControllerType = "Paddle"; - PutCoreSettings(s); + PutCoreSyncSettings(s); } private void SMSControllerLightPhaserToolStripMenuItem_Click(object sender, EventArgs e) { - var s = ((SMS)Emulator).GetSettings(); + var s = ((SMS)Emulator).GetSyncSettings(); s.ControllerType = "Light Phaser"; - PutCoreSettings(s); + PutCoreSyncSettings(s); + } + + private void SMSControllerSportsPadToolStripMenuItem_Click(object sender, EventArgs e) + { + var s = ((SMS)Emulator).GetSyncSettings(); + s.ControllerType = "Sports Pad"; + PutCoreSyncSettings(s); } #endregion diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/Compat.txt b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/Compat.txt index 128e46f9f8..122814b815 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/Compat.txt +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/Compat.txt @@ -9,10 +9,6 @@ Korean games currently not booting: * Desert Strike - you can enter the map screen but cannot leave. -- Light Gun emulation -- Paddle emulation -- Sports pad emulation? - ======= Game Gear compatibility issues ======= * Outrun has raster effect on the wrong line. I've been able to modify interrupt code to diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs index fe2a9222a3..e49a75ddad 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IEmulator.cs @@ -15,7 +15,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem return GGController; } - switch(Settings.ControllerType) + switch(SyncSettings.ControllerType) { case "Paddle": return SMSPaddleController; @@ -24,6 +24,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem SMSLightPhaserController.FloatRanges[1] = new ControllerDefinition.FloatRange(0, Vdp.FrameHeight / 2, Vdp.FrameHeight - 1); return SMSLightPhaserController; + case "Sports Pad": + return SMSSportsPadController; default: return SmsController; } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ISettable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ISettable.cs index a69d726e37..d2112e2dab 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ISettable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.ISettable.cs @@ -38,7 +38,6 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem public bool SpriteLimit = false; public bool Fix3D = true; public bool DisplayOverscan = false; - public string ControllerType = "Standard"; // GG settings public bool ShowClippedRegions = false; @@ -66,6 +65,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem public bool UseBIOS = true; public string ConsoleRegion = "Export"; public string DisplayType = "NTSC"; + public string ControllerType = "Standard"; public SMSSyncSettings Clone() { @@ -79,7 +79,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem x.AllowOverlock != y.AllowOverlock || x.UseBIOS != y.UseBIOS || x.ConsoleRegion != y.ConsoleRegion || - x.DisplayType != y.DisplayType; + x.DisplayType != y.DisplayType || + x.ControllerType != y.ControllerType; } } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs index 0ba7d4293d..87564dfe64 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.IStatable.cs @@ -65,8 +65,8 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem ser.Sync("Port02", ref Port02); ser.Sync("Port3E", ref Port3E); ser.Sync("Port3F", ref Port3F); - ser.Sync("Paddle1High", ref Paddle1High); - ser.Sync("Paddle2High", ref Paddle2High); + ser.Sync("Controller1SelectHigh", ref Controller1SelectHigh); + ser.Sync("ControllerSelect2High", ref Controller2SelectHigh); ser.Sync("LatchLightPhaser", ref LatchLightPhaser); if (SaveRAM != null) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs index fda3dcaa68..c76dab5789 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.Input.cs @@ -67,95 +67,262 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem } }; - // The paddles have a nibble select state - bool Paddle1High = false; - bool Paddle2High = false; + public static readonly ControllerDefinition SMSSportsPadController = new ControllerDefinition + { + Name = "SMS Sports Pad Controller", + BoolButtons = + { + "Reset", "Pause", + "P1 Left", "P1 Right", "P1 Up", "P1 Down", "P1 B1", "P1 B2", + "P2 Left", "P2 Right", "P2 Up", "P2 Down", "P2 B1", "P2 B2" + }, + FloatControls = + { + "P1 X", "P1 Y", + "P2 X", "P2 Y" + }, + FloatRanges = + { + new ControllerDefinition.FloatRange(-64, 0, 63), + new ControllerDefinition.FloatRange(-64, 0, 63), + new ControllerDefinition.FloatRange(-64, 0, 63), + new ControllerDefinition.FloatRange(-64, 0, 63) + } + }; const int PaddleMin = 0; const int PaddleMax = 255; + const int SportsPadMin = -64; + const int SportsPadMax = 63; + + // The paddles and sports pads have data select states + bool Controller1SelectHigh = true; + bool Controller2SelectHigh = true; bool LatchLightPhaser = false; - + + // further state value for sports pad, may be useful for other controllers in future + int Controller1State = 3; + int Controller2State = 3; + int ControllerTick = 0; // for timing in japan + private byte ReadControls1() { InputCallbacks.Call(); _lagged = false; byte value = 0xFF; - switch (Settings.ControllerType) + switch (SyncSettings.ControllerType) { case "Paddle": - // use analog values from a controller, see http://www.smspower.org/Development/Paddle - - int paddle1Pos; - if (_controller.IsPressed("P1 Left")) - paddle1Pos = PaddleMin; - else if (_controller.IsPressed("P1 Right")) - paddle1Pos = PaddleMax; - else - paddle1Pos = (int)_controller.GetFloat("P1 Paddle"); - - int paddle2Pos; - if (_controller.IsPressed("P2 Left")) - paddle2Pos = PaddleMin; - else if (_controller.IsPressed("P2 Right")) - paddle2Pos = PaddleMax; - else - paddle2Pos = (int)_controller.GetFloat("P2 Paddle"); - - // The 3F port's TH slot is also used on games in some games in Export BIOS to clock the paddle state - // Yes it's silly considering the paddle was never released outside Japan but the games think otherwise - if (_region != "Japan") { - if ((Port3F & 0x02) == 0x00) + // use analog values from a controller, see http://www.smspower.org/Development/Paddle + + int paddle1Pos; + if (_controller.IsPressed("P1 Left")) + paddle1Pos = PaddleMin; + else if (_controller.IsPressed("P1 Right")) + paddle1Pos = PaddleMax; + else + paddle1Pos = (int)_controller.GetFloat("P1 Paddle"); + + int paddle2Pos; + if (_controller.IsPressed("P2 Left")) + paddle2Pos = PaddleMin; + else if (_controller.IsPressed("P2 Right")) + paddle2Pos = PaddleMax; + else + paddle2Pos = (int)_controller.GetFloat("P2 Paddle"); + + PresetControllerState(1); + // Hard-wired together? + Controller2SelectHigh = Controller1SelectHigh; + + if (Controller1SelectHigh) { - Paddle1High = (Port3F & 0x20) != 0; - Paddle2High = Paddle1High; + if ((paddle1Pos & 0x10) == 0) value &= 0xFE; + if ((paddle1Pos & 0x20) == 0) value &= 0xFD; + if ((paddle1Pos & 0x40) == 0) value &= 0xFB; + if ((paddle1Pos & 0x80) == 0) value &= 0xF7; } - if ((Port3F & 0x08) == 0x00) + else { - Paddle2High = (Port3F & 0x80) != 0; + if ((paddle1Pos & 0x01) == 0) value &= 0xFE; + if ((paddle1Pos & 0x02) == 0) value &= 0xFD; + if ((paddle1Pos & 0x04) == 0) value &= 0xFB; + if ((paddle1Pos & 0x08) == 0) value &= 0xF7; } - } - if (Paddle1High) - { - if ((paddle1Pos & 0x10) == 0) value &= 0xFE; - if ((paddle1Pos & 0x20) == 0) value &= 0xFD; - if ((paddle1Pos & 0x40) == 0) value &= 0xFB; - if ((paddle1Pos & 0x80) == 0) value &= 0xF7; - } - else - { - if ((paddle1Pos & 0x01) == 0) value &= 0xFE; - if ((paddle1Pos & 0x02) == 0) value &= 0xFD; - if ((paddle1Pos & 0x04) == 0) value &= 0xFB; - if ((paddle1Pos & 0x08) == 0) value &= 0xF7; - } + if (_controller.IsPressed("P1 B1")) value &= 0xEF; + if (!Controller1SelectHigh) value &= 0xDF; - if (_controller.IsPressed("P1 B1")) value &= 0xEF; - if (!Paddle1High) value &= 0xDF; + if (Controller2SelectHigh) + { + if ((paddle2Pos & 0x10) == 0) value &= 0xBF; + if ((paddle2Pos & 0x20) == 0) value &= 0x7F; + } + else + { + if ((paddle2Pos & 0x01) == 0) value &= 0xBF; + if ((paddle2Pos & 0x02) == 0) value &= 0x7F; + } - if (Paddle2High) - { - if ((paddle2Pos & 0x10) == 0) value &= 0xBF; - if ((paddle2Pos & 0x20) == 0) value &= 0x7F; + PostsetControllerState(1); } - else - { - if ((paddle2Pos & 0x01) == 0) value &= 0xBF; - if ((paddle2Pos & 0x02) == 0) value &= 0x7F; - } - - // toggle state for Japanese region controllers - Paddle1High = !Paddle1High; - break; case "Light Phaser": if (_controller.IsPressed("P1 Trigger")) value &= 0xEF; break; + case "Sports Pad": + { + int p1X; + if (_controller.IsPressed("P1 Left")) + p1X = SportsPadMin; + else if (_controller.IsPressed("P1 Right")) + p1X = SportsPadMax; + else + p1X = (int)_controller.GetFloat("P1 X"); + + int p1Y; + if (_controller.IsPressed("P1 Up")) + p1Y = SportsPadMin; + else if (_controller.IsPressed("P1 Down")) + p1Y = SportsPadMax; + else + p1Y = (int)_controller.GetFloat("P1 Y"); + + int p2X; + if (_controller.IsPressed("P2 Left")) + p2X = SportsPadMin; + else if (_controller.IsPressed("P2 Right")) + p2X = SportsPadMax; + else + p2X = (int)_controller.GetFloat("P2 X"); + + int p2Y; + if (_controller.IsPressed("P2 Up")) + p2Y = SportsPadMin; + else if (_controller.IsPressed("P2 Down")) + p2Y = SportsPadMax; + else + p2Y = (int)_controller.GetFloat("P2 Y"); + + if(_region == "Japan") + { + p1X += 128; + p1Y += 128; + p2X += 128; + p2Y += 128; + } else + { + p1X *= -1; + p1Y *= -1; + p2X *= -1; + p2Y *= -1; + } + + PresetControllerState(1); + + // advance state + if (Controller1SelectHigh && (Controller1State % 2 == 0)) + { + ++Controller1State; + } + else if (!Controller1SelectHigh && (Controller1State % 2 == 1)) + { + if (++Controller1State == (_region == "Japan" ? 6 : 4)) + Controller1State = 0; + } + if (Controller2SelectHigh && (Controller2State % 2 == 0)) + { + ++Controller2State; + } + else if (!Controller2SelectHigh && (Controller2State % 2 == 1)) + { + if (++Controller2State == (_region == "Japan" ? 6 : 4)) + Controller2State = 0; + } + + switch (Controller1State) + { + case 0: + if ((p1X & 0x10) == 0) value &= 0xFE; + if ((p1X & 0x20) == 0) value &= 0xFD; + if ((p1X & 0x40) == 0) value &= 0xFB; + if ((p1X & 0x80) == 0) value &= 0xF7; + break; + case 1: + if ((p1X & 0x01) == 0) value &= 0xFE; + if ((p1X & 0x02) == 0) value &= 0xFD; + if ((p1X & 0x04) == 0) value &= 0xFB; + if ((p1X & 0x08) == 0) value &= 0xF7; + break; + case 2: + if ((p1Y & 0x10) == 0) value &= 0xFE; + if ((p1Y & 0x20) == 0) value &= 0xFD; + if ((p1Y & 0x40) == 0) value &= 0xFB; + if ((p1Y & 0x80) == 0) value &= 0xF7; + break; + case 3: + if ((p1Y & 0x01) == 0) value &= 0xFE; + if ((p1Y & 0x02) == 0) value &= 0xFD; + if ((p1Y & 0x04) == 0) value &= 0xFB; + if ((p1Y & 0x08) == 0) value &= 0xF7; + break; + case 4: + // specific to Japan: sync via TR + value &= 0xDF; + break; + case 5: + // specific to Japan: buttons + if (_controller.IsPressed("P1 B1")) value &= 0xFE; + if (_controller.IsPressed("P1 B2")) value &= 0xFD; + break; + } + + if (_region != "Japan") + { + // Buttons like normal in Export + if (_controller.IsPressed("P1 B1")) value &= 0xEF; + if (_controller.IsPressed("P1 B2")) value &= 0xDF; + } + else + { + // In Japan, it contains selectHigh + if (!Controller1SelectHigh) value &= 0xEF; + } + + switch (Controller2State) + { + case 0: + if ((p2X & 0x10) == 0) value &= 0xBF; + if ((p2X & 0x20) == 0) value &= 0x7F; + break; + case 1: + if ((p2X & 0x01) == 0) value &= 0xBF; + if ((p2X & 0x02) == 0) value &= 0x7F; + break; + case 2: + if ((p2Y & 0x10) == 0) value &= 0xBF; + if ((p2Y & 0x20) == 0) value &= 0x7F; + break; + case 3: + if ((p2Y & 0x01) == 0) value &= 0xBF; + if ((p2Y & 0x02) == 0) value &= 0x7F; + break; + case 5: + // specific to Japan: buttons + if (_controller.IsPressed("P2 B1")) value &= 0xBF; + if (_controller.IsPressed("P2 B2")) value &= 0x7F; + break; + } + + PostsetControllerState(1); + } + break; + default: // Normal controller @@ -180,43 +347,38 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem _lagged = false; byte value = 0xFF; - switch (Settings.ControllerType) + switch (SyncSettings.ControllerType) { case "Paddle": - // use analog values from a controller, see http://www.smspower.org/Development/Paddle - - int paddle2Pos; - if (_controller.IsPressed("P2 Left")) - paddle2Pos = PaddleMin; - else if (_controller.IsPressed("P2 Right")) - paddle2Pos = PaddleMax; - else - paddle2Pos = (int)_controller.GetFloat("P2 Paddle"); - - if (_region != "Japan") { - if ((Port3F & 0x08) == 0x00) + // use analog values from a controller, see http://www.smspower.org/Development/Paddle + + int paddle2Pos; + if (_controller.IsPressed("P2 Left")) + paddle2Pos = PaddleMin; + else if (_controller.IsPressed("P2 Right")) + paddle2Pos = PaddleMax; + else + paddle2Pos = (int)_controller.GetFloat("P2 Paddle"); + + PresetControllerState(2); + + if (Controller2SelectHigh) { - Paddle2High = (Port3F & 0x80) != 0; + if ((paddle2Pos & 0x40) == 0) value &= 0xFE; + if ((paddle2Pos & 0x80) == 0) value &= 0xFD; } + else + { + if ((paddle2Pos & 0x04) == 0) value &= 0xFE; + if ((paddle2Pos & 0x08) == 0) value &= 0xFD; + } + + if (_controller.IsPressed("P2 B1")) value &= 0xFB; + if (!Controller2SelectHigh) value &= 0xF7; + + PostsetControllerState(2); } - - if (Paddle2High) - { - if ((paddle2Pos & 0x40) == 0) value &= 0xFE; - if ((paddle2Pos & 0x80) == 0) value &= 0xFD; - } - else - { - if ((paddle2Pos & 0x04) == 0) value &= 0xFE; - if ((paddle2Pos & 0x08) == 0) value &= 0xFD; - } - - if (_controller.IsPressed("P2 B1")) value &= 0xFB; - if (!Paddle2High) value &= 0xF7; - - Paddle2High = !Paddle2High; - break; case "Light Phaser": @@ -227,6 +389,81 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem } break; + case "Sports Pad": + { + int p2X; + if (_controller.IsPressed("P2 Left")) + p2X = SportsPadMin; + else if (_controller.IsPressed("P2 Right")) + p2X = SportsPadMax; + else + p2X = (int)_controller.GetFloat("P2 X"); + + int p2Y; + if (_controller.IsPressed("P2 Down")) + p2Y = SportsPadMin; + else if (_controller.IsPressed("P2 Up")) + p2Y = SportsPadMax; + else + p2Y = (int)_controller.GetFloat("P2 Y"); + + if (_region == "Japan") + { + p2X += 128; + p2Y += 128; + } + else + { + p2X *= -1; + p2Y *= -1; + } + + PresetControllerState(2); + + if (Controller2SelectHigh && (Controller2State % 2 == 0)) + { + ++Controller2State; + } + else if (!Controller2SelectHigh && (Controller2State % 2 == 1)) + { + if (++Controller2State == (_region == "Japan" ? 6 : 4)) + Controller2State = 0; + } + + switch (Controller2State) + { + case 0: + if ((p2X & 0x40) == 0) value &= 0xFE; + if ((p2X & 0x80) == 0) value &= 0xFD; + break; + case 1: + if ((p2X & 0x04) == 0) value &= 0xFE; + if ((p2X & 0x08) == 0) value &= 0xFD; + break; + case 2: + if ((p2Y & 0x40) == 0) value &= 0xFE; + if ((p2Y & 0x80) == 0) value &= 0xFD; + break; + case 3: + if ((p2Y & 0x04) == 0) value &= 0xFE; + if ((p2Y & 0x08) == 0) value &= 0xFD; + break; + } + if (_region != "Japan") + { + // Buttons like normal in Export + if (_controller.IsPressed("P2 B1")) value &= 0xFB; + if (_controller.IsPressed("P2 B2")) value &= 0xF7; + } + else + { + if (!Controller2SelectHigh) value &= 0xF7; + } + + PostsetControllerState(2); + } + break; + default: // Normal controller @@ -262,7 +499,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem const int phaserRadius = 4; // specifically lightgun needs to do things on a per-line basis - if (Settings.ControllerType == "Light Phaser") + if (SyncSettings.ControllerType == "Light Phaser") { byte phaserX = (byte)(_controller.GetFloat("P1 X") + 20); int phaserY = (int)_controller.GetFloat("P1 Y"); @@ -305,5 +542,49 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem return value; } + + private void PresetControllerState(int pin) + { + // The 3F port's TH slot is also used on games in some games in Export BIOS to clock the paddle state + // Re: the paddle: Yes it's silly considering the paddle was never released outside Japan but the games think otherwise + + if (_region != "Japan") + { + if ((Port3F & 0x02) == 0x00) + { + Controller1SelectHigh = (Port3F & 0x20) != 0; + + // resync + Controller2State = 3; + } + + if ((Port3F & 0x08) == 0x00) + { + Controller2SelectHigh = (Port3F & 0x80) != 0; + + // resync + Controller1State = 3; + } + } + } + + private void PostsetControllerState(int pin) + { + // for the benefit of the Japan region + if (_region == "Japan" && (++ControllerTick) == 2) + { + ControllerTick = 0; + + if (pin == 1) + { + Controller1SelectHigh ^= true; + } + else + { + Controller1SelectHigh = false; + Controller2SelectHigh ^= true; + } + } + } } } \ No newline at end of file diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs index 76fe7b8474..c751ca3623 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs @@ -10,7 +10,6 @@ using BizHawk.Emulation.Cores.Components.Z80A; TODO: + HCounter (Manually set for light phaser emulation... should be only case it's polled) + Try to clean up the organization of the source code. - + Lightgun/Paddle/etc if I get really bored (first 2 done!) + Mode 1 not implemented in VDP TMS modes. (I dont have a test case in SG1000 or Coleco) **********************************************************/ From 7eee1c0f8f022cc1718e4bc770bfb3ef4238f958 Mon Sep 17 00:00:00 2001 From: Asnivor Date: Thu, 26 Oct 2017 17:19:47 +0100 Subject: [PATCH 218/219] DiscSystem MDS: version check --- BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs b/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs index 59ba49d5a5..27699da2d1 100644 --- a/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs +++ b/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs @@ -309,6 +309,14 @@ namespace BizHawk.Emulation.DiscSystem // parse header aFile.Header = aFile.Header.Parse(stream); + // check version to make sure this is only v1.x + // currently NO support for version 2.x + + if (aFile.Header.Version[0] > 1) + { + throw new MDSParseException("MDS Parse Error: Only MDS version 1.x is supported!\nDetected version: " + aFile.Header.Version[0] + "." + aFile.Header.Version[1]); + } + // parse sessions Dictionary aSessions = new Dictionary(); From e9a41ec93857182f3b4bfb3778f852ace8dae925 Mon Sep 17 00:00:00 2001 From: vadosnaprimer Date: Sun, 29 Oct 2017 01:43:08 +0300 Subject: [PATCH 219/219] gpgx: lowpass filter range was measured to be 40% instead of 60% on MD1 https://forums.libretro.com/t/genesis-plus-gx-where-is-the-audio-lowpass-filter/12169 enable hex mode for backdrop color (again) and lowpass range --- .../Consoles/Sega/gpgx64/GPGX.ISettable.cs | 535 +++++++++++------- 1 file changed, 325 insertions(+), 210 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.ISettable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.ISettable.cs index c44199e244..261a4418a3 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.ISettable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.ISettable.cs @@ -1,210 +1,325 @@ -using System.ComponentModel; - -using BizHawk.Common; -using BizHawk.Emulation.Common; -using Newtonsoft.Json; - - -namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx -{ - public partial class GPGX : ISettable - { - public GPGXSettings GetSettings() - { - return _settings.Clone(); - } - - public GPGXSyncSettings GetSyncSettings() - { - return _syncSettings.Clone(); - } - - public bool PutSettings(GPGXSettings o) - { - bool ret = GPGXSettings.NeedsReboot(_settings, o); - _settings = o; - Core.gpgx_set_draw_mask(_settings.GetDrawMask()); - return ret; - } - - public bool PutSyncSettings(GPGXSyncSettings o) - { - bool ret = GPGXSyncSettings.NeedsReboot(_syncSettings, o); - _syncSettings = o; - return ret; - } - - private GPGXSyncSettings _syncSettings; - private GPGXSettings _settings; - - public class GPGXSettings - { - [DeepEqualsIgnore] - [JsonIgnore] - private bool _DrawBGA; - - [DisplayName("Background Layer A")] - [Description("True to draw BG layer A")] - [DefaultValue(true)] - public bool DrawBGA { get { return _DrawBGA; } set { _DrawBGA = value; } } - - [DeepEqualsIgnore] - [JsonIgnore] - private bool _DrawBGB; - - [DisplayName("Background Layer B")] - [Description("True to draw BG layer B")] - [DefaultValue(true)] - public bool DrawBGB { get { return _DrawBGB; } set { _DrawBGB = value; } } - - [DeepEqualsIgnore] - [JsonIgnore] - private bool _DrawBGW; - - [DisplayName("Background Layer W")] - [Description("True to draw BG layer W")] - [DefaultValue(true)] - public bool DrawBGW { get { return _DrawBGW; } set { _DrawBGW = value; } } - - [DeepEqualsIgnore] - [JsonIgnore] - private bool _DrawObj; - - [DisplayName("Sprite Layer")] - [Description("True to draw sprite layer")] - [DefaultValue(true)] - public bool DrawObj { get { return _DrawObj; } set { _DrawObj = value; } } - - [DeepEqualsIgnore] - [JsonIgnore] - private bool _PadScreen320; - - [DisplayName("Pad screen to 320")] - [Description("When using 1:1 aspect ratio, enable to make screen width constant (320) between game modes")] - [DefaultValue(false)] - public bool PadScreen320 { get { return _PadScreen320; } set { _PadScreen320 = value; } } - - [DisplayName("Audio Filter")] - [DefaultValue(LibGPGX.InitSettings.FilterType.LowPass)] - public LibGPGX.InitSettings.FilterType Filter { get; set; } - - [DisplayName("Low Pass Range")] - [Description("Only active when filter type is lowpass")] - [DefaultValue((ushort)39321)] - public ushort LowPassRange { get; set; } - - [DisplayName("Three band low cutoff")] - [Description("Only active when filter type is three band")] - [DefaultValue((short)880)] - public short LowFreq { get; set; } - - [DisplayName("Three band high cutoff")] - [Description("Only active when filter type is three band")] - [DefaultValue((short)5000)] - public short HighFreq { get; set; } - - [DisplayName("Three band low gain")] - [Description("Only active when filter type is three band")] - [DefaultValue((short)1)] - public short LowGain { get; set; } - - [DisplayName("Three band mid gain")] - [Description("Only active when filter type is three band")] - [DefaultValue((short)1)] - public short MidGain { get; set; } - - [DisplayName("Three band high gain")] - [Description("Only active when filter type is three band")] - [DefaultValue((short)1)] - public short HighGain { get; set; } - - [DeepEqualsIgnore] - [JsonIgnore] - private bool _Backdrop; - - [DisplayName("Use custom backdrop color")] - [Description("Filler when layers are off")] - [DefaultValue((bool)false)] - public bool Backdrop { get { return _Backdrop; } set { _Backdrop = value; } } - - [DisplayName("Custom backdrop color")] - [Description("Magic pink (0xffff00ff) by default")] - [DefaultValue((uint)0xffff00ff)] - public uint BackdropColor { get; set; } - - public GPGXSettings() - { - SettingsUtil.SetDefaultValues(this); - } - - public GPGXSettings Clone() - { - return (GPGXSettings)MemberwiseClone(); - } - - public LibGPGX.DrawMask GetDrawMask() - { - LibGPGX.DrawMask ret = 0; - if (DrawBGA) ret |= LibGPGX.DrawMask.BGA; - if (DrawBGB) ret |= LibGPGX.DrawMask.BGB; - if (DrawBGW) ret |= LibGPGX.DrawMask.BGW; - if (DrawObj) ret |= LibGPGX.DrawMask.Obj; - if (Backdrop) ret |= LibGPGX.DrawMask.Backdrop; - return ret; - } - - public static bool NeedsReboot(GPGXSettings x, GPGXSettings y) - { - return !DeepEquality.DeepEquals(x, y); - } - - public LibGPGX.InitSettings GetNativeSettings() - { - return new LibGPGX.InitSettings - { - Filter = Filter, - LowPassRange = LowPassRange, - LowFreq = LowFreq, - HighFreq = HighFreq, - LowGain = LowGain, - MidGain = MidGain, - HighGain = HighGain, - BackdropColor = BackdropColor - }; - } - } - - public class GPGXSyncSettings - { - [DisplayName("Use Six Button Controllers")] - [Description("Controls the type of any attached normal controllers; six button controllers are used if true, otherwise three button controllers. Some games don't work correctly with six button controllers. Not relevant if other controller types are connected.")] - [DefaultValue(true)] - public bool UseSixButton { get; set; } - - [DisplayName("Control Type")] - [Description("Sets the type of controls that are plugged into the console. Some games will automatically load with a different control type.")] - [DefaultValue(ControlType.Normal)] - public ControlType ControlType { get; set; } - - [DisplayName("Autodetect Region")] - [Description("Sets the region of the emulated console. Many games can run on multiple regions and will behave differently on different ones. Some games may require a particular region.")] - [DefaultValue(LibGPGX.Region.Autodetect)] - public LibGPGX.Region Region { get; set; } - - public GPGXSyncSettings() - { - SettingsUtil.SetDefaultValues(this); - } - - public GPGXSyncSettings Clone() - { - return (GPGXSyncSettings)MemberwiseClone(); - } - - public static bool NeedsReboot(GPGXSyncSettings x, GPGXSyncSettings y) - { - return !DeepEquality.DeepEquals(x, y); - } - } - } -} +using System; +using System.ComponentModel; +using System.Globalization; + +using BizHawk.Common; +using BizHawk.Emulation.Common; +using Newtonsoft.Json; + + +namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx +{ + public partial class GPGX : ISettable + { + public GPGXSettings GetSettings() + { + return _settings.Clone(); + } + + public GPGXSyncSettings GetSyncSettings() + { + return _syncSettings.Clone(); + } + + public bool PutSettings(GPGXSettings o) + { + bool ret = GPGXSettings.NeedsReboot(_settings, o); + _settings = o; + Core.gpgx_set_draw_mask(_settings.GetDrawMask()); + return ret; + } + + public bool PutSyncSettings(GPGXSyncSettings o) + { + bool ret = GPGXSyncSettings.NeedsReboot(_syncSettings, o); + _syncSettings = o; + return ret; + } + + private class UintToHexConverter : TypeConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + if (sourceType == typeof(string)) + { + return true; + } + else + { + return base.CanConvertFrom(context, sourceType); + } + } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return true; + } + else + { + return base.CanConvertTo(context, destinationType); + } + } + + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + { + if (destinationType == typeof(string) && value.GetType() == typeof(uint)) + { + return string.Format("0x{0:x8}", value); + } + else + { + return base.ConvertTo(context, culture, value, destinationType); + } + } + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + if (value.GetType() == typeof(string)) + { + string input = (string)value; + if (input.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + { + input = input.Substring(2); + } + return uint.Parse(input, NumberStyles.HexNumber, culture); + } + else + { + return base.ConvertFrom(context, culture, value); + } + } + } + + private class UshortToHexConverter : TypeConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + if (sourceType == typeof(string)) + { + return true; + } + else + { + return base.CanConvertFrom(context, sourceType); + } + } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return true; + } + else + { + return base.CanConvertTo(context, destinationType); + } + } + + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + { + if (destinationType == typeof(string) && value.GetType() == typeof(ushort)) + { + return string.Format("0x{0:x4}", value); + } + else + { + return base.ConvertTo(context, culture, value, destinationType); + } + } + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + if (value.GetType() == typeof(string)) + { + string input = (string)value; + if (input.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + { + input = input.Substring(2); + } + return ushort.Parse(input, NumberStyles.HexNumber, culture); + } + else + { + return base.ConvertFrom(context, culture, value); + } + } + } + + private GPGXSyncSettings _syncSettings; + private GPGXSettings _settings; + + public class GPGXSettings + { + [DeepEqualsIgnore] + [JsonIgnore] + private bool _DrawBGA; + + [DisplayName("Background Layer A")] + [Description("True to draw BG layer A")] + [DefaultValue(true)] + public bool DrawBGA { get { return _DrawBGA; } set { _DrawBGA = value; } } + + [DeepEqualsIgnore] + [JsonIgnore] + private bool _DrawBGB; + + [DisplayName("Background Layer B")] + [Description("True to draw BG layer B")] + [DefaultValue(true)] + public bool DrawBGB { get { return _DrawBGB; } set { _DrawBGB = value; } } + + [DeepEqualsIgnore] + [JsonIgnore] + private bool _DrawBGW; + + [DisplayName("Background Layer W")] + [Description("True to draw BG layer W")] + [DefaultValue(true)] + public bool DrawBGW { get { return _DrawBGW; } set { _DrawBGW = value; } } + + [DeepEqualsIgnore] + [JsonIgnore] + private bool _DrawObj; + + [DisplayName("Sprite Layer")] + [Description("True to draw sprite layer")] + [DefaultValue(true)] + public bool DrawObj { get { return _DrawObj; } set { _DrawObj = value; } } + + [DeepEqualsIgnore] + [JsonIgnore] + private bool _PadScreen320; + + [DisplayName("Pad screen to 320")] + [Description("When using 1:1 aspect ratio, enable to make screen width constant (320) between game modes")] + [DefaultValue(false)] + public bool PadScreen320 { get { return _PadScreen320; } set { _PadScreen320 = value; } } + + [DisplayName("Audio Filter")] + [DefaultValue(LibGPGX.InitSettings.FilterType.LowPass)] + public LibGPGX.InitSettings.FilterType Filter { get; set; } + + [DisplayName("Low Pass Range")] + [Description("Only active when filter type is lowpass. Range is 0 - 0xffff. Default value is 40%")] + [TypeConverter(typeof(UshortToHexConverter))] + [DefaultValue((ushort)0x6666)] + public ushort LowPassRange { get; set; } + + [DisplayName("Three band low cutoff")] + [Description("Only active when filter type is three band")] + [DefaultValue((short)880)] + public short LowFreq { get; set; } + + [DisplayName("Three band high cutoff")] + [Description("Only active when filter type is three band")] + [DefaultValue((short)5000)] + public short HighFreq { get; set; } + + [DisplayName("Three band low gain")] + [Description("Only active when filter type is three band")] + [DefaultValue((short)1)] + public short LowGain { get; set; } + + [DisplayName("Three band mid gain")] + [Description("Only active when filter type is three band")] + [DefaultValue((short)1)] + public short MidGain { get; set; } + + [DisplayName("Three band high gain")] + [Description("Only active when filter type is three band")] + [DefaultValue((short)1)] + public short HighGain { get; set; } + + [DeepEqualsIgnore] + [JsonIgnore] + private bool _Backdrop; + + [DisplayName("Use custom backdrop color")] + [Description("Filler when layers are off")] + [DefaultValue((bool)false)] + public bool Backdrop { get { return _Backdrop; } set { _Backdrop = value; } } + + [Description("Magic pink by default. Requires core reboot")] + [TypeConverter(typeof(UintToHexConverter))] + [DefaultValue((uint)0xffff00ff)] + public uint BackdropColor { get; set; } + + public GPGXSettings() + { + SettingsUtil.SetDefaultValues(this); + } + + public GPGXSettings Clone() + { + return (GPGXSettings)MemberwiseClone(); + } + + public LibGPGX.DrawMask GetDrawMask() + { + LibGPGX.DrawMask ret = 0; + if (DrawBGA) ret |= LibGPGX.DrawMask.BGA; + if (DrawBGB) ret |= LibGPGX.DrawMask.BGB; + if (DrawBGW) ret |= LibGPGX.DrawMask.BGW; + if (DrawObj) ret |= LibGPGX.DrawMask.Obj; + if (Backdrop) ret |= LibGPGX.DrawMask.Backdrop; + return ret; + } + + public static bool NeedsReboot(GPGXSettings x, GPGXSettings y) + { + return !DeepEquality.DeepEquals(x, y); + } + + public LibGPGX.InitSettings GetNativeSettings() + { + return new LibGPGX.InitSettings + { + Filter = Filter, + LowPassRange = LowPassRange, + LowFreq = LowFreq, + HighFreq = HighFreq, + LowGain = LowGain, + MidGain = MidGain, + HighGain = HighGain, + BackdropColor = BackdropColor + }; + } + } + + public class GPGXSyncSettings + { + [DisplayName("Use Six Button Controllers")] + [Description("Controls the type of any attached normal controllers; six button controllers are used if true, otherwise three button controllers. Some games don't work correctly with six button controllers. Not relevant if other controller types are connected.")] + [DefaultValue(true)] + public bool UseSixButton { get; set; } + + [DisplayName("Control Type")] + [Description("Sets the type of controls that are plugged into the console. Some games will automatically load with a different control type.")] + [DefaultValue(ControlType.Normal)] + public ControlType ControlType { get; set; } + + [DisplayName("Autodetect Region")] + [Description("Sets the region of the emulated console. Many games can run on multiple regions and will behave differently on different ones. Some games may require a particular region.")] + [DefaultValue(LibGPGX.Region.Autodetect)] + public LibGPGX.Region Region { get; set; } + + public GPGXSyncSettings() + { + SettingsUtil.SetDefaultValues(this); + } + + public GPGXSyncSettings Clone() + { + return (GPGXSyncSettings)MemberwiseClone(); + } + + public static bool NeedsReboot(GPGXSyncSettings x, GPGXSyncSettings y) + { + return !DeepEquality.DeepEquals(x, y); + } + } + } +}