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 );
static void ini_random_table( void );
-static int
-load_fv( void )
+int CONV load_fv( void )
{
FILE *pf;
size_t size;
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 )
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;
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;
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;
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 ) )
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
}
#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();
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;
}
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(); }
{
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; }
if ( file_close( pf_log ) < 0 ) { return -1; }
#endif
+ ShutdownAll();
return 1;
}
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];
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];
}
}
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;
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);
}
+ }
}
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;
}
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 ); }
+ }
}
first_one00( int pcs )
{
int i;
-
+
for ( i = 0; i < 9; i++ ) { if ( pcs & (1<<(8-i)) ) { break; } }
return i;
}
last_one00( int pcs )
{
int i;
-
+
for ( i = 8; i >= 0; i-- ) { if ( pcs & (1<<(8-i)) ) { break; } }
return i;
}