Upgrade to Bonanza 6.0
[bonanza.git] / mate1ply.c
index b09a6d1..b4d52db 100644 (file)
@@ -5,13 +5,15 @@
 #define DebugOut { static int count = 0; \
                    if ( count++ < 16 ) { out_CSA_posi( ptree, stdout, 0 ); } }
 
-static int can_w_king_escape( tree_t * restrict ptree, int to, bitboard_t bb );
-static int can_b_king_escape( tree_t * restrict ptree, int to, bitboard_t bb );
-static int can_w_piece_capture( const tree_t * restrict ptree, int to );
-static int can_b_piece_capture( const tree_t * restrict ptree, int to );
+static int CONV can_w_king_escape( tree_t * restrict ptree, int to,
+                                  const bitboard_t * restrict pbb );
+static int CONV can_b_king_escape( tree_t * restrict ptree, int to,
+                                  const bitboard_t * restrict pbb );
+static int CONV can_w_piece_capture( const tree_t * restrict ptree, int to );
+static int CONV can_b_piece_capture( const tree_t * restrict ptree, int to );
 
 
-unsigned int
+unsigned int CONV
 is_b_mate_in_1ply( tree_t * restrict ptree )
 {
   bitboard_t bb, bb_temp, bb_check, bb_check_pro, bb_attacks, bb_drop, bb_move;
@@ -26,20 +28,18 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
 
   if ( IsHandRook(HAND_B) ) {
 
-    BBAnd( bb, abb_w_gold_attacks[SQ_WKING],
-          abb_b_gold_attacks[SQ_WKING] );
+    BBAnd( bb, abb_w_gold_attacks[SQ_WKING], abb_b_gold_attacks[SQ_WKING] );
     BBAnd( bb, bb, bb_drop );
-    while( BBToU(bb) )
+    while( BBTest(bb) )
       {
        to = FirstOne( bb );
        Xor( to, bb );
 
        if ( ! is_white_attacked( ptree, to ) ) { continue; }
        
-       bb_attacks                     = abb_file_attacks[to][0];
-       bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
-       if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
-       if ( can_w_piece_capture( ptree, to ) )           { continue; }
+       BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
+       if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+       if ( can_w_piece_capture( ptree, to ) )            { continue; }
        return To2Move(to) | Drop2Move(rook);
       }
 
@@ -49,7 +49,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
     if ( ! BOARD[to] && is_white_attacked( ptree, to ) )
       {
        bb_attacks = abb_file_attacks[to][0];
-       if ( ! can_w_king_escape( ptree, to, bb_attacks )
+       if ( ! can_w_king_escape( ptree, to, &bb_attacks )
             && ! can_w_piece_capture( ptree, to ) )
          {
            return To2Move(to) | Drop2Move(lance);
@@ -62,7 +62,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
     BBAnd( bb, abb_w_silver_attacks[SQ_WKING],
           abb_b_silver_attacks[SQ_WKING] );
     BBAnd( bb, bb, bb_drop );
-    while( BBToU(bb) )
+    while( BBTest(bb) )
       {
        to = FirstOne( bb );
        Xor( to, bb );
@@ -71,8 +71,8 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
        
        BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
              abb_bishop_attacks_rl45[to][0] );
-       if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
-       if ( can_w_piece_capture( ptree, to ) )           { continue; }
+       if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+       if ( can_w_piece_capture( ptree, to ) )            { continue; }
        return To2Move(to) | Drop2Move(bishop);
       }
   }
@@ -83,13 +83,12 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       {
        BBAnd( bb, abb_b_gold_attacks[SQ_WKING],
               abb_b_silver_attacks[SQ_WKING] );
-       BBNot( bb, bb );
-       BBAnd( bb, bb, bb_drop );
+       BBNotAnd( bb, bb_drop, bb );
        BBAnd( bb, bb, abb_w_gold_attacks[SQ_WKING] );
       }
     else { BBAnd( bb, bb_drop, abb_w_gold_attacks[SQ_WKING] ); }
 
-    while ( BBToU(bb) )
+    while ( BBTest(bb) )
       {
        to = FirstOne( bb );
        Xor( to, bb );
@@ -97,8 +96,8 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
        if ( ! is_white_attacked( ptree, to ) ) { continue; }
        
        bb_attacks = abb_b_gold_attacks[to];
-       if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
-       if ( can_w_piece_capture( ptree, to ) )           { continue; }
+       if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+       if ( can_w_piece_capture( ptree, to ) )            { continue; }
        return To2Move(to) | Drop2Move(gold);
       }
   }
@@ -108,8 +107,9 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
     if ( IsHandGold(HAND_B) )
       {
        if ( IsHandBishop(HAND_B) ) { goto b_silver_drop_end; }
-       BBNot( bb, abb_w_gold_attacks[SQ_WKING] );
-       BBAnd( bb, bb, abb_w_silver_attacks[SQ_WKING] );
+       BBNotAnd( bb,
+                 abb_w_silver_attacks[SQ_WKING],
+                 abb_w_gold_attacks[SQ_WKING]  );
        BBAnd( bb, bb, bb_drop );
       }
     else {
@@ -120,7 +120,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
        }
     }
     
-    while ( BBToU(bb) )
+    while ( BBTest(bb) )
       {
        to = FirstOne( bb );
        Xor( to, bb );
@@ -128,8 +128,8 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
        if ( ! is_white_attacked( ptree, to ) ) { continue; }
        
        bb_attacks = abb_b_silver_attacks[to];
-       if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
-       if ( can_w_piece_capture( ptree, to ) )           { continue; }
+       if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+       if ( can_w_piece_capture( ptree, to ) )            { continue; }
        return To2Move(to) | Drop2Move(silver);
       }
   }
