private x86OpCode SelectOpCodeFromToken(x86OpCode[] matches, byte token)
{
byte groupIndex = matches[0]._opcodeBytes[0];
byte hByte = (byte)(token >> 4 << 4);
byte lByte = (byte)(token - hByte);
int index = (int)Math.Floor((double)(token % 0x40) / (double)8.0f);
// 0xff group has got more than 8 instructions with some special tokens.
if (groupIndex == 0xFF)
{
// instructions with lowerbyte of 5 or D are an exception.
if (lByte == 0x5 || lByte == 0xD)
return matches.FirstOrDefault(m => m._opcodeBytes[1] == token);
else
index *= 2;
}
if (index < 0 || index >= matches.Length)
return null;
return matches[index];
}