Code: Select all
static U64 SBackup[MaxDepth][16];
static U64 CRBackup[MaxDepth][2];
static U64 PositionKeyBackUp[MaxDepth];
static unsigned int LastMoveDPushSQBackup[MaxDepth];
static U64 HalfMoveClockBackUp[MaxDepth];
static Score PSQTScore;
static Score PSQTScoreBackUp[MaxDepth];
static int ply = 0;
static U64 BitBoards[16];
static U64 HalfMoveClock = 0ULL;
static U64 GameRecordCounter = 0ULL;
static U64 Positionkey = 0ULL;
static U64 GameRecord[512];
//Junk,Real
unsigned int DoublePushSQ[2] = { 0U,0U };
BB TypeBoard[64 + MaxDepth];
Color STM = White;
Code: Select all
void MakeMove(const Move& __restrict M)
{
HalfMoveClockBackUp[ply] = HalfMoveClock;/
HalfMoveClock++;
std::memcpy(SBackup[ply], BitBoards, 16 * sizeof(U64));
PositionKeyBackUp[ply] = Positionkey;
CRBackup[ply][0] = CastleRights[0];
CRBackup[ply][1] = CastleRights[1];
PSQTScoreBackUp[ply] = PSQTScore;
Color NTM = Color(7 - STM);
unsigned int From = M.From, To = M.To;
BB PT = TypeBoard[From];
PSQTScore += psq[STM ? 1 : 0][PT][To] - psq[STM ? 1 : 0][PT][From];
LastMoveDPushSQBackup[ply] = DoublePushSQ[1];
if (DoublePushSQ[1] != 0) Positionkey ^= GetEnpassantZobrist();
DoublePushSQ[1] = 0UL;
TypeBoard[64 + ply] = TypeBoard[To];
U64 ToMask = 1ULL << To;
U64 FromMask = ~(1ULL << From);
BitBoards[Occupied] &= FromMask;
BitBoards[STM + PT] &= FromMask;
BitBoards[Occupied] |= ToMask;
BitBoards[NTM + Enemy] &= FromMask;
BitBoards[NTM + Enemy] |= ToMask;
Positionkey ^= ZobristSide;
size_t USTM = STM & 1ULL, UNTM = NTM & 1ULL;
Positionkey ^= Zobrist[PT][USTM][From];
Positionkey ^= GetCatsleZobrist();
switch (M.Type)
{
case NORMAL:
if (BB CapturedPiece = TypeBoard[64 + ply])
{
HalfMoveClock = 0ULL;
Positionkey ^= Zobrist[CapturedPiece][UNTM][To];
PSQTScore -= psq[NTM & 1][CapturedPiece][To];
}
//HalfMoveClock = HalfMoveClock&(0ULL - (PT != Pawn));
if (PT == Pawn) HalfMoveClock = 0ULL;
Positionkey ^= Zobrist[PT][USTM][To];//Add To
BitBoards[STM + PT] |= ToMask;
DoublePushSQ[((From^To) == 16U)&(PT == Pawn)] = To;
if (!PT) CastleRights[STM & 1U] = 0ULL;
BitBoards[STM + Enemy] &= ~ToMask;
BitBoards[NTM + TypeBoard[64 + ply]] &= ~ToMask;
BitBoards[NTM + Enemy] &= ~BitBoards[STM + King];
CastleRights[0] &= BitBoards[Black + Rook];
CastleRights[1] &= BitBoards[White + Rook];
break;
case PROMOTION:
HalfMoveClock = 0ULL;
if (BB CapturedPiece = TypeBoard[64 + ply])
{
Positionkey ^= Zobrist[CapturedPiece][UNTM][To];
PSQTScore -= psq[NTM & 1][CapturedPiece][To];
}
PT = BB(M.PromoType + 2);
Positionkey ^= Zobrist[PT][USTM][To];
BitBoards[STM + PT] |= ToMask;
BitBoards[STM + Enemy] &= ~ToMask;
BitBoards[NTM + TypeBoard[64 + ply]] &= ~ToMask;
CastleRights[0] &= BitBoards[Black + Rook];
CastleRights[1] &= BitBoards[White + Rook];
PSQTScore += psq[STM & 1][PT][To] - psq[STM & 1][Pawn][To];
break;
case ENPASSANT:
HalfMoveClock = 0ULL;
{
const auto dpSq = LastMoveDPushSQBackup[ply];
Positionkey ^= Zobrist[PT][UNTM][dpSq];
Positionkey ^= Zobrist[PT][USTM][To];
BitBoards[Occupied] &= ~(1ULL << dpSq);
PSQTScore -= psq[NTM & 1][Pawn][dpSq];
BitBoards[NTM + PT] &= BitBoards[Occupied];
BitBoards[STM + Enemy] &= BitBoards[Occupied];
BitBoards[STM + PT] |= ToMask;
TypeBoard[dpSq] = Null;
}
break;
case CASTLING:
Positionkey ^= Zobrist[King][USTM][(NTM * 8) + 4];
Positionkey ^= Zobrist[Rook][USTM][To];
BitBoards[Occupied] &= ~BitBoards[STM + King];
{
unsigned int KingTo = (From + To + 1) >> 1;
Positionkey ^= Zobrist[King][USTM][KingTo];
BitBoards[STM + King] = 1ULL << KingTo;
PSQTScore += psq[STM & 1][King][KingTo] - psq[STM & 1][King][(NTM * 8) + 4];
}
BitBoards[STM + PT] |= ToMask;
BitBoards[Occupied] |= BitBoards[STM + King];
CastleRights[STM & 1U] = 0ULL;
break;
default:
break;
}
Positionkey ^= GetCatsleZobrist();
if (DoublePushSQ[1] != 0) Positionkey ^= GetEnpassantZobrist();
GameRecord[++GameRecordCounter] = Positionkey;
ply++;
BitBoards[Empty] = ~BitBoards[Occupied];
STM = NTM;
TypeBoard[From] = Null;
TypeBoard[To] = PT;
}
Code: Select all
void UnMakeMove(const Move& __restrict M)
{
std::memcpy(BitBoards, SBackup[--ply], 16 * sizeof(U64));
GameRecordCounter--;
HalfMoveClock = HalfMoveClockBackUp[ply];
Positionkey = PositionKeyBackUp[ply];
CastleRights[0] = CRBackup[ply][0];
CastleRights[1] = CRBackup[ply][1];
PSQTScore = PSQTScoreBackUp[ply];
DoublePushSQ[1] = LastMoveDPushSQBackup[ply];
STM = Color(7 - STM);
unsigned int From = M.From, To = M.To;
TypeBoard[From] = TypeBoard[To];
if (M.Type == ENPASSANT) TypeBoard[DoublePushSQ[1]] = Pawn;
else if (M.Type == PROMOTION)TypeBoard[From] = Pawn;
TypeBoard[To] = TypeBoard[64 + ply];
}