Check in Bonanza Feliz 0.0
[bonanza.git] / gencap.c
1 #include "shogi.h"
2
3 unsigned int *
4 b_gen_captures( const tree_t * restrict ptree, unsigned int * restrict pmove )
5 {
6   bitboard_t bb_movable, bb_capture, bb_piece, bb_desti;
7   unsigned int utemp;
8   int ito, ifrom;
9
10   bb_capture = BB_WOCCUPY;
11   BBNot( bb_movable, BB_BOCCUPY );
12
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 ) )
17     {
18       ito = LastOne( bb_desti );
19       Xor( ito, bb_desti );
20
21       ifrom = ito + 9;
22       utemp = ( To2Move(ito) | From2Move(ifrom) | Cap2Move(-BOARD[ito])
23                 | Piece2Move(pawn) );
24       if ( ito < A6 ) { utemp |= FLAG_PROMO; }
25       *pmove++ = utemp;
26     }
27
28   bb_piece = BB_BSILVER;
29   while ( BBToU( bb_piece ) )
30     {
31       ifrom = LastOne( bb_piece );
32       Xor( ifrom, bb_piece );
33
34       BBAnd( bb_desti, bb_capture, abb_b_silver_attacks[ifrom] );
35       while ( BBToU( bb_desti ) )
36         {
37           ito = LastOne( bb_desti );
38           Xor( ito, bb_desti );
39
40           utemp = ( To2Move(ito) | From2Move(ifrom) | Cap2Move(-BOARD[ito])
41                     | Piece2Move(silver) );
42           if ( ito < A6 || ifrom < A6 ) { *pmove++ = utemp | FLAG_PROMO; }
43           *pmove++ = utemp;
44         }
45     }
46
47   bb_piece = BB_BTGOLD;
48   while( BBToU( bb_piece ) )
49     {
50       ifrom = LastOne( bb_piece );
51       Xor( ifrom, bb_piece );
52
53       BBAnd( bb_desti, bb_capture, abb_b_gold_attacks[ifrom] );
54       while ( BBToU( bb_desti ) )
55         {
56           ito = LastOne( bb_desti );
57           Xor( ito, bb_desti );
58
59           *pmove++ = ( To2Move(ito) | From2Move(ifrom)
60                        | Cap2Move(-BOARD[ito])
61                        | Piece2Move(BOARD[ifrom]) );
62         }
63     }
64
65   ifrom = SQ_BKING;
66   BBAnd( bb_desti, bb_capture, abb_king_attacks[ifrom] );
67   while ( BBToU( bb_desti ) )
68     {
69       ito = LastOne( bb_desti );
70       Xor( ito, bb_desti );
71
72       *pmove++ = ( To2Move(ito) | From2Move(ifrom)
73                    | Cap2Move(-BOARD[ito]) | Piece2Move(king) );
74     }
75
76   bb_piece = BB_BBISHOP;
77   while ( BBToU( bb_piece ) )
78     {
79       ifrom = LastOne( bb_piece );
80       Xor( ifrom, bb_piece );
81
82       AttackBishop( bb_desti, ifrom );
83       bb_desti.p[0] &= bb_movable.p[0];
84       if ( ifrom < A6 )
85         {
86           bb_desti.p[1] &= bb_movable.p[1];
87           bb_desti.p[2] &= bb_movable.p[2];
88         }
89       else {
90         bb_desti.p[1] &= bb_capture.p[1];
91         bb_desti.p[2] &= bb_capture.p[2];
92       }
93
94       while ( BBToU( bb_desti ) )
95         {
96           ito = LastOne( bb_desti );
97           Xor( ito, bb_desti );
98
99           utemp = ( To2Move(ito) | From2Move(ifrom)
100                     | Cap2Move(-BOARD[ito]) | Piece2Move(bishop) );
101           if ( ito < A6 || ifrom < A6 ) { utemp |= FLAG_PROMO; }
102           *pmove++ = utemp;
103         }
104     }
105
106   bb_piece = BB_BROOK;
107   while ( BBToU( bb_piece ) )
108     {
109       ifrom = LastOne( bb_piece );
110       Xor( ifrom, bb_piece );
111
112       AttackRook( bb_desti, ifrom );
113       bb_desti.p[0] &= bb_movable.p[0];
114       if ( ifrom < A6 )
115         {
116           bb_desti.p[1] &= bb_movable.p[1];
117           bb_desti.p[2] &= bb_movable.p[2];
118         }
119       else {
120         bb_desti.p[1] &= bb_capture.p[1];
121         bb_desti.p[2] &= bb_capture.p[2];
122       }
123
124       while ( BBToU( bb_desti ) )
125         {
126           ito = LastOne( bb_desti );
127           Xor( ito, bb_desti );
128
129           utemp = ( To2Move(ito) | From2Move(ifrom)
130                     | Cap2Move(-BOARD[ito]) | Piece2Move(rook) );
131           if ( ito < A6 || ifrom < A6 ) { utemp |= FLAG_PROMO; }
132           *pmove++ = utemp;
133         }
134     }
135
136   bb_piece = BB_BHORSE;
137   while ( BBToU( bb_piece ) )
138     {
139       ifrom = LastOne( bb_piece );
140       Xor( ifrom, bb_piece );
141
142       AttackHorse( bb_desti, ifrom );
143       BBAnd( bb_desti, bb_desti, bb_capture );
144       while ( BBToU( bb_desti ) )
145         {
146           ito = LastOne( bb_desti );
147           Xor( ito, bb_desti );
148
149           *pmove++ = ( To2Move(ito) | From2Move(ifrom)
150                        | Cap2Move(-BOARD[ito]) | Piece2Move(horse) );
151         }
152     }
153
154   bb_piece = BB_BDRAGON;
155   while ( BBToU( bb_piece ) )
156     {
157       ifrom = LastOne( bb_piece );
158       Xor( ifrom, bb_piece );
159
160       AttackDragon( bb_desti, ifrom );
161       BBAnd( bb_desti, bb_desti, bb_capture );
162       while ( BBToU( bb_desti ) )
163         {
164           ito = LastOne( bb_desti );
165           Xor( ito, bb_desti );
166
167           *pmove++ = ( To2Move(ito) | From2Move(ifrom)
168                        | Cap2Move(-BOARD[ito]) | Piece2Move(dragon) );
169         }
170     }
171
172   bb_piece = BB_BLANCE;
173   while( BBToU( bb_piece ) )
174     {
175       ifrom = LastOne( bb_piece );
176       Xor( ifrom, bb_piece );
177
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];
183
184       while ( BBToU( bb_desti ) )
185         {
186           ito = LastOne( bb_desti );
187           Xor( ito, bb_desti );
188
189           utemp = ( To2Move(ito) | From2Move(ifrom)
190                     | Cap2Move(-BOARD[ito]) | Piece2Move(lance) );
191           if      ( ito < A7 ) { *pmove++ = utemp | FLAG_PROMO; }
192           else if ( ito < A6 )
193             {
194               *pmove++ = utemp | FLAG_PROMO;
195               if ( UToCap(utemp) ) { *pmove++ = utemp; }
196             }
197           else { *pmove++ = utemp; }
198         }
199     }
200
201   bb_piece = BB_BKNIGHT;
202   while( BBToU( bb_piece ) )
203     {
204       ifrom = LastOne( bb_piece );
205       Xor( ifrom, bb_piece );
206
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];
211
212       while ( BBToU( bb_desti ) )
213         {
214           ito = LastOne( bb_desti );
215           Xor( ito, bb_desti );
216
217           utemp = ( To2Move(ito) | From2Move(ifrom)
218                     | Cap2Move(-BOARD[ito]) | Piece2Move(knight) );
219           if      ( ito < A7 ) { *pmove++ = utemp | FLAG_PROMO; }
220           else if ( ito < A6 )
221             {
222               *pmove++ = utemp | FLAG_PROMO;
223               if ( UToCap(utemp) ) { *pmove++ = utemp; }
224             }
225           else { *pmove++ = utemp; }
226         }
227     }
228
229   return pmove;
230 }
231
232
233 unsigned int *
234 w_gen_captures( const tree_t * restrict ptree, unsigned int * restrict pmove )
235 {
236   bitboard_t bb_movable, bb_capture, bb_piece, bb_desti;
237   unsigned int utemp;
238   int ito, ifrom;
239
240   bb_capture = BB_BOCCUPY;
241   BBNot( bb_movable, BB_WOCCUPY );
242
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 ) )
247     {
248       ito = FirstOne( bb_desti );
249       Xor( ito, bb_desti );
250
251       ifrom = ito - 9;
252       utemp = ( To2Move(ito) | From2Move(ifrom) | Cap2Move(BOARD[ito])
253                 | Piece2Move(pawn) );
254       if ( ito > I4 ) { utemp |= FLAG_PROMO; }
255       *pmove++ = utemp;
256     }
257
258   bb_piece = BB_WSILVER;
259   while ( BBToU( bb_piece ) )
260     {
261       ifrom = FirstOne( bb_piece );
262       Xor( ifrom, bb_piece );
263
264       BBAnd( bb_desti, bb_capture, abb_w_silver_attacks[ifrom] );
265       while ( BBToU( bb_desti ) )
266         {
267           ito = FirstOne( bb_desti );
268           Xor( ito, bb_desti );
269
270           utemp = ( To2Move(ito) | From2Move(ifrom) | Cap2Move(BOARD[ito])
271                     | Piece2Move(silver) );
272           if ( ito > I4 || ifrom > I4 ) { *pmove++ = utemp | FLAG_PROMO; }
273           *pmove++ = utemp;
274         }
275     }
276
277   bb_piece = BB_WTGOLD;
278   while( BBToU( bb_piece ) )
279     {
280       ifrom = FirstOne( bb_piece );
281       Xor( ifrom, bb_piece );
282
283       BBAnd( bb_desti, bb_capture, abb_w_gold_attacks[ifrom] );
284       while ( BBToU( bb_desti ) )
285         {
286           ito = FirstOne( bb_desti );
287           Xor( ito, bb_desti );
288
289           *pmove++ = ( To2Move(ito) | From2Move(ifrom)
290                        | Cap2Move(BOARD[ito])
291                        | Piece2Move(-BOARD[ifrom]) );
292         }
293     }
294
295   ifrom = SQ_WKING;
296   BBAnd( bb_desti, bb_capture, abb_king_attacks[ifrom] );
297   while ( BBToU( bb_desti ) )
298     {
299       ito = FirstOne( bb_desti );
300       Xor( ito, bb_desti );
301
302       *pmove++ = ( To2Move(ito) | From2Move(ifrom)
303                    | Cap2Move(BOARD[ito]) | Piece2Move(king) );
304     }
305
306   bb_piece = BB_WBISHOP;
307   while ( BBToU( bb_piece ) )
308     {
309       ifrom = FirstOne( bb_piece );
310       Xor( ifrom, bb_piece );
311
312       AttackBishop( bb_desti, ifrom );
313       bb_desti.p[2] &= bb_movable.p[2];
314       if ( ifrom > I4 )
315         {
316           bb_desti.p[1] &= bb_movable.p[1];
317           bb_desti.p[0] &= bb_movable.p[0];
318         }
319       else {
320         bb_desti.p[1] &= bb_capture.p[1];
321         bb_desti.p[0] &= bb_capture.p[0];
322       }
323
324       while ( BBToU( bb_desti ) )
325         {
326           ito = FirstOne( bb_desti );
327           Xor( ito, bb_desti );
328
329           utemp = ( To2Move(ito) | From2Move(ifrom)
330                     | Cap2Move(BOARD[ito]) | Piece2Move(bishop) );
331           if ( ito > I4 || ifrom > I4 ) { utemp |= FLAG_PROMO; }
332           *pmove++ = utemp;
333         }
334     }
335
336   bb_piece = BB_WROOK;
337   while ( BBToU( bb_piece ) )
338     {
339       ifrom = FirstOne( bb_piece );
340       Xor( ifrom, bb_piece );
341
342       AttackRook( bb_desti, ifrom );
343       bb_desti.p[2] &= bb_movable.p[2];
344       if ( ifrom > I4 )
345         {
346           bb_desti.p[1] &= bb_movable.p[1];
347           bb_desti.p[0] &= bb_movable.p[0];
348         }
349       else {
350         bb_desti.p[1] &= bb_capture.p[1];
351         bb_desti.p[0] &= bb_capture.p[0];
352       }
353
354       while ( BBToU( bb_desti ) )
355         {
356           ito = FirstOne( bb_desti );
357           Xor( ito, bb_desti );
358
359           utemp = ( To2Move(ito) | From2Move(ifrom)
360                     | Cap2Move(BOARD[ito]) | Piece2Move(rook) );
361           if ( ito > I4 || ifrom > I4 ) { utemp |= FLAG_PROMO; }
362           *pmove++ = utemp;
363         }
364     }
365
366   bb_piece = BB_WHORSE;
367   while ( BBToU( bb_piece ) )
368     {
369       ifrom = FirstOne( bb_piece );
370       Xor( ifrom, bb_piece );
371
372       AttackHorse( bb_desti, ifrom );
373       BBAnd( bb_desti, bb_desti, bb_capture );
374       while ( BBToU( bb_desti ) )
375         {
376           ito = FirstOne( bb_desti );
377           Xor( ito, bb_desti );
378
379           *pmove++ = ( To2Move(ito) | From2Move(ifrom)
380                        | Cap2Move(BOARD[ito]) | Piece2Move(horse) );
381         }
382     }
383
384   bb_piece = BB_WDRAGON;
385   while ( BBToU( bb_piece ) )
386     {
387       ifrom = FirstOne( bb_piece );
388       Xor( ifrom, bb_piece );
389
390       AttackDragon( bb_desti, ifrom );
391       BBAnd( bb_desti, bb_desti, bb_capture );
392       while ( BBToU( bb_desti ) )
393         {
394           ito = FirstOne( bb_desti );
395           Xor( ito, bb_desti );
396
397           *pmove++ = ( To2Move(ito) | From2Move(ifrom)
398                        | Cap2Move(BOARD[ito]) | Piece2Move(dragon) );
399         }
400     }
401
402   bb_piece = BB_WLANCE;
403   while( BBToU( bb_piece ) )
404     {
405       ifrom = FirstOne( bb_piece );
406       Xor( ifrom, bb_piece );
407
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];
413
414       while ( BBToU( bb_desti ) )
415         {
416           ito = FirstOne( bb_desti );
417           Xor( ito, bb_desti );
418
419           utemp = ( To2Move(ito) | From2Move(ifrom)
420                     | Cap2Move(BOARD[ito]) | Piece2Move(lance) );
421           if      ( ito > I3 ) { *pmove++ = utemp | FLAG_PROMO; }
422           else if ( ito > I4 )
423             {
424               *pmove++ = utemp | FLAG_PROMO;
425               if ( UToCap(utemp) ) { *pmove++ = utemp; }
426             }
427           else { *pmove++ = utemp; }
428         }
429     }
430
431   bb_piece = BB_WKNIGHT;
432   while( BBToU( bb_piece ) )
433     {
434       ifrom = FirstOne( bb_piece );
435       Xor( ifrom, bb_piece );
436
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];
441
442       while ( BBToU( bb_desti ) )
443         {
444           ito = FirstOne( bb_desti );
445           Xor( ito, bb_desti );
446
447           utemp = ( To2Move(ito) | From2Move(ifrom)
448                     | Cap2Move(BOARD[ito]) | Piece2Move(knight) );
449           if      ( ito > I3 ) { *pmove++ = utemp | FLAG_PROMO; }
450           else if ( ito > I4 )
451             {
452               *pmove++ = utemp | FLAG_PROMO;
453               if ( UToCap(utemp) ) { *pmove++ = utemp; }
454             }
455           else { *pmove++ = utemp; }
456         }
457     }
458
459   return pmove;
460 }