- // When we have arrived here, some work has already been done by
- // Position::undo_move. In particular, the side to move has been switched,
- // so the code below is correct.
- Color us = side_to_move();
-
- // Find source squares for king and rook
- Square kfrom = move_from(m);
- Square rfrom = move_to(m); // HACK: See comment at beginning of function
- Square kto, rto;
-
- // Find destination squares for king and rook
- if (rfrom > kfrom) // O-O
- {
- kto = relative_square(us, SQ_G1);
- rto = relative_square(us, SQ_F1);
- } else { // O-O-O
- kto = relative_square(us, SQ_C1);
- rto = relative_square(us, SQ_D1);
- }
-
- assert(piece_on(kto) == piece_of_color_and_type(us, KING));
- assert(piece_on(rto) == piece_of_color_and_type(us, ROOK));
-
- // Put the pieces back at the source square
- Bitboard kmove_bb = make_move_bb(kto, kfrom);
- do_move_bb(&(byColorBB[us]), kmove_bb);
- do_move_bb(&(byTypeBB[KING]), kmove_bb);
- do_move_bb(&(byTypeBB[0]), kmove_bb); // HACK: byTypeBB[0] == occupied squares
-
- Bitboard rmove_bb = make_move_bb(rto, rfrom);
- do_move_bb(&(byColorBB[us]), rmove_bb);
- do_move_bb(&(byTypeBB[ROOK]), rmove_bb);
- do_move_bb(&(byTypeBB[0]), rmove_bb); // HACK: byTypeBB[0] == occupied squares
-
- // Update board
- board[rto] = board[kto] = EMPTY;
- board[rfrom] = piece_of_color_and_type(us, ROOK);
- board[kfrom] = piece_of_color_and_type(us, KING);
-
- // Update king square
- kingSquare[us] = kfrom;
-
- // Update piece lists
- pieceList[us][KING][index[kto]] = kfrom;
- pieceList[us][ROOK][index[rto]] = rfrom;
- int tmp = index[rto]; // In Chess960 could be rto == kfrom
- index[kfrom] = index[kto];
- index[rfrom] = tmp;
-
- // Finally point our state pointer back to the previous state
- st = st->previous;