@@ -138,14 +138,14 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
   if ( IsHandKnight(HAND_B) ) {
     
     BBAnd( bb, bb_drop, abb_w_knight_attacks[SQ_WKING] );
-    while ( BBToU(bb) )
+    while ( BBTest(bb) )
       {
        to = FirstOne( bb );
        Xor( to, bb );
        
        BBIni( bb_attacks );
-       if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
-       if ( can_w_piece_capture( ptree, to ) )           { continue; }
+       if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+       if ( can_w_piece_capture( ptree, to ) )            { continue; }
        return To2Move(to) | Drop2Move(knight);
       }
   }
@@ -154,14 +154,14 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
   BBNot( bb_move, BB_BOCCUPY );
 
   bb = BB_BDRAGON;
-  while ( BBToU(bb) ) {
+  while ( BBTest(bb) ) {
     from = FirstOne( bb );
     Xor( from, bb );
 
     AttackDragon( bb_attacks, from );
     BBAnd( bb_check, bb_move,  bb_attacks );
     BBAnd( bb_check, bb_check, abb_king_attacks[SQ_WKING] );
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     Xor( from, BB_B_HDK );
     Xor( from, BB_B_RD );
@@ -178,16 +178,15 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
 
       if ( (int)adirec[SQ_WKING][to] & flag_cross )
        {
-         bb_attacks = abb_file_attacks[to][0];
-         bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+         BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
          BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
        }
       else { AttackDragon( bb_attacks, to ); }
 
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -197,7 +196,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       Xor( from, BB_B_HDK );
       return ( To2Move(to) | From2Move(from)
               | Cap2Move(-BOARD[to]) | Piece2Move(dragon) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -215,7 +214,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
     AttackRook( bb_attacks, from );
     BBAnd( bb_check, bb_move, bb_attacks );
     BBAnd( bb_check, bb_check, abb_king_attacks[SQ_WKING] );
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     BB_B_RD.p[0]    ^= abb_mask[from].p[0];
     BB_BOCCUPY.p[0] ^= abb_mask[from].p[0];
@@ -231,16 +230,15 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
        
       if ( (int)adirec[SQ_WKING][to] & flag_cross )
        {
-         bb_attacks = abb_file_attacks[to][0];
-         bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+         BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
          BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
        }
       else { AttackDragon( bb_attacks, to ); }
 
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -249,7 +247,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       BB_B_RD.p[0]    ^= abb_mask[from].p[0];
       return ( To2Move(to) | From2Move(from) | FLAG_PROMO
               | Cap2Move(-BOARD[to]) | Piece2Move(rook) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -272,7 +270,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
     bb_check.p[2] &= abb_b_gold_attacks[SQ_WKING].p[2];
     bb_check.p[1] &= abb_w_gold_attacks[SQ_WKING].p[1];
     bb_check.p[2] &= abb_w_gold_attacks[SQ_WKING].p[2];
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     BB_B_RD.p[1]    ^= abb_mask[from].p[1];
     BB_B_RD.p[2]    ^= abb_mask[from].p[2];
@@ -291,21 +289,19 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       if ( to <= I7 ) {
        if ( (int)adirec[SQ_WKING][to] & flag_cross )
          {
-           bb_attacks = abb_file_attacks[to][0];
-           bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+           BBOr(bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0]);
            bb_attacks.p[0] |= abb_king_attacks[to].p[0];
            bb_attacks.p[1] |= abb_king_attacks[to].p[1];
          }
        else { AttackDragon( bb_attacks, to ); }
 
       } else {
-       bb_attacks = abb_file_attacks[to][0];
-       bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+       BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
       }
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -317,7 +313,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       return ( To2Move(to) | From2Move(from)
               | ( (to < A6) ? FLAG_PROMO : 0 )
               | Cap2Move(-BOARD[to]) | Piece2Move(rook) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -329,14 +325,14 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
   }
 
   bb = BB_BHORSE;
-  while ( BBToU(bb) ) {
+  while ( BBTest(bb) ) {
     from = FirstOne( bb );
     Xor( from, bb );
 
     AttackHorse( bb_attacks, from );
     BBAnd( bb_check, bb_move,  bb_attacks );
     BBAnd( bb_check, bb_check, abb_king_attacks[SQ_WKING] );
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     Xor( from, BB_B_HDK );
     Xor( from, BB_B_BH );
@@ -354,10 +350,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
            abb_bishop_attacks_rl45[to][0] );
       BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -367,7 +363,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       Xor( from, BB_B_HDK );
       return ( To2Move(to) | From2Move(from)
               | Cap2Move(-BOARD[to]) | Piece2Move(horse) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -385,7 +381,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
     AttackBishop( bb_attacks, from );
     BBAnd( bb_check, bb_move, bb_attacks );
     BBAnd( bb_check, bb_check, abb_king_attacks[SQ_WKING] );
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     BB_B_BH.p[0]    ^= abb_mask[from].p[0];
     BB_BOCCUPY.p[0] ^= abb_mask[from].p[0];
@@ -402,10 +398,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
            abb_bishop_attacks_rl45[to][0] );
       BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -414,7 +410,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       BB_B_BH.p[0]    ^= abb_mask[from].p[0];
       return ( To2Move(to) | From2Move(from) | FLAG_PROMO
               | Cap2Move(-BOARD[to]) | Piece2Move(bishop) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -437,7 +433,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
     bb_check.p[2] &= abb_b_silver_attacks[SQ_WKING].p[2];
     bb_check.p[1] &= abb_w_silver_attacks[SQ_WKING].p[1];
     bb_check.p[2] &= abb_w_silver_attacks[SQ_WKING].p[2];
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     BB_B_BH.p[1]    ^= abb_mask[from].p[1];
     BB_B_BH.p[2]    ^= abb_mask[from].p[2];
@@ -459,10 +455,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
        bb_attacks.p[0] |= abb_king_attacks[to].p[0];
        bb_attacks.p[1] |= abb_king_attacks[to].p[1];
       }
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -474,7 +470,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       return ( To2Move(to) | From2Move(from)
               | ( (to < A6) ? FLAG_PROMO : 0 )
               | Cap2Move(-BOARD[to]) | Piece2Move(bishop) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -486,13 +482,13 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
   }
 
   BBAnd( bb, BB_BTGOLD, b_chk_tbl[SQ_WKING].gold );
-  while ( BBToU(bb) ) {
+  while ( BBTest(bb) ) {
     from = FirstOne( bb );
     Xor( from, bb );
 
     BBAnd( bb_check, bb_move, abb_b_gold_attacks[from] );
     BBAnd( bb_check, bb_check, abb_w_gold_attacks[SQ_WKING] );
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     Xor( from, BB_BTGOLD );
     Xor( from, BB_BOCCUPY );
@@ -507,10 +503,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_white_attacked( ptree, to ) ) { continue; }
        
       bb_attacks = abb_b_gold_attacks[to];
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -519,7 +515,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       Xor( from, BB_BTGOLD );
       return ( To2Move(to) | From2Move(from)
               | Cap2Move(-BOARD[to]) | Piece2Move(BOARD[from]) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -562,10 +558,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_white_attacked( ptree, to ) ) { continue; }
       
       bb_attacks = abb_b_gold_attacks[to];
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -584,10 +580,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_white_attacked( ptree, to ) ) { continue; }
       
       bb_attacks = abb_b_silver_attacks[to];
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -634,10 +630,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_white_attacked( ptree, to ) ) { continue; }
       
       bb_attacks = abb_b_gold_attacks[to];
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -656,10 +652,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_white_attacked( ptree, to ) ) { continue; }
       
       bb_attacks = abb_b_silver_attacks[to];
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -705,10 +701,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_white_attacked( ptree, to ) ) { continue; }
        
       bb_attacks = abb_b_silver_attacks[to];
-      if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverBK( from, to ) )                  { continue; }
+      else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverBK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -731,7 +727,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
   }
 
   BBAnd( bb, BB_BKNIGHT, b_chk_tbl[SQ_WKING].knight );
