- // 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));
-
- // 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());
+ // Remove both pieces first since squares could overlap in Chess960
+ remove_piece(kfrom, sideToMove, KING);
+ remove_piece(rfrom, sideToMove, ROOK);
+ board[kfrom] = board[rfrom] = NO_PIECE; // Since remove_piece doesn't do it for us
+ put_piece(kto, sideToMove, KING);
+ put_piece(rto, sideToMove, ROOK);