From 7ecd7d45a0c08958ecdb47709f905065418dca55 Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Wed, 26 Nov 2025 15:17:24 +0800 Subject: [PATCH] =?UTF-8?q?MAME:MC68000=20Table=E6=8C=87=E9=92=88=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cpu/m68000/Instructions/DataMovement.cs | 42 +++-- .../Plugins/Mame.Core/cpu/m68000/MC68000.cs | 2 + .../Plugins/Mame.Core/cpu/m68000/Tables.cs | 161 ++++++++++++++---- 3 files changed, 159 insertions(+), 46 deletions(-) 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] {