-  while ( BBToU(bb) ) {
+  while ( BBTest(bb) ) {
     from = FirstOne( bb );
     Xor( from, bb );
 
@@ -754,10 +750,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
        if ( ! is_white_attacked( ptree, to ) ) { continue; }
       
        bb_attacks = abb_b_gold_attacks[to];
-       if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+       if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
        if ( IsDiscoverWK( from, to ) );
-       else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-       if ( IsDiscoverBK( from, to ) )                  { continue; }
+       else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+       if ( IsDiscoverBK( from, to ) )                    { continue; }
       
        XorFile( from, OCCUPIED_FILE );
        XorDiag2( from, OCCUPIED_DIAG2 );
@@ -782,7 +778,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       BBAnd( bb_check, bb_move, abb_b_knight_attacks[from] );
       BBAnd( bb_check, bb_check, abb_w_knight_attacks[SQ_WKING] );
       
-      if ( BBToU(bb_check) ) {
+      if ( BBTest(bb_check) ) {
        BB_BKNIGHT.p[1] ^= abb_mask[from].p[1];
        BB_BKNIGHT.p[2] ^= abb_mask[from].p[2];
        BB_BOCCUPY.p[1] ^= abb_mask[from].p[1];
@@ -796,10 +792,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
          Xor( to, bb_check );
       
          BBIni( bb_attacks );
-         if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+         if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
          if ( IsDiscoverWK( from, to ) );
-         else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-         if ( IsDiscoverBK( from, to ) )                  { continue; }
+         else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+         if ( IsDiscoverBK( from, to ) )                    { continue; }
       
          XorFile( from, OCCUPIED_FILE );
          XorDiag2( from, OCCUPIED_DIAG2 );
@@ -810,7 +806,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
          BB_BKNIGHT.p[2] ^= abb_mask[from].p[2];
          return ( To2Move(to) | From2Move(from)
                   | Cap2Move(-BOARD[to]) | Piece2Move(knight) );
-       } while ( BBToU(bb_check) );
+       } while ( BBTest(bb_check) );
 
        XorFile( from, OCCUPIED_FILE );
        XorDiag2( from, OCCUPIED_DIAG2 );
@@ -824,7 +820,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
   }
 
   BBAnd( bb, BB_BLANCE, b_chk_tbl[SQ_WKING].lance );
-  while ( BBToU(bb) ) {
+  while ( BBTest(bb) ) {
     from = FirstOne( bb );
     Xor( from, bb );
 
@@ -845,7 +841,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
     XorDiag1( from, OCCUPIED_DIAG1 );
 
     bb_check.p[0] &= 0x1ffU;
-    if ( BBToU(bb_check) ) {
+    if ( BBTest(bb_check) ) {
 
       to = SQ_WKING+nfile;
       if ( ! is_white_attacked( ptree, to ) ) {
@@ -853,10 +849,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
        goto b_lance_next;
       }
       bb_temp = abb_file_attacks[to][0];
-      if ( can_w_king_escape( ptree, to, bb_temp ) ) { goto b_lance_next; }
+      if ( can_w_king_escape( ptree, to, &bb_temp ) ) { goto b_lance_next; }
       if ( IsDiscoverWK( from, to ) );
-      else if ( can_w_piece_capture( ptree, to ) )   { goto b_lance_next; }
-      if ( IsDiscoverBK( from, to ) )               { goto b_lance_next; }
+      else if ( can_w_piece_capture( ptree, to ) )    { goto b_lance_next; }
+      if ( IsDiscoverBK( from, to ) )                 { goto b_lance_next; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -876,10 +872,10 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
        if ( ! is_white_attacked( ptree, to ) ) { continue; }
        
        bb_attacks = abb_b_gold_attacks[to];
-       if ( can_w_king_escape( ptree, to, bb_attacks ) ) { continue; }
+       if ( can_w_king_escape( ptree, to, &bb_attacks ) ) { continue; }
        if ( IsDiscoverWK( from, to ) );
-       else if ( can_w_piece_capture( ptree, to ) )      { continue; }
-       if ( IsDiscoverBK( from, to ) )                  { continue; }
+       else if ( can_w_piece_capture( ptree, to ) )       { continue; }
+       if ( IsDiscoverBK( from, to ) )                    { continue; }
        
        XorFile( from, OCCUPIED_FILE );
        XorDiag2( from, OCCUPIED_DIAG2 );
@@ -912,12 +908,12 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
     XorDiag2( from, OCCUPIED_DIAG2 );
     XorDiag1( from, OCCUPIED_DIAG1 );
 
-    if ( ! is_white_attacked( ptree, to ) )         { goto b_pawn_pro_next; }
+    if ( ! is_white_attacked( ptree, to ) )          { goto b_pawn_pro_next; }
     bb_attacks = abb_b_gold_attacks[to];
-    if ( can_w_king_escape( ptree,to,bb_attacks ) ) { goto b_pawn_pro_next; }
+    if ( can_w_king_escape( ptree,to,&bb_attacks ) ) { goto b_pawn_pro_next; }
     if ( IsDiscoverWK( from, to ) );
-    else if ( can_w_piece_capture( ptree, to ) )    { goto b_pawn_pro_next; }
-    if ( IsDiscoverBK( from, to ) )                { goto b_pawn_pro_next; }
+    else if ( can_w_piece_capture( ptree, to ) )     { goto b_pawn_pro_next; }
+    if ( IsDiscoverBK( from, to ) )                  { goto b_pawn_pro_next; }
     
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -952,11 +948,11 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
       XorDiag2( from, OCCUPIED_DIAG2 );
       XorDiag1( from, OCCUPIED_DIAG1 );
       
-      if ( ! is_white_attacked( ptree, to ) )         { goto b_pawn_end; }
+      if ( ! is_white_attacked( ptree, to ) )          { goto b_pawn_end; }
       BBIni( bb_attacks );
-      if ( can_w_king_escape( ptree,to,bb_attacks ) ) { goto b_pawn_end; }
-      if ( can_w_piece_capture( ptree, to ) )         { goto b_pawn_end; }
-      if ( IsDiscoverBK( from, to ) )                { goto b_pawn_end; }
+      if ( can_w_king_escape( ptree,to,&bb_attacks ) ) { goto b_pawn_end; }
+      if ( can_w_piece_capture( ptree, to ) )          { goto b_pawn_end; }
+      if ( IsDiscoverBK( from, to ) )                  { goto b_pawn_end; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -983,7 +979,7 @@ is_b_mate_in_1ply( tree_t * restrict ptree )
 }
 
 
-unsigned int
+unsigned int CONV
 is_w_mate_in_1ply( tree_t * restrict ptree )
 {
   bitboard_t bb, bb_temp, bb_check, bb_check_pro, bb_attacks, bb_drop, bb_move;
@@ -1001,17 +997,16 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
     BBAnd( bb, abb_w_gold_attacks[SQ_BKING],
           abb_b_gold_attacks[SQ_BKING] );
     BBAnd( bb, bb, bb_drop );
-    while( BBToU(bb) )
+    while( BBTest(bb) )
       {
        to = LastOne( bb );
        Xor( to, bb );
 
        if ( ! is_black_attacked( ptree, to ) ) { continue; }
        
-       bb_attacks                     = abb_file_attacks[to][0];
-       bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
-       if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
-       if ( can_b_piece_capture( ptree, to ) )           { continue; }
+       BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
+       if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+       if ( can_b_piece_capture( ptree, to ) )            { continue; }
        return To2Move(to) | Drop2Move(rook);
       }
 
@@ -1021,7 +1016,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
     if ( ( ! BOARD[to] ) && is_black_attacked( ptree, to ) )
       {
        bb_attacks = abb_file_attacks[to][0];
-       if ( ( ! can_b_king_escape( ptree, to, bb_attacks ) )
+       if ( ( ! can_b_king_escape( ptree, to, &bb_attacks ) )
             && ( ! can_b_piece_capture( ptree, to ) ) )
          {
            return To2Move(to) | Drop2Move(lance);
@@ -1034,7 +1029,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
     BBAnd( bb, abb_w_silver_attacks[SQ_BKING],
           abb_b_silver_attacks[SQ_BKING] );
     BBAnd( bb, bb, bb_drop );
-    while( BBToU(bb) )
+    while( BBTest(bb) )
       {
        to = LastOne( bb );
        Xor( to, bb );
@@ -1043,8 +1038,8 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
        
        BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
              abb_bishop_attacks_rl45[to][0] );
-       if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
-       if ( can_b_piece_capture( ptree, to ) )           { continue; }
+       if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+       if ( can_b_piece_capture( ptree, to ) )            { continue; }
        return To2Move(to) | Drop2Move(bishop);
       }
   }
@@ -1055,13 +1050,12 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       {
        BBAnd( bb, abb_w_gold_attacks[SQ_BKING],
               abb_w_silver_attacks[SQ_BKING] );
-       BBNot( bb, bb );
-       BBAnd( bb, bb, bb_drop );
+       BBNotAnd( bb, bb_drop, bb );
        BBAnd( bb, bb, abb_b_gold_attacks[SQ_BKING] );
       }
     else { BBAnd( bb, bb_drop, abb_b_gold_attacks[SQ_BKING] ); }
 
-    while ( BBToU(bb) )
+    while ( BBTest(bb) )
       {
        to = LastOne( bb );
        Xor( to, bb );
@@ -1069,8 +1063,8 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
        if ( ! is_black_attacked( ptree, to ) ) { continue; }
        
        bb_attacks = abb_w_gold_attacks[to];
-       if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
-       if ( can_b_piece_capture( ptree, to ) )           { continue; }
+       if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+       if ( can_b_piece_capture( ptree, to ) )            { continue; }
        return To2Move(to) | Drop2Move(gold);
       }
   }
@@ -1080,8 +1074,9 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
     if ( IsHandGold(HAND_W) )
       {
        if ( IsHandBishop(HAND_W) ) { goto w_silver_drop_end; }
-       BBNot( bb, abb_b_gold_attacks[SQ_BKING] );
-       BBAnd( bb, bb, abb_b_silver_attacks[SQ_BKING] );
+       BBNotAnd( bb,
+                 abb_b_silver_attacks[SQ_BKING],
+                 abb_b_gold_attacks[SQ_BKING] );
        BBAnd( bb, bb, bb_drop );
       }
     else {
@@ -1092,7 +1087,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
        }
     }
     
-    while ( BBToU(bb) )
+    while ( BBTest(bb) )
       {
        to = LastOne( bb );
        Xor( to, bb );
@@ -1100,8 +1095,8 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
        if ( ! is_black_attacked( ptree, to ) ) { continue; }
        
        bb_attacks = abb_w_silver_attacks[to];
-       if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
-       if ( can_b_piece_capture( ptree, to ) )           { continue; }
+       if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+       if ( can_b_piece_capture( ptree, to ) )            { continue; }
        return To2Move(to) | Drop2Move(silver);
       }
   }
@@ -1110,14 +1105,14 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
   if ( IsHandKnight(HAND_W) ) {
     
     BBAnd( bb, bb_drop, abb_b_knight_attacks[SQ_BKING] );
-    while ( BBToU(bb) )
+    while ( BBTest(bb) )
       {
        to = LastOne( bb );
        Xor( to, bb );
        
        BBIni( bb_attacks );
-       if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
-       if ( can_b_piece_capture( ptree, to ) )           { continue; }
+       if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
+       if ( can_b_piece_capture( ptree, to ) )            { continue; }
        return To2Move(to) | Drop2Move(knight);
       }
   }
@@ -1126,14 +1121,14 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
   BBNot( bb_move, BB_WOCCUPY );
 
   bb = BB_WDRAGON;
-  while ( BBToU(bb) ) {
+  while ( BBTest(bb) ) {
     from = LastOne( bb );
     Xor( from, bb );
 
     AttackDragon( bb_attacks, from );
     BBAnd( bb_check, bb_move,  bb_attacks );
     BBAnd( bb_check, bb_check, abb_king_attacks[SQ_BKING] );
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     Xor( from, BB_W_HDK );
     Xor( from, BB_W_RD );
@@ -1150,16 +1145,15 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
        
       if ( (int)adirec[SQ_BKING][to] & flag_cross )
        {
-         bb_attacks = abb_file_attacks[to][0];
-         bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+         BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
          BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
        }
       else { AttackDragon( bb_attacks, to ); }
 
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1169,7 +1163,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       Xor( from, BB_W_HDK );
       return ( To2Move(to) | From2Move(from)
               | Cap2Move(BOARD[to]) | Piece2Move(dragon) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1187,7 +1181,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
     AttackRook( bb_attacks, from );
     BBAnd( bb_check, bb_move, bb_attacks );
     BBAnd( bb_check, bb_check, abb_king_attacks[SQ_BKING] );
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     BB_W_RD.p[2]    ^= abb_mask[from].p[2];
     BB_WOCCUPY.p[2] ^= abb_mask[from].p[2];
@@ -1203,16 +1197,15 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
        
       if ( (int)adirec[SQ_BKING][to] & flag_cross )
        {
-         bb_attacks = abb_file_attacks[to][0];
-         bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+         BBOr( bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0] );
          BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
        }
       else { AttackDragon( bb_attacks, to ); }
 
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1221,7 +1214,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       BB_W_RD.p[2]    ^= abb_mask[from].p[2];
       return ( To2Move(to) | From2Move(from) | FLAG_PROMO
               | Cap2Move(BOARD[to]) | Piece2Move(rook) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1244,7 +1237,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
     bb_check.p[0] &= abb_w_gold_attacks[SQ_BKING].p[0];
     bb_check.p[1] &= abb_w_gold_attacks[SQ_BKING].p[1];
     bb_check.p[2] &= abb_king_attacks[SQ_BKING].p[2];
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     BB_W_RD.p[0]    ^= abb_mask[from].p[0];
     BB_W_RD.p[1]    ^= abb_mask[from].p[1];
@@ -1263,20 +1256,18 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       if ( to >= A3 ) {
        if ( (int)adirec[SQ_BKING][to] & flag_cross )
          {
-           bb_attacks = abb_file_attacks[to][0];
-           bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+           BBOr(bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0]);
            bb_attacks.p[1] |= abb_king_attacks[to].p[1];
            bb_attacks.p[2] |= abb_king_attacks[to].p[2];
          }
        else { AttackDragon( bb_attacks, to ); }
       } else {
-       bb_attacks = abb_file_attacks[to][0];
-       bb_attacks.p[aslide[to].ir0] |= ai_rook_attacks_r0[to][0];
+       BBOr(bb_attacks, abb_file_attacks[to][0], abb_rank_attacks[to][0]);
       }
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1288,7 +1279,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       return ( To2Move(to) | From2Move(from)
               | ( (to > I4) ? FLAG_PROMO : 0 )
               | Cap2Move(BOARD[to]) | Piece2Move(rook) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1300,14 +1291,14 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
   }
 
   bb = BB_WHORSE;
-  while ( BBToU(bb) ) {
+  while ( BBTest(bb) ) {
     from = LastOne( bb );
     Xor( from, bb );
 
     AttackHorse( bb_attacks, from );
     BBAnd( bb_check, bb_move,  bb_attacks );
     BBAnd( bb_check, bb_check, abb_king_attacks[SQ_BKING] );
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     Xor( from, BB_W_HDK );
     Xor( from, BB_W_BH );
@@ -1325,10 +1316,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
            abb_bishop_attacks_rl45[to][0] );
       BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1338,7 +1329,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       Xor( from, BB_W_HDK );
       return ( To2Move(to) | From2Move(from)
               | Cap2Move(BOARD[to]) | Piece2Move(horse) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1356,7 +1347,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
     AttackBishop( bb_attacks, from );
     BBAnd( bb_check, bb_move, bb_attacks );
     BBAnd( bb_check, bb_check, abb_king_attacks[SQ_BKING] );
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     BB_W_BH.p[2]    ^= abb_mask[from].p[2];
     BB_WOCCUPY.p[2] ^= abb_mask[from].p[2];
@@ -1373,10 +1364,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       BBOr( bb_attacks, abb_bishop_attacks_rr45[to][0],
            abb_bishop_attacks_rl45[to][0] );
       BBOr( bb_attacks, bb_attacks, abb_king_attacks[to] );
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1385,7 +1376,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       BB_W_BH.p[2]    ^= abb_mask[from].p[2];
       return ( To2Move(to) | From2Move(from) | FLAG_PROMO
               | Cap2Move(BOARD[to]) | Piece2Move(bishop) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1408,7 +1399,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
     bb_check.p[0] &= abb_w_silver_attacks[SQ_BKING].p[0];
     bb_check.p[1] &= abb_w_silver_attacks[SQ_BKING].p[1];
     bb_check.p[2] &= abb_king_attacks[SQ_BKING].p[2];
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     BB_W_BH.p[0]    ^= abb_mask[from].p[0];
     BB_W_BH.p[1]    ^= abb_mask[from].p[1];
@@ -1430,10 +1421,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
        bb_attacks.p[1] |= abb_king_attacks[to].p[1];
        bb_attacks.p[2] |= abb_king_attacks[to].p[2];
       }
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1445,7 +1436,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       return ( To2Move(to) | From2Move(from)
               | ( (to > I4) ? FLAG_PROMO : 0 )
               | Cap2Move(BOARD[to]) | Piece2Move(bishop) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1457,13 +1448,13 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
   }
 
   BBAnd( bb, BB_WTGOLD, w_chk_tbl[SQ_BKING].gold );
-  while ( BBToU(bb) ) {
+  while ( BBTest(bb) ) {
     from = LastOne( bb );
     Xor( from, bb );
 
     BBAnd( bb_check, bb_move, abb_w_gold_attacks[from] );
     BBAnd( bb_check, bb_check, abb_b_gold_attacks[SQ_BKING] );
-    if ( ! BBToU(bb_check) ) { continue; }
+    if ( ! BBTest(bb_check) ) { continue; }
 
     Xor( from, BB_WTGOLD );
     Xor( from, BB_WOCCUPY );
@@ -1478,10 +1469,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_black_attacked( ptree, to ) ) { continue; }
        
       bb_attacks = abb_w_gold_attacks[to];
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1490,7 +1481,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       Xor( from, BB_WTGOLD );
       return ( To2Move(to) | From2Move(from)
               | Cap2Move(BOARD[to]) | Piece2Move(-BOARD[from]) );
-    } while ( BBToU(bb_check) );
+    } while ( BBTest(bb_check) );
 
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1533,10 +1524,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_black_attacked( ptree, to ) ) { continue; }
       
       bb_attacks = abb_w_gold_attacks[to];
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1555,10 +1546,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_black_attacked( ptree, to ) ) { continue; }
       
       bb_attacks = abb_w_silver_attacks[to];
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1605,10 +1596,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_black_attacked( ptree, to ) ) { continue; }
       
       bb_attacks = abb_w_gold_attacks[to];
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1627,10 +1618,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_black_attacked( ptree, to ) ) { continue; }
       
       bb_attacks = abb_w_silver_attacks[to];
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                  { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1677,10 +1668,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       if ( ! is_black_attacked( ptree, to ) ) { continue; }
        
       bb_attacks = abb_w_silver_attacks[to];
-      if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+      if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-      if ( IsDiscoverWK( from, to ) )                   { continue; }
+      else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+      if ( IsDiscoverWK( from, to ) )                    { continue; }
        
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1703,7 +1694,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
   }
 
   BBAnd( bb, BB_WKNIGHT, w_chk_tbl[SQ_BKING].knight );
-  while ( BBToU(bb) ) {
+  while ( BBTest(bb) ) {
     from = LastOne( bb );
     Xor( from, bb );
 
@@ -1726,10 +1717,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
        if ( ! is_black_attacked( ptree, to ) ) { continue; }
       
        bb_attacks = abb_w_gold_attacks[to];
-       if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+       if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
        if ( IsDiscoverBK( from, to ) );
-       else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-       if ( IsDiscoverWK( from, to ) )                   { continue; }
+       else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+       if ( IsDiscoverWK( from, to ) )                    { continue; }
       
        XorFile( from, OCCUPIED_FILE );
        XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1754,7 +1745,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       BBAnd( bb_check, bb_move, abb_w_knight_attacks[from] );
       BBAnd( bb_check, bb_check, abb_b_knight_attacks[SQ_BKING] );
       
-      if ( BBToU(bb_check) ) {
+      if ( BBTest(bb_check) ) {
        BB_WKNIGHT.p[0] ^= abb_mask[from].p[0];
        BB_WKNIGHT.p[1] ^= abb_mask[from].p[1];
        BB_WOCCUPY.p[0] ^= abb_mask[from].p[0];
@@ -1768,10 +1759,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
          Xor( to, bb_check );
       
          BBIni( bb_attacks );
-         if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+         if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
          if ( IsDiscoverBK( from, to ) );
-         else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-         if ( IsDiscoverWK( from, to ) )                   { continue; }
+         else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+         if ( IsDiscoverWK( from, to ) )                    { continue; }
       
          XorFile( from, OCCUPIED_FILE );
          XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1782,7 +1773,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
          BB_WKNIGHT.p[1] ^= abb_mask[from].p[1];
          return ( To2Move(to) | From2Move(from)
                   | Cap2Move(BOARD[to]) | Piece2Move(knight) );
-       } while ( BBToU(bb_check) );
+       } while ( BBTest(bb_check) );
 
        XorFile( from, OCCUPIED_FILE );
        XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1796,7 +1787,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
   }
 
   BBAnd( bb, BB_WLANCE, w_chk_tbl[SQ_BKING].lance );
-  while ( BBToU(bb) ) {
+  while ( BBTest(bb) ) {
     from = LastOne( bb );
     Xor( from, bb );
 
@@ -1817,7 +1808,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
     XorDiag1( from, OCCUPIED_DIAG1 );
 
     bb_check.p[2] &= 0x7fc0000U;
-    if ( BBToU(bb_check) ) {
+    if ( BBTest(bb_check) ) {
 
       to = SQ_BKING-nfile;
       if ( ! is_black_attacked( ptree, to ) ) {
@@ -1825,10 +1816,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
        goto w_lance_next;
       }
       bb_temp = abb_file_attacks[to][0];
-      if ( can_b_king_escape( ptree, to, bb_temp ) ) { goto w_lance_next; }
+      if ( can_b_king_escape( ptree, to, &bb_temp ) ) { goto w_lance_next; }
       if ( IsDiscoverBK( from, to ) );
-      else if ( can_b_piece_capture( ptree, to ) )   { goto w_lance_next; }
-      if ( IsDiscoverWK( from, to ) )                { goto w_lance_next; }
+      else if ( can_b_piece_capture( ptree, to ) )    { goto w_lance_next; }
+      if ( IsDiscoverWK( from, to ) )                 { goto w_lance_next; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1848,10 +1839,10 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
        if ( ! is_black_attacked( ptree, to ) ) { continue; }
        
        bb_attacks = abb_w_gold_attacks[to];
-       if ( can_b_king_escape( ptree, to, bb_attacks ) ) { continue; }
+       if ( can_b_king_escape( ptree, to, &bb_attacks ) ) { continue; }
        if ( IsDiscoverBK( from, to ) );
-       else if ( can_b_piece_capture( ptree, to ) )      { continue; }
-       if ( IsDiscoverWK( from, to ) )                   { continue; }
+       else if ( can_b_piece_capture( ptree, to ) )       { continue; }
+       if ( IsDiscoverWK( from, to ) )                    { continue; }
        
        XorFile( from, OCCUPIED_FILE );
        XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1884,12 +1875,12 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
     XorDiag2( from, OCCUPIED_DIAG2 );
     XorDiag1( from, OCCUPIED_DIAG1 );
 
-    if ( ! is_black_attacked( ptree, to ) )         { goto w_pawn_pro_next; }
+    if ( ! is_black_attacked( ptree, to ) )          { goto w_pawn_pro_next; }
     bb_attacks = abb_w_gold_attacks[to];
-    if ( can_b_king_escape( ptree,to,bb_attacks ) ) { goto w_pawn_pro_next; }
+    if ( can_b_king_escape( ptree,to,&bb_attacks ) ) { goto w_pawn_pro_next; }
     if ( IsDiscoverBK( from, to ) );
-    else if ( can_b_piece_capture( ptree, to ) )    { goto w_pawn_pro_next; }
-    if ( IsDiscoverWK( from, to ) )                 { goto w_pawn_pro_next; }
+    else if ( can_b_piece_capture( ptree, to ) )     { goto w_pawn_pro_next; }
+    if ( IsDiscoverWK( from, to ) )                  { goto w_pawn_pro_next; }
     
     XorFile( from, OCCUPIED_FILE );
     XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1924,11 +1915,11 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
       XorDiag2( from, OCCUPIED_DIAG2 );
       XorDiag1( from, OCCUPIED_DIAG1 );
       
-      if ( ! is_black_attacked( ptree, to ) )         { goto w_pawn_end; }
+      if ( ! is_black_attacked( ptree, to ) )          { goto w_pawn_end; }
       BBIni( bb_attacks );
-      if ( can_b_king_escape( ptree,to,bb_attacks ) ) { goto w_pawn_end; }
-      if ( can_b_piece_capture( ptree, to ) )         { goto w_pawn_end; }
-      if ( IsDiscoverWK( from, to ) )                 { goto w_pawn_end; }
+      if ( can_b_king_escape( ptree,to,&bb_attacks ) ) { goto w_pawn_end; }
+      if ( can_b_piece_capture( ptree, to ) )          { goto w_pawn_end; }
+      if ( IsDiscoverWK( from, to ) )                  { goto w_pawn_end; }
       
       XorFile( from, OCCUPIED_FILE );
       XorDiag2( from, OCCUPIED_DIAG2 );
@@ -1955,7 +1946,7 @@ is_w_mate_in_1ply( tree_t * restrict ptree )
 }
 
 
-static int
+static int CONV
 can_w_piece_capture( const tree_t * restrict ptree, int to )
 {
   bitboard_t bb_sum, bb, bb_attacks;
@@ -1970,29 +1961,22 @@ can_w_piece_capture( const tree_t * restrict ptree, int to )
   
   BBAnd( bb_sum, BB_WKNIGHT, abb_b_knight_attacks[to] );
   
-  BBAnd( bb, BB_WSILVER, abb_b_silver_attacks[to] );
-  BBOr( bb_sum, bb, bb_sum );
-  
-  BBAnd( bb, BB_WTGOLD, abb_b_gold_attacks[to] );
-  BBOr( bb_sum, bb, bb_sum );
+  BBAndOr( bb_sum, BB_WSILVER, abb_b_silver_attacks[to] );
+  BBAndOr( bb_sum, BB_WTGOLD, abb_b_gold_attacks[to] );
 
   BBOr( bb, BB_WHORSE, BB_WDRAGON );
-  BBAnd( bb, bb, abb_king_attacks[to] );
-  BBOr( bb_sum, bb, bb_sum );
+  BBAndOr( bb_sum, bb, abb_king_attacks[to] );
   
   AttackBishop( bb, to );
-  BBAnd( bb, BB_W_BH, bb );
-  BBOr( bb_sum, bb, bb_sum );
+  BBAndOr( bb_sum, BB_W_BH, bb );
 
-  bb_sum.p[aslide[to].ir0] |= BB_W_RD.p[aslide[to].ir0] & AttackRank(to);
-
-  BBAnd( bb, BB_WLANCE, abb_minus_rays[to] );
-  BBOr( bb, bb, BB_W_RD );
+  BBAndOr( bb_sum, BB_W_RD, AttackRank(to) );
+  bb = BB_W_RD;
+  BBAndOr( bb, BB_WLANCE, abb_minus_rays[to] );
   bb_attacks = AttackFile( to );
-  BBAnd( bb, bb, bb_attacks );
-  BBOr( bb_sum, bb_sum, bb );
+  BBAndOr( bb_sum, bb, bb_attacks );
 
-  while ( BBToU( bb_sum ) )
+  while ( BBTest( bb_sum ) )
     {
       from  = FirstOne( bb_sum );
       Xor( from, bb_sum );
@@ -2005,10 +1989,10 @@ can_w_piece_capture( const tree_t * restrict ptree, int to )
 }
 
 
-static int
+static int CONV
 can_b_piece_capture( const tree_t * restrict ptree, int to )
 {
-  bitboard_t bb_sum, bb, bb_attacks;
+  bitboard_t bb_sum, bb;
   int idirec, from;
 
   from = to+nfile;
@@ -2020,29 +2004,21 @@ can_b_piece_capture( const tree_t * restrict ptree, int to )
 
   BBAnd( bb_sum, BB_BKNIGHT, abb_w_knight_attacks[to] );
 
-  BBAnd( bb, BB_BSILVER, abb_w_silver_attacks[to] );
-  BBOr( bb_sum, bb_sum, bb );
-
-  BBAnd( bb, BB_BTGOLD, abb_w_gold_attacks[to] );
-  BBOr( bb_sum, bb_sum, bb );
+  BBAndOr( bb_sum, BB_BSILVER, abb_w_silver_attacks[to] );
+  BBAndOr( bb_sum, BB_BTGOLD, abb_w_gold_attacks[to] );
 
   BBOr( bb, BB_BHORSE, BB_BDRAGON );
-  BBAnd( bb, bb, abb_king_attacks[to] );
-  BBOr( bb_sum, bb_sum, bb );
+  BBAndOr( bb_sum, bb, abb_king_attacks[to] );
   
   AttackBishop( bb, to );
-  BBAnd( bb, bb, BB_B_BH );
-  BBOr( bb_sum, bb_sum, bb );
+  BBAndOr( bb_sum, bb, BB_B_BH );
+  BBAndOr( bb_sum, BB_B_RD, AttackRank(to) );
 
-  bb_sum.p[aslide[to].ir0] |= BB_B_RD.p[aslide[to].ir0] & AttackRank(to);
-
-  BBAnd( bb, BB_BLANCE, abb_plus_rays[to] );
-  BBOr( bb, bb, BB_B_RD );
-  bb_attacks = AttackFile( to );
-  BBAnd( bb, bb, bb_attacks );
-  BBOr( bb_sum, bb_sum, bb );
+  bb = BB_B_RD;
+  BBAndOr( bb, BB_BLANCE, abb_plus_rays[to] );
+  BBAndOr( bb_sum, bb, AttackFile( to ) );
 
-  while ( BBToU( bb_sum ) )
+  while ( BBTest( bb_sum ) )
     {
       from  = LastOne( bb_sum );
       Xor( from, bb_sum );
@@ -2055,9 +2031,11 @@ can_b_piece_capture( const tree_t * restrict ptree, int to )
 }
 
 
-static int
-can_w_king_escape( tree_t * restrict ptree, int to, bitboard_t bb )
+static int CONV
+can_w_king_escape( tree_t * restrict ptree, int to,
+                  const bitboard_t * restrict pbb )
 {
+  bitboard_t bb = *pbb;
   int iret = 0, iescape;
 
   if ( !BOARD[to] )
@@ -2074,10 +2052,9 @@ can_w_king_escape( tree_t * restrict ptree, int to, bitboard_t bb )
 
   BBOr( bb, bb, abb_mask[to] );
   BBOr( bb, bb, BB_WOCCUPY );
-  BBNot( bb, bb );
-  BBAnd( bb, bb, abb_king_attacks[SQ_WKING] );
+  BBNotAnd( bb, abb_king_attacks[SQ_WKING], bb );
   
-  while( BBToU(bb) )
+  while( BBTest(bb) )
     {
       iescape = FirstOne( bb );
       if ( ! is_white_attacked( ptree, iescape ) )
@@ -2104,9 +2081,11 @@ can_w_king_escape( tree_t * restrict ptree, int to, bitboard_t bb )
 }
 
 
-static int
-can_b_king_escape( tree_t * restrict ptree, int to, bitboard_t bb )
+static int CONV
+can_b_king_escape( tree_t * restrict ptree, int to,
+                  const bitboard_t * restrict pbb )
 {
+  bitboard_t bb = *pbb;
   int iret = 0, iescape;
 
   if ( !BOARD[to] )
@@ -2124,10 +2103,9 @@ can_b_king_escape( tree_t * restrict ptree, int to, bitboard_t bb )
 
   BBOr( bb, bb, abb_mask[to] );
   BBOr( bb, bb, BB_BOCCUPY );
-  BBNot( bb, bb );
-  BBAnd( bb, bb, abb_king_attacks[SQ_BKING] );
+  BBNotAnd( bb, abb_king_attacks[SQ_BKING], bb );
   
-  while( BBToU(bb) )
+  while( BBTest(bb) )
     {
       iescape = LastOne( bb );
       if ( ! is_black_attacked( ptree, iescape ) )