- assert(piece_on(kto) == piece_of_color_and_type(us, KING));
- assert(piece_on(rto) == piece_of_color_and_type(us, ROOK));
-
- // Remove pieces from destination squares:
- clear_bit(&(byColorBB[us]), kto);
- clear_bit(&(byTypeBB[KING]), kto);
- clear_bit(&(byTypeBB[0]), kto); // HACK: byTypeBB[0] == occupied squares
- clear_bit(&(byColorBB[us]), rto);
- clear_bit(&(byTypeBB[ROOK]), rto);
- clear_bit(&(byTypeBB[0]), rto); // HACK: byTypeBB[0] == occupied squares
-
- // Put pieces on source squares:
- set_bit(&(byColorBB[us]), kfrom);
- set_bit(&(byTypeBB[KING]), kfrom);
- set_bit(&(byTypeBB[0]), kfrom); // HACK: byTypeBB[0] == occupied squares
- set_bit(&(byColorBB[us]), rfrom);
- set_bit(&(byTypeBB[ROOK]), rfrom);
- set_bit(&(byTypeBB[0]), rfrom); // 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 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;
-
- assert(is_ok());
-}
-
-
-/// Position::do_null_move makes() a "null move": It switches the side to move
-/// and updates the hash key without executing any move on the board.
-
-void Position::do_null_move(StateInfo& backupSt) {
-
- assert(is_ok());
- assert(!is_check());
-
- // Back up the information necessary to undo the null move to the supplied
- // StateInfo object.
- // Note that differently from normal case here backupSt is actually used as
- // a backup storage not as a new state to be used.
- backupSt.key = st->key;
- backupSt.epSquare = st->epSquare;
- backupSt.mgValue = st->mgValue;
- backupSt.egValue = st->egValue;
- backupSt.previous = st->previous;
- backupSt.pliesFromNull = st->pliesFromNull;
- st->previous = &backupSt;
-
- // Save the current key to the history[] array, in order to be able to
- // detect repetition draws.
- history[gamePly] = st->key;