Upgrade to Bonanza 6.0
[bonanza.git] / ini.c
diff --git a/ini.c b/ini.c
index 13db541..6522316 100644 (file)
--- a/ini.c
+++ b/ini.c
@@ -16,7 +16,6 @@ static int last_one00( int pcs );
 
 static void ini_check_table( void );
 static bitboard_t bb_set_mask( int isquare );
-static int load_fv( void );
 static void set_attacks( int irank, int ifilea, bitboard_t *pbb );
 static void ini_is_same( void );
 static void ini_tables( void );
@@ -24,8 +23,7 @@ static void ini_attack_tables( void );
 static void ini_random_table( void );
 
 
-static int
-load_fv( void )
+int CONV load_fv( void )
 {
   FILE *pf;
   size_t size;
@@ -83,35 +81,6 @@ load_fv( void )
   return 1;
 }
 
-/*
-static int
-ini_fv( void )
-{
-  FILE *pf;
-  size_t size, i;
-
-  pf = file_open( str_fv, "wb" );
-  if ( pf == NULL ) { return -2; }
-
-  size = nsquare * pos_n;
-  for ( i = 0; i < size; i++ ) { pc_on_sq[0][i] = 0; }
-  if ( fwrite( pc_on_sq, sizeof(short), size, pf ) != size )
-    {
-      str_error = str_io_error;
-      return -2;
-    }
-
-  size = nsquare * nsquare * kkp_end;
-  for ( i = 0; i < size; i++ ) { kkp[0][0][i] = 0; }
-  if ( fwrite( kkp, sizeof(short), size, pf ) != size )
-    {
-      str_error = str_io_error;
-      return -2;
-    }
-
-  return file_close( pf );
-}
-*/
 
 int
 ini( tree_t * restrict ptree )
@@ -123,7 +92,7 @@ ini( tree_t * restrict ptree )
 
   for ( i = 0; i < 31; i++ ) { p_value[i]       = 0; }
   for ( i = 0; i < 31; i++ ) { p_value_ex[i]    = 0; }
-  for ( i = 0; i < 15; i++ ) { benefit2promo[i] = 0; }
+  for ( i = 0; i < 15; i++ ) { p_value_pm[i] = 0; }
   p_value[15+pawn]       = DPawn;
   p_value[15+lance]      = DLance;
   p_value[15+knight]     = DKnight;
@@ -144,6 +113,7 @@ ini( tree_t * restrict ptree )
   ptrans_table_orig     = NULL;
   record_game.pf        = NULL;
   node_per_second       = TIME_CHECK_MIN_NODE;
+  resign_threshold      = RESIGN_THRESHOLD;
   node_limit            = UINT64_MAX;
   time_response         = TIME_RESPONSE;
   sec_limit             = 0;
@@ -151,9 +121,22 @@ ini( tree_t * restrict ptree )
   sec_limit_depth       = UINT_MAX;
   depth_limit           = PLY_MAX;
   log2_ntrans_table     = 20;
-  
+  record_num            = -1;
+
   pf_book               = NULL;
-  pf_hash               = NULL;
+
+  for ( i = 0; i < NUM_UNMAKE; i++ )
+    {
+      amove_save[i]            = MOVE_NA;
+      amaterial_save[i]        = 0;
+      ansuc_check_save[i]      = 0;
+      alast_root_value_save[i] = 0;
+      alast_pv_save[i].a[0]    = 0;
+      alast_pv_save[i].a[1]    = 0;
+      alast_pv_save[i].depth   = 0;
+      alast_pv_save[i].length  = 0;
+      alast_pv_save[i].type    = no_rep;
+    }
 
 #if defined(TLP)
   tlp_max        = 1;
@@ -177,8 +160,9 @@ ini( tree_t * restrict ptree )
       tlp_atree_work[i].tlp_used = 0;
       if ( lock_init( &tlp_atree_work[i].tlp_lock ) < 0 ) { return -1; }
     }
-#  if defined(_WIN32)
-#  else
+#endif
+
+#if ! defined(_WIN32) && ( defined(DFPN_CLIENT) || defined(TLP) )
   if ( pthread_attr_init( &pthread_attr )
        || pthread_attr_setdetachstate( &pthread_attr,
                                       PTHREAD_CREATE_DETACHED ) )
@@ -186,26 +170,52 @@ ini( tree_t * restrict ptree )
       str_error = "pthread_attr_init() failed.";
       return -1;
     }
-#  endif
 #endif
 
+
 #if defined(CSA_LAN)
   sckt_csa       = SCKT_NULL;
   time_last_send = 0U;
 #endif
 
+#if defined(MNJ_LAN) || defined(USI)
+  moves_ignore[0] = MOVE_NA;
+#endif
+
 #if defined(MNJ_LAN)
-  for ( i = 1; i < MNJ_MASK + 1; i++ ) { mnj_tbl[i] = 0; }
-  sckt_mnj       = SCKT_NULL;
-  mnj_posi_id    = 0;
-  mnj_move_last  = 0;
-  time_last_send = 0U;
+  sckt_mnj              = SCKT_NULL;
+  mnj_posi_id           = 0;
+  time_last_send        = 0U;
+#endif
+
+#if defined(TLP) || defined(DFPN_CLIENT)
+  if ( lock_init( &io_lock ) < 0 ) { return -1; }
+#endif
+
+#if defined(DFPN_CLIENT)
+  if ( lock_init( &dfpn_client_lock ) < 0 ) { return -1; }
+  dfpn_client_str_move[0]  = '\0';
+  dfpn_client_str_addr[0]  = '\0';
+  dfpn_client_signature[0] = '\0';
+  dfpn_client_rresult      = dfpn_client_na;
+  dfpn_client_num_cresult  = 0;
+  dfpn_client_flag_read    = 0;
+  dfpn_client_sckt         = SCKT_NULL;
+#endif
+
+#if defined(USI)
+  usi_byoyomi         = 0;
+  if ( usi_mode != usi_off )
+    {
+      game_status      |= flag_noprompt;
+      game_status      |= flag_nostdout;
+      game_status      |= flag_noponder;
+      game_status      |= flag_nobeep;
+      resign_threshold  = 65535;
+    }
 #endif
 
 #if defined(_WIN32)
