From 45f904172df619b458ced41c713eb0fcfcbb3fdd Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Thu, 15 Aug 2024 13:19:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B8=E5=BF=83=E4=BD=8E=E7=89=88=E6=9C=ACC#?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Iris/Iris.CPU/ARM_Interpreter.cs | 532 ++++++++--------- Assets/Iris/Iris.CPU/CPU_Core.cs | 45 +- Assets/Iris/Iris.CPU/THUMB_Interpreter.cs | 564 +++++++++--------- Assets/Iris/Iris.Common/Scheduler.cs | 28 +- Assets/Iris/Iris.Common/System.cs | 5 +- Assets/Iris/Iris.GBA/BIOS.cs | 4 +- Assets/Iris/Iris.GBA/Communication.cs | 5 +- Assets/Iris/Iris.GBA/DMA.cs | 16 +- Assets/Iris/Iris.GBA/GBA_System.cs | 4 +- Assets/Iris/Iris.GBA/InterruptControl.cs | 4 +- Assets/Iris/Iris.GBA/KeyInput.cs | 4 +- Assets/Iris/Iris.GBA/Memory.cs | 17 +- Assets/Iris/Iris.GBA/Sound.cs | 5 +- Assets/Iris/Iris.GBA/SystemControl.cs | 5 +- Assets/Iris/Iris.GBA/Timer.cs | 56 +- Assets/Iris/Iris.GBA/Video.cs | 21 +- Assets/Iris/Iris.NDS/BIOS.cs | 4 +- Assets/Iris/Iris.NDS/Memory.cs | 5 +- Assets/Iris/Iris.NDS/NDS_System.cs | 5 +- Assets/MyUnSafeCommon.cs | 91 +++ Assets/MyUnSafeCommon.cs.meta | 11 + Assets/Plugins.meta | 8 + Assets/Plugins/System.Buffers.dll | Bin 0 -> 21376 bytes Assets/Plugins/System.Buffers.dll.meta | 33 + Assets/Plugins/System.Memory.dll | Bin 0 -> 142752 bytes Assets/Plugins/System.Memory.dll.meta | 33 + Assets/Plugins/System.Numerics.Vectors.dll | Bin 0 -> 163712 bytes .../Plugins/System.Numerics.Vectors.dll.meta | 33 + ...System.Runtime.CompilerServices.Unsafe.dll | Bin 0 -> 16768 bytes ...m.Runtime.CompilerServices.Unsafe.dll.meta | 33 + 30 files changed, 975 insertions(+), 596 deletions(-) create mode 100644 Assets/MyUnSafeCommon.cs create mode 100644 Assets/MyUnSafeCommon.cs.meta create mode 100644 Assets/Plugins.meta create mode 100644 Assets/Plugins/System.Buffers.dll create mode 100644 Assets/Plugins/System.Buffers.dll.meta create mode 100644 Assets/Plugins/System.Memory.dll create mode 100644 Assets/Plugins/System.Memory.dll.meta create mode 100644 Assets/Plugins/System.Numerics.Vectors.dll create mode 100644 Assets/Plugins/System.Numerics.Vectors.dll.meta create mode 100644 Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll create mode 100644 Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta diff --git a/Assets/Iris/Iris.CPU/ARM_Interpreter.cs b/Assets/Iris/Iris.CPU/ARM_Interpreter.cs index 52eab54..d9b46ce 100644 --- a/Assets/Iris/Iris.CPU/ARM_Interpreter.cs +++ b/Assets/Iris/Iris.CPU/ARM_Interpreter.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -18,195 +19,194 @@ namespace Iris.CPU unsafe { InstructionListEntry[] InstructionList = - [ + { // ADC - new(0x0fe0_0000, 0x02a0_0000, &ADC, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fe0_0090, 0x00a0_0000, &ADC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fe0_0090, 0x00a0_0080, &ADC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fe0_0090, 0x00a0_0010, &ADC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 - + new InstructionListEntry(0x0fe0_0000, 0x02a0_0000, &ADC, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fe0_0090, 0x00a0_0000, &ADC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x00a0_0080, &ADC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x00a0_0010, &ADC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // ADD - new(0x0fe0_0000, 0x0280_0000, &ADD, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fe0_0090, 0x0080_0000, &ADD, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fe0_0090, 0x0080_0080, &ADD, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fe0_0090, 0x0080_0010, &ADD, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fe0_0000, 0x0280_0000, &ADD, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fe0_0090, 0x0080_0000, &ADD, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0080_0080, &ADD, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0080_0010, &ADD, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // AND - new(0x0fe0_0000, 0x0200_0000, &AND, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fe0_0090, 0x0000_0000, &AND, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fe0_0090, 0x0000_0080, &AND, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fe0_0090, 0x0000_0010, &AND, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fe0_0000, 0x0200_0000, &AND, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fe0_0090, 0x0000_0000, &AND, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0000_0080, &AND, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0000_0010, &AND, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // B - new(0x0f00_0000, 0x0a00_0000, &B, [Model.ARM7TDMI]), + new InstructionListEntry(0x0f00_0000, 0x0a00_0000, &B, new List(){ Model.ARM7TDMI}), // BL - new(0x0f00_0000, 0x0b00_0000, &BL, [Model.ARM7TDMI]), + new InstructionListEntry(0x0f00_0000, 0x0b00_0000, &BL, new List(){ Model.ARM7TDMI}), // BIC - new(0x0fe0_0000, 0x03c0_0000, &BIC, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fe0_0090, 0x01c0_0000, &BIC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fe0_0090, 0x01c0_0080, &BIC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fe0_0090, 0x01c0_0010, &BIC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fe0_0000, 0x03c0_0000, &BIC, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fe0_0090, 0x01c0_0000, &BIC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x01c0_0080, &BIC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x01c0_0010, &BIC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // BX - new(0x0fff_fff0, 0x012f_ff10, &BX, [Model.ARM7TDMI]), + new InstructionListEntry(0x0fff_fff0, 0x012f_ff10, &BX, new List(){ Model.ARM7TDMI}), // CMN - new(0x0ff0_f000, 0x0370_0000, &CMN, [Model.ARM7TDMI]), // I bit is 1 - new(0x0ff0_f090, 0x0170_0000, &CMN, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0ff0_f090, 0x0170_0080, &CMN, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0ff0_f090, 0x0170_0010, &CMN, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 - new(0x0ff0_f000, 0x0370_f000, &CMN, [Model.ARM7TDMI]), // I bit is 1 - new(0x0ff0_f090, 0x0170_f000, &CMN, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0ff0_f090, 0x0170_f080, &CMN, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0ff0_f090, 0x0170_f010, &CMN, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0ff0_f000, 0x0370_0000, &CMN, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0ff0_f090, 0x0170_0000, &CMN, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0170_0080, &CMN, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0170_0010, &CMN, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0ff0_f000, 0x0370_f000, &CMN, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0ff0_f090, 0x0170_f000, &CMN, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0170_f080, &CMN, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0170_f010, &CMN, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // CMP - new(0x0ff0_f000, 0x0350_0000, &CMP, [Model.ARM7TDMI]), // I bit is 1 - new(0x0ff0_f090, 0x0150_0000, &CMP, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0ff0_f090, 0x0150_0080, &CMP, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0ff0_f090, 0x0150_0010, &CMP, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 - new(0x0ff0_f000, 0x0350_f000, &CMP, [Model.ARM7TDMI]), // I bit is 1 - new(0x0ff0_f090, 0x0150_f000, &CMP, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0ff0_f090, 0x0150_f080, &CMP, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0ff0_f090, 0x0150_f010, &CMP, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0ff0_f000, 0x0350_0000, &CMP, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0ff0_f090, 0x0150_0000, &CMP, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0150_0080, &CMP, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0150_0010, &CMP, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0ff0_f000, 0x0350_f000, &CMP, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0ff0_f090, 0x0150_f000, &CMP, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0150_f080, &CMP, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0150_f010, &CMP, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // EOR - new(0x0fe0_0000, 0x0220_0000, &EOR, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fe0_0090, 0x0020_0000, &EOR, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fe0_0090, 0x0020_0080, &EOR, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fe0_0090, 0x0020_0010, &EOR, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fe0_0000, 0x0220_0000, &EOR, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fe0_0090, 0x0020_0000, &EOR, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0020_0080, &EOR, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0020_0010, &EOR, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // LDM - new(0x0e50_0000, 0x0810_0000, &LDM1, [Model.ARM7TDMI]), - new(0x0e50_8000, 0x0850_0000, &LDM2, [Model.ARM7TDMI]), - //new(0x0e50_8000, 0x0850_8000, &LDM3, new List{ Model.ARM7TDMI }), + new InstructionListEntry(0x0e50_0000, 0x0810_0000, &LDM1, new List(){ Model.ARM7TDMI}), + new InstructionListEntry(0x0e50_8000, 0x0850_0000, &LDM2, new List(){ Model.ARM7TDMI}), + //new InstructionListEntry(0x0e50_8000, 0x0850_8000, &LDM3, new List{ Model.ARM7TDMI }), // LDR - new(0x0c50_0000, 0x0410_0000, &LDR, [Model.ARM7TDMI]), + new InstructionListEntry(0x0c50_0000, 0x0410_0000, &LDR, new List(){ Model.ARM7TDMI}), // LDRB - new(0x0c50_0000, 0x0450_0000, &LDRB, [Model.ARM7TDMI]), + new InstructionListEntry(0x0c50_0000, 0x0450_0000, &LDRB, new List(){ Model.ARM7TDMI}), // LDRH - new(0x0e10_00f0, 0x0010_00b0, &LDRH, [Model.ARM7TDMI]), + new InstructionListEntry(0x0e10_00f0, 0x0010_00b0, &LDRH, new List(){ Model.ARM7TDMI}), // LDRSB - new(0x0e10_00f0, 0x0010_00d0, &LDRSB, [Model.ARM7TDMI]), + new InstructionListEntry(0x0e10_00f0, 0x0010_00d0, &LDRSB, new List(){ Model.ARM7TDMI}), // LDRSH - new(0x0e10_00f0, 0x0010_00f0, &LDRSH, [Model.ARM7TDMI]), + new InstructionListEntry(0x0e10_00f0, 0x0010_00f0, &LDRSH, new List(){ Model.ARM7TDMI}), // MLA - new(0x0fe0_00f0, 0x0020_0090, &MLA, [Model.ARM7TDMI]), + new InstructionListEntry(0x0fe0_00f0, 0x0020_0090, &MLA, new List(){ Model.ARM7TDMI}), // MOV - new(0x0fef_0000, 0x03a0_0000, &MOV, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fef_0090, 0x01a0_0000, &MOV, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fef_0090, 0x01a0_0080, &MOV, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fef_0090, 0x01a0_0010, &MOV, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fef_0000, 0x03a0_0000, &MOV, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fef_0090, 0x01a0_0000, &MOV, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fef_0090, 0x01a0_0080, &MOV, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fef_0090, 0x01a0_0010, &MOV, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // MRS - new(0x0fbf_0fff, 0x010f_0000, &MRS, [Model.ARM7TDMI]), + new InstructionListEntry(0x0fbf_0fff, 0x010f_0000, &MRS, new List(){ Model.ARM7TDMI}), // MSR - new(0x0fb0_f000, 0x0320_f000, &MSR, [Model.ARM7TDMI]), // Immediate operand - new(0x0fb0_fff0, 0x0120_f000, &MSR, [Model.ARM7TDMI]), // Register operand + new InstructionListEntry(0x0fb0_f000, 0x0320_f000, &MSR, new List(){ Model.ARM7TDMI}), // Immediate operand + new InstructionListEntry(0x0fb0_fff0, 0x0120_f000, &MSR, new List(){ Model.ARM7TDMI}), // Register operand // MUL - new(0x0fe0_f0f0, 0x0000_0090, &MUL, [Model.ARM7TDMI]), + new InstructionListEntry(0x0fe0_f0f0, 0x0000_0090, &MUL, new List(){ Model.ARM7TDMI}), // MVN - new(0x0fef_0000, 0x03e0_0000, &MVN, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fef_0090, 0x01e0_0000, &MVN, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fef_0090, 0x01e0_0080, &MVN, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fef_0090, 0x01e0_0010, &MVN, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fef_0000, 0x03e0_0000, &MVN, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fef_0090, 0x01e0_0000, &MVN, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fef_0090, 0x01e0_0080, &MVN, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fef_0090, 0x01e0_0010, &MVN, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // ORR - new(0x0fe0_0000, 0x0380_0000, &ORR, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fe0_0090, 0x0180_0000, &ORR, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fe0_0090, 0x0180_0080, &ORR, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fe0_0090, 0x0180_0010, &ORR, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fe0_0000, 0x0380_0000, &ORR, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fe0_0090, 0x0180_0000, &ORR, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0180_0080, &ORR, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0180_0010, &ORR, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // RSB - new(0x0fe0_0000, 0x0260_0000, &RSB, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fe0_0090, 0x0060_0000, &RSB, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fe0_0090, 0x0060_0080, &RSB, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fe0_0090, 0x0060_0010, &RSB, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fe0_0000, 0x0260_0000, &RSB, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fe0_0090, 0x0060_0000, &RSB, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0060_0080, &RSB, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0060_0010, &RSB, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // RSC - new(0x0fe0_0000, 0x02e0_0000, &RSC, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fe0_0090, 0x00e0_0000, &RSC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fe0_0090, 0x00e0_0080, &RSC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fe0_0090, 0x00e0_0010, &RSC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fe0_0000, 0x02e0_0000, &RSC, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fe0_0090, 0x00e0_0000, &RSC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x00e0_0080, &RSC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x00e0_0010, &RSC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // SBC - new(0x0fe0_0000, 0x02c0_0000, &SBC, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fe0_0090, 0x00c0_0000, &SBC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fe0_0090, 0x00c0_0080, &SBC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fe0_0090, 0x00c0_0010, &SBC, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fe0_0000, 0x02c0_0000, &SBC, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fe0_0090, 0x00c0_0000, &SBC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x00c0_0080, &SBC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x00c0_0010, &SBC, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // SMLAL - new(0x0fe0_00f0, 0x00e0_0090, &SMLAL, [Model.ARM7TDMI]), + new InstructionListEntry(0x0fe0_00f0, 0x00e0_0090, &SMLAL, new List(){ Model.ARM7TDMI}), // SMULL - new(0x0fe0_00f0, 0x00c0_0090, &SMULL, [Model.ARM7TDMI]), + new InstructionListEntry(0x0fe0_00f0, 0x00c0_0090, &SMULL, new List(){ Model.ARM7TDMI}), // STM - new(0x0e50_0000, 0x0800_0000, &STM1, [Model.ARM7TDMI]), - new(0x0e70_0000, 0x0840_0000, &STM2, [Model.ARM7TDMI]), + new InstructionListEntry(0x0e50_0000, 0x0800_0000, &STM1, new List(){ Model.ARM7TDMI}), + new InstructionListEntry(0x0e70_0000, 0x0840_0000, &STM2, new List(){ Model.ARM7TDMI}), // STR - new(0x0c50_0000, 0x0400_0000, &STR, [Model.ARM7TDMI]), + new InstructionListEntry(0x0c50_0000, 0x0400_0000, &STR, new List(){ Model.ARM7TDMI}), // STRB - new(0x0c50_0000, 0x0440_0000, &STRB, [Model.ARM7TDMI]), + new InstructionListEntry(0x0c50_0000, 0x0440_0000, &STRB, new List(){ Model.ARM7TDMI}), // STRH - new(0x0e10_00f0, 0x0000_00b0, &STRH, [Model.ARM7TDMI]), + new InstructionListEntry(0x0e10_00f0, 0x0000_00b0, &STRH, new List(){ Model.ARM7TDMI}), // SUB - new(0x0fe0_0000, 0x0240_0000, &SUB, [Model.ARM7TDMI]), // I bit is 1 - new(0x0fe0_0090, 0x0040_0000, &SUB, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0fe0_0090, 0x0040_0080, &SUB, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0fe0_0090, 0x0040_0010, &SUB, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0fe0_0000, 0x0240_0000, &SUB, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0fe0_0090, 0x0040_0000, &SUB, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0040_0080, &SUB, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0fe0_0090, 0x0040_0010, &SUB, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // SWI - new(0x0f00_0000, 0x0f00_0000, &SWI, [Model.ARM7TDMI]), + new InstructionListEntry(0x0f00_0000, 0x0f00_0000, &SWI, new List(){ Model.ARM7TDMI}), // SWP - new(0x0ff0_0ff0, 0x0100_0090, &SWP, [Model.ARM7TDMI]), + new InstructionListEntry(0x0ff0_0ff0, 0x0100_0090, &SWP, new List(){ Model.ARM7TDMI}), // SWPB - new(0x0ff0_0ff0, 0x0140_0090, &SWPB, [Model.ARM7TDMI]), + new InstructionListEntry(0x0ff0_0ff0, 0x0140_0090, &SWPB, new List(){ Model.ARM7TDMI}), // TEQ - new(0x0ff0_f000, 0x0330_0000, &TEQ, [Model.ARM7TDMI]), // I bit is 1 - new(0x0ff0_f090, 0x0130_0000, &TEQ, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0ff0_f090, 0x0130_0080, &TEQ, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0ff0_f090, 0x0130_0010, &TEQ, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 - new(0x0ff0_f000, 0x0330_f000, &TEQ, [Model.ARM7TDMI]), // I bit is 1 - new(0x0ff0_f090, 0x0130_f000, &TEQ, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0ff0_f090, 0x0130_f080, &TEQ, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0ff0_f090, 0x0130_f010, &TEQ, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0ff0_f000, 0x0330_0000, &TEQ, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0ff0_f090, 0x0130_0000, &TEQ, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0130_0080, &TEQ, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0130_0010, &TEQ, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0ff0_f000, 0x0330_f000, &TEQ, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0ff0_f090, 0x0130_f000, &TEQ, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0130_f080, &TEQ, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0130_f010, &TEQ, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // TST - new(0x0ff0_f000, 0x0310_0000, &TST, [Model.ARM7TDMI]), // I bit is 1 - new(0x0ff0_f090, 0x0110_0000, &TST, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0ff0_f090, 0x0110_0080, &TST, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0ff0_f090, 0x0110_0010, &TST, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 - new(0x0ff0_f000, 0x0310_f000, &TST, [Model.ARM7TDMI]), // I bit is 1 - new(0x0ff0_f090, 0x0110_f000, &TST, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 0 - new(0x0ff0_f090, 0x0110_f080, &TST, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 1 and bit[4] is 0 - new(0x0ff0_f090, 0x0110_f010, &TST, [Model.ARM7TDMI]), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0ff0_f000, 0x0310_0000, &TST, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0ff0_f090, 0x0110_0000, &TST, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0110_0080, &TST, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0110_0010, &TST, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 + new InstructionListEntry(0x0ff0_f000, 0x0310_f000, &TST, new List(){ Model.ARM7TDMI}), // I bit is 1 + new InstructionListEntry(0x0ff0_f090, 0x0110_f000, &TST, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0110_f080, &TST, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 1 and bit[4] is 0 + new InstructionListEntry(0x0ff0_f090, 0x0110_f010, &TST, new List(){ Model.ARM7TDMI}), // I bit is 0, bit[7] is 0 and bit[4] is 1 // UMLAL - new(0x0fe0_00f0, 0x00a0_0090, &UMLAL, [Model.ARM7TDMI]), + new InstructionListEntry(0x0fe0_00f0, 0x00a0_0090, &UMLAL, new List(){ Model.ARM7TDMI}), // UMULL - new(0x0fe0_00f0, 0x0080_0090, &UMULL, [Model.ARM7TDMI]), - ]; + new InstructionListEntry(0x0fe0_00f0, 0x0080_0090, &UMULL, new List(){ Model.ARM7TDMI}), + }; for (UInt32 instruction = 0; instruction < _instructionLUT.Length; ++instruction) { @@ -244,13 +244,13 @@ namespace Iris.CPU if (_cpu.ConditionPassed(cond)) { - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(_cpu.Reg); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(_cpu.Reg); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); regPC = _cpu.NextInstructionAddress + 4; - ref InstructionLUTEntry instructionLUTDataRef = ref MemoryMarshal.GetArrayDataReference(_instructionLUT); - ref InstructionLUTEntry instructionLUTEntry = ref Unsafe.Add(ref instructionLUTDataRef, InstructionLUTHash(instruction)); + ref InstructionLUTEntry instructionLUTDataRef = ref MyUnSafeCommon.GetArrayDataReference(_instructionLUT); + ref InstructionLUTEntry instructionLUTEntry = ref Unsafe.Add(ref instructionLUTDataRef, (int)InstructionLUTHash(instruction)); unsafe { @@ -277,8 +277,8 @@ namespace Iris.CPU } else { - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, i); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, (int)i); regRi = value; } @@ -297,7 +297,7 @@ namespace Iris.CPU UInt32 rotateImm = (instruction >> 8) & 0b1111; UInt32 imm = instruction & 0xff; - shifterOperand = BitOperations.RotateRight(imm, (int)(rotateImm * 2)); + shifterOperand = MyBitOperations.RotateRight(imm, (int)(rotateImm * 2)); shifterCarryOut = (rotateImm == 0) ? cpu.GetFlag(Flag.C) : (shifterOperand >> 31); } else @@ -306,8 +306,8 @@ namespace Iris.CPU UInt32 r = (instruction >> 4) & 1; UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); if (r == 0) // Immediate shifts { @@ -362,7 +362,7 @@ namespace Iris.CPU } else { - shifterOperand = BitOperations.RotateRight(value, shiftAmount); + shifterOperand = MyBitOperations.RotateRight(value, shiftAmount); shifterCarryOut = (value >> (shiftAmount - 1)) & 1; } break; @@ -372,8 +372,8 @@ namespace Iris.CPU { UInt32 rs = (instruction >> 8) & 0b1111; - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); UInt32 value = (rm == PC) ? (regPC + 4) : regRm; int shiftAmount = (int)(regRs & 0xff); @@ -454,7 +454,7 @@ namespace Iris.CPU } else { - shifterOperand = BitOperations.RotateRight(value, shiftAmount & 0b1_1111); + shifterOperand = MyBitOperations.RotateRight(value, shiftAmount & 0b1_1111); shifterCarryOut = (value >> ((shiftAmount & 0b1_1111) - 1)) & 1; } break; @@ -474,8 +474,8 @@ namespace Iris.CPU UInt32 w = (instruction >> 21) & 1; UInt32 rn = (instruction >> 16) & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); UInt32 index = 0; @@ -491,7 +491,7 @@ namespace Iris.CPU UInt32 shift = (instruction >> 5) & 0b11; UInt32 rm = instruction & 0b1111; - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); if ((shiftImm == 0) && (shift == 0)) // Register { @@ -520,7 +520,7 @@ namespace Iris.CPU if (shiftImm == 0) // RRX index = (cpu.GetFlag(Flag.C) << 31) | (regRm >> 1); else // ROR - index = BitOperations.RotateRight(regRm, (int)shiftImm); + index = MyBitOperations.RotateRight(regRm, (int)shiftImm); break; } } @@ -557,8 +557,8 @@ namespace Iris.CPU UInt32 w = (instruction >> 21) & 1; UInt32 rn = (instruction >> 16) & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); UInt32 index; @@ -574,7 +574,7 @@ namespace Iris.CPU { UInt32 rm = instruction & 0b1111; - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); index = regRm; } @@ -610,10 +610,10 @@ namespace Iris.CPU UInt32 rn = (instruction >> 16) & 0b1111; UInt32 registerList = instruction & 0xffff; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); - UInt32 increment = (registerList == 0) ? 0x40 : ((UInt32)BitOperations.PopCount(registerList) * 4); + UInt32 increment = (registerList == 0) ? 0x40 : ((UInt32)MyBitOperations.PopCount(registerList) * 4); UInt32 startAddress, endAddress; UInt32 value; @@ -668,9 +668,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, _) = GetShifterOperand(cpu, instruction); @@ -692,7 +692,7 @@ namespace Iris.CPU } else { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -716,9 +716,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, _) = GetShifterOperand(cpu, instruction); @@ -740,7 +740,7 @@ namespace Iris.CPU } else { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -764,9 +764,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, UInt32 shifterCarryOut) = GetShifterOperand(cpu, instruction); @@ -787,7 +787,7 @@ namespace Iris.CPU } else { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -806,8 +806,8 @@ namespace Iris.CPU { UInt32 imm = instruction & 0xff_ffff; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); SetPC(cpu, regPC + (SignExtend(imm, 24) << 2)); @@ -818,9 +818,9 @@ namespace Iris.CPU { UInt32 imm = instruction & 0xff_ffff; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regLR = ref Unsafe.Add(ref regDataRef, LR); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regLR = ref Unsafe.Add(ref regDataRef, (int)LR); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); regLR = cpu.NextInstructionAddress; SetPC(cpu, regPC + (SignExtend(imm, 24) << 2)); @@ -836,9 +836,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, UInt32 shifterCarryOut) = GetShifterOperand(cpu, instruction); @@ -859,7 +859,7 @@ namespace Iris.CPU } else { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -878,8 +878,8 @@ namespace Iris.CPU { UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); cpu.CPSR = (cpu.CPSR & ~(1u << 5)) | ((regRm & 1) << 5); SetPC(cpu, regRm & 0xffff_fffe); @@ -894,9 +894,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, _) = GetShifterOperand(cpu, instruction); @@ -935,9 +935,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, _) = GetShifterOperand(cpu, instruction); @@ -977,9 +977,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, UInt32 shifterCarryOut) = GetShifterOperand(cpu, instruction); @@ -1000,7 +1000,7 @@ namespace Iris.CPU } else { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -1031,20 +1031,20 @@ namespace Iris.CPU } else { - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); for (int i = 0; i <= 14; ++i) { if (((registerList >> i) & 1) == 1) { - ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, i); + ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, (int)i); regRi = cpu._callbackInterface._read32(address); address += 4; } } - UInt32 n = (UInt32)BitOperations.PopCount(registerList); + UInt32 n = (UInt32)MyBitOperations.PopCount(registerList); if (((registerList >> 15) & 1) == 1) { @@ -1075,7 +1075,7 @@ namespace Iris.CPU } else { - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); for (int i = 0; i <= 14; ++i) { @@ -1108,7 +1108,7 @@ namespace Iris.CPU break; default: { - ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, i); + ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, (int)i); regRi = value; break; @@ -1119,7 +1119,7 @@ namespace Iris.CPU } } - UInt32 n = (UInt32)BitOperations.PopCount(registerList); + UInt32 n = (UInt32)MyBitOperations.PopCount(registerList); return n + 2; } } @@ -1129,7 +1129,7 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 address = GetAddress(cpu, instruction); - UInt32 data = BitOperations.RotateRight(cpu._callbackInterface._read32(address), (int)(8 * (address & 0b11))); + UInt32 data = MyBitOperations.RotateRight(cpu._callbackInterface._read32(address), (int)(8 * (address & 0b11))); if (rd == PC) { @@ -1139,8 +1139,8 @@ namespace Iris.CPU } else { - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); regRd = data; @@ -1164,7 +1164,7 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 address = GetAddress_Misc(cpu, instruction); - UInt32 data = BitOperations.RotateRight(cpu._callbackInterface._read16(address), (int)(8 * (address & 1))); + UInt32 data = MyBitOperations.RotateRight(cpu._callbackInterface._read16(address), (int)(8 * (address & 1))); SetReg(cpu, rd, data); return (rd == PC) ? 5u : 3u; @@ -1209,17 +1209,17 @@ namespace Iris.CPU UInt32 rs = (instruction >> 8) & 0b1111; UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); UInt64 m = ComputeMultiplicationCycleCount(regRm, regRs); SetReg(cpu, rd, (regRm * regRs) + regRn); if (s == 1) { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -1251,8 +1251,8 @@ namespace Iris.CPU } else { - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -1290,14 +1290,14 @@ namespace Iris.CPU UInt32 rotateImm = (instruction >> 8) & 0b1111; UInt32 imm = instruction & 0xff; - operand = BitOperations.RotateRight(imm, (int)(2 * rotateImm)); + operand = MyBitOperations.RotateRight(imm, (int)(2 * rotateImm)); } else { UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); operand = regRm; } @@ -1334,16 +1334,16 @@ namespace Iris.CPU UInt32 rs = (instruction >> 8) & 0b1111; UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); UInt64 m = ComputeMultiplicationCycleCount(regRm, regRs); SetReg(cpu, rd, regRm * regRs); if (s == 1) { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -1375,8 +1375,8 @@ namespace Iris.CPU } else { - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -1399,9 +1399,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, UInt32 shifterCarryOut) = GetShifterOperand(cpu, instruction); @@ -1422,7 +1422,7 @@ namespace Iris.CPU } else { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -1445,9 +1445,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, _) = GetShifterOperand(cpu, instruction); @@ -1469,7 +1469,7 @@ namespace Iris.CPU } else { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -1493,9 +1493,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, _) = GetShifterOperand(cpu, instruction); @@ -1517,7 +1517,7 @@ namespace Iris.CPU } else { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -1541,9 +1541,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, _) = GetShifterOperand(cpu, instruction); @@ -1565,7 +1565,7 @@ namespace Iris.CPU } else { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -1589,11 +1589,11 @@ namespace Iris.CPU UInt32 rs = (instruction >> 8) & 0b1111; UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRdHi = ref Unsafe.Add(ref regDataRef, rdHi); - ref UInt32 regRdLo = ref Unsafe.Add(ref regDataRef, rdLo); - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRdHi = ref Unsafe.Add(ref regDataRef, (int)rdHi); + ref UInt32 regRdLo = ref Unsafe.Add(ref regDataRef, (int)rdLo); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); UInt64 m = ComputeMultiplicationCycleCount(regRm, regRs); Int64 result = (Int64)(Int32)regRm * (Int64)(Int32)regRs; @@ -1619,9 +1619,9 @@ namespace Iris.CPU UInt32 rs = (instruction >> 8) & 0b1111; UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); UInt64 m = ComputeMultiplicationCycleCount(regRm, regRs); Int64 result = (Int64)(Int32)regRm * (Int64)(Int32)regRs; @@ -1630,8 +1630,8 @@ namespace Iris.CPU if (s == 1) { - ref UInt32 regRdHi = ref Unsafe.Add(ref regDataRef, rdHi); - ref UInt32 regRdLo = ref Unsafe.Add(ref regDataRef, rdLo); + ref UInt32 regRdHi = ref Unsafe.Add(ref regDataRef, (int)rdHi); + ref UInt32 regRdLo = ref Unsafe.Add(ref regDataRef, (int)rdLo); cpu.SetFlag(Flag.N, regRdHi >> 31); cpu.SetFlag(Flag.Z, ((regRdHi == 0) && (regRdLo == 0)) ? 1u : 0u); @@ -1645,8 +1645,8 @@ namespace Iris.CPU UInt32 rn = (instruction >> 16) & 0b1111; UInt32 registerList = instruction & 0xffff; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); UInt32 oldRegRn = regRn; @@ -1656,7 +1656,7 @@ namespace Iris.CPU if (registerList == 0) { - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); cpu._callbackInterface._write32(address, regPC + 4); @@ -1674,7 +1674,7 @@ namespace Iris.CPU } else { - ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, i); + ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, (int)i); cpu._callbackInterface._write32(address, regRi); } @@ -1685,12 +1685,12 @@ namespace Iris.CPU if (((registerList >> 15) & 1) == 1) { - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); cpu._callbackInterface._write32(address, regPC + 4); } - UInt32 n = (UInt32)BitOperations.PopCount(registerList); + UInt32 n = (UInt32)MyBitOperations.PopCount(registerList); return n + 1; } } @@ -1700,7 +1700,7 @@ namespace Iris.CPU UInt32 rn = (instruction >> 16) & 0b1111; UInt32 registerList = instruction & 0xffff; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); UInt32 oldRegRn = rn switch { @@ -1711,7 +1711,7 @@ namespace Iris.CPU 12 => cpu.Reg12_usr, 13 => cpu.Reg13_usr, 14 => cpu.Reg14_usr, - _ => Unsafe.Add(ref regDataRef, rn), + _ => Unsafe.Add(ref regDataRef, (int)rn), }; (UInt32 startAddress, _) = GetAddress_Multiple(cpu, instruction); @@ -1720,7 +1720,7 @@ namespace Iris.CPU if (registerList == 0) { - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); cpu._callbackInterface._write32(address, regPC + 4); @@ -1759,12 +1759,12 @@ namespace Iris.CPU if (((registerList >> 15) & 1) == 1) { - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); cpu._callbackInterface._write32(address, regPC + 4); } - UInt32 n = (UInt32)BitOperations.PopCount(registerList); + UInt32 n = (UInt32)MyBitOperations.PopCount(registerList); return n + 1; } } @@ -1773,9 +1773,9 @@ namespace Iris.CPU { UInt32 rd = (instruction >> 12) & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); UInt32 data = (rd == PC) ? (regPC + 4) : regRd; UInt32 address = GetAddress(cpu, instruction); @@ -1788,9 +1788,9 @@ namespace Iris.CPU { UInt32 rd = (instruction >> 12) & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); UInt32 data = (rd == PC) ? (regPC + 4) : regRd; UInt32 address = GetAddress(cpu, instruction); @@ -1803,9 +1803,9 @@ namespace Iris.CPU { UInt32 rd = (instruction >> 12) & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); UInt32 data = (rd == PC) ? (regPC + 4) : regRd; UInt32 address = GetAddress_Misc(cpu, instruction); @@ -1822,9 +1822,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, _) = GetShifterOperand(cpu, instruction); @@ -1846,7 +1846,7 @@ namespace Iris.CPU } else { - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); cpu.SetFlag(Flag.N, regRd >> 31); cpu.SetFlag(Flag.Z, (regRd == 0) ? 1u : 0u); @@ -1873,11 +1873,11 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); - UInt32 temp = BitOperations.RotateRight(cpu._callbackInterface._read32(regRn), (int)(8 * (regRn & 0b11))); + UInt32 temp = MyBitOperations.RotateRight(cpu._callbackInterface._read32(regRn), (int)(8 * (regRn & 0b11))); cpu._callbackInterface._write32(regRn, regRm); SetReg(cpu, rd, temp); @@ -1890,9 +1890,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); Byte temp = cpu._callbackInterface._read8(regRn); cpu._callbackInterface._write8(regRn, (Byte)regRm); @@ -1908,9 +1908,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, UInt32 shifterCarryOut) = GetShifterOperand(cpu, instruction); @@ -1947,9 +1947,9 @@ namespace Iris.CPU UInt32 rd = (instruction >> 12) & 0b1111; UInt32 r = (instruction >> 4) & 1; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); (UInt32 shifterOperand, UInt32 shifterCarryOut) = GetShifterOperand(cpu, instruction); @@ -1987,11 +1987,11 @@ namespace Iris.CPU UInt32 rs = (instruction >> 8) & 0b1111; UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRdHi = ref Unsafe.Add(ref regDataRef, rdHi); - ref UInt32 regRdLo = ref Unsafe.Add(ref regDataRef, rdLo); - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRdHi = ref Unsafe.Add(ref regDataRef, (int)rdHi); + ref UInt32 regRdLo = ref Unsafe.Add(ref regDataRef, (int)rdLo); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); UInt64 m = ComputeMultiplicationCycleCount(regRm, regRs); UInt64 result = (UInt64)regRm * (UInt64)regRs; @@ -2017,9 +2017,9 @@ namespace Iris.CPU UInt32 rs = (instruction >> 8) & 0b1111; UInt32 rm = instruction & 0b1111; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); UInt64 m = ComputeMultiplicationCycleCount(regRm, regRs); UInt64 result = (UInt64)regRm * (UInt64)regRs; @@ -2028,8 +2028,8 @@ namespace Iris.CPU if (s == 1) { - ref UInt32 regRdHi = ref Unsafe.Add(ref regDataRef, rdHi); - ref UInt32 regRdLo = ref Unsafe.Add(ref regDataRef, rdLo); + ref UInt32 regRdHi = ref Unsafe.Add(ref regDataRef, (int)rdHi); + ref UInt32 regRdLo = ref Unsafe.Add(ref regDataRef, (int)rdLo); cpu.SetFlag(Flag.N, regRdHi >> 31); cpu.SetFlag(Flag.Z, ((regRdHi == 0) && (regRdLo == 0)) ? 1u : 0u); diff --git a/Assets/Iris/Iris.CPU/CPU_Core.cs b/Assets/Iris/Iris.CPU/CPU_Core.cs index 14336aa..6a76c07 100644 --- a/Assets/Iris/Iris.CPU/CPU_Core.cs +++ b/Assets/Iris/Iris.CPU/CPU_Core.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; namespace Iris.CPU { @@ -93,17 +93,43 @@ namespace Iris.CPU N = 31 } - internal unsafe readonly struct InstructionListEntry(T mask, T expected, delegate* handler, List modelList) + //internal unsafe readonly struct InstructionListEntry1(T mask, T expected, delegate* handler, List modelList) + //{ + // internal readonly T _mask = mask; + // internal readonly T _expected = expected; + // internal unsafe readonly delegate* _handler = handler; + // internal readonly List _modelList = modelList; + //} + + internal unsafe readonly struct InstructionListEntry { - internal readonly T _mask = mask; - internal readonly T _expected = expected; - internal unsafe readonly delegate* _handler = handler; - internal readonly List _modelList = modelList; + internal InstructionListEntry(T mask, T expected, delegate* handler, List modelList) + { + _mask = mask; + _expected = expected; + _handler = handler; + _modelList = modelList; + } + + internal readonly T _mask; + internal readonly T _expected; + internal unsafe readonly delegate* _handler; + internal readonly List _modelList; } - internal unsafe readonly struct InstructionLUTEntry(delegate* handler) + //internal unsafe readonly struct InstructionLUTEntry(delegate* handler) + //{ + // internal unsafe readonly delegate* _handler = handler; + //} + + + internal unsafe readonly struct InstructionLUTEntry { - internal unsafe readonly delegate* _handler = handler; + internal InstructionLUTEntry(delegate* handler) + { + _handler = handler; + } + internal unsafe readonly delegate* _handler; } internal const UInt32 ModeMask = 0b1_1111; @@ -307,10 +333,9 @@ namespace Iris.CPU UInt32 newMode = value & ModeMask; CPSR = value | 0b1_0000; - if (previousMode != newMode) { - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(Reg); ref UInt32 reg8 = ref Unsafe.Add(ref regDataRef, 8); ref UInt32 reg9 = ref Unsafe.Add(ref regDataRef, 9); ref UInt32 reg10 = ref Unsafe.Add(ref regDataRef, 10); diff --git a/Assets/Iris/Iris.CPU/THUMB_Interpreter.cs b/Assets/Iris/Iris.CPU/THUMB_Interpreter.cs index 28f6fad..2660892 100644 --- a/Assets/Iris/Iris.CPU/THUMB_Interpreter.cs +++ b/Assets/Iris/Iris.CPU/THUMB_Interpreter.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -18,151 +19,151 @@ namespace Iris.CPU unsafe { InstructionListEntry[] InstructionList = - [ + { // ADC - new(0xffc0, 0x4140, &ADC, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x4140, &ADC, new List{Model.ARM7TDMI}), // ADD - new(0xfe00, 0x1c00, &ADD1, [Model.ARM7TDMI]), - new(0xf800, 0x3000, &ADD2, [Model.ARM7TDMI]), - new(0xfe00, 0x1800, &ADD3, [Model.ARM7TDMI]), - new(0xff00, 0x4400, &ADD4, [Model.ARM7TDMI]), - new(0xf800, 0xa000, &ADD5, [Model.ARM7TDMI]), - new(0xf800, 0xa800, &ADD6, [Model.ARM7TDMI]), - new(0xff80, 0xb000, &ADD7, [Model.ARM7TDMI]), + new InstructionListEntry(0xfe00, 0x1c00, &ADD1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xf800, 0x3000, &ADD2, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xfe00, 0x1800, &ADD3, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xff00, 0x4400, &ADD4, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xf800, 0xa000, &ADD5, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xf800, 0xa800, &ADD6, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xff80, 0xb000, &ADD7, new List{Model.ARM7TDMI}), // AND - new(0xffc0, 0x4000, &AND, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x4000, &AND, new List{Model.ARM7TDMI}), // ASR - new(0xf800, 0x1000, &ASR1, [Model.ARM7TDMI]), - new(0xffc0, 0x4100, &ASR2, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x1000, &ASR1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xffc0, 0x4100, &ASR2, new List{Model.ARM7TDMI}), // B - new(0xff00, 0xd000, &B1, [Model.ARM7TDMI]), // condition field 0b0000 - new(0xff00, 0xd100, &B1, [Model.ARM7TDMI]), // condition field 0b0001 - new(0xff00, 0xd200, &B1, [Model.ARM7TDMI]), // condition field 0b0010 - new(0xff00, 0xd300, &B1, [Model.ARM7TDMI]), // condition field 0b0011 - new(0xff00, 0xd400, &B1, [Model.ARM7TDMI]), // condition field 0b0100 - new(0xff00, 0xd500, &B1, [Model.ARM7TDMI]), // condition field 0b0101 - new(0xff00, 0xd600, &B1, [Model.ARM7TDMI]), // condition field 0b0110 - new(0xff00, 0xd700, &B1, [Model.ARM7TDMI]), // condition field 0b0111 - new(0xff00, 0xd800, &B1, [Model.ARM7TDMI]), // condition field 0b1000 - new(0xff00, 0xd900, &B1, [Model.ARM7TDMI]), // condition field 0b1001 - new(0xff00, 0xda00, &B1, [Model.ARM7TDMI]), // condition field 0b1010 - new(0xff00, 0xdb00, &B1, [Model.ARM7TDMI]), // condition field 0b1011 - new(0xff00, 0xdc00, &B1, [Model.ARM7TDMI]), // condition field 0b1100 - new(0xff00, 0xdd00, &B1, [Model.ARM7TDMI]), // condition field 0b1101 - new(0xf800, 0xe000, &B2, [Model.ARM7TDMI]), + new InstructionListEntry(0xff00, 0xd000, &B1, new List{Model.ARM7TDMI}), // condition field 0b0000 + new InstructionListEntry(0xff00, 0xd100, &B1, new List{Model.ARM7TDMI}), // condition field 0b0001 + new InstructionListEntry(0xff00, 0xd200, &B1, new List{Model.ARM7TDMI}), // condition field 0b0010 + new InstructionListEntry(0xff00, 0xd300, &B1, new List{Model.ARM7TDMI}), // condition field 0b0011 + new InstructionListEntry(0xff00, 0xd400, &B1, new List{Model.ARM7TDMI}), // condition field 0b0100 + new InstructionListEntry(0xff00, 0xd500, &B1, new List{Model.ARM7TDMI}), // condition field 0b0101 + new InstructionListEntry(0xff00, 0xd600, &B1, new List{Model.ARM7TDMI}), // condition field 0b0110 + new InstructionListEntry(0xff00, 0xd700, &B1, new List{Model.ARM7TDMI}), // condition field 0b0111 + new InstructionListEntry(0xff00, 0xd800, &B1, new List{Model.ARM7TDMI}), // condition field 0b1000 + new InstructionListEntry(0xff00, 0xd900, &B1, new List{Model.ARM7TDMI}), // condition field 0b1001 + new InstructionListEntry(0xff00, 0xda00, &B1, new List{Model.ARM7TDMI}), // condition field 0b1010 + new InstructionListEntry(0xff00, 0xdb00, &B1, new List{Model.ARM7TDMI}), // condition field 0b1011 + new InstructionListEntry(0xff00, 0xdc00, &B1, new List{Model.ARM7TDMI}), // condition field 0b1100 + new InstructionListEntry(0xff00, 0xdd00, &B1, new List{Model.ARM7TDMI}), // condition field 0b1101 + new InstructionListEntry(0xf800, 0xe000, &B2, new List{Model.ARM7TDMI}), // BIC - new(0xffc0, 0x4380, &BIC, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x4380, &BIC, new List{Model.ARM7TDMI}), // BL - new(0xf000, 0xf000, &BL, [Model.ARM7TDMI]), + new InstructionListEntry(0xf000, 0xf000, &BL, new List{Model.ARM7TDMI}), // BX - new(0xff80, 0x4700, &BX, [Model.ARM7TDMI]), + new InstructionListEntry(0xff80, 0x4700, &BX, new List{Model.ARM7TDMI}), // CMN - new(0xffc0, 0x42c0, &CMN, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x42c0, &CMN, new List{Model.ARM7TDMI}), // CMP - new(0xf800, 0x2800, &CMP1, [Model.ARM7TDMI]), - new(0xffc0, 0x4280, &CMP2, [Model.ARM7TDMI]), - new(0xff00, 0x4500, &CMP3, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x2800, &CMP1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xffc0, 0x4280, &CMP2, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xff00, 0x4500, &CMP3, new List{Model.ARM7TDMI}), // EOR - new(0xffc0, 0x4040, &EOR, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x4040, &EOR, new List{Model.ARM7TDMI}), // LDMIA - new(0xf800, 0xc800, &LDMIA, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0xc800, &LDMIA, new List{Model.ARM7TDMI}), // LDR - new(0xf800, 0x6800, &LDR1, [Model.ARM7TDMI]), - new(0xfe00, 0x5800, &LDR2, [Model.ARM7TDMI]), - new(0xf800, 0x4800, &LDR3, [Model.ARM7TDMI]), - new(0xf800, 0x9800, &LDR4, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x6800, &LDR1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xfe00, 0x5800, &LDR2, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xf800, 0x4800, &LDR3, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xf800, 0x9800, &LDR4, new List{Model.ARM7TDMI}), // LDRB - new(0xf800, 0x7800, &LDRB1, [Model.ARM7TDMI]), - new(0xfe00, 0x5c00, &LDRB2, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x7800, &LDRB1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xfe00, 0x5c00, &LDRB2, new List{Model.ARM7TDMI}), // LDRH - new(0xf800, 0x8800, &LDRH1, [Model.ARM7TDMI]), - new(0xfe00, 0x5a00, &LDRH2, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x8800, &LDRH1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xfe00, 0x5a00, &LDRH2, new List{Model.ARM7TDMI}), // LDRSB - new(0xfe00, 0x5600, &LDRSB, [Model.ARM7TDMI]), + new InstructionListEntry(0xfe00, 0x5600, &LDRSB, new List{Model.ARM7TDMI}), // LDRSH - new(0xfe00, 0x5e00, &LDRSH, [Model.ARM7TDMI]), + new InstructionListEntry(0xfe00, 0x5e00, &LDRSH, new List{Model.ARM7TDMI}), // LSL - new(0xf800, 0x0000, &LSL1, [Model.ARM7TDMI]), - new(0xffc0, 0x4080, &LSL2, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x0000, &LSL1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xffc0, 0x4080, &LSL2, new List{Model.ARM7TDMI}), // LSR - new(0xf800, 0x0800, &LSR1, [Model.ARM7TDMI]), - new(0xffc0, 0x40c0, &LSR2, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x0800, &LSR1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xffc0, 0x40c0, &LSR2, new List{Model.ARM7TDMI}), // MOV - new(0xf800, 0x2000, &MOV1, [Model.ARM7TDMI]), - //new(0xffc0, 0x1c00, &MOV2, new List{ Model.ARM7TDMI }), - new(0xff00, 0x4600, &MOV3, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x2000, &MOV1, new List{Model.ARM7TDMI}), + //new InstructionListEntry(0xffc0, 0x1c00, &MOV2, new List{ Model.ARM7TDMI }), + new InstructionListEntry(0xff00, 0x4600, &MOV3, new List{Model.ARM7TDMI}), // MUL - new(0xffc0, 0x4340, &MUL, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x4340, &MUL, new List{Model.ARM7TDMI}), // MVN - new(0xffc0, 0x43c0, &MVN, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x43c0, &MVN, new List{Model.ARM7TDMI}), // NEG - new(0xffc0, 0x4240, &NEG, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x4240, &NEG, new List{Model.ARM7TDMI}), // ORR - new(0xffc0, 0x4300, &ORR, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x4300, &ORR, new List{Model.ARM7TDMI}), // POP - new(0xfe00, 0xbc00, &POP, [Model.ARM7TDMI]), + new InstructionListEntry(0xfe00, 0xbc00, &POP, new List{Model.ARM7TDMI}), // PUSH - new(0xfe00, 0xb400, &PUSH, [Model.ARM7TDMI]), + new InstructionListEntry(0xfe00, 0xb400, &PUSH, new List{Model.ARM7TDMI}), // ROR - new(0xffc0, 0x41c0, &ROR, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x41c0, &ROR, new List{Model.ARM7TDMI}), // SBC - new(0xffc0, 0x4180, &SBC, [Model.ARM7TDMI]), + new InstructionListEntry(0xffc0, 0x4180, &SBC, new List{Model.ARM7TDMI}), // STMIA - new(0xf800, 0xc000, &STMIA, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0xc000, &STMIA, new List{Model.ARM7TDMI}), // STR - new(0xf800, 0x6000, &STR1, [Model.ARM7TDMI]), - new(0xfe00, 0x5000, &STR2, [Model.ARM7TDMI]), - new(0xf800, 0x9000, &STR3, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x6000, &STR1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xfe00, 0x5000, &STR2, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xf800, 0x9000, &STR3, new List{Model.ARM7TDMI}), // STRB - new(0xf800, 0x7000, &STRB1, [Model.ARM7TDMI]), - new(0xfe00, 0x5400, &STRB2, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x7000, &STRB1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xfe00, 0x5400, &STRB2, new List{Model.ARM7TDMI}), // STRH - new(0xf800, 0x8000, &STRH1, [Model.ARM7TDMI]), - new(0xfe00, 0x5200, &STRH2, [Model.ARM7TDMI]), + new InstructionListEntry(0xf800, 0x8000, &STRH1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xfe00, 0x5200, &STRH2, new List{Model.ARM7TDMI}), // SUB - new(0xfe00, 0x1e00, &SUB1, [Model.ARM7TDMI]), - new(0xf800, 0x3800, &SUB2, [Model.ARM7TDMI]), - new(0xfe00, 0x1a00, &SUB3, [Model.ARM7TDMI]), - new(0xff80, 0xb080, &SUB4, [Model.ARM7TDMI]), + new InstructionListEntry(0xfe00, 0x1e00, &SUB1, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xf800, 0x3800, &SUB2, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xfe00, 0x1a00, &SUB3, new List{Model.ARM7TDMI}), + new InstructionListEntry(0xff80, 0xb080, &SUB4, new List{Model.ARM7TDMI}), // SWI - new(0xff00, 0xdf00, &SWI, [Model.ARM7TDMI]), + new InstructionListEntry(0xff00, 0xdf00, &SWI, new List{Model.ARM7TDMI}), // TST - new(0xffc0, 0x4200, &TST, [Model.ARM7TDMI]), - ]; + new InstructionListEntry(0xffc0, 0x4200, &TST, new List{Model.ARM7TDMI}), + }; for (UInt16 instruction = 0; instruction < _instructionLUT.Length; ++instruction) { @@ -196,12 +197,14 @@ namespace Iris.CPU UInt16 instruction = _cpu._callbackInterface._read16(_cpu.NextInstructionAddress); _cpu.NextInstructionAddress += 2; - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(_cpu.Reg); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(_cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(_cpu.Reg); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); regPC = _cpu.NextInstructionAddress + 2; - ref InstructionLUTEntry instructionLUTDataRef = ref MemoryMarshal.GetArrayDataReference(_instructionLUT); + //ref InstructionLUTEntry instructionLUTDataRef = ref MyUnSafeCommon.GetArrayDataReference(_instructionLUT); + ref InstructionLUTEntry instructionLUTDataRef = ref MyUnSafeCommon.GetArrayDataReference(_instructionLUT); ref InstructionLUTEntry instructionLUTEntry = ref Unsafe.Add(ref instructionLUTDataRef, InstructionLUTHash(instruction)); unsafe @@ -224,8 +227,9 @@ namespace Iris.CPU } else { - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, i); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, (int)i); regRi = value; } @@ -241,9 +245,10 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 leftOperand = regRd; UInt32 rightOperand = regRm; @@ -265,9 +270,10 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 leftOperand = regRn; UInt32 rightOperand = imm; @@ -288,8 +294,9 @@ namespace Iris.CPU UInt16 rd = (UInt16)((instruction >> 8) & 0b111); UInt16 imm = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 leftOperand = regRd; UInt32 rightOperand = imm; @@ -311,10 +318,11 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 leftOperand = regRn; UInt32 rightOperand = regRm; @@ -340,9 +348,10 @@ namespace Iris.CPU rd |= (UInt16)(h1 << 3); rm |= (UInt16)(h2 << 3); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); SetReg(cpu, rd, regRd + regRm); @@ -354,9 +363,10 @@ namespace Iris.CPU UInt16 rd = (UInt16)((instruction >> 8) & 0b111); UInt16 imm = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); regRd = (regPC & 0xffff_fffc) + (imm * 4u); @@ -368,9 +378,10 @@ namespace Iris.CPU UInt16 rd = (UInt16)((instruction >> 8) & 0b111); UInt16 imm = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); - ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, SP); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); + ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, (int)SP); regRd = regSP + (imm * 4u); @@ -381,8 +392,9 @@ namespace Iris.CPU { UInt16 imm = (UInt16)(instruction & 0x7f); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, SP); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, (int)SP); regSP += imm * 4u; @@ -394,9 +406,10 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); regRd &= regRm; @@ -412,9 +425,10 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); int shiftAmount = imm; @@ -440,9 +454,10 @@ namespace Iris.CPU UInt16 rs = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); int shiftAmount = (int)(regRs & 0xff); @@ -474,8 +489,9 @@ namespace Iris.CPU if (cpu.ConditionPassed(cond)) { - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); SetPC(cpu, regPC + (SignExtend(imm, 8) << 1)); @@ -491,8 +507,9 @@ namespace Iris.CPU { UInt16 imm = (UInt16)(instruction & 0x7ff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); SetPC(cpu, regPC + (SignExtend(imm, 11) << 1)); @@ -504,9 +521,10 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); regRd &= ~regRm; @@ -521,12 +539,13 @@ namespace Iris.CPU UInt16 h = (UInt16)((instruction >> 11) & 0b11); UInt16 offset = (UInt16)(instruction & 0x7ff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regLR = ref Unsafe.Add(ref regDataRef, LR); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regLR = ref Unsafe.Add(ref regDataRef, (int)LR); if (h == 0b10) { - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); regLR = regPC + (SignExtend(offset, 11) << 12); } @@ -549,8 +568,9 @@ namespace Iris.CPU rm |= (UInt16)(h2 << 3); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); cpu.CPSR = (cpu.CPSR & ~(1u << 5)) | ((regRm & 1) << 5); SetPC(cpu, regRm); @@ -563,9 +583,10 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rn = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); UInt32 leftOperand = regRn; UInt32 rightOperand = regRm; @@ -586,8 +607,9 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 8) & 0b111); UInt16 imm = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); UInt32 leftOperand = regRn; UInt32 rightOperand = imm; @@ -608,9 +630,10 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rn = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); UInt32 leftOperand = regRn; UInt32 rightOperand = regRm; @@ -636,9 +659,10 @@ namespace Iris.CPU rn |= (UInt16)(h1 << 3); rm |= (UInt16)(h2 << 3); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + //ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); UInt32 leftOperand = regRn; UInt32 rightOperand = regRm; @@ -659,9 +683,9 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); regRd ^= regRm; @@ -676,8 +700,8 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 8) & 0b111); UInt16 registerList = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); UInt32 address = regRn; @@ -690,14 +714,14 @@ namespace Iris.CPU } else { - UInt32 n = (UInt32)BitOperations.PopCount(registerList); + UInt32 n = (UInt32)MyBitOperations.PopCount(registerList); regRn += n * 4; for (int i = 0; i <= 7; ++i) { if (((registerList >> i) & 1) == 1) { - ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, i); + ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, (int)i); regRi = cpu._callbackInterface._read32(address); address += 4; @@ -714,12 +738,12 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + (imm * 4u); - UInt32 data = BitOperations.RotateRight(cpu._callbackInterface._read32(address), (int)(8 * (address & 0b11))); + UInt32 data = MyBitOperations.RotateRight(cpu._callbackInterface._read32(address), (int)(8 * (address & 0b11))); regRd = data; return 3; @@ -731,13 +755,13 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + regRm; - UInt32 data = BitOperations.RotateRight(cpu._callbackInterface._read32(address), (int)(8 * (address & 0b11))); + UInt32 data = MyBitOperations.RotateRight(cpu._callbackInterface._read32(address), (int)(8 * (address & 0b11))); regRd = data; return 3; @@ -748,9 +772,9 @@ namespace Iris.CPU UInt16 rd = (UInt16)((instruction >> 8) & 0b111); UInt16 imm = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); UInt32 address = regPC + (imm * 4u); UInt32 data = cpu._callbackInterface._read32(address); @@ -764,12 +788,12 @@ namespace Iris.CPU UInt16 rd = (UInt16)((instruction >> 8) & 0b111); UInt16 imm = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); - ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, SP); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); + ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, (int)SP); UInt32 address = regSP + (imm * 4u); - UInt32 data = BitOperations.RotateRight(cpu._callbackInterface._read32(address), (int)(8 * (address & 0b11))); + UInt32 data = MyBitOperations.RotateRight(cpu._callbackInterface._read32(address), (int)(8 * (address & 0b11))); regRd = data; return 3; @@ -781,9 +805,9 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + imm; Byte data = cpu._callbackInterface._read8(address); @@ -798,10 +822,10 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + regRm; Byte data = cpu._callbackInterface._read8(address); @@ -816,12 +840,12 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + (imm * 2u); - UInt32 data = BitOperations.RotateRight(cpu._callbackInterface._read16(address), (int)(8 * (address & 1))); + UInt32 data = MyBitOperations.RotateRight(cpu._callbackInterface._read16(address), (int)(8 * (address & 1))); regRd = data; return 3; @@ -833,13 +857,13 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + regRm; - UInt32 data = BitOperations.RotateRight(cpu._callbackInterface._read16(address), (int)(8 * (address & 1))); + UInt32 data = MyBitOperations.RotateRight(cpu._callbackInterface._read16(address), (int)(8 * (address & 1))); regRd = data; return 3; @@ -851,10 +875,10 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + regRm; Byte data = cpu._callbackInterface._read8(address); @@ -869,10 +893,10 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + regRm; @@ -896,9 +920,9 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); int shiftAmount = imm; @@ -923,9 +947,9 @@ namespace Iris.CPU UInt16 rs = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); int shiftAmount = (int)(regRs & 0xff); @@ -961,9 +985,9 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); int shiftAmount = imm; @@ -989,9 +1013,9 @@ namespace Iris.CPU UInt16 rs = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); int shiftAmount = (int)(regRs & 0xff); @@ -1026,8 +1050,8 @@ namespace Iris.CPU UInt16 rd = (UInt16)((instruction >> 8) & 0b111); UInt16 imm = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); regRd = imm; @@ -1047,8 +1071,8 @@ namespace Iris.CPU rd |= (UInt16)(h1 << 3); rm |= (UInt16)(h2 << 3); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); SetReg(cpu, rd, regRm); @@ -1060,9 +1084,9 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt64 m = ComputeMultiplicationCycleCount(regRd, regRm); regRd *= regRm; @@ -1078,9 +1102,9 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); regRd = ~regRm; @@ -1095,9 +1119,9 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 leftOperand = 0; UInt32 rightOperand = regRm; @@ -1118,9 +1142,9 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); regRd |= regRm; @@ -1135,10 +1159,10 @@ namespace Iris.CPU UInt16 r = (UInt16)((instruction >> 8) & 1); UInt16 registerList = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, SP); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, (int)SP); - UInt32 n = (UInt32)BitOperations.PopCount(registerList); + UInt32 n = (UInt32)MyBitOperations.PopCount(registerList); UInt32 address = regSP; regSP += 4 * (r + n); @@ -1146,7 +1170,7 @@ namespace Iris.CPU { if (((registerList >> i) & 1) == 1) { - ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, i); + ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, (int)i); regRi = cpu._callbackInterface._read32(address); address += 4; @@ -1170,10 +1194,10 @@ namespace Iris.CPU UInt16 r = (UInt16)((instruction >> 8) & 1); UInt16 registerList = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, SP); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, (int)SP); - UInt32 n = (UInt32)BitOperations.PopCount(registerList); + UInt32 n = (UInt32)MyBitOperations.PopCount(registerList); regSP -= 4 * (r + n); UInt32 address = regSP; @@ -1181,7 +1205,7 @@ namespace Iris.CPU { if (((registerList >> i) & 1) == 1) { - ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, i); + ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, (int)i); cpu._callbackInterface._write32(address, regRi); address += 4; @@ -1190,7 +1214,7 @@ namespace Iris.CPU if (r == 1) { - ref UInt32 regLR = ref Unsafe.Add(ref regDataRef, LR); + ref UInt32 regLR = ref Unsafe.Add(ref regDataRef, (int)LR); cpu._callbackInterface._write32(address, regLR); @@ -1207,9 +1231,9 @@ namespace Iris.CPU UInt16 rs = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, rs); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRs = ref Unsafe.Add(ref regDataRef, (int)rs); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); if ((regRs & 0xff) == 0) { @@ -1222,7 +1246,7 @@ namespace Iris.CPU else { cpu.SetFlag(Flag.C, (regRd >> (int)((regRs & 0b1_1111) - 1)) & 1); - regRd = BitOperations.RotateRight(regRd, (int)(regRs & 0b1_1111)); + regRd = MyBitOperations.RotateRight(regRd, (int)(regRs & 0b1_1111)); } cpu.SetFlag(Flag.N, regRd >> 31); @@ -1236,9 +1260,9 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 leftOperand = regRd; UInt32 rightOperand = regRm; @@ -1259,14 +1283,14 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 8) & 0b111); UInt16 registerList = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); UInt32 address = regRn; if (registerList == 0) { - ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, PC); + ref UInt32 regPC = ref Unsafe.Add(ref regDataRef, (int)PC); regRn += 0x40; cpu._callbackInterface._write32(address, regPC + 2); @@ -1275,7 +1299,7 @@ namespace Iris.CPU } else { - UInt32 n = (UInt32)BitOperations.PopCount(registerList); + UInt32 n = (UInt32)MyBitOperations.PopCount(registerList); UInt32 oldRegRn = regRn; regRn += n * 4; @@ -1289,7 +1313,7 @@ namespace Iris.CPU } else { - ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, i); + ref UInt32 regRi = ref Unsafe.Add(ref regDataRef, (int)i); cpu._callbackInterface._write32(address, regRi); } @@ -1308,9 +1332,9 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + (imm * 4u); cpu._callbackInterface._write32(address, regRd); @@ -1324,10 +1348,10 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + regRm; cpu._callbackInterface._write32(address, regRd); @@ -1340,9 +1364,9 @@ namespace Iris.CPU UInt16 rd = (UInt16)((instruction >> 8) & 0b111); UInt16 imm = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); - ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, SP); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); + ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, (int)SP); UInt32 address = regSP + (imm * 4u); cpu._callbackInterface._write32(address, regRd); @@ -1356,9 +1380,9 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + imm; cpu._callbackInterface._write8(address, (Byte)regRd); @@ -1372,10 +1396,10 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + regRm; cpu._callbackInterface._write8(address, (Byte)regRd); @@ -1389,9 +1413,9 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + (imm * 2u); cpu._callbackInterface._write16(address, (UInt16)regRd); @@ -1405,10 +1429,10 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 address = regRn + regRm; cpu._callbackInterface._write16(address, (UInt16)regRd); @@ -1422,9 +1446,9 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 leftOperand = regRn; UInt32 rightOperand = imm; @@ -1445,8 +1469,8 @@ namespace Iris.CPU UInt16 rd = (UInt16)((instruction >> 8) & 0b111); UInt16 imm = (UInt16)(instruction & 0xff); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 leftOperand = regRd; UInt32 rightOperand = imm; @@ -1468,10 +1492,10 @@ namespace Iris.CPU UInt16 rn = (UInt16)((instruction >> 3) & 0b111); UInt16 rd = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); - ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, rd); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); + ref UInt32 regRd = ref Unsafe.Add(ref regDataRef, (int)rd); UInt32 leftOperand = regRn; UInt32 rightOperand = regRm; @@ -1491,8 +1515,8 @@ namespace Iris.CPU { UInt16 imm = (UInt16)(instruction & 0x7f); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, SP); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regSP = ref Unsafe.Add(ref regDataRef, (int)SP); regSP -= (UInt32)imm << 2; @@ -1509,9 +1533,9 @@ namespace Iris.CPU UInt16 rm = (UInt16)((instruction >> 3) & 0b111); UInt16 rn = (UInt16)(instruction & 0b111); - ref UInt32 regDataRef = ref MemoryMarshal.GetArrayDataReference(cpu.Reg); - ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, rm); - ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, rn); + ref UInt32 regDataRef = ref MyUnSafeCommon.GetArrayDataReference(cpu.Reg); + ref UInt32 regRm = ref Unsafe.Add(ref regDataRef, (int)rm); + ref UInt32 regRn = ref Unsafe.Add(ref regDataRef, (int)rn); UInt32 aluOut = regRn & regRm; diff --git a/Assets/Iris/Iris.Common/Scheduler.cs b/Assets/Iris/Iris.Common/Scheduler.cs index e88761e..e760202 100644 --- a/Assets/Iris/Iris.Common/Scheduler.cs +++ b/Assets/Iris/Iris.Common/Scheduler.cs @@ -1,13 +1,20 @@ using System; +using System.IO; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace Iris.Common { - public sealed class Scheduler(int taskListSize, int scheduledTaskListSize) + public sealed class Scheduler { + public Scheduler(int taskListSize, int scheduledTaskListSize) + { + _taskList = new Task_Delegate[taskListSize]; + _scheduledTaskList = new ScheduledTaskListEntry[scheduledTaskListSize]; + } public delegate void Task_Delegate(UInt64 cycleCountDelay); - private readonly Task_Delegate[] _taskList = new Task_Delegate[taskListSize]; + private readonly Task_Delegate[] _taskList; + //private readonly Task_Delegate[] _taskList = new Task_Delegate[taskListSize]; private struct ScheduledTaskListEntry { @@ -15,7 +22,7 @@ namespace Iris.Common internal UInt64 _cycleCount; } - private readonly ScheduledTaskListEntry[] _scheduledTaskList = new ScheduledTaskListEntry[scheduledTaskListSize]; // sorted by _cycleCount from smallest to largest + private readonly ScheduledTaskListEntry[] _scheduledTaskList; // sorted by _cycleCount from smallest to largest private int _scheduledTaskCount; private UInt64 _cycleCounter; @@ -60,9 +67,14 @@ namespace Iris.Common { _cycleCounter += cycleCount; + // process tasks - ref readonly ScheduledTaskListEntry firstEntry = ref MemoryMarshal.GetArrayDataReference(_scheduledTaskList); - ref Task_Delegate taskListDataRef = ref MemoryMarshal.GetArrayDataReference(_taskList); + + //ref readonly ScheduledTaskListEntry firstEntry = ref UnSafeCommon.GetArrayDataReference(_scheduledTaskList); + //ref Task_Delegate taskListDataRef = ref UnSafeCommon.GetArrayDataReference(_taskList); + + ref readonly ScheduledTaskListEntry firstEntry = ref MyUnSafeCommon.GetArrayDataReference(_scheduledTaskList); + ref Task_Delegate taskListDataRef = ref MyUnSafeCommon.GetArrayDataReference(_taskList); while ((_scheduledTaskCount > 0) && (firstEntry._cycleCount <= _cycleCounter)) { @@ -93,7 +105,8 @@ namespace Iris.Common // get the position and reference of the new task // (searching is done backward because a new task is more likely to be inserted towards the end) int index = _scheduledTaskCount; - ref ScheduledTaskListEntry entry = ref Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_scheduledTaskList), _scheduledTaskCount - 1); + //ref ScheduledTaskListEntry entry = ref Unsafe.Add(ref MyUnSafeCommon.GetArrayDataReference(_scheduledTaskList), _scheduledTaskCount - 1); + ref ScheduledTaskListEntry entry = ref Unsafe.Add(ref MyUnSafeCommon.GetArrayDataReference(_scheduledTaskList), _scheduledTaskCount - 1); while ((index > 0) && (entry._cycleCount > cycleCount)) { @@ -116,7 +129,8 @@ namespace Iris.Common public void CancelTask(int id) { int index = 0; - ref ScheduledTaskListEntry entry = ref MemoryMarshal.GetArrayDataReference(_scheduledTaskList); + //ref ScheduledTaskListEntry entry = ref MyUnSafeCommon.GetArrayDataReference(_scheduledTaskList); + ref ScheduledTaskListEntry entry = ref MyUnSafeCommon.GetArrayDataReference(_scheduledTaskList); while (index < _scheduledTaskCount) { diff --git a/Assets/Iris/Iris.Common/System.cs b/Assets/Iris/Iris.Common/System.cs index e98796b..f39846f 100644 --- a/Assets/Iris/Iris.Common/System.cs +++ b/Assets/Iris/Iris.Common/System.cs @@ -1,4 +1,7 @@ -namespace Iris.Common +using System; +using System.IO; + +namespace Iris.Common { public abstract class System : IDisposable { diff --git a/Assets/Iris/Iris.GBA/BIOS.cs b/Assets/Iris/Iris.GBA/BIOS.cs index f7868d4..497d086 100644 --- a/Assets/Iris/Iris.GBA/BIOS.cs +++ b/Assets/Iris/Iris.GBA/BIOS.cs @@ -1,4 +1,6 @@ -using System.Runtime.InteropServices; +using System; +using System.IO; +using System.Runtime.InteropServices; namespace Iris.GBA { diff --git a/Assets/Iris/Iris.GBA/Communication.cs b/Assets/Iris/Iris.GBA/Communication.cs index 480f068..e565ac6 100644 --- a/Assets/Iris/Iris.GBA/Communication.cs +++ b/Assets/Iris/Iris.GBA/Communication.cs @@ -1,4 +1,7 @@ -namespace Iris.GBA +using System; +using System.IO; + +namespace Iris.GBA { internal sealed class Communication { diff --git a/Assets/Iris/Iris.GBA/DMA.cs b/Assets/Iris/Iris.GBA/DMA.cs index f91b7b9..9083018 100644 --- a/Assets/Iris/Iris.GBA/DMA.cs +++ b/Assets/Iris/Iris.GBA/DMA.cs @@ -1,4 +1,6 @@ -using System.Runtime.CompilerServices; +using System; +using System.IO; +using System.Runtime.CompilerServices; namespace Iris.GBA { @@ -414,10 +416,15 @@ namespace Iris.GBA const int DataUnitSize = 2; int sourceIncrement = GetSourceIncrement(DataUnitSize); - (int destinationIncrement, reloadDestination) = GetDestinationIncrement(DataUnitSize); + //(int destinationIncrement, reloadDestination) = GetDestinationIncrement(DataUnitSize); + + var v2 = GetDestinationIncrement(DataUnitSize); + int destinationIncrement = v2.destinationIncrement; + reloadDestination = v2.reloadDestination; for (; channel._length > 0; --channel._length) { + //_memory.Write16(channel._destination, _memory.Read16(channel._source)); _memory.Write16(channel._destination, _memory.Read16(channel._source)); channel._source = (UInt32)(channel._source + sourceIncrement); @@ -433,7 +440,10 @@ namespace Iris.GBA const int DataUnitSize = 4; int sourceIncrement = GetSourceIncrement(DataUnitSize); - (int destinationIncrement, reloadDestination) = GetDestinationIncrement(DataUnitSize); + //(int destinationIncrement, reloadDestination) = GetDestinationIncrement(DataUnitSize); + var v2 = GetDestinationIncrement(DataUnitSize); + int destinationIncrement = v2.destinationIncrement; + reloadDestination = v2.reloadDestination; for (; channel._length > 0; --channel._length) { diff --git a/Assets/Iris/Iris.GBA/GBA_System.cs b/Assets/Iris/Iris.GBA/GBA_System.cs index 17b6b3e..27f7b0a 100644 --- a/Assets/Iris/Iris.GBA/GBA_System.cs +++ b/Assets/Iris/Iris.GBA/GBA_System.cs @@ -1,4 +1,6 @@ -using System.Security.Cryptography; +using System; +using System.IO; +using System.Security.Cryptography; namespace Iris.GBA { diff --git a/Assets/Iris/Iris.GBA/InterruptControl.cs b/Assets/Iris/Iris.GBA/InterruptControl.cs index 233898c..06ec4a9 100644 --- a/Assets/Iris/Iris.GBA/InterruptControl.cs +++ b/Assets/Iris/Iris.GBA/InterruptControl.cs @@ -1,4 +1,6 @@ -using System.Runtime.CompilerServices; +using System; +using System.IO; +using System.Runtime.CompilerServices; namespace Iris.GBA { diff --git a/Assets/Iris/Iris.GBA/KeyInput.cs b/Assets/Iris/Iris.GBA/KeyInput.cs index 1073613..ee024bd 100644 --- a/Assets/Iris/Iris.GBA/KeyInput.cs +++ b/Assets/Iris/Iris.GBA/KeyInput.cs @@ -1,4 +1,6 @@ -using System.Runtime.CompilerServices; +using System; +using System.IO; +using System.Runtime.CompilerServices; namespace Iris.GBA { diff --git a/Assets/Iris/Iris.GBA/Memory.cs b/Assets/Iris/Iris.GBA/Memory.cs index 4b4a6f9..bb50b7f 100644 --- a/Assets/Iris/Iris.GBA/Memory.cs +++ b/Assets/Iris/Iris.GBA/Memory.cs @@ -1,4 +1,7 @@ -using System.Runtime.CompilerServices; +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace Iris.GBA @@ -226,7 +229,7 @@ namespace Iris.GBA { address &= 0x0fff_ffff; - IntPtr page = Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_read8PageTable), address >> 10); + IntPtr page = Unsafe.Add(ref MyUnSafeCommon.GetArrayDataReference(_read8PageTable), (int)(address >> 10)); if (page != IntPtr.Zero) { @@ -507,7 +510,7 @@ namespace Iris.GBA { address &= 0x0fff_fffe; - IntPtr page = Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_read16PageTable), address >> 10); + IntPtr page = Unsafe.Add(ref MyUnSafeCommon.GetArrayDataReference(_read16PageTable), (int)(address >> 10)); if (page != IntPtr.Zero) { @@ -655,7 +658,7 @@ namespace Iris.GBA { address &= 0x0fff_fffc; - IntPtr page = Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_read32PageTable), address >> 10); + IntPtr page = Unsafe.Add(ref MyUnSafeCommon.GetArrayDataReference(_read32PageTable), (int)(address >> 10)); if (page != IntPtr.Zero) { @@ -778,7 +781,7 @@ namespace Iris.GBA { address &= 0x0fff_ffff; - IntPtr page = Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_write8PageTable), address >> 10); + IntPtr page = Unsafe.Add(ref MyUnSafeCommon.GetArrayDataReference(_write8PageTable), (int)(address >> 10)); if (page != IntPtr.Zero) { @@ -1499,7 +1502,7 @@ namespace Iris.GBA { address &= 0x0fff_fffe; - IntPtr page = Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_write16PageTable), address >> 10); + IntPtr page = Unsafe.Add(ref MyUnSafeCommon.GetArrayDataReference(_write16PageTable), (int)(address >> 10)); if (page != IntPtr.Zero) { @@ -1883,7 +1886,7 @@ namespace Iris.GBA { address &= 0x0fff_fffc; - IntPtr page = Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(_write32PageTable), address >> 10); + IntPtr page = Unsafe.Add(ref MyUnSafeCommon.GetArrayDataReference(_write32PageTable), (int)(address >> 10)); if (page != IntPtr.Zero) { diff --git a/Assets/Iris/Iris.GBA/Sound.cs b/Assets/Iris/Iris.GBA/Sound.cs index 9c8a784..6aa8ea2 100644 --- a/Assets/Iris/Iris.GBA/Sound.cs +++ b/Assets/Iris/Iris.GBA/Sound.cs @@ -1,4 +1,7 @@ -namespace Iris.GBA +using System; +using System.IO; + +namespace Iris.GBA { internal sealed class Sound { diff --git a/Assets/Iris/Iris.GBA/SystemControl.cs b/Assets/Iris/Iris.GBA/SystemControl.cs index aed81e8..2bf2ac2 100644 --- a/Assets/Iris/Iris.GBA/SystemControl.cs +++ b/Assets/Iris/Iris.GBA/SystemControl.cs @@ -1,4 +1,7 @@ -namespace Iris.GBA +using System; +using System.IO; + +namespace Iris.GBA { internal sealed class SystemControl { diff --git a/Assets/Iris/Iris.GBA/Timer.cs b/Assets/Iris/Iris.GBA/Timer.cs index ba0f96d..abcafb6 100644 --- a/Assets/Iris/Iris.GBA/Timer.cs +++ b/Assets/Iris/Iris.GBA/Timer.cs @@ -1,4 +1,7 @@ -using System.Runtime.CompilerServices; +using System; +using System.IO; +using System.Runtime.CompilerServices; +using static UnityEditor.Experimental.AssetDatabaseExperimental.AssetDatabaseCounters; namespace Iris.GBA { @@ -23,17 +26,43 @@ namespace Iris.GBA private InterruptControl _interruptControl; - private struct Channel(GBA_System.TaskId startTaskId, GBA_System.TaskId handleOverflowTaskId, InterruptControl.Interrupt interrupt) + //private struct Channel(GBA_System.TaskId startTaskId, GBA_System.TaskId handleOverflowTaskId, InterruptControl.Interrupt interrupt) + //{ + // internal UInt16 _counter; + // internal UInt16 _reload; + // internal UInt16 _control; + // internal UInt64 _cycleCount; // only used in non-cascading mode + // internal bool _running; + + // internal readonly GBA_System.TaskId _startTaskId = startTaskId; + // internal readonly GBA_System.TaskId _handleOverflowTaskId = handleOverflowTaskId; + // internal readonly InterruptControl.Interrupt _interrupt = interrupt; + //} + + private struct Channel { + internal Channel(GBA_System.TaskId startTaskId, GBA_System.TaskId handleOverflowTaskId, InterruptControl.Interrupt interrupt) + { + _startTaskId = startTaskId; + _handleOverflowTaskId = handleOverflowTaskId; + _interrupt = interrupt; + + _counter = 0; + _reload = 0; + _control = 0; + _cycleCount = 0; + _running = false; + + } internal UInt16 _counter; internal UInt16 _reload; internal UInt16 _control; internal UInt64 _cycleCount; // only used in non-cascading mode internal bool _running; - internal readonly GBA_System.TaskId _startTaskId = startTaskId; - internal readonly GBA_System.TaskId _handleOverflowTaskId = handleOverflowTaskId; - internal readonly InterruptControl.Interrupt _interrupt = interrupt; + internal readonly GBA_System.TaskId _startTaskId; + internal readonly GBA_System.TaskId _handleOverflowTaskId; + internal readonly InterruptControl.Interrupt _interrupt; } private readonly Channel[] _channels; @@ -42,13 +71,13 @@ namespace Iris.GBA { _scheduler = scheduler; - _channels = - [ - new(GBA_System.TaskId.StartTimer_Channel0, GBA_System.TaskId.HandleTimerOverflow_Channel0, InterruptControl.Interrupt.Timer0), - new(GBA_System.TaskId.StartTimer_Channel1, GBA_System.TaskId.HandleTimerOverflow_Channel1, InterruptControl.Interrupt.Timer1), - new(GBA_System.TaskId.StartTimer_Channel2, GBA_System.TaskId.HandleTimerOverflow_Channel2, InterruptControl.Interrupt.Timer2), - new(GBA_System.TaskId.StartTimer_Channel3, GBA_System.TaskId.HandleTimerOverflow_Channel3, InterruptControl.Interrupt.Timer3) - ]; + _channels = new Channel[] + { + new Channel(GBA_System.TaskId.StartTimer_Channel0, GBA_System.TaskId.HandleTimerOverflow_Channel0, InterruptControl.Interrupt.Timer0), + new Channel(GBA_System.TaskId.StartTimer_Channel1, GBA_System.TaskId.HandleTimerOverflow_Channel1, InterruptControl.Interrupt.Timer1), + new Channel(GBA_System.TaskId.StartTimer_Channel2, GBA_System.TaskId.HandleTimerOverflow_Channel2, InterruptControl.Interrupt.Timer2), + new Channel(GBA_System.TaskId.StartTimer_Channel3, GBA_System.TaskId.HandleTimerOverflow_Channel3, InterruptControl.Interrupt.Timer3) + }; for (int channelIndex = 0; channelIndex < 4; ++channelIndex) { @@ -333,7 +362,8 @@ namespace Iris.GBA } } - private static UInt64 ComputeCycleCountUntilOverflow(ref readonly Channel channel) + //private static UInt64 ComputeCycleCountUntilOverflow(ref readonly Channel channel) + private static UInt64 ComputeCycleCountUntilOverflow(ref Channel channel) { return (0x1_0000u - channel._counter) * GetPrescaler(channel._control); } diff --git a/Assets/Iris/Iris.GBA/Video.cs b/Assets/Iris/Iris.GBA/Video.cs index 64a570d..53db5f4 100644 --- a/Assets/Iris/Iris.GBA/Video.cs +++ b/Assets/Iris/Iris.GBA/Video.cs @@ -1,4 +1,6 @@ -using System.Runtime.CompilerServices; +using System; +using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace Iris.GBA @@ -265,7 +267,7 @@ namespace Iris.GBA _scheduler.ScheduleTask((int)GBA_System.TaskId.StartHBlank, HDrawCycleCount); - Array.Clear(_displayFrameBuffer); + Array.Clear(_displayFrameBuffer,0, _displayFrameBuffer.Length); _currentBG2X = 0; _currentBG2Y = 0; @@ -674,7 +676,8 @@ namespace Iris.GBA _dma.PerformVideoTransfer(false); _presentFrameCallback(_displayFrameBuffer); - Array.Clear(_displayFrameBuffer); + //Array.Clear(_displayFrameBuffer); + Array.Clear(_displayFrameBuffer,0, _displayFrameBuffer.Length); _currentBG2X = ((_BG2X_H << 20) | (_BG2X_L << 4)) >> 4; _currentBG2Y = ((_BG2Y_H << 20) | (_BG2Y_L << 4)) >> 4; @@ -859,7 +862,7 @@ namespace Iris.GBA { if ((_DISPCNT & 0x0400) == 0x0400) { - ref UInt16 displayFrameBufferDataRef = ref MemoryMarshal.GetArrayDataReference(_displayFrameBuffer); + ref UInt16 displayFrameBufferDataRef = ref MyUnSafeCommon.GetArrayDataReference(_displayFrameBuffer); int pixelNumberBegin = _VCOUNT * DisplayScreenWidth; int pixelNumberEnd = pixelNumberBegin + DisplayScreenWidth; @@ -886,7 +889,7 @@ namespace Iris.GBA { if ((_DISPCNT & 0x0400) == 0x0400) { - ref UInt16 displayFrameBufferDataRef = ref MemoryMarshal.GetArrayDataReference(_displayFrameBuffer); + ref UInt16 displayFrameBufferDataRef = ref MyUnSafeCommon.GetArrayDataReference(_displayFrameBuffer); int pixelNumberBegin = _VCOUNT * DisplayScreenWidth; int pixelNumberEnd = pixelNumberBegin + DisplayScreenWidth; @@ -921,7 +924,7 @@ namespace Iris.GBA if (_VCOUNT < VRAM_FrameBufferHeight) { - ref UInt16 displayFrameBufferDataRef = ref MemoryMarshal.GetArrayDataReference(_displayFrameBuffer); + ref UInt16 displayFrameBufferDataRef = ref MyUnSafeCommon.GetArrayDataReference(_displayFrameBuffer); int vramPixelNumberBegin = _VCOUNT * VRAM_FrameBufferWidth; int vramPixelNumberEnd = vramPixelNumberBegin + VRAM_FrameBufferWidth; @@ -950,7 +953,7 @@ namespace Iris.GBA private void RenderTextBackground(UInt16 cnt, UInt16 hofs, UInt16 vofs, bool isFirst) { - ref UInt16 displayFrameBufferDataRef = ref MemoryMarshal.GetArrayDataReference(_displayFrameBuffer); + ref UInt16 displayFrameBufferDataRef = ref MyUnSafeCommon.GetArrayDataReference(_displayFrameBuffer); int displayPixelNumberBegin = _VCOUNT * DisplayScreenWidth; @@ -1068,7 +1071,7 @@ namespace Iris.GBA private void RenderRotationScalingBackground(UInt16 cnt, Int32 x, Int32 y, UInt16 pa, UInt16 pc, bool isFirst) { - ref UInt16 displayFrameBufferDataRef = ref MemoryMarshal.GetArrayDataReference(_displayFrameBuffer); + ref UInt16 displayFrameBufferDataRef = ref MyUnSafeCommon.GetArrayDataReference(_displayFrameBuffer); int displayPixelNumberBegin = _VCOUNT * DisplayScreenWidth; @@ -1144,7 +1147,7 @@ namespace Iris.GBA private void RenderObjects(UInt16 bgPriority) { - ref UInt16 displayFrameBufferDataRef = ref MemoryMarshal.GetArrayDataReference(_displayFrameBuffer); + ref UInt16 displayFrameBufferDataRef = ref MyUnSafeCommon.GetArrayDataReference(_displayFrameBuffer); int displayPixelNumberBegin = _VCOUNT * DisplayScreenWidth; diff --git a/Assets/Iris/Iris.NDS/BIOS.cs b/Assets/Iris/Iris.NDS/BIOS.cs index 92ddf4d..9dd7d4a 100644 --- a/Assets/Iris/Iris.NDS/BIOS.cs +++ b/Assets/Iris/Iris.NDS/BIOS.cs @@ -1,4 +1,6 @@ -namespace Iris.NDS +using System; + +namespace Iris.NDS { public sealed partial class NDS_System { diff --git a/Assets/Iris/Iris.NDS/Memory.cs b/Assets/Iris/Iris.NDS/Memory.cs index 7e952ea..5d6daa4 100644 --- a/Assets/Iris/Iris.NDS/Memory.cs +++ b/Assets/Iris/Iris.NDS/Memory.cs @@ -1,4 +1,7 @@ -namespace Iris.NDS +using System; +using System.IO; + +namespace Iris.NDS { public sealed partial class NDS_System { diff --git a/Assets/Iris/Iris.NDS/NDS_System.cs b/Assets/Iris/Iris.NDS/NDS_System.cs index 3e905a2..14290ec 100644 --- a/Assets/Iris/Iris.NDS/NDS_System.cs +++ b/Assets/Iris/Iris.NDS/NDS_System.cs @@ -1,4 +1,7 @@ -namespace Iris.NDS +using System; +using System.IO; + +namespace Iris.NDS { public sealed partial class NDS_System : Common.System { diff --git a/Assets/MyUnSafeCommon.cs b/Assets/MyUnSafeCommon.cs new file mode 100644 index 0000000..bab1ab4 --- /dev/null +++ b/Assets/MyUnSafeCommon.cs @@ -0,0 +1,91 @@ +using System; + +public static class MyUnSafeCommon +{ + public static ref T GetArrayDataReference(T[] array) + { + if (array == null) throw new ArgumentNullException(nameof(array)); + if (array.Length == 0) throw new ArgumentException("Array cannot be empty", nameof(array)); + return ref array[0]; + } + + //public unsafe static ref T GetArrayDataReference(T[] array) where T : struct + //{ + // fixed (T* ptr = array) + // { + // return ref ArrayElementAsRef(ptr, 0); + // } + //} + + //public unsafe static ref T ArrayElementAsRef(void* ptr, int index) where T : struct + //{ + // return ref Unity.Collections.LowLevel.Unsafe.UnsafeUtility.ArrayElementAsRef(ptr, index); + //} + +} + + +public static class MyBitOperations +{ + // 计算一个整数的位计数(也称为汉明重量) + public static int PopCount(uint value) + { + int count = 0; + while (value != 0) + { + value &= value - 1; // 清除最低位的1 + count++; + } + return count; + } + + // 如果需要处理long或int等其他类型,可以添加重载 + public static int PopCount(int value) + { + return PopCount((uint)value); // 对于int,简单地将其视为无符号的uint来处理 + } + + // 对于long,你可能需要更复杂的处理或额外的迭代,但基本思想相同 + public static int PopCount(long value) + { + int count = 0; + value = value - ((value >> 1) & 0x5555555555555555L); // 每两位一组求和 + value = (value & 0x3333333333333333L) + ((value >> 2) & 0x3333333333333333L); // 每四位一组求和 + value = (value + (value >> 4)) & 0x0f0f0f0f0f0f0f0fL; // 每八位一组求和 + count = (int)((value * 0x0101010101010101L) >> 56); // 计算总和 + return count; + } + + // 向右旋转指定数量的位(等效于BitOperations.RotateRight) + public static uint RotateRight(uint value, int count) + { + // 确保旋转位数在有效范围内(对于uint,0到31) + count &= 31; + + // 使用位移和位或操作来实现旋转 + // 先右移count位 + uint rightShifted = value >> count; + + // 然后左移(32 - count)位,并将结果与右移的结果进行位或操作 + // 注意:由于uint是无符号的,所以左移不会导致符号扩展 + uint leftShifted = (value << (32 - count)) & 0xFFFFFFFF; // 实际上,对于uint,& 0xFFFFFFFF是多余的,但在这里为了清晰性而保留 + + // 组合结果 + return rightShifted | leftShifted; + } + + // 如果需要处理ulong,可以添加类似的重载 + public static ulong RotateRight(ulong value, int count) + { + // 确保旋转位数在有效范围内(对于ulong,0到63) + count &= 63; + + // 使用位移和位或操作来实现旋转 + // 注意:ulong需要64位操作 + ulong rightShifted = value >> count; + ulong leftShifted = (value << (64 - count)) & 0xFFFFFFFFFFFFFFFF; // 同样,对于ulong,& 0xFFFFFFFFFFFFFFFF是多余的,但保留以增加清晰性 + + // 组合结果 + return rightShifted | leftShifted; + } +} \ No newline at end of file diff --git a/Assets/MyUnSafeCommon.cs.meta b/Assets/MyUnSafeCommon.cs.meta new file mode 100644 index 0000000..22caad4 --- /dev/null +++ b/Assets/MyUnSafeCommon.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d82a940594010314bbfb9de2d3865d64 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 0000000..24adc08 --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2a9692e254d34f34aa83151367615810 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/System.Buffers.dll b/Assets/Plugins/System.Buffers.dll new file mode 100644 index 0000000000000000000000000000000000000000..c0970c078522845d0ac9420f390fed5c29344d8c GIT binary patch literal 21376 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%0AL|T{&GAus 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/System.Memory.dll.meta b/Assets/Plugins/System.Memory.dll.meta new file mode 100644 index 0000000..4a6db12 --- /dev/null +++ b/Assets/Plugins/System.Memory.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b70ee69b176c61f4eb6db50741d13b0b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/System.Numerics.Vectors.dll b/Assets/Plugins/System.Numerics.Vectors.dll new file mode 100644 index 0000000000000000000000000000000000000000..a808165accf4b28833d22169931d4c879defd96d GIT binary patch literal 163712 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�q8Bzlv}ROx-}ptnKD&8tasR$2=E({1 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/System.Numerics.Vectors.dll.meta b/Assets/Plugins/System.Numerics.Vectors.dll.meta new file mode 100644 index 0000000..50e7dd5 --- /dev/null +++ b/Assets/Plugins/System.Numerics.Vectors.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d58c54bd61da7884f97da0f6bea3e4f5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll b/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 0000000000000000000000000000000000000000..b17135bc95170151b88fc4679fe8be3758c3c3b9 GIT binary patch literal 16768 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