Fix pondering in XBoard mode
[bonanza.git] / gennocap.c
1 #include "shogi.h"
2
3 unsigned int *
4 b_gen_nocaptures( const tree_t * restrict ptree,
5                   unsigned int * restrict pmove )
6 {
7   bitboard_t bb_empty, bb_piece, bb_desti;
8   unsigned int utemp;
9   int to, from;
10
11   BBOr( bb_empty, BB_BOCCUPY, BB_WOCCUPY );
12   BBNot( bb_empty, bb_empty );
13
14   bb_piece.p[1] = BB_BPAWN_ATK.p[1] & bb_empty.p[1];
15   bb_piece.p[2] = BB_BPAWN_ATK.p[2] & bb_empty.p[2];
16   while( bb_piece.p[1] | bb_piece.p[2] )
17     {
18       to            = last_one12( bb_piece.p[1], bb_piece.p[2] );
19       bb_piece.p[1] ^= abb_mask[to].p[1];
20       bb_piece.p[2] ^= abb_mask[to].p[2];
21       from          = to + 9;
22       *pmove++ = To2Move( to ) | From2Move( from ) | Piece2Move( pawn );
23     }
24
25   bb_piece = BB_BSILVER;
26   while( BBToU( bb_piece ) )
27     {
28       from   = LastOne( bb_piece );
29       Xor( from, bb_piece );
30
31       BBAnd( bb_desti, bb_empty, abb_b_silver_attacks[from] );
32       while ( BBToU( bb_desti ) )
33         {
34           to = LastOne( bb_desti );
35           Xor( to, bb_desti );
36
37           utemp = To2Move( to ) | From2Move( from ) | Piece2Move( silver );
38           if ( from < A6 || to < A6 ) { *pmove++ = utemp | FLAG_PROMO; }
39           *pmove++ = utemp;
40         }
41     }
42
43   bb_piece = BB_BTGOLD;
44   while( BBToU( bb_piece ) )
45     {
46       from = LastOne( bb_piece );
47       Xor( from, bb_piece );
48
49       BBAnd( bb_desti, bb_empty, abb_b_gold_attacks[from] );
50       utemp = From2Move( from ) | Piece2Move( BOARD[from] ); 
51       while ( BBToU( bb_desti ) )
52         {
53           to = LastOne( bb_desti );
54           Xor( to, bb_desti );
55           *pmove++ = To2Move( to ) | utemp;
56         }
57     }
58
59   from = SQ_BKING;
60   BBAnd( bb_desti, bb_empty, abb_king_attacks[from] );
61   utemp = From2Move( from ) | Piece2Move( king ); 
62   while ( BBToU( bb_desti ) )
63     {
64       to = LastOne( bb_desti );
65       Xor( to, bb_desti );
66       *pmove++ = To2Move( to ) | utemp;
67     }
68
69   bb_piece.p[1] = BB_BBISHOP.p[1];
70   bb_piece.p[2] = BB_BBISHOP.p[2];
71   while( bb_piece.p[1] | bb_piece.p[2] )
72     {
73       from          = last_one12( bb_piece.p[1], bb_piece.p[2] );
74       bb_piece.p[1] ^= abb_mask[from].p[1];
75       bb_piece.p[2] ^= abb_mask[from].p[2];
76
77       AttackBishop( bb_desti, from );
78       bb_desti.p[1] &= bb_empty.p[1];
79       bb_desti.p[2] &= bb_empty.p[2];
80
81       utemp = From2Move( from ) | Piece2Move( bishop );
82       while ( bb_desti.p[1] | bb_desti.p[2] )
83         {
84           to            = last_one12( bb_desti.p[1], bb_desti.p[2] );
85           bb_desti.p[1] ^= abb_mask[to].p[1];
86           bb_desti.p[2] ^= abb_mask[to].p[2];
87           *pmove++ = To2Move( to ) | utemp;
88         }
89     }
90
91   bb_piece.p[1] = BB_BROOK.p[1];
92   bb_piece.p[2] = BB_BROOK.p[2];
93   while( bb_piece.p[1] | bb_piece.p[2] )
94     {
95       from          = last_one12( bb_piece.p[1], bb_piece.p[2] );
96       bb_piece.p[1] ^= abb_mask[from].p[1];
97       bb_piece.p[2] ^= abb_mask[from].p[2];
98
99       AttackRook( bb_desti, from );
100       bb_desti.p[1] &= bb_empty.p[1];
101       bb_desti.p[2] &= bb_empty.p[2];
102
103       utemp = From2Move( from ) | Piece2Move( rook );
104       while ( bb_desti.p[1] | bb_desti.p[2] )
105         {
106           to            = last_one12( bb_desti.p[1], bb_desti.p[2] );
107           bb_desti.p[1] ^= abb_mask[to].p[1];
108           bb_desti.p[2] ^= abb_mask[to].p[2];
109           *pmove++ = To2Move( to ) | utemp;
110         }
111     }
112
113   bb_piece = BB_BHORSE;
114   while( BBToU( bb_piece ) )
115     {
116       from = LastOne( bb_piece );
117       Xor( from, bb_piece );
118       
119       AttackHorse( bb_desti, from );
120       BBAnd( bb_desti, bb_desti, bb_empty );
121       utemp = From2Move( from ) | Piece2Move( horse ); 
122       while ( BBToU( bb_desti ) )
123         {
124           to = LastOne( bb_desti );
125           Xor( to, bb_desti );
126           *pmove++ = To2Move( to ) | utemp;
127         }
128     }
129
130   bb_piece = BB_BDRAGON;
131   while( BBToU( bb_piece ) )
132     {
133       from = LastOne( bb_piece );
134       Xor( from, bb_piece );
135       
136       AttackDragon( bb_desti, from );
137       BBAnd( bb_desti, bb_desti, bb_empty );
138       utemp = From2Move( from ) | Piece2Move( dragon ); 
139       while ( BBToU( bb_desti ) )
140         {
141           to = LastOne( bb_desti );
142           Xor( to, bb_desti );
143           *pmove++ = To2Move( to ) | utemp;
144         }
145     }
146
147   bb_empty.p[0] &= 0x1ffU;
148
149   bb_piece = BB_BLANCE;
150   while( BBToU( bb_piece ) )
151     {
152       from = LastOne( bb_piece );
153       Xor( from, bb_piece );
154
155       bb_desti = AttackFile( from );
156       BBAnd( bb_desti, bb_desti, abb_minus_rays[from] );
157       BBAnd( bb_desti, bb_desti, bb_empty );
158
159       utemp = From2Move( from ) | Piece2Move( lance ); 
160       while ( BBToU( bb_desti ) )
161         {
162           to = LastOne( bb_desti );
163           Xor( to, bb_desti );
164           *pmove++ = To2Move( to ) | utemp;
165         }
166     }
167
168   bb_piece = BB_BKNIGHT;
169   while( BBToU( bb_piece ) )
170     {
171       from = LastOne( bb_piece );
172       Xor( from, bb_piece );
173
174       BBAnd( bb_desti, bb_empty, abb_b_knight_attacks[from] );
175       utemp = From2Move( from ) | Piece2Move( knight ); 
176       while ( BBToU( bb_desti ) )
177         {
178           to = LastOne( bb_desti );
179           Xor( to, bb_desti );
180           *pmove++ = To2Move( to ) | utemp;
181         }
182     }
183
184   return pmove;
185 }
186
187
188 unsigned int *
189 w_gen_nocaptures( const tree_t * restrict ptree,
190                   unsigned int * restrict pmove )
191 {
192   bitboard_t bb_empty, bb_piece, bb_desti;
193   unsigned int utemp;
194   int to, from;
195
196   BBOr( bb_empty, BB_BOCCUPY, BB_WOCCUPY );
197   BBNot( bb_empty, bb_empty );
198
199   bb_piece.p[0] = BB_WPAWN_ATK.p[0] & bb_empty.p[0];
200   bb_piece.p[1] = BB_WPAWN_ATK.p[1] & bb_empty.p[1];
201   while( bb_piece.p[0] | bb_piece.p[1] )
202     {
203       to            = first_one01( bb_piece.p[0], bb_piece.p[1] );
204       bb_piece.p[0] ^= abb_mask[to].p[0];
205       bb_piece.p[1] ^= abb_mask[to].p[1];
206       from          = to - 9;
207       *pmove++ = To2Move( to ) | From2Move( from ) | Piece2Move( pawn );
208     }
209
210   bb_piece = BB_WSILVER;
211   while( BBToU( bb_piece ) )
212     {
213       from = FirstOne( bb_piece );
214       Xor( from, bb_piece );
215
216       BBAnd( bb_desti, bb_empty, abb_w_silver_attacks[from] );
217       while ( BBToU( bb_desti ) )
218         {
219           to = FirstOne( bb_desti );
220           Xor( to, bb_desti );
221
222           utemp = To2Move( to ) | From2Move( from ) | Piece2Move( silver );
223           if ( from > I4 || to > I4 ) { *pmove++ = utemp | FLAG_PROMO; }
224           *pmove++ = utemp;
225         }
226     }
227
228   bb_piece = BB_WTGOLD;
229   while( BBToU( bb_piece ) )
230     {
231       from = FirstOne( bb_piece );
232       Xor( from, bb_piece );
233
234       BBAnd( bb_desti, bb_empty, abb_w_gold_attacks[from] );
235       utemp = From2Move( from ) | Piece2Move( -BOARD[from] ); 
236       while ( BBToU( bb_desti ) )
237         {
238           to = FirstOne( bb_desti );
239           Xor( to, bb_desti );
240           *pmove++ = To2Move( to ) | utemp;
241         }
242     }
243
244   from = SQ_WKING;
245   BBAnd( bb_desti, bb_empty, abb_king_attacks[from] );
246   utemp = From2Move( from ) | Piece2Move( king ); 
247   while ( BBToU( bb_desti ) )
248     {
249       to = FirstOne( bb_desti );
250       Xor( to, bb_desti );
251       *pmove++ = To2Move( to ) | utemp;
252     }
253
254   bb_piece.p[0] = BB_WBISHOP.p[0];
255   bb_piece.p[1] = BB_WBISHOP.p[1];
256   while( bb_piece.p[0] | bb_piece.p[1] )
257     {
258       from          = first_one01( bb_piece.p[0], bb_piece.p[1] );
259       bb_piece.p[0] ^= abb_mask[from].p[0];
260       bb_piece.p[1] ^= abb_mask[from].p[1];
261
262       AttackBishop( bb_desti, from );
263       bb_desti.p[0] &= bb_empty.p[0];
264       bb_desti.p[1] &= bb_empty.p[1];
265
266       utemp = From2Move( from ) | Piece2Move( bishop );
267       while ( bb_desti.p[0] | bb_desti.p[1] )
268         {
269           to            = first_one01( bb_desti.p[0], bb_desti.p[1] );
270           bb_desti.p[0] ^= abb_mask[to].p[0];
271           bb_desti.p[1] ^= abb_mask[to].p[1];
272           *pmove++ = To2Move( to ) | utemp;
273         }
274     }
275
276   bb_piece.p[0] = BB_WROOK.p[0];
277   bb_piece.p[1] = BB_WROOK.p[1];
278   while( bb_piece.p[0] | bb_piece.p[1] )
279     {
280       from          = first_one01( bb_piece.p[0], bb_piece.p[1] );
281       bb_piece.p[0] ^= abb_mask[from].p[0];
282       bb_piece.p[1] ^= abb_mask[from].p[1];
283
284       AttackRook( bb_desti, from );
285       bb_desti.p[0] &= bb_empty.p[0];
286       bb_desti.p[1] &= bb_empty.p[1];
287
288       utemp = From2Move( from ) | Piece2Move( rook );
289       while ( bb_desti.p[0] | bb_desti.p[1] )
290         {
291           to            = first_one01( bb_desti.p[0], bb_desti.p[1] );
292           bb_desti.p[0] ^= abb_mask[to].p[0];
293           bb_desti.p[1] ^= abb_mask[to].p[1];
294           *pmove++ = To2Move( to ) | utemp;
295         }
296     }
297
298   bb_piece = BB_WHORSE;
299   while( BBToU( bb_piece ) )
300     {
301       from = FirstOne( bb_piece );
302       Xor( from, bb_piece );
303       
304       AttackHorse( bb_desti, from );
305       BBAnd( bb_desti, bb_desti, bb_empty );
306       utemp = From2Move( from ) | Piece2Move( horse ); 
307       while ( BBToU( bb_desti ) )
308         {
309           to = FirstOne( bb_desti );
310           Xor( to, bb_desti );
311           *pmove++ = To2Move( to ) | utemp;
312         }
313     }
314
315   bb_piece = BB_WDRAGON;
316   while( BBToU( bb_piece ) )
317     {
318       from = FirstOne( bb_piece );
319       Xor( from, bb_piece );
320       
321       AttackDragon( bb_desti, from );
322       BBAnd( bb_desti, bb_desti, bb_empty );
323       utemp = From2Move( from ) | Piece2Move( dragon ); 
324       while ( BBToU( bb_desti ) )
325         {
326           to = FirstOne( bb_desti );
327           Xor( to, bb_desti );
328           *pmove++ = To2Move( to ) | utemp;
329         }
330     }
331
332   bb_empty.p[2] &= 0x7fc0000U;
333
334   bb_piece = BB_WLANCE;
335   while( BBToU( bb_piece ) )
336     {
337       from = FirstOne( bb_piece );
338       Xor( from, bb_piece );
339
340       bb_desti = AttackFile( from );
341       BBAnd( bb_desti, bb_desti, abb_plus_rays[from] );
342       BBAnd( bb_desti, bb_desti, bb_empty );
343
344       utemp = From2Move( from ) | Piece2Move( lance ); 
345       while ( BBToU( bb_desti ) )
346         {
347           to = FirstOne( bb_desti );
348           Xor( to, bb_desti );
349           *pmove++ = To2Move( to ) | utemp;
350         }
351     }
352
353   bb_piece = BB_WKNIGHT;
354   while( BBToU( bb_piece ) )
355     {
356       from = FirstOne( bb_piece );
357       Xor( from, bb_piece );
358
359       BBAnd( bb_desti, bb_empty, abb_w_knight_attacks[from] );
360       utemp = From2Move( from ) | Piece2Move( knight ); 
361       while ( BBToU( bb_desti ) )
362         {
363           to = FirstOne( bb_desti );
364           Xor( to, bb_desti );
365           *pmove++ = To2Move( to ) | utemp;
366         }
367     }
368
369   return pmove;
370 }