-#  if defined(DEKUNOBOU)
-  dek_ngame = 0;
-#  endif
 #else
   clk_tck = (clock_t)sysconf(_SC_CLK_TCK);
 #endif
@@ -224,13 +234,6 @@ ini( tree_t * restrict ptree )
     }
 #endif
   
-  for ( i = 0; i < HASH_REG_HIST_LEN; i++ )
-    {
-      history_book_learn[i].move_responsible = 0;
-      history_book_learn[i].move_probed      = 0;
-      history_book_learn[i].move_played      = 0;
-    }
-
   ini_rand( 5489U );
   ini_is_same();
   ini_tables();
@@ -250,24 +253,29 @@ ini( tree_t * restrict ptree )
 
   if ( ini_trans_table() < 0 ) { return -1; }
 
+#if defined(DFPN)
+  dfpn_sckt      = SCKT_NULL;
+  dfpn_hash_log2 = 20;
+  if ( dfpn_ini_hash() < 0 ) { return -1; }
+#endif
+
   if ( book_on() < 0 ) { out_warning( "%s", str_error );}
   else                 { Out( "%s found\n", str_book );}
 
-  if ( hash_learn_on() < 0 ) { out_warning( "%s", str_error );}
-  else                       { Out( "%s found\n", str_hash );}
-
   if ( get_elapsed( &time_turn_start ) < 0 ) { return -1; }
 
   ini_rand( time_turn_start );
   Out( "rand seed = %x\n", time_turn_start );
 
-  resign_threshold = RESIGN_THRESHOLD;
-
 #if defined(MPV)
   mpv_num   = 1;
   mpv_width = 2 * MT_CAP_PAWN;
 #endif
 
+#if defined(INANIWA_SHIFT)
+  inaniwa_flag = 0;
+#endif
+
   return 1;
 }
 
@@ -281,6 +289,14 @@ fin( void )
 
   memory_free( (void *)ptrans_table_orig );
 
+#if defined(TLP) || defined(DFPN_CLIENT)
+  if ( lock_free( &io_lock ) < 0 ) { return -1; }
+#endif
+
+#if defined(DFPN_CLIENT)
+  if ( lock_free( & dfpn_client_lock ) < 0 ) { return -1; }
+#endif
+
 #if defined(TLP)
   tlp_abort = 1;
   while ( tlp_num ) { tlp_yield(); }
@@ -290,14 +306,14 @@ fin( void )
     {
       if ( lock_free( &tlp_atree_work[i].tlp_lock ) < 0 ) { return -1; }
     }
-#  if defined(_WIN32)
-#  else
+#endif
+
+#if ! defined(_WIN32) && ( defined(DFPN_CLIENT) || defined(TLP) )
   if ( pthread_attr_destroy( &pthread_attr ) )
     {
       str_error = "pthread_attr_destroy() failed.";
       return -1;
     }
-#  endif
 #endif
 
   if ( book_off() < 0 ) { return -1; }
@@ -306,6 +322,7 @@ fin( void )
   if ( file_close( pf_log ) < 0 ) { return -1; }
 #endif
 
+  ShutdownAll();
   return 1;
 }
 
@@ -328,12 +345,12 @@ set_derivative_param( void )
   p_value_ex[15+horse]      = p_value[15+horse]      + p_value[15+bishop];
   p_value_ex[15+dragon]     = p_value[15+dragon]     + p_value[15+rook];
 
-  benefit2promo[7+pawn]     = p_value[15+pro_pawn]   - p_value[15+pawn];
-  benefit2promo[7+lance]    = p_value[15+pro_lance]  - p_value[15+lance];
-  benefit2promo[7+knight]   = p_value[15+pro_knight] - p_value[15+knight];
-  benefit2promo[7+silver]   = p_value[15+pro_silver] - p_value[15+silver];
-  benefit2promo[7+bishop]   = p_value[15+horse]      - p_value[15+bishop];
-  benefit2promo[7+rook]     = p_value[15+dragon]     - p_value[15+rook];
+  p_value_pm[7+pawn]     = p_value[15+pro_pawn]   - p_value[15+pawn];
+  p_value_pm[7+lance]    = p_value[15+pro_lance]  - p_value[15+lance];
+  p_value_pm[7+knight]   = p_value[15+pro_knight] - p_value[15+knight];
+  p_value_pm[7+silver]   = p_value[15+pro_silver] - p_value[15+silver];
+  p_value_pm[7+bishop]   = p_value[15+horse]      - p_value[15+bishop];
+  p_value_pm[7+rook]     = p_value[15+dragon]     - p_value[15+rook];
 
   p_value[15-pawn]          = p_value[15+pawn];
   p_value[15-lance]         = p_value[15+lance];
@@ -365,12 +382,12 @@ set_derivative_param( void )
   p_value_ex[15-horse]      = p_value_ex[15+horse];
   p_value_ex[15-dragon]     = p_value_ex[15+dragon];
 
-  benefit2promo[7-pawn]     = benefit2promo[7+pawn];
-  benefit2promo[7-lance]    = benefit2promo[7+lance];
-  benefit2promo[7-knight]   = benefit2promo[7+knight];
-  benefit2promo[7-silver]   = benefit2promo[7+silver];
-  benefit2promo[7-bishop]   = benefit2promo[7+bishop];
-  benefit2promo[7-rook]     = benefit2promo[7+rook];
+  p_value_pm[7-pawn]     = p_value_pm[7+pawn];
+  p_value_pm[7-lance]    = p_value_pm[7+lance];
+  p_value_pm[7-knight]   = p_value_pm[7+knight];
+  p_value_pm[7-silver]   = p_value_pm[7+silver];
+  p_value_pm[7-bishop]   = p_value_pm[7+bishop];
+  p_value_pm[7-rook]     = p_value_pm[7+rook];
 }
 
 
