MAME:MC68000 Table指针化
This commit is contained in:
parent
a3e5f75694
commit
7ecd7d45a0
@ -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)];
|
||||
//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)];
|
||||
//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)];
|
||||
//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;
|
||||
}
|
||||
|
||||
|
||||
@ -207,6 +207,8 @@ namespace cpu.m68000
|
||||
D_set = new Register[8];
|
||||
//还是使用Action[]吧
|
||||
BuildOpcodeTable();
|
||||
|
||||
InitMC68000Tables();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
{
|
||||
{ 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 }
|
||||
void InitMC68000Tables()
|
||||
{
|
||||
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]
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user