- // Underpromotion captures in the h1-a8 (h8-a1 for black) direction
- b1 = move_pawns<Us, DELTA_NW>(pawns) & ~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 captures in the a1-h8 (a8-h1 for black) direction
+ b1 = move_pawns<Us, DELTA_NE>(pawns) & ~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>(pawns) & ~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
+ b1 = move_pawns<Us, DELTA_N>(pawns) & emptySquares & TRank8BB;
+ while (b1)
+ {
+ to = pop_1st_bit(&b1);
+ (*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);
+ }