4 b_gen_captures( const tree_t * restrict ptree, unsigned int * restrict pmove )
6 bitboard_t bb_movable, bb_capture, bb_piece, bb_desti;
10 bb_capture = BB_WOCCUPY;
11 BBNot( bb_movable, BB_BOCCUPY );
13 bb_desti.p[0] = BB_BPAWN_ATK.p[0] & bb_movable.p[0];
14 bb_desti.p[1] = BB_BPAWN_ATK.p[1] & bb_capture.p[1];
15 bb_desti.p[2] = BB_BPAWN_ATK.p[2] & bb_capture.p[2];
16 while ( BBToU( bb_desti ) )
18 ito = LastOne( bb_desti );
22 utemp = ( To2Move(ito) | From2Move(ifrom) | Cap2Move(-BOARD[ito])
24 if ( ito < A6 ) { utemp |= FLAG_PROMO; }
28 bb_piece = BB_BSILVER;
29 while ( BBToU( bb_piece ) )
31 ifrom = LastOne( bb_piece );
32 Xor( ifrom, bb_piece );
34 BBAnd( bb_desti, bb_capture, abb_b_silver_attacks[ifrom] );
35 while ( BBToU( bb_desti ) )
37 ito = LastOne( bb_desti );
40 utemp = ( To2Move(ito) | From2Move(ifrom) | Cap2Move(-BOARD[ito])
41 | Piece2Move(silver) );
42 if ( ito < A6 || ifrom < A6 ) { *pmove++ = utemp | FLAG_PROMO; }
48 while( BBToU( bb_piece ) )
50 ifrom = LastOne( bb_piece );
51 Xor( ifrom, bb_piece );
53 BBAnd( bb_desti, bb_capture, abb_b_gold_attacks[ifrom] );
54 while ( BBToU( bb_desti ) )
56 ito = LastOne( bb_desti );
59 *pmove++ = ( To2Move(ito) | From2Move(ifrom)
60 | Cap2Move(-BOARD[ito])
61 | Piece2Move(BOARD[ifrom]) );
66 BBAnd( bb_desti, bb_capture, abb_king_attacks[ifrom] );
67 while ( BBToU( bb_desti ) )
69 ito = LastOne( bb_desti );
72 *pmove++ = ( To2Move(ito) | From2Move(ifrom)
73 | Cap2Move(-BOARD[ito]) | Piece2Move(king) );
76 bb_piece = BB_BBISHOP;
77 while ( BBToU( bb_piece ) )
79 ifrom = LastOne( bb_piece );
80 Xor( ifrom, bb_piece );
82 AttackBishop( bb_desti, ifrom );
83 bb_desti.p[0] &= bb_movable.p[0];
86 bb_desti.p[1] &= bb_movable.p[1];
87 bb_desti.p[2] &= bb_movable.p[2];
90 bb_desti.p[1] &= bb_capture.p[1];
91 bb_desti.p[2] &= bb_capture.p[2];
94 while ( BBToU( bb_desti ) )
96 ito = LastOne( bb_desti );
99 utemp = ( To2Move(ito) | From2Move(ifrom)
100 | Cap2Move(-BOARD[ito]) | Piece2Move(bishop) );
101 if ( ito < A6 || ifrom < A6 ) { utemp |= FLAG_PROMO; }
107 while ( BBToU( bb_piece ) )
109 ifrom = LastOne( bb_piece );
110 Xor( ifrom, bb_piece );
112 AttackRook( bb_desti, ifrom );
113 bb_desti.p[0] &= bb_movable.p[0];
116 bb_desti.p[1] &= bb_movable.p[1];
117 bb_desti.p[2] &= bb_movable.p[2];
120 bb_desti.p[1] &= bb_capture.p[1];
121 bb_desti.p[2] &= bb_capture.p[2];
124 while ( BBToU( bb_desti ) )
126 ito = LastOne( bb_desti );
127 Xor( ito, bb_desti );
129 utemp = ( To2Move(ito) | From2Move(ifrom)
130 | Cap2Move(-BOARD[ito]) | Piece2Move(rook) );
131 if ( ito < A6 || ifrom < A6 ) { utemp |= FLAG_PROMO; }
136 bb_piece = BB_BHORSE;
137 while ( BBToU( bb_piece ) )
139 ifrom = LastOne( bb_piece );
140 Xor( ifrom, bb_piece );
142 AttackHorse( bb_desti, ifrom );
143 BBAnd( bb_desti, bb_desti, bb_capture );
144 while ( BBToU( bb_desti ) )
146 ito = LastOne( bb_desti );
147 Xor( ito, bb_desti );
149 *pmove++ = ( To2Move(ito) | From2Move(ifrom)
150 | Cap2Move(-BOARD[ito]) | Piece2Move(horse) );
154 bb_piece = BB_BDRAGON;
155 while ( BBToU( bb_piece ) )
157 ifrom = LastOne( bb_piece );
158 Xor( ifrom, bb_piece );
160 AttackDragon( bb_desti, ifrom );
161 BBAnd( bb_desti, bb_desti, bb_capture );
162 while ( BBToU( bb_desti ) )
164 ito = LastOne( bb_desti );
165 Xor( ito, bb_desti );
167 *pmove++ = ( To2Move(ito) | From2Move(ifrom)
168 | Cap2Move(-BOARD[ito]) | Piece2Move(dragon) );
172 bb_piece = BB_BLANCE;
173 while( BBToU( bb_piece ) )
175 ifrom = LastOne( bb_piece );
176 Xor( ifrom, bb_piece );
178 bb_desti = AttackFile( ifrom );
179 BBAnd( bb_desti, bb_desti, abb_minus_rays[ifrom] );
180 bb_desti.p[0] &= bb_movable.p[0];
181 bb_desti.p[1] &= bb_capture.p[1];
182 bb_desti.p[2] &= bb_capture.p[2];
184 while ( BBToU( bb_desti ) )
186 ito = LastOne( bb_desti );
187 Xor( ito, bb_desti );
189 utemp = ( To2Move(ito) | From2Move(ifrom)
190 | Cap2Move(-BOARD[ito]) | Piece2Move(lance) );
191 if ( ito < A7 ) { *pmove++ = utemp | FLAG_PROMO; }
194 *pmove++ = utemp | FLAG_PROMO;
195 if ( UToCap(utemp) ) { *pmove++ = utemp; }
197 else { *pmove++ = utemp; }
201 bb_piece = BB_BKNIGHT;
202 while( BBToU( bb_piece ) )
204 ifrom = LastOne( bb_piece );
205 Xor( ifrom, bb_piece );
207 bb_desti = abb_b_knight_attacks[ifrom];
208 bb_desti.p[0] &= bb_movable.p[0];
209 bb_desti.p[1] &= bb_capture.p[1];
210 bb_desti.p[2] &= bb_capture.p[2];
212 while ( BBToU( bb_desti ) )
214 ito = LastOne( bb_desti );
215 Xor( ito, bb_desti );
217 utemp = ( To2Move(ito) | From2Move(ifrom)
218 | Cap2Move(-BOARD[ito]) | Piece2Move(knight) );
219 if ( ito < A7 ) { *pmove++ = utemp | FLAG_PROMO; }
222 *pmove++ = utemp | FLAG_PROMO;
223 if ( UToCap(utemp) ) { *pmove++ = utemp; }
225 else { *pmove++ = utemp; }
234 w_gen_captures( const tree_t * restrict ptree, unsigned int * restrict pmove )
236 bitboard_t bb_movable, bb_capture, bb_piece, bb_desti;
240 bb_capture = BB_BOCCUPY;
241 BBNot( bb_movable, BB_WOCCUPY );
243 bb_desti.p[2] = BB_WPAWN_ATK.p[2] & bb_movable.p[2];
244 bb_desti.p[1] = BB_WPAWN_ATK.p[1] & bb_capture.p[1];
245 bb_desti.p[0] = BB_WPAWN_ATK.p[0] & bb_capture.p[0];
246 while ( BBToU( bb_desti ) )
248 ito = FirstOne( bb_desti );
249 Xor( ito, bb_desti );
252 utemp = ( To2Move(ito) | From2Move(ifrom) | Cap2Move(BOARD[ito])
253 | Piece2Move(pawn) );
254 if ( ito > I4 ) { utemp |= FLAG_PROMO; }
258 bb_piece = BB_WSILVER;
259 while ( BBToU( bb_piece ) )
261 ifrom = FirstOne( bb_piece );
262 Xor( ifrom, bb_piece );
264 BBAnd( bb_desti, bb_capture, abb_w_silver_attacks[ifrom] );
265 while ( BBToU( bb_desti ) )
267 ito = FirstOne( bb_desti );
268 Xor( ito, bb_desti );
270 utemp = ( To2Move(ito) | From2Move(ifrom) | Cap2Move(BOARD[ito])
271 | Piece2Move(silver) );
272 if ( ito > I4 || ifrom > I4 ) { *pmove++ = utemp | FLAG_PROMO; }
277 bb_piece = BB_WTGOLD;
278 while( BBToU( bb_piece ) )
280 ifrom = FirstOne( bb_piece );
281 Xor( ifrom, bb_piece );
283 BBAnd( bb_desti, bb_capture, abb_w_gold_attacks[ifrom] );
284 while ( BBToU( bb_desti ) )
286 ito = FirstOne( bb_desti );
287 Xor( ito, bb_desti );
289 *pmove++ = ( To2Move(ito) | From2Move(ifrom)
290 | Cap2Move(BOARD[ito])
291 | Piece2Move(-BOARD[ifrom]) );
296 BBAnd( bb_desti, bb_capture, abb_king_attacks[ifrom] );
297 while ( BBToU( bb_desti ) )
299 ito = FirstOne( bb_desti );
300 Xor( ito, bb_desti );
302 *pmove++ = ( To2Move(ito) | From2Move(ifrom)
303 | Cap2Move(BOARD[ito]) | Piece2Move(king) );
306 bb_piece = BB_WBISHOP;
307 while ( BBToU( bb_piece ) )
309 ifrom = FirstOne( bb_piece );
310 Xor( ifrom, bb_piece );
312 AttackBishop( bb_desti, ifrom );
313 bb_desti.p[2] &= bb_movable.p[2];
316 bb_desti.p[1] &= bb_movable.p[1];
317 bb_desti.p[0] &= bb_movable.p[0];
320 bb_desti.p[1] &= bb_capture.p[1];
321 bb_desti.p[0] &= bb_capture.p[0];
324 while ( BBToU( bb_desti ) )
326 ito = FirstOne( bb_desti );
327 Xor( ito, bb_desti );
329 utemp = ( To2Move(ito) | From2Move(ifrom)
330 | Cap2Move(BOARD[ito]) | Piece2Move(bishop) );
331 if ( ito > I4 || ifrom > I4 ) { utemp |= FLAG_PROMO; }
337 while ( BBToU( bb_piece ) )
339 ifrom = FirstOne( bb_piece );
340 Xor( ifrom, bb_piece );
342 AttackRook( bb_desti, ifrom );
343 bb_desti.p[2] &= bb_movable.p[2];
346 bb_desti.p[1] &= bb_movable.p[1];
347 bb_desti.p[0] &= bb_movable.p[0];
350 bb_desti.p[1] &= bb_capture.p[1];
351 bb_desti.p[0] &= bb_capture.p[0];
354 while ( BBToU( bb_desti ) )
356 ito = FirstOne( bb_desti );
357 Xor( ito, bb_desti );
359 utemp = ( To2Move(ito) | From2Move(ifrom)
360 | Cap2Move(BOARD[ito]) | Piece2Move(rook) );
361 if ( ito > I4 || ifrom > I4 ) { utemp |= FLAG_PROMO; }
366 bb_piece = BB_WHORSE;
367 while ( BBToU( bb_piece ) )
369 ifrom = FirstOne( bb_piece );
370 Xor( ifrom, bb_piece );
372 AttackHorse( bb_desti, ifrom );
373 BBAnd( bb_desti, bb_desti, bb_capture );
374 while ( BBToU( bb_desti ) )
376 ito = FirstOne( bb_desti );
377 Xor( ito, bb_desti );
379 *pmove++ = ( To2Move(ito) | From2Move(ifrom)
380 | Cap2Move(BOARD[ito]) | Piece2Move(horse) );
384 bb_piece = BB_WDRAGON;
385 while ( BBToU( bb_piece ) )
387 ifrom = FirstOne( bb_piece );
388 Xor( ifrom, bb_piece );
390 AttackDragon( bb_desti, ifrom );
391 BBAnd( bb_desti, bb_desti, bb_capture );
392 while ( BBToU( bb_desti ) )
394 ito = FirstOne( bb_desti );
395 Xor( ito, bb_desti );
397 *pmove++ = ( To2Move(ito) | From2Move(ifrom)
398 | Cap2Move(BOARD[ito]) | Piece2Move(dragon) );
402 bb_piece = BB_WLANCE;
403 while( BBToU( bb_piece ) )
405 ifrom = FirstOne( bb_piece );
406 Xor( ifrom, bb_piece );
408 bb_desti = AttackFile( ifrom );
409 BBAnd( bb_desti, bb_desti, abb_plus_rays[ifrom] );
410 bb_desti.p[2] &= bb_movable.p[2];
411 bb_desti.p[1] &= bb_capture.p[1];
412 bb_desti.p[0] &= bb_capture.p[0];
414 while ( BBToU( bb_desti ) )
416 ito = FirstOne( bb_desti );
417 Xor( ito, bb_desti );
419 utemp = ( To2Move(ito) | From2Move(ifrom)
420 | Cap2Move(BOARD[ito]) | Piece2Move(lance) );
421 if ( ito > I3 ) { *pmove++ = utemp | FLAG_PROMO; }
424 *pmove++ = utemp | FLAG_PROMO;
425 if ( UToCap(utemp) ) { *pmove++ = utemp; }
427 else { *pmove++ = utemp; }
431 bb_piece = BB_WKNIGHT;
432 while( BBToU( bb_piece ) )
434 ifrom = FirstOne( bb_piece );
435 Xor( ifrom, bb_piece );
437 bb_desti = abb_w_knight_attacks[ifrom];
438 bb_desti.p[2] &= bb_movable.p[2];
439 bb_desti.p[1] &= bb_capture.p[1];
440 bb_desti.p[0] &= bb_capture.p[0];
442 while ( BBToU( bb_desti ) )
444 ito = FirstOne( bb_desti );
445 Xor( ito, bb_desti );
447 utemp = ( To2Move(ito) | From2Move(ifrom)
448 | Cap2Move(BOARD[ito]) | Piece2Move(knight) );
449 if ( ito > I3 ) { *pmove++ = utemp | FLAG_PROMO; }
452 *pmove++ = utemp | FLAG_PROMO;
453 if ( UToCap(utemp) ) { *pmove++ = utemp; }
455 else { *pmove++ = utemp; }