X-Git-Url: http://winboard.nl/cgi-bin?p=bonanza.git;a=blobdiff_plain;f=ini.c;h=65223167b2e71b21f8ece0146a0cc861150eb5c4;hp=13db541327fbceac84507f43911e95afabd4b1ea;hb=31daebfc1031441aa180e3af2e547a8cd2b92c32;hpb=18b507e1b20fc6c32ee50f00fb910a59110c1a1d diff --git a/ini.c b/ini.c index 13db541..6522316 100644 --- 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; }