Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 112 | pmbaty | 1 | /* |
| 2 | Protector -- a UCI chess engine |
||
| 3 | |||
| 4 | Copyright (C) 2009-2010 Raimund Heid (Raimund_Heid@yahoo.com) |
||
| 5 | |||
| 6 | This program is free software: you can redistribute it and/or modify |
||
| 7 | it under the terms of the GNU General Public License as published by |
||
| 8 | the Free Software Foundation, either version 3 of the License, or |
||
| 9 | (at your option) any later version. |
||
| 10 | |||
| 11 | This program is distributed in the hope that it will be useful, |
||
| 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 14 | GNU General Public License for more details. |
||
| 15 | |||
| 16 | You should have received a copy of the GNU General Public License |
||
| 17 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
||
| 18 | |||
| 19 | */ |
||
| 20 | |||
| 21 | #ifndef _bitboard_h_ |
||
| 22 | #define _bitboard_h_ |
||
| 23 | |||
| 24 | #include "protector.h" |
||
| 25 | #include <string.h> |
||
| 26 | |||
| 27 | typedef UINT64 Bitboard; |
||
| 28 | |||
| 29 | #define EMPTY_BITBOARD ULONG_ZERO |
||
| 30 | #define IMAX_ROOK 4096 |
||
| 31 | #define IMAX_BISHOP 512 |
||
| 32 | |||
| 33 | typedef struct |
||
| 34 | { |
||
| 35 | int hLane, vLane, uLane, dLane; |
||
| 36 | BYTE hLaneSetMask, vLaneSetMask, uLaneSetMask, dLaneSetMask; |
||
| 37 | BYTE hLaneClearMask, vLaneClearMask, uLaneClearMask, dLaneClearMask; |
||
| 38 | } |
||
| 39 | SquareLaneInfo; |
||
| 40 | |||
| 41 | typedef struct |
||
| 42 | { |
||
| 43 | int numSetSquares; |
||
| 44 | UINT8 setSquares[16]; |
||
| 45 | } |
||
| 46 | SetSquaresInfo; |
||
| 47 | |||
| 48 | typedef struct |
||
| 49 | { |
||
| 50 | int hLaneNumber, vLaneNumber, uLaneNumber, dLaneNumber; |
||
| 51 | Bitboard hLane[256], vLane[256], uLane[256], dLane[256]; |
||
| 52 | } |
||
| 53 | ObstacleSquareInfo; |
||
| 54 | |||
| 55 | typedef struct |
||
| 56 | { |
||
| 57 | Bitboard preMask, magicNumber; |
||
| 58 | Bitboard moves[IMAX_ROOK]; |
||
| 59 | } |
||
| 60 | MagicSquareInfoRook; |
||
| 61 | |||
| 62 | typedef struct |
||
| 63 | { |
||
| 64 | Bitboard preMask, magicNumber; |
||
| 65 | Bitboard moves[IMAX_BISHOP]; |
||
| 66 | } |
||
| 67 | MagicSquareInfoBishop; |
||
| 68 | |||
| 69 | #define SLI(square) (squareLaneInfo[(square)]) |
||
| 70 | |||
| 71 | extern UINT64 minValue[_64_]; |
||
| 72 | extern UINT64 maxValue[_64_]; |
||
| 73 | extern INT8 highestBit[0x10000]; |
||
| 74 | extern INT8 lowestBit[0x10000]; |
||
| 75 | extern Bitboard hlane[_64_][256]; |
||
| 76 | extern Bitboard vlane[_64_][256]; |
||
| 77 | extern Bitboard ulane[_64_][256]; |
||
| 78 | extern Bitboard dlane[_64_][256]; |
||
| 79 | extern ObstacleSquareInfo obsi[_64_]; |
||
| 80 | extern Bitboard castlings[2][16][256]; |
||
| 81 | extern int castlingLane[2]; |
||
| 82 | extern int castlingsOfColor[2]; |
||
| 83 | extern SquareLaneInfo squareLaneInfo[_64_]; |
||
| 84 | extern Bitboard generalMoves[0x0f][_64_]; |
||
| 85 | extern const Bitboard squaresOfFile[8]; |
||
| 86 | extern const Bitboard squaresOfRank[8]; |
||
| 87 | extern const Bitboard squaresOfLateralFiles[8]; |
||
| 88 | extern Bitboard squaresOfFileRange[8][8]; |
||
| 89 | extern Bitboard squaresOfRankRange[8][8]; |
||
| 90 | extern Bitboard pawnMoves[2][_64_][256]; |
||
| 91 | extern Bitboard promotionCandidates[2]; |
||
| 92 | extern SetSquaresInfo setSquares[4][0x10000]; |
||
| 93 | extern INT8 numSetBits[0x10000]; |
||
| 94 | extern UINT8 rankOverlay[0x10000]; |
||
| 95 | extern UINT8 bitshiftGap[8][256]; |
||
| 96 | extern Bitboard squaresBehind[_64_][_64_]; |
||
| 97 | extern Bitboard squaresBetween[_64_][_64_]; |
||
| 98 | extern Bitboard squaresInDistance[8][_64_]; |
||
| 99 | extern Bitboard squaresInTaxiDistance[15][_64_]; |
||
| 100 | extern Bitboard squaresAbove[2][_64_]; |
||
| 101 | extern Bitboard squaresBelow[2][_64_]; |
||
| 102 | extern Bitboard squaresLeftOf[_64_]; |
||
| 103 | extern Bitboard squaresRightOf[_64_]; |
||
| 104 | extern Bitboard orthoKingAttackers[_64_]; |
||
| 105 | extern Bitboard diaKingAttackers[_64_]; |
||
| 106 | extern Bitboard knightKingAttackers[_64_]; |
||
| 107 | extern Bitboard pawnKingAttackers[2][_64_]; |
||
| 108 | extern Bitboard interestedPawns[2][_64_][256]; |
||
| 109 | extern Bitboard nonA, nonH, border, center, lightSquares, darkSquares, |
||
| 110 | queenSide, kingSide, centerFiles, extendedCenter; |
||
| 111 | extern int hLaneNumber[_64_], vLaneNumber[_64_]; |
||
| 112 | extern int uLaneNumber[_64_], dLaneNumber[_64_]; |
||
| 113 | extern Bitboard preMaskRook[64], preMaskBishop[64]; |
||
| 114 | extern Bitboard magicRookMoves[64][IMAX_ROOK]; |
||
| 115 | extern Bitboard magicBishopMoves[64][IMAX_BISHOP]; |
||
| 116 | extern const Bitboard magicRookNumber[64]; |
||
| 117 | extern const Bitboard magicBishopNumber[64]; |
||
| 118 | extern MagicSquareInfoRook magicSquareInfoRook[64]; |
||
| 119 | extern MagicSquareInfoBishop magicSquareInfoBishop[64]; |
||
| 120 | |||
| 121 | #define setSquare(bitboard,square) ((bitboard) |= minValue[(square)]); |
||
| 122 | #define clearSquare(bitboard,square) ((bitboard) &= maxValue[(square)]); |
||
| 123 | #define excludeSquares(bitboard,toBeExcluded) ((bitboard) &= ~(toBeExcluded)) |
||
| 124 | |||
| 125 | /** |
||
| 126 | * The number of lanes used to hold information |
||
| 127 | * about the state of all files, rows and diagonals |
||
| 128 | */ |
||
| 129 | #define NUM_LANES 46 |
||
| 130 | |||
| 131 | #define UHEX_FFFF 0xFFFFllu |
||
| 132 | #define UHEX_FFFFffff00000000 0xFFFFffff00000000llu |
||
| 133 | #define UHEX_00000000FFFF0000 0x00000000FFFF0000llu |
||
| 134 | #define UHEX_FFFF000000000000 0xFFFF000000000000llu |
||
| 135 | #define UHEX_0000ffff00000000 0x0000ffff00000000llu |
||
| 136 | #define UHEX_00000000FFFFffff 0x00000000FFFFffffllu |
||
| 137 | #define UHEX_000000000000ffff 0x000000000000ffffllu |
||
| 138 | |||
| 139 | bool testSquare(const Bitboard bitboard, const Square square); |
||
| 140 | Bitboard getKingMoves(const Square square); |
||
| 141 | Bitboard getCastlingMoves(const Color color, |
||
| 142 | const BYTE castlingRights, |
||
| 143 | const Bitboard obstacles); |
||
| 144 | /* |
||
| 145 | Bitboard getQueenMoves(const Square square, const BYTE * obstacles); |
||
| 146 | */ |
||
| 147 | int getWidth(const Bitboard set); |
||
| 148 | Bitboard getMagicQueenMoves(const Square square, const Bitboard obstacles); |
||
| 149 | Bitboard getRookMoves(const Square square, const BYTE * obstacles); |
||
| 150 | Bitboard getMagicRookMoves(const Square square, const Bitboard obstacles); |
||
| 151 | Bitboard getBishopMoves(const Square square, const BYTE * obstacles); |
||
| 152 | Bitboard getMagicBishopMoves(const Square square, const Bitboard obstacles); |
||
| 153 | Bitboard getKnightMoves(const Square square); |
||
| 154 | Bitboard getPawnCaptures(const Piece piece, const Square square, |
||
| 155 | const Bitboard allPieces); |
||
| 156 | Bitboard getPawnAdvances(const Color color, const Square square, |
||
| 157 | const Bitboard obstacles); |
||
| 158 | Bitboard getInterestedPawns(const Color color, |
||
| 159 | const Square square, const Bitboard obstacles); |
||
| 160 | Bitboard getSquaresBetween(const Square square1, const Square square2); |
||
| 161 | Bitboard getSquaresBehind(const Square target, const Square viewpoint); |
||
| 162 | Bitboard shiftLeft(const Bitboard bitboard); |
||
| 163 | Bitboard shiftRight(const Bitboard bitboard); |
||
| 164 | Bitboard getLateralSquares(const Bitboard squares); |
||
| 165 | Bitboard getSquaresOfFile(const File file); |
||
| 166 | Bitboard getSquaresOfRank(const Rank rank); |
||
| 167 | int getNumberOfSetSquares(const Bitboard bitboard); |
||
| 168 | int getRankOverlay(const Bitboard bitboard); |
||
| 169 | Bitboard getMoves(Square square, Piece piece, Bitboard allPieces); |
||
| 170 | Bitboard getCaptureMoves(Square square, Piece piece, Bitboard allPieces); |
||
| 171 | void setObstacleSquare(Square square, BYTE obstacles[NUM_LANES]); |
||
| 172 | void clearObstacleSquare(Square square, BYTE obstacles[NUM_LANES]); |
||
| 173 | void calculateObstacles(Bitboard board, BYTE obstacles[NUM_LANES]); |
||
| 174 | Square getLastSquare(Bitboard * vector); |
||
| 175 | void floodBoard(Bitboard * board); |
||
| 176 | Bitboard getWhitePawnTargets(const Bitboard whitePawns); |
||
| 177 | Bitboard getBlackPawnTargets(const Bitboard blackPawns); |
||
| 178 | void floodBoard(Bitboard * board); |
||
| 179 | Square getLastSquare(Bitboard * vector); |
||
| 180 | Square getFirstSquare(Bitboard * vector); |
||
| 181 | int getSetSquares(const Bitboard board, UINT8 squares[_64_]); |
||
| 182 | Bitboard getMultipleSquaresBetween(const Square origin, Bitboard targets); |
||
| 183 | |||
| 184 | #define ITERATE_BITBOARD(b,sq) while ( ( sq = getLastSquare(b) ) >= 0 ) |
||
| 185 | |||
| 186 | unsigned int getMinimumDistance(const Bitboard targets, const Square square); |
||
| 187 | unsigned int getMaximumDistance(const Bitboard targets, const Square square); |
||
| 188 | int getFloodValue(const Square origin, const Bitboard targets, |
||
| 189 | const Bitboard permittedSquares); |
||
| 190 | Bitboard getFlippedBitboard(Bitboard original); |
||
| 191 | |||
| 192 | /** |
||
| 193 | * Initialize this module. |
||
| 194 | * |
||
| 195 | * @return 0 if no errors occurred. |
||
| 196 | */ |
||
| 197 | int initializeModuleBitboard(void); |
||
| 198 | |||
| 199 | /** |
||
| 200 | * Test this module. |
||
| 201 | * |
||
| 202 | * @return 0 if all tests succeed. |
||
| 203 | */ |
||
| 204 | int testModuleBitboard(void); |
||
| 205 | |||
| 206 | #endif |