- // Underpromotion captures in the a1-h8 (a8-h1 for black) direction
- b1 = move_pawns<Us, DELTA_NE>(pp) & ~FileABB & enemyPieces & TRank8BB;
- while (b1)
- {
- to = pop_1st_bit(&b1);
- (*mlist++).move = make_promotion_move(to - TDELTA_NE, to, ROOK);
- (*mlist++).move = make_promotion_move(to - TDELTA_NE, to, BISHOP);
- (*mlist++).move = make_promotion_move(to - TDELTA_NE, to, KNIGHT);
- }
-
- // Underpromotion captures in the h1-a8 (h8-a1 for black) direction
- b1 = move_pawns<Us, DELTA_NW>(pp) & ~FileHBB & enemyPieces & TRank8BB;
- while (b1)
- {
- to = pop_1st_bit(&b1);
- (*mlist++).move = make_promotion_move(to - TDELTA_NW, to, ROOK);
- (*mlist++).move = make_promotion_move(to - TDELTA_NW, to, BISHOP);
- (*mlist++).move = make_promotion_move(to - TDELTA_NW, to, KNIGHT);
- }
- }
-
- // Underpromotion pawn pushes. Also queen promotions for evasions and captures.
- b1 = move_pawns<Us, DELTA_N>(pp) & TRank8BB;
- b1 &= (Type == EVASION ? blockSquares : emptySquares);
-
- while (b1)
- {
- to = pop_1st_bit(&b1);
- if (Type == EVASION || Type == CAPTURE)
- (*mlist++).move = make_promotion_move(to - TDELTA_N, to, QUEEN);
-
- if (Type != CAPTURE)
- {
- (*mlist++).move = make_promotion_move(to - TDELTA_N, to, ROOK);
- (*mlist++).move = make_promotion_move(to - TDELTA_N, to, BISHOP);
- (*mlist++).move = make_promotion_move(to - TDELTA_N, to, KNIGHT);
- }
- }
- }
-
- if (Type == CAPTURE)
- {
- // En passant captures
- if (pos.ep_square() != SQ_NONE)
- {
- assert(Us != WHITE || square_rank(pos.ep_square()) == RANK_6);
- assert(Us != BLACK || square_rank(pos.ep_square()) == RANK_3);
-
- Bitboard b1 = pawns & pos.attacks_from<PAWN>(pos.ep_square(), Them);
- assert(b1 != EmptyBoardBB);
-
- while (b1)
- {
- to = pop_1st_bit(&b1);
- (*mlist++).move = make_ep_move(to, pos.ep_square());
- }
- }
- return mlist;
- }
-
- dcPawns1 = dcPawns2 = EmptyBoardBB;
- if (Type == CHECK && (pawns & dcp))
- {
- // Pawn moves which gives discovered check. This is possible only if the
- // pawn is not on the same file as the enemy king, because we don't
- // generate captures.
- dcPawns1 = move_pawns<Us, DELTA_N>(pawns & dcp & ~file_bb(ksq)) & emptySquares & ~TRank8BB;
- dcPawns2 = move_pawns<Us, DELTA_N>(dcPawns1 & TRank3BB) & emptySquares;
- }
-
- // Single pawn pushes
- b1 = move_pawns<Us, DELTA_N>(pawns) & emptySquares & ~TRank8BB;
- b2 = (Type == CHECK ? (b1 & pos.attacks_from<PAWN>(ksq, Them)) | dcPawns1 :
- (Type == EVASION ? b1 & blockSquares : b1));
- SERIALIZE_MOVES_D(b2, -TDELTA_N);
-
- // Double pawn pushes
- b1 = move_pawns<Us, DELTA_N>(b1 & TRank3BB) & emptySquares;
- b2 = (Type == CHECK ? (b1 & pos.attacks_from<PAWN>(ksq, Them)) | dcPawns2 :
- (Type == EVASION ? b1 & blockSquares : b1));
- SERIALIZE_MOVES_D(b2, -TDELTA_N -TDELTA_N);
- return mlist;