From e49e9b8f9d7a4c569117c21a21ecf09a52ade90b Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Sun, 4 Feb 2024 19:16:10 +0100 Subject: [PATCH] Start bitboard migration... Long long cries coming --- src/bitboard.c | 42 ++++++++++++++++++ src/bitboard.h | 115 +++++++++++++++++++++++++++++++----------------- src/brchess.h | 4 +- src/chessdefs.h | 2 +- src/move.c | 20 ++++++--- 5 files changed, 133 insertions(+), 50 deletions(-) create mode 100644 src/bitboard.c diff --git a/src/bitboard.c b/src/bitboard.c new file mode 100644 index 0000000..7034183 --- /dev/null +++ b/src/bitboard.c @@ -0,0 +1,42 @@ +/* bitboard.c - bitboard functions. + * + * Copyright (C) 2024 Bruno Raoult ("br") + * Licensed under the GNU General Public License v3.0 or later. + * Some rights reserved. See COPYING. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "br.h" +#include "bitboard.h" + +/* maps are clockwise from N */ +static char knight_vector[8] = { + NORTH*2 + EAST, NORTH + EAST*2, SOUTH + EAST*2, SOUTH*2 + EAST, + SOUTH*2 + WEST, SOUTH + WEST*2, NORTH + WEST*2, NORTH*2 + WEST +}; +static char king_vector[8] = { + NORTH, NORTH_EAST, EAST, SOUTH_EAST, + SOUTH, SOUTH_WEST, WEST, NORTH_WEST +}; + +static u64 knight_attacks[64], king_attacks[64]; +static int zob=0; + +void bitboard_init(void) +{ + for (int sq = SQ_0; sq < SQ_N; ++sq) { + /* knight/king */ + for (int j = 0; j < 8; ++j) { + zob += *knight_attacks + *king_attacks + *knight_vector + + *king_vector; + //int dest_knight = sq + knight_vector[j]; + //if () + } + + } +} diff --git a/src/bitboard.h b/src/bitboard.h index c7f3348..1533b93 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -1,6 +1,6 @@ /* bitboard.h - bitboard definitions. * - * Copyright (C) 2021 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * @@ -19,52 +19,87 @@ #include "piece.h" #include "bitops.h" -enum bb_square { - A1 = 1UL << 0, B1 = 1UL << 1, C1 = 1UL << 2, D1 = 1UL << 3, - E1 = 1UL << 4, F1 = 1UL << 5, G1 = 1UL << 6, H1 = 1UL << 7, +#define mask(s) ( 1ULL << (s) ) +#define C64(const_u64) const_u64##ULL - A2 = 1UL << 8, B2 = 1UL << 9, C2 = 1UL << 10, D2 = 1UL << 11, - E2 = 1UL << 12, F2 = 1UL << 13, G2 = 1UL << 14, H2 = 1UL << 15, +typedef enum square { + A1, B1, C1, D1, E1, F1, G1, H1, + A2, B2, C2, D2, E2, F2, G2, H2, + A3, B3, C3, D3, E3, F3, G3, H3, + A4, B4, C4, D4, E4, F4, G4, H4, + A5, B5, C5, D5, E5, F5, G5, H5, + A6, B6, C6, D6, E6, F6, G6, H6, + A7, B7, C7, D7, E7, F7, G7, H7, + A8, B8, C8, D8, E8, F8, G8, H8, + SQ_N, + SQ_0 = 0 +} square; - A3 = 1UL << 16, B3 = 1UL << 17, C3 = 1UL << 18, D3 = 1UL << 19, - E3 = 1UL << 20, F3 = 1UL << 21, G3 = 1UL << 22, H3 = 1UL << 23, +typedef enum file { + FILE_A, FILE_B, FILE_C, FILE_D, FILE_E, FILE_F, FILE_G, FILE_H, + FILE_N, + FILE_0 = 0 +} file; - A4 = 1UL << 24, B4 = 1UL << 25, C4 = 1UL << 26, D4 = 1UL << 27, - E4 = 1UL << 28, F4 = 1UL << 29, G4 = 1UL << 30, H4 = 1UL << 31, +typedef enum rank { + RANK_1, RANK_2, RANK_3, RANK_4, RANK_5, RANK_6, RANK_7, RANK_8, + RANK_N, + RANK_0 = 0 +} rank; - A5 = 1UL << 32, B5 = 1UL << 33, C5 = 1UL << 34, D5 = 1UL << 35, - E5 = 1UL << 36, F5 = 1UL << 37, G5 = 1UL << 38, H5 = 1UL << 39, +typedef enum sq_bb { + //A1 = 0x01ULL, B1 = 0x02ULL, C1 = 1UL << 2, D1 = 1UL << 3, + //E1 = 1UL << 4, F1 = 1UL << 5, G1 = 1UL << 6, H1 = 1UL << + A1bb = mask(A1), A2bb = mask(A2), A3bb = mask(A3), A4bb = mask(A4), + A5bb = mask(A5), A6bb = mask(A6), A7bb = mask(A7), A8bb = mask(A8), + B1bb = mask(B1), B2bb = mask(B2), B3bb = mask(B3), B4bb = mask(B4), + B5bb = mask(B5), B6bb = mask(B6), B7bb = mask(B7), B8bb = mask(B8), + C1bb = mask(C1), C2bb = mask(C2), C3bb = mask(C3), C4bb = mask(C4), + C5bb = mask(C5), C6bb = mask(C6), C7bb = mask(C7), C8bb = mask(C8), + D1bb = mask(D1), D2bb = mask(D2), D3bb = mask(D3), D4bb = mask(D4), + D5bb = mask(D5), D6bb = mask(D6), D7bb = mask(D7), D8bb = mask(D8), + E1bb = mask(E1), E2bb = mask(E2), E3bb = mask(E3), E4bb = mask(E4), + E5bb = mask(E5), E6bb = mask(E6), E7bb = mask(E7), E8bb = mask(E8), + F1bb = mask(F1), F2bb = mask(F2), F3bb = mask(F3), F4bb = mask(F4), + F5bb = mask(F5), F6bb = mask(F6), F7bb = mask(F7), F8bb = mask(F8), + G1bb = mask(G1), G2bb = mask(G2), G3bb = mask(G3), G4bb = mask(G4), + G5bb = mask(G5), G6bb = mask(G6), G7bb = mask(G7), G8bb = mask(G8), + H1bb = mask(H1), H2bb = mask(H2), H3bb = mask(H3), H4bb = mask(H4), + H5bb = mask(H5), H6bb = mask(H6), H7bb = mask(H7), H8bb = mask(H8), +} sq_bb; - A6 = 1UL << 40, B6 = 1UL << 41, C6 = 1UL << 42, D6 = 1UL << 43, - E6 = 1UL << 44, F6 = 1UL << 45, G6 = 1UL << 46, H6 = 1UL << 47, +typedef enum file_bb { + FILE_Abb = 0x0101010101010101ULL, + FILE_Bbb = 0x0202020202020202ULL, + FILE_Cbb = 0x0404040404040404ULL, + FILE_Dbb = 0x0808080808080808ULL, + FILE_Ebb = 0x1010101010101010ULL, + FILE_Fbb = 0x2020202020202020ULL, + FILE_Gbb = 0x4040404040404040ULL, + FILE_Hbb = 0x8080808080808080ULL, +} file_bb; - A7 = 1UL << 48, B7 = 1UL << 49, C7 = 1UL << 50, D7 = 1UL << 51, - E7 = 1UL << 52, F7 = 1UL << 53, G7 = 1UL << 54, H7 = 1UL << 55, +typedef enum rank_bb { + RANK_1bb = 0x00000000000000ffULL, + RANK_2bb = 0x000000000000ff00ULL, + RANK_3bb = 0x0000000000ff0000ULL, + RANK_4bb = 0x00000000ff000000ULL, + RANK_5bb = 0x000000ff00000000ULL, + RANK_6bb = 0x0000ff0000000000ULL, + RANK_7bb = 0x00ff000000000000ULL, + RANK_8bb = 0xff00000000000000ULL +} rank_bb; - A8 = 1UL << 56, B8 = 1UL << 57, C8 = 1UL << 58, D8 = 1UL << 59, - E8 = 1UL << 60, F8 = 1UL << 61, G8 = 1UL << 62, H8 = 1UL << 63, -}; +#define NORTH 8 +#define EAST 1 +#define SOUTH -NORTH +#define WEST -EAST -enum bb_files { - F_1 = A1 | A2 | A3 | A4 | A5 | A6 | A7 | A8, - F_2 = B1 | B2 | B3 | B4 | B5 | B6 | B7 | B8, - F_3 = C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8, - F_4 = D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8, - F_5 = E1 | E2 | E3 | E4 | E5 | E6 | E7 | E8, - F_6 = F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8, - F_7 = G1 | G2 | G3 | G4 | G5 | G6 | G7 | G8, - F_8 = H1 | H2 | H3 | H4 | H5 | H6 | H7 | H8, -}; +#define NORTH_EAST (NORTH + EAST) +#define SOUTH_EAST (SOUTH + EAST) +#define SOUTH_WEST (SOUTH + WEST) +#define NORTH_WEST (NORTH + WEST) -enum bb_ranges { - R_1 = A1 | B1 | C1 | D1 | E1 | F1 | G1 | H1, - R_2 = A2 | B2 | C2 | D2 | E2 | F2 | G2 | H2, - R_3 = A3 | B3 | C3 | D3 | E3 | F3 | G3 | H3, - R_4 = A4 | B4 | C4 | D4 | E4 | F4 | G4 | H4, - R_5 = A5 | B5 | C5 | D5 | E5 | F5 | G5 | H5, - R_6 = A6 | B6 | C6 | D6 | E6 | F6 | G6 | H6, - R_7 = A7 | B7 | C7 | D7 | E7 | F7 | G7 | H7, - R_8 = A8 | B8 | C8 | D8 | E8 | F8 | G8 | H8, -}; +void bitboard_init(void); -#endif /* BOARD_H */ +#endif /* BITBOARD_H */ diff --git a/src/brchess.h b/src/brchess.h index 4309270..e8863d3 100644 --- a/src/brchess.h +++ b/src/brchess.h @@ -1,6 +1,6 @@ -/* bodichess.h - main loop. +/* brchess.h - main loop. * - * Copyright (C) 2021 Bruno Raoult ("br") + * Copyright (C) 2021-2024 Bruno Raoult ("br") * Licensed under the GNU General Public License v3.0 or later. * Some rights reserved. See COPYING. * diff --git a/src/chessdefs.h b/src/chessdefs.h index 44b4ef5..889520e 100644 --- a/src/chessdefs.h +++ b/src/chessdefs.h @@ -90,7 +90,7 @@ enum { * ffff: file * rrrr: rank */ -typedef unsigned char square_t; +typedef uchar square_t; /* castle_t bits structure */ diff --git a/src/move.c b/src/move.c index b44ac78..7f1d23e 100644 --- a/src/move.c +++ b/src/move.c @@ -50,8 +50,8 @@ static struct can_castle { bitboard_t occupied[2]; } castle_squares[2] = { /* Queen side King side Queen side King side */ - { { C1|D1|E1, E1|F1|G1, }, { B1|C1|D1, F1|G1 } }, - { { C8|D8|E8, E8|F8|G8, }, { B8|C8|D8, F8|G8 } } + { { C1bb|D1bb|E1bb, E1bb|F1bb|G1bb }, { B1bb|C1bb|D1bb, F1bb|G1bb } }, + { { C8bb|D8bb|E8bb, E8bb|F8bb|G8bb }, { B8bb|C8bb|D8bb, F8bb|G8bb } } }; pool_t *moves_pool_init() @@ -863,18 +863,24 @@ pos_t *move_do(pos_t *pos, move_t *move) new->board[from].s_piece = NULL; //printf("old turn=%d ", color); - SET_COLOR(new->turn, OPPONENT(color)); /* pos color */ //printf("new turn=%d\n", new->turn); //fflush(stdout); /* adjust castling flags */ - if ((bb_from | bb_to) & (A1 | E1)) + if ((bb_from | bb_to) & E1bb) + new->castle &= ~(CASTLE_WQ | CASTLE_WK); + else if ((bb_from | bb_to) & A1bb) new->castle &= ~CASTLE_WQ; - else if ((bb_from | bb_to) & (E1 | H1)) + else if ((bb_from | bb_to) & H1bb) new->castle &= ~CASTLE_WK; - else if ((bb_from | bb_to) & (A8 | E8)) + + if ((bb_from | bb_to) & E8bb) + new->castle &= ~(CASTLE_BQ | CASTLE_BK); + else if ((bb_from | bb_to) & A8bb) new->castle &= ~CASTLE_BQ; - else if ((bb_from | bb_to) & (E8 | H8)) + else if ((bb_from | bb_to) & H8bb) new->castle &= ~CASTLE_BK; + + SET_COLOR(new->turn, OPPONENT(color)); /* pos color */ return new; }