From 49705bc70704e6117ba974a5165f77e68adb55bc Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Tue, 19 Mar 2024 18:29:02 +0100 Subject: [PATCH] rename few macros to lowercase, add M_DPUSH move flag --- src/bitboard.h | 12 +++++------- src/chessdefs.h | 38 ++++++++++++++++++++++++++++++++------ src/fen.c | 6 +++--- src/move-gen.c | 9 +++++---- src/move.h | 10 ++++++++-- src/position.c | 12 ++++++------ 6 files changed, 59 insertions(+), 28 deletions(-) diff --git a/src/bitboard.h b/src/bitboard.h index f17b3e3..c537946 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -173,10 +173,6 @@ static __always_inline bitboard_t bb_rank(int rank) { return RANK_1bb << (rank * 8); } -static __always_inline bitboard_t bb_file(int file) -{ - return FILE_Abb << file; -} static __always_inline bitboard_t bb_rel_rank(int rank, color) { return RANK_1bb << (rank * 8); @@ -187,11 +183,13 @@ static __always_inline bitboard_t bb_file(int file) } */ -#define BB_RANK(r) ((u64) RANK_1bb << ((r) * 8)) +#define bb_rank(r) ((u64) RANK_1bb << ((r) * 8)) #define BB_FILE(f) ((u64) FILE_Abb << (f)) -#define BB_REL_RANK(r, c) (RANK_1bb << (SQ_REL_RANK((r), (c)) * 8)) -#define BB_REL_FILE(f, c) (FILE_Abb << (SQ_REL_RANK((f), (c)))) +#define bb_rel_rank(r, c) bb_rank(sq_rel_rank(r, c)) + +//#define BB_REL_RANK(r, c) (RANK_1bb << (SQ_REL_RANK(r, c) * 8)) +//#define BB_REL_FILE(f, c) (FILE_Abb << (SQ_REL_RANK((f), (c)))) /** * bb_sq_aligned() - check if two squares are aligned (same file or rank). diff --git a/src/chessdefs.h b/src/chessdefs.h index ff17548..2fb76ec 100644 --- a/src/chessdefs.h +++ b/src/chessdefs.h @@ -21,8 +21,30 @@ #define mask(i) ( (u64) (ONE << (i)) ) #define BOARDSIZE (8*8) -/* relative rank */ -#define SQ_REL_RANK(r, c) (rank_t)((7 * (c)) ^ r) + +/** + * sq_rel - get relative square + * @sq: white point of view square + * @c: color + * + * Get relative (mirrored if @c is BLACK) square. + * Example: sq_rel(A1, WHITE) = A1, sq_rel(B2, BLACK) = B7 + * + * @return: Relative square. + */ +#define sq_rel(sq, c) ((square_t)((sq) ^ (56 * (c)))) + +/** + * sq_rel_rank - get relative rank + * @rank: white point of view rank + * @c: color + * + * Get relative (mirrored if @c is BLACK) rank. + * Example: sq_rel(RANK_2, WHITE) = RANK_2, sq_rel(RANK_6, BLACK) = RANK_3 + * + * @return: Relative rank. + */ +#define sq_rel_rank(rank, c) ((rank_t)((7 * (c)) ^ rank)) /* castle_t bits structure */ @@ -41,10 +63,14 @@ typedef enum { /* determine is oo or ooo is possible with castle flags f and color c */ -#define NORM_CASTLE(f, c) ((f) >> (2 * (c))) /* shift flags to bits 0/1 */ -#define CAN_OO(f, c) (NORM_CASTLE(f, c) & CASTLE_K) -#define CAN_OOO(f, c) (NORM_CASTLE(f, c) & CASTLE_Q) -#define CAN_CASTLE(f, c) (CAN_OO(f, c) | CAN_OOO(f, c)) +#define NORM_CASTLE(f, c) ((f) >> (2 * (c))) /* shift flags to bits 0/1 */ +#define CAN_OO(f, c) (NORM_CASTLE(f, c) & CASTLE_K) +#define CAN_OOO(f, c) (NORM_CASTLE(f, c) & CASTLE_Q) +#define CAN_CASTLE(f, c) (CAN_OO(f, c) | CAN_OOO(f, c)) + +#define CLR_OO(f, c) (f & ~(CASTLE_K << (2 * (c)))) +#define CLR_OOO(f, c) (f & ~(CASTLE_Q << (2 * (c)))) +#define CLR_OO_OOO(f, c) (f & ~((CASTLE_K | CASTLE_Q) << (2 * (c)) )) /* game phases */ diff --git a/src/fen.c b/src/fen.c index 74f469f..8b34afa 100644 --- a/src/fen.c +++ b/src/fen.c @@ -81,9 +81,9 @@ static int fen_check(pos_t *pos) if (pos->en_passant != SQUARE_NONE) { rank_t eprank = sq_rank(pos->en_passant); file_t epfile = sq_file(pos->en_passant); - rank_t rank5 = SQ_REL_RANK(RANK_5, pos->turn); - rank_t rank6 = SQ_REL_RANK(RANK_6, pos->turn); - rank_t rank7 = SQ_REL_RANK(RANK_7, pos->turn); + rank_t rank5 = sq_rel_rank(RANK_5, pos->turn); + rank_t rank6 = sq_rel_rank(RANK_6, pos->turn); + rank_t rank7 = sq_rel_rank(RANK_7, pos->turn); piece_t pawn = pos->turn == WHITE? B_PAWN: W_PAWN; if (warn(eprank != rank6 || pos->board[sq_make(epfile, rank5)] != pawn || diff --git a/src/move-gen.c b/src/move-gen.c index 001108a..fa3e451 100644 --- a/src/move-gen.c +++ b/src/move-gen.c @@ -159,6 +159,7 @@ movelist_t *pos_all_legal(const pos_t *pos, movelist_t *dest) * - castling: M_CASTLE_{K,Q} * - pawn capture (incl. en-passant): M_CAPTURE * en-passant: M_EN_PASSANT + * - pawn double push: M_DPUSH * - promotion: M_PROMOTION * - promotion and capture * @@ -232,8 +233,8 @@ int pos_gen_pseudomoves(pos_t *pos) } /* pawn: relative rank and files */ - bitboard_t rel_rank7 = us == WHITE ? RANK_7bb : RANK_2bb; - bitboard_t rel_rank3 = us == WHITE ? RANK_3bb : RANK_6bb; + bitboard_t rel_rank7 = bb_rel_rank(RANK_7, us); + bitboard_t rel_rank3 = bb_rel_rank(RANK_3, us); /* pawn: ranks 2-6 push 1 and 2 squares */ movebits = pawn_shift_up(pos->bb[us][PAWN] & ~rel_rank7, us) & empty; @@ -246,7 +247,7 @@ int pos_gen_pseudomoves(pos_t *pos) movebits = pawn_shift_up(movebits & rel_rank3, us) & empty; bit_for_each64(to, tmp1, movebits) { from = pawn_push_up(pawn_push_up(to, them), them); - moves[nmoves++] = move_make(from, to); + moves[nmoves++] = move_make_flags(from, to, M_DPUSH); } /* pawn: ranks 2-6 captures left */ @@ -307,7 +308,7 @@ int pos_gen_pseudomoves(pos_t *pos) /* castle - Attention ! Castling flags are assumed correct */ if (!pos->checkers) { - bitboard_t rel_rank1 = BB_REL_RANK(RANK_1, us); + bitboard_t rel_rank1 = bb_rel_rank(RANK_1, us); from = pos->king[us]; square_t from_square[2] = { E1, E8 }; /* verify king is on E1/E8 */ bug_on(CAN_CASTLE(pos->castle, us) && from != from_square[us]); diff --git a/src/move.h b/src/move.h index 69dcc2e..cc531ba 100644 --- a/src/move.h +++ b/src/move.h @@ -52,7 +52,8 @@ typedef enum { M_PROMOTION = mask(M_OFF_FLAGS + 2), M_CASTLE_K = mask(M_OFF_FLAGS + 3), /* maybe only one ? */ M_CASTLE_Q = mask(M_OFF_FLAGS + 5), /* maybe only one ? */ - M_CHECK = mask(M_OFF_FLAGS + 6) /* maybe unknown/useless ? */ + M_CHECK = mask(M_OFF_FLAGS + 6), /* maybe unknown/useless ? */ + M_DPUSH = mask(M_OFF_FLAGS + 7) /* pawn double push */ } move_flags_t; #define move_set_flags(move, flags) ((move) | (flags)) @@ -64,7 +65,7 @@ typedef enum { #define is_castle_K(m) ((m) & M_CASTLE_K) #define is_castle_Q(m) ((m) & M_CASTLE_Q) #define is_check(m) ((m) & M_CHECK) - +#define is_dpush(m) ((m) & M_DPUSH) #define MOVES_MAX 256 @@ -126,6 +127,11 @@ static inline move_t move_make_promote_capture(square_t from, square_t to, return move_make_promote(from, to, promoted) | M_CAPTURE; } +static inline move_t move_set_captured(move_t move, piece_type_t captured) +{ + return move | (captured << M_OFF_CAPTURED); +} + /* moves_print flags */ #define M_PR_CAPT 0x01 diff --git a/src/position.c b/src/position.c index 4378e8f..80feea3 100644 --- a/src/position.c +++ b/src/position.c @@ -299,7 +299,7 @@ void pos_print_raw(const pos_t *pos, const int type) */ void pos_print_pieces(const pos_t *pos) { - int bit, count, cur; + int sq, count, cur; char *pname; u64 tmp; bitboard_t p; @@ -308,12 +308,12 @@ void pos_print_pieces(const pos_t *pos) p = pos->bb[color][piece]; count = popcount64(p); cur = 0; - pname = piece_to_cap(piece); - printf("%s(0)%s", pname, count? ":": ""); + pname = piece_to_char(p); + printf("%s(%d)%s", pname, count, count? ":": ""); if (count) { - bit_for_each64(bit, tmp, p) { - char cf = sq_file(bit), cr = sq_rank(bit); - printf("%s%c%c", cur? ",": "", FILE2C(cf), RANK2C(cr)); + bit_for_each64(sq, tmp, p) { + // char cf = sq_file(bit), cr = sq_rank(bit); + printf("%s%s", cur? ",": "", sq_to_string(sq)); cur++; } }