diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Instructions/DataMovement.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Instructions/DataMovement.cs index 91db1efb..79a7b281 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Instructions/DataMovement.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Instructions/DataMovement.cs @@ -17,22 +17,38 @@ namespace cpu.m68000 switch (size) { case 1: // Byte - value = ReadValueB(srcMode, srcReg); - WriteValueB(dstMode, dstReg, (sbyte)value); - pendingCycles -= MoveCyclesBW[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)]; - N = (value & 0x80) != 0; + { + value = ReadValueB(srcMode, srcReg); + WriteValueB(dstMode, dstReg, (sbyte)value); + //pendingCycles -= MoveCyclesBW[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)]; + int i = srcMode + (srcMode == 7 ? srcReg : 0); + int j = srcMode + dstMode + (dstMode == 7 ? dstReg : 0); + pendingCycles -= *(MoveCyclesBW + (i * MoveCyclesBW_Columns) + j); + N = (value & 0x80) != 0; + } break; case 3: // Word - value = ReadValueW(srcMode, srcReg); - WriteValueW(dstMode, dstReg, (short)value); - pendingCycles -= MoveCyclesBW[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)]; - N = (value & 0x8000) != 0; - break; + { + value = ReadValueW(srcMode, srcReg); + WriteValueW(dstMode, dstReg, (short)value); + //pendingCycles -= MoveCyclesBW[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)]; + int i = srcMode + (srcMode == 7 ? srcReg : 0); + int j = srcMode + dstMode + (dstMode == 7 ? dstReg : 0); + pendingCycles -= *(MoveCyclesBW + (i * MoveCyclesBW_Columns) + j); + N = (value & 0x8000) != 0; + break; + } case 2: // Long - value = ReadValueL(srcMode, srcReg); - WriteValueL(dstMode, dstReg, value); - pendingCycles -= MoveCyclesL[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)]; - N = (value & 0x80000000) != 0; + { + + value = ReadValueL(srcMode, srcReg); + WriteValueL(dstMode, dstReg, value); + //pendingCycles -= MoveCyclesL[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)]; + int i = srcMode + (srcMode == 7 ? srcReg : 0); + int j = dstMode + (dstMode == 7 ? dstReg : 0); + pendingCycles -= *(MoveCyclesL + (i * MoveCyclesL_Columns) + j); + N = (value & 0x80000000) != 0; + } break; } diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/MC68000.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/MC68000.cs index db3a7504..4ea138a3 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/MC68000.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/MC68000.cs @@ -207,6 +207,8 @@ namespace cpu.m68000 D_set = new Register[8]; //还是使用Action[]吧 BuildOpcodeTable(); + + InitMC68000Tables(); } diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Tables.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Tables.cs index eb82a8a6..814ff883 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Tables.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m68000/Tables.cs @@ -1,38 +1,133 @@ -namespace cpu.m68000 -{ - partial class MC68000 - { - static readonly int[,] MoveCyclesBW = new int[12, 9] - { - { 4, 4, 8, 8, 8, 12, 14, 12, 16 }, - { 4, 4, 8, 8, 8, 12, 14, 12, 16 }, - { 8, 8, 12, 12, 12, 16, 18, 16, 20 }, - { 8, 8, 12, 12, 12, 16, 18, 16, 20 }, - { 10, 10, 14, 14, 14, 18, 20, 18, 22 }, - { 12, 12, 16, 16, 16, 20, 22, 20, 24 }, - { 14, 14, 18, 18, 18, 22, 24, 22, 26 }, - { 12, 12, 16, 16, 16, 20, 22, 20, 24 }, - { 16, 16, 20, 20, 20, 24, 26, 24, 28 }, - { 12, 12, 16, 16, 16, 20, 22, 20, 24 }, - { 14, 14, 18, 18, 18, 22, 24, 22, 26 }, - { 8, 8, 12, 12, 12, 16, 18, 16, 20 } - }; +using MAME.Core; +using System; +using System.Runtime.InteropServices; - static readonly int[,] MoveCyclesL = new int[12, 9] +namespace cpu.m68000 +{ + unsafe partial class MC68000 + { + void InitMC68000Tables() { - { 4, 4, 12, 12, 12, 16, 18, 16, 20 }, - { 4, 4, 12, 12, 12, 16, 18, 16, 20 }, - { 12, 12, 20, 20, 20, 24, 26, 24, 28 }, - { 12, 12, 20, 20, 20, 24, 26, 24, 28 }, - { 14, 14, 22, 22, 22, 26, 28, 26, 30 }, - { 16, 16, 24, 24, 24, 28, 30, 28, 32 }, - { 18, 18, 26, 26, 26, 30, 32, 30, 34 }, - { 16, 16, 24, 24, 24, 28, 30, 28, 32 }, - { 20, 20, 28, 28, 28, 32, 34, 32, 36 }, - { 16, 16, 24, 24, 24, 28, 30, 28, 32 }, - { 18, 18, 26, 26, 26, 30, 32, 30, 34 }, - { 12, 12, 20, 20, 20, 24, 26, 24, 28 } - }; + Init_MoveCyclesBW(); + Init_MoveCyclesL(); + } + + //static readonly int[,] MoveCyclesBW = new int[12, 9] + //{ + // { 4, 4, 8, 8, 8, 12, 14, 12, 16 }, + // { 4, 4, 8, 8, 8, 12, 14, 12, 16 }, + // { 8, 8, 12, 12, 12, 16, 18, 16, 20 }, + // { 8, 8, 12, 12, 12, 16, 18, 16, 20 }, + // { 10, 10, 14, 14, 14, 18, 20, 18, 22 }, + // { 12, 12, 16, 16, 16, 20, 22, 20, 24 }, + // { 14, 14, 18, 18, 18, 22, 24, 22, 26 }, + // { 12, 12, 16, 16, 16, 20, 22, 20, 24 }, + // { 16, 16, 20, 20, 20, 24, 26, 24, 28 }, + // { 12, 12, 16, 16, 16, 20, 22, 20, 24 }, + // { 14, 14, 18, 18, 18, 22, 24, 22, 26 }, + // { 8, 8, 12, 12, 12, 16, 18, 16, 20 } + //}; + + //取值范例 Columns = 9 ; i* Columns + j + + const int MoveCyclesBW_len_1 = 12; + const int MoveCyclesBW_Columns = 9; + #region //指针化 MoveCyclesBW + static byte[] MoveCyclesBW_src; + static GCHandle MoveCyclesBW_handle; + public static byte* MoveCyclesBW; + public static int MoveCyclesBWLength; + public static bool MoveCyclesBW_IsNull => MoveCyclesBW == null; + public static byte[] MoveCyclesBW_set + { + set + { + MoveCyclesBW_handle.ReleaseGCHandle(); + MoveCyclesBW_src = value; + MoveCyclesBWLength = value.Length; + MoveCyclesBW_src.GetObjectPtr(ref MoveCyclesBW_handle, ref MoveCyclesBW); + } + } + + static void Init_MoveCyclesBW() + { + MoveCyclesBW_set = new byte[] + { + 4, 4, 8, 8, 8, 12, 14, 12, 16, + 4, 4, 8, 8, 8, 12, 14, 12, 16, + 8, 8, 12, 12, 12, 16, 18, 16, 20, + 8, 8, 12, 12, 12, 16, 18, 16, 20, + 10, 10, 14, 14, 14, 18, 20, 18, 22, + 12, 12, 16, 16, 16, 20, 22, 20, 24, + 14, 14, 18, 18, 18, 22, 24, 22, 26, + 12, 12, 16, 16, 16, 20, 22, 20, 24, + 16, 16, 20, 20, 20, 24, 26, 24, 28, + 12, 12, 16, 16, 16, 20, 22, 20, 24, + 14, 14, 18, 18, 18, 22, 24, 22, 26, + 8, 8, 12, 12, 12, 16, 18, 16, 20 + }; + } + + #endregion + + + + //static readonly int[,] MoveCyclesL = new int[12, 9] + //{ + // { 4, 4, 12, 12, 12, 16, 18, 16, 20 }, + // { 4, 4, 12, 12, 12, 16, 18, 16, 20 }, + // { 12, 12, 20, 20, 20, 24, 26, 24, 28 }, + // { 12, 12, 20, 20, 20, 24, 26, 24, 28 }, + // { 14, 14, 22, 22, 22, 26, 28, 26, 30 }, + // { 16, 16, 24, 24, 24, 28, 30, 28, 32 }, + // { 18, 18, 26, 26, 26, 30, 32, 30, 34 }, + // { 16, 16, 24, 24, 24, 28, 30, 28, 32 }, + // { 20, 20, 28, 28, 28, 32, 34, 32, 36 }, + // { 16, 16, 24, 24, 24, 28, 30, 28, 32 }, + // { 18, 18, 26, 26, 26, 30, 32, 30, 34 }, + // { 12, 12, 20, 20, 20, 24, 26, 24, 28 } + //}; + + + const int MoveCyclesL_len_1 = 12; + const int MoveCyclesL_Columns = 9; + #region //指针化 MoveCyclesL + static byte[] MoveCyclesL_src; + static GCHandle MoveCyclesL_handle; + public static byte* MoveCyclesL; + public static int MoveCyclesLLength; + public static bool MoveCyclesL_IsNull => MoveCyclesL == null; + public static byte[] MoveCyclesL_set + { + set + { + MoveCyclesL_handle.ReleaseGCHandle(); + MoveCyclesL_src = value; + MoveCyclesLLength = value.Length; + MoveCyclesL_src.GetObjectPtr(ref MoveCyclesL_handle, ref MoveCyclesL); + } + } + + static void Init_MoveCyclesL() + { + MoveCyclesL_set = new byte[] + { + 4, 4, 12, 12, 12, 16, 18, 16, 20 , + 4, 4, 12, 12, 12, 16, 18, 16, 20 , + 12, 12, 20, 20, 20, 24, 26, 24, 28 , + 12, 12, 20, 20, 20, 24, 26, 24, 28 , + 14, 14, 22, 22, 22, 26, 28, 26, 30 , + 16, 16, 24, 24, 24, 28, 30, 28, 32 , + 18, 18, 26, 26, 26, 30, 32, 30, 34 , + 16, 16, 24, 24, 24, 28, 30, 28, 32 , + 20, 20, 28, 28, 28, 32, 34, 32, 36 , + 16, 16, 24, 24, 24, 28, 30, 28, 32 , + 18, 18, 26, 26, 26, 30, 32, 30, 34 , + 12, 12, 20, 20, 20, 24, 26, 24, 28 + }; + } + #endregion + static readonly int[,] EACyclesBW = new int[8, 8] {