MAME:MC68000 Table指针化

This commit is contained in:
sin365 2025-11-26 15:17:24 +08:00
parent a3e5f75694
commit 7ecd7d45a0
3 changed files with 159 additions and 46 deletions

View File

@ -17,22 +17,38 @@ namespace cpu.m68000
switch (size) switch (size)
{ {
case 1: // Byte case 1: // Byte
{
value = ReadValueB(srcMode, srcReg); value = ReadValueB(srcMode, srcReg);
WriteValueB(dstMode, dstReg, (sbyte)value); WriteValueB(dstMode, dstReg, (sbyte)value);
pendingCycles -= MoveCyclesBW[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)]; //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; N = (value & 0x80) != 0;
}
break; break;
case 3: // Word case 3: // Word
{
value = ReadValueW(srcMode, srcReg); value = ReadValueW(srcMode, srcReg);
WriteValueW(dstMode, dstReg, (short)value); WriteValueW(dstMode, dstReg, (short)value);
pendingCycles -= MoveCyclesBW[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)]; //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; N = (value & 0x8000) != 0;
break; break;
}
case 2: // Long case 2: // Long
{
value = ReadValueL(srcMode, srcReg); value = ReadValueL(srcMode, srcReg);
WriteValueL(dstMode, dstReg, value); WriteValueL(dstMode, dstReg, value);
pendingCycles -= MoveCyclesL[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)]; //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; N = (value & 0x80000000) != 0;
}
break; break;
} }

View File

@ -207,6 +207,8 @@ namespace cpu.m68000
D_set = new Register[8]; D_set = new Register[8];
//还是使用Action[]吧 //还是使用Action[]吧
BuildOpcodeTable(); BuildOpcodeTable();
InitMC68000Tables();
} }

View File

@ -1,38 +1,133 @@
namespace cpu.m68000 using MAME.Core;
{ using System;
partial class MC68000 using System.Runtime.InteropServices;
{
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 }
};
static readonly int[,] MoveCyclesL = new int[12, 9] namespace cpu.m68000
{
unsafe partial class MC68000
{ {
{ 4, 4, 12, 12, 12, 16, 18, 16, 20 }, void InitMC68000Tables()
{ 4, 4, 12, 12, 12, 16, 18, 16, 20 }, {
{ 12, 12, 20, 20, 20, 24, 26, 24, 28 }, Init_MoveCyclesBW();
{ 12, 12, 20, 20, 20, 24, 26, 24, 28 }, Init_MoveCyclesL();
{ 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 }, //static readonly int[,] MoveCyclesBW = new int[12, 9]
{ 16, 16, 24, 24, 24, 28, 30, 28, 32 }, //{
{ 20, 20, 28, 28, 28, 32, 34, 32, 36 }, // { 4, 4, 8, 8, 8, 12, 14, 12, 16 },
{ 16, 16, 24, 24, 24, 28, 30, 28, 32 }, // { 4, 4, 8, 8, 8, 12, 14, 12, 16 },
{ 18, 18, 26, 26, 26, 30, 32, 30, 34 }, // { 8, 8, 12, 12, 12, 16, 18, 16, 20 },
{ 12, 12, 20, 20, 20, 24, 26, 24, 28 } // { 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] static readonly int[,] EACyclesBW = new int[8, 8]
{ {