MAME:MC68000 Table指针化
This commit is contained in:
parent
a3e5f75694
commit
7ecd7d45a0
@ -17,22 +17,38 @@ namespace cpu.m68000
|
|||||||
switch (size)
|
switch (size)
|
||||||
{
|
{
|
||||||
case 1: // Byte
|
case 1: // Byte
|
||||||
value = ReadValueB(srcMode, srcReg);
|
{
|
||||||
WriteValueB(dstMode, dstReg, (sbyte)value);
|
value = ReadValueB(srcMode, srcReg);
|
||||||
pendingCycles -= MoveCyclesBW[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)];
|
WriteValueB(dstMode, dstReg, (sbyte)value);
|
||||||
N = (value & 0x80) != 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;
|
break;
|
||||||
case 3: // Word
|
case 3: // Word
|
||||||
value = ReadValueW(srcMode, srcReg);
|
{
|
||||||
WriteValueW(dstMode, dstReg, (short)value);
|
value = ReadValueW(srcMode, srcReg);
|
||||||
pendingCycles -= MoveCyclesBW[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)];
|
WriteValueW(dstMode, dstReg, (short)value);
|
||||||
N = (value & 0x8000) != 0;
|
//pendingCycles -= MoveCyclesBW[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)];
|
||||||
break;
|
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
|
case 2: // Long
|
||||||
value = ReadValueL(srcMode, srcReg);
|
{
|
||||||
WriteValueL(dstMode, dstReg, value);
|
|
||||||
pendingCycles -= MoveCyclesL[srcMode + (srcMode == 7 ? srcReg : 0), dstMode + (dstMode == 7 ? dstReg : 0)];
|
value = ReadValueL(srcMode, srcReg);
|
||||||
N = (value & 0x80000000) != 0;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -207,6 +207,8 @@ namespace cpu.m68000
|
|||||||
D_set = new Register[8];
|
D_set = new Register[8];
|
||||||
//还是使用Action[]吧
|
//还是使用Action[]吧
|
||||||
BuildOpcodeTable();
|
BuildOpcodeTable();
|
||||||
|
|
||||||
|
InitMC68000Tables();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
{
|
||||||
|
void InitMC68000Tables()
|
||||||
{
|
{
|
||||||
{ 4, 4, 12, 12, 12, 16, 18, 16, 20 },
|
Init_MoveCyclesBW();
|
||||||
{ 4, 4, 12, 12, 12, 16, 18, 16, 20 },
|
Init_MoveCyclesL();
|
||||||
{ 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 },
|
//static readonly int[,] MoveCyclesBW = new int[12, 9]
|
||||||
{ 16, 16, 24, 24, 24, 28, 30, 28, 32 },
|
//{
|
||||||
{ 18, 18, 26, 26, 26, 30, 32, 30, 34 },
|
// { 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 },
|
||||||
{ 20, 20, 28, 28, 28, 32, 34, 32, 36 },
|
// { 8, 8, 12, 12, 12, 16, 18, 16, 20 },
|
||||||
{ 16, 16, 24, 24, 24, 28, 30, 28, 32 },
|
// { 8, 8, 12, 12, 12, 16, 18, 16, 20 },
|
||||||
{ 18, 18, 26, 26, 26, 30, 32, 30, 34 },
|
// { 10, 10, 14, 14, 14, 18, 20, 18, 22 },
|
||||||
{ 12, 12, 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 },
|
||||||
|
// { 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]
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user