@@ -512,28 +529,28 @@ ini_tables( void )
        }
 
       BBOr( bb, abb_plus1dir[ifrom], abb_minus1dir[ifrom] );
-      while ( BBToU(bb) )
+      while ( BBTest(bb) )
        {
          ito = FirstOne( bb );
          adirec[ifrom][ito]  = (unsigned char)direc_rank;
          Xor( ito, bb );
        }
       BBOr( bb, abb_plus8dir[ifrom], abb_minus8dir[ifrom] );
-      while ( BBToU(bb) )
+      while ( BBTest(bb) )
        {
          ito = FirstOne( bb );
          adirec[ifrom][ito]  = (unsigned char)direc_diag1;
          Xor( ito, bb );
        }
       BBOr( bb, abb_plus9dir[ifrom], abb_minus9dir[ifrom] );
-      while ( BBToU(bb) )
+      while ( BBTest(bb) )
        {
          ito = FirstOne( bb );
          adirec[ifrom][ito]  = (unsigned char)direc_file;
          Xor(ito,bb);
        }
       BBOr( bb, abb_plus10dir[ifrom], abb_minus10dir[ifrom] );
-      while ( BBToU(bb) )
+      while ( BBTest(bb) )
        {
          ito = FirstOne( bb );
          adirec[ifrom][ito]  = (unsigned char)direc_diag2;
@@ -659,218 +676,169 @@ ini_attack_tables( void )
   int irank, ifile, pcs, i;
   bitboard_t bb;
 
+  for ( i = 0; i < nsquare; i++ ) {
+
+      aslide[i].ir0   = (unsigned char)(i/27);
+      aslide[i].sr0   = (unsigned char)((2-(i/9)%3)*9+1);
+      aslide[i].irl90 = (unsigned char)(2-(i%9)/3);
+      aslide[i].srl90 = (unsigned char)(((i%9)%3)*9+1);
+  }
+  
   for ( irank = 0; irank < nrank; irank++ )
-    for ( ifile = 0; ifile < nfile; ifile++ )
-      {
+    for ( ifile = 0; ifile < nfile; ifile++ ) {
+
+      BBIni(bb);
+      set_attacks( irank-1, ifile-1, &bb );
+      set_attacks( irank-1, ifile+1, &bb );
+      set_attacks( irank+1, ifile-1, &bb );
+      set_attacks( irank+1, ifile+1, &bb );
+      set_attacks( irank-1, ifile, &bb );
+      abb_b_silver_attacks[ irank*nfile + ifile ] = bb;
+      
+      BBIni(bb);
+      set_attacks( irank-1, ifile-1, &bb );
+      set_attacks( irank-1, ifile+1, &bb );
+      set_attacks( irank+1, ifile-1, &bb );
+      set_attacks( irank+1, ifile+1, &bb );
+      set_attacks( irank+1, ifile,   &bb );
+      abb_w_silver_attacks[ irank*nfile + ifile ] = bb;
+      
+      BBIni(bb);
+      set_attacks( irank-1, ifile-1, &bb );
+      set_attacks( irank-1, ifile+1, &bb );
+      set_attacks( irank-1, ifile,   &bb );
+      set_attacks( irank+1, ifile,   &bb );
+      set_attacks( irank,   ifile-1, &bb );
+      set_attacks( irank,   ifile+1, &bb );
+      abb_b_gold_attacks[ irank*nfile + ifile ] = bb;
+      
+      BBIni(bb);
+      set_attacks( irank+1, ifile-1, &bb );
+      set_attacks( irank+1, ifile+1, &bb );
+      set_attacks( irank+1, ifile,   &bb );
+      set_attacks( irank-1, ifile,   &bb );
+      set_attacks( irank,   ifile-1, &bb );
+      set_attacks( irank,   ifile+1, &bb );
+      abb_w_gold_attacks[ irank*nfile + ifile ] = bb;
+      
+      BBIni(bb);
+      set_attacks( irank+1, ifile-1, &bb );
+      set_attacks( irank+1, ifile+1, &bb );
+      set_attacks( irank+1, ifile,   &bb );
+      set_attacks( irank-1, ifile-1, &bb );
+      set_attacks( irank-1, ifile+1, &bb );
+      set_attacks( irank-1, ifile,   &bb );
+      set_attacks( irank,   ifile-1, &bb );
+      set_attacks( irank,   ifile+1, &bb );
+      abb_king_attacks[ irank*nfile + ifile ] = bb;
+      
+      BBIni(bb);
+      set_attacks( irank-2, ifile-1, &bb );
+      set_attacks( irank-2, ifile+1, &bb );
+      abb_b_knight_attacks[ irank*nfile + ifile ] = bb;
+      
+      BBIni(bb);
+      set_attacks( irank+2, ifile-1, &bb );
+      set_attacks( irank+2, ifile+1, &bb );
+      abb_w_knight_attacks[ irank*nfile + ifile ] = bb;
+      
+
+      for ( pcs = 0; pcs < 128; pcs++ )        {
+       
        BBIni(bb);
-       set_attacks( irank-1, ifile-1, &bb );
-       set_attacks( irank-1, ifile+1, &bb );
-       set_attacks( irank+1, ifile-1, &bb );
-       set_attacks( irank+1, ifile+1, &bb );
-       set_attacks( irank-1, ifile, &bb );
-       abb_b_silver_attacks[ irank*nfile + ifile ] = bb;
-
+       for ( i = -1; irank+i >= 0; i-- ) {
+         set_attacks( irank+i, ifile, &bb );
+         if ( (pcs<<1) & (1 << (8-irank-i)) ) { break; }
+       }
+       for ( i = 1; irank+i <= 8; i++ ) {
+         set_attacks( irank+i, ifile, &bb );
+         if ( (pcs<<1) & (1 << (8-irank-i)) ) { break; }
+       }
+       abb_file_attacks[irank*nfile+ifile][pcs] = bb; 
+       
        BBIni(bb);
-       set_attacks( irank-1, ifile-1, &bb );
-       set_attacks( irank-1, ifile+1, &bb );
-       set_attacks( irank+1, ifile-1, &bb );
-       set_attacks( irank+1, ifile+1, &bb );
-       set_attacks( irank+1, ifile,   &bb );
-       abb_w_silver_attacks[ irank*nfile + ifile ] = bb;
-
+       for ( i = -1; ifile+i >= 0; i-- ) {
+         set_attacks( irank, ifile+i, &bb );
+         if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
+       }
+       for ( i = 1; ifile+i <= 8; i++ ) {
+         set_attacks( irank, ifile+i, &bb );
+         if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
+       }
+       abb_rank_attacks[irank*nfile+ifile][pcs] = bb;
+       
        BBIni(bb);
-       set_attacks( irank-1, ifile-1, &bb );
-       set_attacks( irank-1, ifile+1, &bb );
-       set_attacks( irank-1, ifile,   &bb );
-       set_attacks( irank+1, ifile,   &bb );
-       set_attacks( irank,   ifile-1, &bb );
-       set_attacks( irank,   ifile+1, &bb );
-       abb_b_gold_attacks[ irank*nfile + ifile ] = bb;
+       if ( ifile <= irank ) {
 
-       BBIni(bb);
-       set_attacks( irank+1, ifile-1, &bb );
-       set_attacks( irank+1, ifile+1, &bb );
-       set_attacks( irank+1, ifile,   &bb );
-       set_attacks( irank-1, ifile,   &bb );
-       set_attacks( irank,   ifile-1, &bb );
-       set_attacks( irank,   ifile+1, &bb );
-       abb_w_gold_attacks[ irank*nfile + ifile ] = bb;
+         for ( i = -1; ifile+i >= 0; i-- ) {
+           set_attacks( irank+i, ifile+i, &bb );
+           if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
+         }
+         for ( i = 1; irank+i <= 8; i++ ) {
+           set_attacks( irank+i, ifile+i, &bb );
+           if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
+         }
 
-       BBIni(bb);
-       set_attacks( irank+1, ifile-1, &bb );
-       set_attacks( irank+1, ifile+1, &bb );
-       set_attacks( irank+1, ifile,   &bb );
-       set_attacks( irank-1, ifile-1, &bb );
-       set_attacks( irank-1, ifile+1, &bb );
-       set_attacks( irank-1, ifile,   &bb );
-       set_attacks( irank,   ifile-1, &bb );
-       set_attacks( irank,   ifile+1, &bb );
-       abb_king_attacks[ irank*nfile + ifile ] = bb;
-      }
+       } else {
 
-  for ( irank = 0; irank < nrank; irank++ )
-    for ( ifile = 0; ifile < nfile; ifile++ )
-      {
-       BBIni(bb);
-       set_attacks( irank-2, ifile-1, &bb );
-       set_attacks( irank-2, ifile+1, &bb );
-       abb_b_knight_attacks[ irank*nfile + ifile ] = bb;
-      }
+         for ( i = -1; irank+i >= 0; i-- ) {
+             set_attacks( irank+i, ifile+i, &bb );
+             if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
+         }
+         for ( i = 1; ifile+i <= 8; i++ ) {
+           set_attacks( irank+i, ifile+i, &bb );
+           if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
+         }
+       }
 
-  for ( irank = 0; irank < nrank; irank++ )
-    for ( ifile = 0; ifile < nfile; ifile++ )
-      {
+       abb_bishop_attacks_rl45[irank*nfile+ifile][pcs] = bb; 
+       
        BBIni(bb);
-       set_attacks( irank+2, ifile-1, &bb );
-       set_attacks( irank+2, ifile+1, &bb );
-       abb_w_knight_attacks[ irank*nfile + ifile ] = bb;
-      }
-
-  for ( irank = 0; irank < nrank; irank++ )
-    for ( ifile = 0; ifile < nrank; ifile++ )
-      for ( pcs = 0; pcs < 128; pcs++ )
-       {
-         BBIni(bb);
-         for ( i = -1; irank+i >= 0; i-- )
-           {
-             set_attacks( irank+i, ifile, &bb );
-             if ( (pcs<<1) & (1 << (8-irank-i)) ) { break; }
-           }
-         for ( i = 1; irank+i <= 8; i++ )
-           {
-             set_attacks( irank+i, ifile, &bb );
-             if ( (pcs<<1) & (1 << (8-irank-i)) ) { break; }
-           }
-         abb_file_attacks[irank*nfile+ifile][pcs] = bb; 
-       }
+       if ( ifile+irank >= 8 ) {
 
-  for ( irank = 0; irank < nrank; irank++ )
-    for ( ifile = 0; ifile < nrank; ifile++ )
-      for ( pcs = 0; pcs < 128; pcs++ )
-       {
-         BBIni(bb);
-         for ( i = -1; ifile+i >= 0; i-- )
-           {
-             set_attacks( irank, ifile+i, &bb );
-             if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
+           for ( i = -1; irank-i <= 8; i-- ) {
+               set_attacks( irank-i, ifile+i, &bb );
+               if ( (pcs<<1) & (1 << (irank-i)) ) { break; }
            }
-         for ( i = 1; ifile+i <= 8; i++ )
-           {
-             set_attacks( irank, ifile+i, &bb );
-             if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
+           for ( i = 1; ifile+i <= 8; i++ ) {
+             set_attacks( irank-i, ifile+i, &bb );
+             if ( (pcs<<1) & (1 << (irank-i)) ) { break; }
            }
-         ai_rook_attacks_r0[irank*nfile+ifile][pcs] = bb.p[irank/3]; 
-       }
 
-  for ( irank = 0; irank < nrank; irank++ )
-    for ( ifile = 0; ifile < nrank; ifile++ )
-      for ( pcs = 0; pcs < 128; pcs++ )
-       {
-         BBIni(bb);
-         if ( ifile <= irank )
-           {
-             for ( i = -1; ifile+i >= 0; i-- )
-               {
-                 set_attacks( irank+i, ifile+i, &bb );
-                 if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
-               }
-             for ( i = 1; irank+i <= 8; i++ )
-               {
-                 set_attacks( irank+i, ifile+i, &bb );
-                 if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
-               }
-           }  
-         else {
-           for ( i = -1; irank+i >= 0; i-- )
-             {
-               set_attacks( irank+i, ifile+i, &bb );
-               if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
-             }
-           for ( i = 1; ifile+i <= 8; i++ )
-             {
-               set_attacks( irank+i, ifile+i, &bb );
-               if ( (pcs<<1) & (1 << (8-ifile-i)) ) { break; }
-             }
-         }
-         abb_bishop_attacks_rl45[irank*nfile+ifile][pcs] = bb; 
-       }
+       } else {
 
-  for ( irank = 0; irank < nrank; irank++ )
-    for ( ifile = 0; ifile < nrank; ifile++ )
-      for ( pcs = 0; pcs < 128; pcs++ )
-       {
-         BBIni(bb);
-         if ( ifile+irank >= 8 )
-           {
-             for ( i = -1; irank-i <= 8; i-- )
-               {
-                 set_attacks( irank-i, ifile+i, &bb );
-                 if ( (pcs<<1) & (1 << (irank-i)) ) { break; }
-               }
-             for ( i = 1; ifile+i <= 8; i++ )
-               {
-                 set_attacks( irank-i, ifile+i, &bb );
-                 if ( (pcs<<1) & (1 << (irank-i)) ) { break; }
-               }
-           }  
-         else {
-           for ( i = -1; ifile+i >= 0; i-- )
-             {
-               set_attacks( irank-i, ifile+i, &bb );
-               if ( (pcs<<1) & (1 << (irank-i)) ) { break; }
-             }
-           for ( i = 1; irank-i >= 0; i++ )
-             {
-               set_attacks( irank-i, ifile+i, &bb );
-               if ( (pcs<<1) & (1 << (irank-i)) ) { break; }
-             }
+         for ( i = -1; ifile+i >= 0; i-- ) {
+             set_attacks( irank-i, ifile+i, &bb );
+             if ( (pcs<<1) & (1 << (irank-i)) ) { break; }
          }
-         abb_bishop_attacks_rr45[irank*nfile+ifile][pcs] = bb; 
-       }
-
-  for ( i = 0; i < nsquare; i++ )
-    {
-      aslide[i].ir0   = (unsigned char)(i/27);
-      aslide[i].sr0   = (unsigned char)((2-(i/9)%3)*9+1);
-      aslide[i].irl90 = (unsigned char)(2-(i%9)/3);
-      aslide[i].srl90 = (unsigned char)(((i%9)%3)*9+1);
-    }
-  
-  for ( irank = 0; irank < nrank; irank++ )
-    for ( ifile = 0; ifile < nfile; ifile++ )
-      {
-       if ( irank >= ifile )
-         {
-           aslide[ irank*nfile+ifile ].irl45
-             = (unsigned char)((irank-ifile)/3);
-           aslide[ irank*nfile+ifile ].srl45
-             = (unsigned char)((2-((irank-ifile)%3))*9+1);
+         for ( i = 1; irank-i >= 0; i++ ) {
+           set_attacks( irank-i, ifile+i, &bb );
+           if ( (pcs<<1) & (1 << (irank-i)) ) { break; }
          }
-       else {
-         aslide[ irank*nfile+ifile ].irl45
-           = (unsigned char)((9+irank-ifile)/3);
-         aslide[ irank*nfile+ifile ].srl45
-           = (unsigned char)((2-((9+irank-ifile)%3))*9+1);
        }
+       abb_bishop_attacks_rr45[irank*nfile+ifile][pcs] = bb; 
       }
-
-  for ( irank = 0; irank < nrank; irank++ )
-    for ( ifile = 0; ifile < nfile; ifile++ )
-      {
-       if ( ifile+irank >= 8 )
-         {
-           aslide[ irank*nfile+ifile ].irr45
-             = (unsigned char)((irank+ifile-8)/3);
-           aslide[ irank*nfile+ifile ].srr45
-             = (unsigned char)((2-((irank+ifile-8)%3))*9+1);
-         }
-       else {
-         aslide[ irank*nfile+ifile ].irr45
-           = (unsigned char)((irank+ifile+1)/3);
-         aslide[ irank*nfile+ifile ].srr45
-           = (unsigned char)((2-((irank+ifile+1)%3))*9+1);
-       }
+      
+      if ( irank >= ifile ) {
+         aslide[irank*nfile+ifile].irl45 = (unsigned char)((irank-ifile)/3);
+         aslide[irank*nfile+ifile].srl45
+           = (unsigned char)((2-((irank-ifile)%3))*9+1);
+      } else {
+       aslide[irank*nfile+ifile].irl45 = (unsigned char)((9+irank-ifile)/3);
+       aslide[irank*nfile+ifile].srl45
+         = (unsigned char)((2-((9+irank-ifile)%3))*9+1);
+      }
+      
+      if ( ifile+irank >= 8 ) {
+       aslide[irank*nfile+ifile].irr45 = (unsigned char)((irank+ifile-8)/3);
+       aslide[irank*nfile+ifile].srr45
+         = (unsigned char)((2-((irank+ifile-8)%3))*9+1);
+      } else {
+       aslide[irank*nfile+ifile].irr45 = (unsigned char)((irank+ifile+1)/3);
+       aslide[irank*nfile+ifile].srr45
+         = (unsigned char)((2-((irank+ifile+1)%3))*9+1);
       }
+    }
 }
 
 
@@ -885,25 +853,15 @@ set_attacks( int irank, int ifile, bitboard_t *pbb )
 
 
 static bitboard_t
-bb_set_mask( int isquare )
+bb_set_mask( int sq )
 {
   bitboard_t bb;
   
-  if ( isquare > 53 )
-    {
-      bb.p[0] = bb.p[1] = 0;
-      bb.p[2] = 1U << (80-isquare);
-    }
-  else if ( isquare > 26 )
-    {
-      bb.p[0] = bb.p[2] = 0;
-      bb.p[1] = 1U << (53-isquare);
-    }
-  else {
-      bb.p[1] = bb.p[2] = 0;
-      bb.p[0] = 1U << (26-isquare);
-  }
-
+  BBIni(bb);
+  if      ( sq > 53 ) { bb.p[2] = 1U << ( 80 - sq ); }
+  else if ( sq > 26 ) { bb.p[1] = 1U << ( 53 - sq ); }
+  else                { bb.p[0] = 1U << ( 26 - sq ); }
+  
   return bb;
 }
 
@@ -912,164 +870,160 @@ static void
 ini_check_table( void )
 {
   bitboard_t bb_check, bb;
-  int iking, icheck;
-
-  for ( iking = 0; iking < nsquare; iking++ )
-    {
-      /* black gold */
-      BBIni( b_chk_tbl[iking].gold );
-      bb_check = abb_w_gold_attacks[iking];
-      while ( BBToU(bb_check) )
-       {
-         icheck = LastOne( bb_check );
-         BBOr( b_chk_tbl[iking].gold, b_chk_tbl[iking].gold,
-               abb_w_gold_attacks[icheck] );
-         Xor( icheck, bb_check );
-       }
-      BBOr( bb, abb_mask[iking], abb_w_gold_attacks[iking] );
-      BBNot( bb, bb );
-      BBAnd( b_chk_tbl[iking].gold, b_chk_tbl[iking].gold, bb );
-
-      /* black silver */
-      BBIni( b_chk_tbl[iking].silver );
-      bb_check = abb_w_silver_attacks[iking];
-      while ( BBToU(bb_check) )
-       {
-         icheck = LastOne( bb_check );
-         BBOr( b_chk_tbl[iking].silver, b_chk_tbl[iking].silver,
-               abb_w_silver_attacks[icheck] );
-         Xor( icheck, bb_check );
-       }
-      bb_check.p[0] = abb_w_gold_attacks[iking].p[0];
-      while ( bb_check.p[0] )
-       {
-         icheck = last_one0( bb_check.p[0] );
-         BBOr( b_chk_tbl[iking].silver, b_chk_tbl[iking].silver,
-               abb_w_silver_attacks[icheck] );
-         bb_check.p[0] ^= abb_mask[icheck].p[0];
-       }
-      bb_check.p[1] = abb_w_gold_attacks[iking].p[1];
-      while ( bb_check.p[1] )
-       {
-         icheck = last_one1( bb_check.p[1] );
-         b_chk_tbl[iking].silver.p[0]
-           |= abb_w_silver_attacks[icheck].p[0];
-         bb_check.p[1] ^= abb_mask[icheck].p[1];
-       }
-      BBOr( bb, abb_mask[iking], abb_w_silver_attacks[iking] );
-      BBNot( bb, bb );
-      BBAnd( b_chk_tbl[iking].silver, b_chk_tbl[iking].silver, bb );
-
-      /* black knight */
-      BBIni( b_chk_tbl[iking].knight );
-      bb_check = abb_w_knight_attacks[iking];
-      while ( BBToU(bb_check) )
-       {
-         icheck = LastOne( bb_check );
-         BBOr( b_chk_tbl[iking].knight, b_chk_tbl[iking].knight,
-               abb_w_knight_attacks[icheck] );
-         Xor( icheck, bb_check );
-       }
-      bb_check.p[0] = abb_w_gold_attacks[iking].p[0];
-      while ( bb_check.p[0] )
-       {
-         icheck = last_one0( bb_check.p[0] );
-         BBOr( b_chk_tbl[iking].knight, b_chk_tbl[iking].knight,
-               abb_w_knight_attacks[icheck] );
-         bb_check.p[0] ^= abb_mask[icheck].p[0];
-       }
-
-      /* black lance */
-      if ( iking <= I3 ) {
-       BBAnd( b_chk_tbl[iking].lance, abb_plus_rays[iking+nfile],
-              abb_file_attacks[iking][0] );
-       if ( iking <= I7 && iking != A9 && iking != A8 && iking != A7 ) {
-         BBAnd( bb, abb_plus_rays[iking-1], abb_file_attacks[iking-1][0] );
-         BBOr( b_chk_tbl[iking].lance, b_chk_tbl[iking].lance, bb );
-       }
-       if ( iking <= I7 && iking != I9 && iking != I8 && iking != I7 ) {
-           BBAnd( bb, abb_plus_rays[iking+1], abb_file_attacks[iking+1][0] );
-           BBOr( b_chk_tbl[iking].lance, b_chk_tbl[iking].lance, bb );
-       }
-      } else { BBIni( b_chk_tbl[iking].lance ); }
-
-      /* white gold */
-      BBIni( w_chk_tbl[iking].gold );
-      bb_check = abb_b_gold_attacks[iking];
-      while ( BBToU(bb_check) )
-       {
-         icheck = LastOne( bb_check );
-         BBOr( w_chk_tbl[iking].gold, w_chk_tbl[iking].gold,
-               abb_b_gold_attacks[icheck] );
-         Xor( icheck, bb_check );
-       }
-      BBOr( bb, abb_mask[iking], abb_b_gold_attacks[iking] );
-      BBNot( bb, bb );
-      BBAnd( w_chk_tbl[iking].gold, w_chk_tbl[iking].gold, bb );
-
-      /* white silver */
-      BBIni( w_chk_tbl[iking].silver );
-      bb_check = abb_b_silver_attacks[iking];
-      while ( BBToU(bb_check) )
-       {
-         icheck = LastOne( bb_check );
-         BBOr( w_chk_tbl[iking].silver, w_chk_tbl[iking].silver,
-               abb_b_silver_attacks[icheck] );
-         Xor( icheck, bb_check );
-       }
-      bb_check.p[2] = abb_b_gold_attacks[iking].p[2];
-      while ( bb_check.p[2] )
-       {
-         icheck = first_one2( bb_check.p[2] );
-         BBOr( w_chk_tbl[iking].silver, w_chk_tbl[iking].silver,
-               abb_b_silver_attacks[icheck] );
-         bb_check.p[2] ^= abb_mask[icheck].p[2];
-       }
-      bb_check.p[1] = abb_b_gold_attacks[iking].p[1];
-      while ( bb_check.p[1] )
-       {
-         icheck = first_one1( bb_check.p[1] );
-         w_chk_tbl[iking].silver.p[2]
-           |= abb_b_silver_attacks[icheck].p[2];
-         bb_check.p[1] ^= abb_mask[icheck].p[1];
-       }
-      BBOr( bb, abb_mask[iking], abb_b_silver_attacks[iking] );
-      BBNot( bb, bb );
-      BBAnd( w_chk_tbl[iking].silver, w_chk_tbl[iking].silver, bb );
-
-      /* white knight */
-      BBIni( w_chk_tbl[iking].knight );
-      bb_check = abb_b_knight_attacks[iking];
-      while ( BBToU(bb_check) )
-       {
-         icheck = LastOne( bb_check );
-         BBOr( w_chk_tbl[iking].knight, w_chk_tbl[iking].knight,
-               abb_b_knight_attacks[icheck] );
-         Xor( icheck, bb_check );
-       }
-      bb_check.p[2] = abb_b_gold_attacks[iking].p[2];
-      while ( bb_check.p[2] )
-       {
-         icheck = first_one2( bb_check.p[2] );
-         BBOr( w_chk_tbl[iking].knight, w_chk_tbl[iking].knight,
-               abb_b_knight_attacks[icheck] );
-         bb_check.p[2] ^= abb_mask[icheck].p[2];
-       }
-
-      /* white lance */
-      if ( iking >= A7 ) {
-       BBAnd( w_chk_tbl[iking].lance, abb_minus_rays[iking-nfile],
-              abb_file_attacks[iking][0] );
-       if ( iking >= A3 && iking != A3 && iking != A2 && iking != A1 ) {
-         BBAnd( bb, abb_minus_rays[iking-1], abb_file_attacks[iking-1][0] );
-         BBOr( w_chk_tbl[iking].lance, w_chk_tbl[iking].lance, bb );
-       }
-       if ( iking >= A3 && iking != I3 && iking != I2 && iking != I1 ) {
-         BBAnd( bb, abb_minus_rays[iking+1], abb_file_attacks[iking+1][0] );
-         BBOr( w_chk_tbl[iking].lance, w_chk_tbl[iking].lance, bb );
-       }
-      } else { BBIni( w_chk_tbl[iking].lance ); }
-    }
+  int iking, sq_chk;
+  
+  for ( iking = 0; iking < nsquare; iking++ ) {
+    
+    /* black gold */
+    BBIni( b_chk_tbl[iking].gold );
+    bb_check = abb_w_gold_attacks[iking];
+    while ( BBTest(bb_check) )
+      {
+       sq_chk = LastOne( bb_check );
+       BBOr( b_chk_tbl[iking].gold, b_chk_tbl[iking].gold,
+             abb_w_gold_attacks[sq_chk] );
+       Xor( sq_chk, bb_check );
+      }
+    BBOr( bb, abb_mask[iking], abb_w_gold_attacks[iking] );
+    BBNotAnd( b_chk_tbl[iking].gold, b_chk_tbl[iking].gold, bb );
+    
+    /* black silver */
+    BBIni( b_chk_tbl[iking].silver );
+    bb_check = abb_w_silver_attacks[iking];
+    while ( BBTest(bb_check) )
+      {
+       sq_chk = LastOne( bb_check );
+       BBOr( b_chk_tbl[iking].silver, b_chk_tbl[iking].silver,
+             abb_w_silver_attacks[sq_chk] );
+       Xor( sq_chk, bb_check );
+      }
+    bb_check.p[0] = abb_w_gold_attacks[iking].p[0];
+    while ( bb_check.p[0] )
+      {
+       sq_chk = last_one0( bb_check.p[0] );
+       BBOr( b_chk_tbl[iking].silver, b_chk_tbl[iking].silver,
+             abb_w_silver_attacks[sq_chk] );
+       bb_check.p[0] ^= abb_mask[sq_chk].p[0];
+      }
+    bb_check.p[1] = abb_w_gold_attacks[iking].p[1];
+    while ( bb_check.p[1] )
+      {
+       sq_chk = last_one1( bb_check.p[1] );
+       b_chk_tbl[iking].silver.p[0]
+         |= abb_w_silver_attacks[sq_chk].p[0];
+       bb_check.p[1] ^= abb_mask[sq_chk].p[1];
+      }
+    BBOr( bb, abb_mask[iking], abb_w_silver_attacks[iking] );
+    BBNotAnd( b_chk_tbl[iking].silver, b_chk_tbl[iking].silver, bb );
+    
+    /* black knight */
+    BBIni( b_chk_tbl[iking].knight );
+    bb_check = abb_w_knight_attacks[iking];
+    while ( BBTest(bb_check) )
+      {
+       sq_chk = LastOne( bb_check );
+       BBOr( b_chk_tbl[iking].knight, b_chk_tbl[iking].knight,
+             abb_w_knight_attacks[sq_chk] );
+       Xor( sq_chk, bb_check );
+      }
+    bb_check.p[0] = abb_w_gold_attacks[iking].p[0];
+    while ( bb_check.p[0] )
+      {
+       sq_chk = last_one0( bb_check.p[0] );
+       BBOr( b_chk_tbl[iking].knight, b_chk_tbl[iking].knight,
+             abb_w_knight_attacks[sq_chk] );
+       bb_check.p[0] ^= abb_mask[sq_chk].p[0];
+      }
+    
+    /* black lance */
+    if ( iking <= I3 ) {
+      BBAnd( b_chk_tbl[iking].lance, abb_plus_rays[iking+nfile],
+            abb_file_attacks[iking][0] );
+      if ( iking <= I7 && iking != A9 && iking != A8 && iking != A7 ) {
+       BBAnd( bb, abb_plus_rays[iking-1], abb_file_attacks[iking-1][0] );
+       BBOr( b_chk_tbl[iking].lance,   b_chk_tbl[iking].lance, bb );
+      }
+      if ( iking <= I7 && iking != I9 && iking != I8 && iking != I7 ) {
+       BBAnd( bb, abb_plus_rays[iking+1], abb_file_attacks[iking+1][0] );
+       BBOr( b_chk_tbl[iking].lance, b_chk_tbl[iking].lance, bb );
+      }
+    } else { BBIni( b_chk_tbl[iking].lance ); }
+    
+    /* white gold */
+    BBIni( w_chk_tbl[iking].gold );
+    bb_check = abb_b_gold_attacks[iking];
+    while ( BBTest(bb_check) )
+      {
+       sq_chk = LastOne( bb_check );
+       BBOr( w_chk_tbl[iking].gold, w_chk_tbl[iking].gold,
+             abb_b_gold_attacks[sq_chk] );
+       Xor( sq_chk, bb_check );
+      }
+    BBOr( bb, abb_mask[iking], abb_b_gold_attacks[iking] );
+    BBNotAnd( w_chk_tbl[iking].gold, w_chk_tbl[iking].gold, bb );
+    
+    /* white silver */
+    BBIni( w_chk_tbl[iking].silver );
+    bb_check = abb_b_silver_attacks[iking];
+    while ( BBTest(bb_check) )
+      {
+       sq_chk = LastOne( bb_check );
+       BBOr( w_chk_tbl[iking].silver, w_chk_tbl[iking].silver,
+             abb_b_silver_attacks[sq_chk] );
+       Xor( sq_chk, bb_check );
+      }
+    bb_check.p[2] = abb_b_gold_attacks[iking].p[2];
+    while ( bb_check.p[2] )
+      {
+       sq_chk = first_one2( bb_check.p[2] );
+       BBOr( w_chk_tbl[iking].silver, w_chk_tbl[iking].silver,
+             abb_b_silver_attacks[sq_chk] );
+       bb_check.p[2] ^= abb_mask[sq_chk].p[2];
+      }
+    bb_check.p[1] = abb_b_gold_attacks[iking].p[1];
+    while ( bb_check.p[1] )
+      {
+       sq_chk = first_one1( bb_check.p[1] );
+       w_chk_tbl[iking].silver.p[2]
+         |= abb_b_silver_attacks[sq_chk].p[2];
+       bb_check.p[1] ^= abb_mask[sq_chk].p[1];
+      }
+    BBOr( bb, abb_mask[iking], abb_b_silver_attacks[iking] );
+    BBNotAnd( w_chk_tbl[iking].silver, w_chk_tbl[iking].silver, bb );
+    
+    /* white knight */
+    BBIni( w_chk_tbl[iking].knight );
+    bb_check = abb_b_knight_attacks[iking];
+    while ( BBTest( bb_check ) )
+      {
+       sq_chk = LastOne( bb_check );
+       BBOr( w_chk_tbl[iking].knight, w_chk_tbl[iking].knight,
+             abb_b_knight_attacks[sq_chk] );
+       Xor( sq_chk, bb_check );
+      }
+    bb_check.p[2] = abb_b_gold_attacks[iking].p[2];
+    while ( bb_check.p[2] )
+      {
+       sq_chk = first_one2( bb_check.p[2] );
+       BBOr( w_chk_tbl[iking].knight, w_chk_tbl[iking].knight,
+             abb_b_knight_attacks[sq_chk] );
+       bb_check.p[2] ^= abb_mask[sq_chk].p[2];
+      }
+    
+    /* white lance */
+    if ( iking >= A7 ) {
+      BBAnd( w_chk_tbl[iking].lance, abb_minus_rays[iking-nfile],
+            abb_file_attacks[iking][0] );
+      if ( iking >= A3 && iking != A3 && iking != A2 && iking != A1 ) {
+       BBAnd( bb, abb_minus_rays[iking-1], abb_file_attacks[iking-1][0] );
+       BBOr( w_chk_tbl[iking].lance, w_chk_tbl[iking].lance, bb );
+      }
+      if ( iking >= A3 && iking != I3 && iking != I2 && iking != I1 ) {
+       BBAnd( bb, abb_minus_rays[iking+1], abb_file_attacks[iking+1][0] );
+       BBOr( w_chk_tbl[iking].lance, w_chk_tbl[iking].lance, bb );
+      }
+    } else { BBIni( w_chk_tbl[iking].lance ); }
+  }
 }
 
 
@@ -1080,7 +1034,7 @@ static int
 first_one00( int pcs )
 {
   int i;
-
+  
   for ( i = 0; i < 9; i++ ) { if ( pcs & (1<<(8-i)) ) { break; } }
   return i;
 }
@@ -1090,7 +1044,7 @@ static int
 last_one00( int pcs )
 {
   int i;
-
+  
   for ( i = 8; i >= 0; i-- ) { if ( pcs & (1<<(8-i)) ) { break; } }
   return i;
 }