- /* 
-     Protector -- a UCI chess engine 
-   
-     Copyright (C) 2009-2010 Raimund Heid (Raimund_Heid@yahoo.com) 
-   
-     This program is free software: you can redistribute it and/or modify 
-     it under the terms of the GNU General Public License as published by 
-     the Free Software Foundation, either version 3 of the License, or 
-     (at your option) any later version. 
-   
-     This program is distributed in the hope that it will be useful, 
-     but WITHOUT ANY WARRANTY; without even the implied warranty of 
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
-     GNU General Public License for more details. 
-   
-     You should have received a copy of the GNU General Public License 
-     along with this program.  If not, see <http://www.gnu.org/licenses/>. 
-   
- */ 
-   
- #ifndef _bitboard_h_ 
- #define _bitboard_h_ 
-   
- #include "protector.h" 
- #include <string.h> 
-   
- typedef UINT64 Bitboard; 
-   
- #define EMPTY_BITBOARD ULONG_ZERO 
- #define IMAX_ROOK    4096 
- #define IMAX_BISHOP  512 
-   
- typedef struct 
- { 
-    int hLane, vLane, uLane, dLane; 
-    BYTE hLaneSetMask, vLaneSetMask, uLaneSetMask, dLaneSetMask; 
-    BYTE hLaneClearMask, vLaneClearMask, uLaneClearMask, dLaneClearMask; 
- } 
- SquareLaneInfo; 
-   
- typedef struct 
- { 
-    int numSetSquares; 
-    UINT8 setSquares[16]; 
- } 
- SetSquaresInfo; 
-   
- typedef struct 
- { 
-    int hLaneNumber, vLaneNumber, uLaneNumber, dLaneNumber; 
-    Bitboard hLane[256], vLane[256], uLane[256], dLane[256]; 
- } 
- ObstacleSquareInfo; 
-   
- typedef struct 
- { 
-    Bitboard preMask, magicNumber; 
-    Bitboard moves[IMAX_ROOK]; 
- } 
- MagicSquareInfoRook; 
-   
- typedef struct 
- { 
-    Bitboard preMask, magicNumber; 
-    Bitboard moves[IMAX_BISHOP]; 
- } 
- MagicSquareInfoBishop; 
-   
- #define SLI(square) (squareLaneInfo[(square)]) 
-   
- extern UINT64 minValue[_64_]; 
- extern UINT64 maxValue[_64_]; 
- extern INT8 highestBit[0x10000]; 
- extern INT8 lowestBit[0x10000]; 
- extern Bitboard hlane[_64_][256]; 
- extern Bitboard vlane[_64_][256]; 
- extern Bitboard ulane[_64_][256]; 
- extern Bitboard dlane[_64_][256]; 
- extern ObstacleSquareInfo obsi[_64_]; 
- extern Bitboard castlings[2][16][256]; 
- extern int castlingLane[2]; 
- extern int castlingsOfColor[2]; 
- extern SquareLaneInfo squareLaneInfo[_64_]; 
- extern Bitboard generalMoves[0x0f][_64_]; 
- extern const Bitboard squaresOfFile[8]; 
- extern const Bitboard squaresOfRank[8]; 
- extern const Bitboard squaresOfLateralFiles[8]; 
- extern Bitboard squaresOfFileRange[8][8]; 
- extern Bitboard squaresOfRankRange[8][8]; 
- extern Bitboard pawnMoves[2][_64_][256]; 
- extern Bitboard promotionCandidates[2]; 
- extern SetSquaresInfo setSquares[4][0x10000]; 
- extern INT8 numSetBits[0x10000]; 
- extern UINT8 rankOverlay[0x10000]; 
- extern UINT8 bitshiftGap[8][256]; 
- extern Bitboard squaresBehind[_64_][_64_]; 
- extern Bitboard squaresBetween[_64_][_64_]; 
- extern Bitboard squaresInDistance[8][_64_]; 
- extern Bitboard squaresInTaxiDistance[15][_64_]; 
- extern Bitboard squaresAbove[2][_64_]; 
- extern Bitboard squaresBelow[2][_64_]; 
- extern Bitboard squaresLeftOf[_64_]; 
- extern Bitboard squaresRightOf[_64_]; 
- extern Bitboard orthoKingAttackers[_64_]; 
- extern Bitboard diaKingAttackers[_64_]; 
- extern Bitboard knightKingAttackers[_64_]; 
- extern Bitboard pawnKingAttackers[2][_64_]; 
- extern Bitboard interestedPawns[2][_64_][256]; 
- extern Bitboard nonA, nonH, border, center, lightSquares, darkSquares, 
-    queenSide, kingSide, centerFiles, extendedCenter; 
- extern int hLaneNumber[_64_], vLaneNumber[_64_]; 
- extern int uLaneNumber[_64_], dLaneNumber[_64_]; 
- extern Bitboard preMaskRook[64], preMaskBishop[64]; 
- extern Bitboard magicRookMoves[64][IMAX_ROOK]; 
- extern Bitboard magicBishopMoves[64][IMAX_BISHOP]; 
- extern const Bitboard magicRookNumber[64]; 
- extern const Bitboard magicBishopNumber[64]; 
- extern MagicSquareInfoRook magicSquareInfoRook[64]; 
- extern MagicSquareInfoBishop magicSquareInfoBishop[64]; 
-   
- #define setSquare(bitboard,square) ((bitboard) |= minValue[(square)]); 
- #define clearSquare(bitboard,square) ((bitboard) &= maxValue[(square)]); 
- #define excludeSquares(bitboard,toBeExcluded) ((bitboard) &= ~(toBeExcluded)) 
-   
- /** 
-  * The number of lanes used to hold information 
-  * about the state of all files, rows and diagonals 
-  */ 
- #define NUM_LANES 46 
-   
- #define UHEX_FFFF 0xFFFFllu 
- #define UHEX_FFFFffff00000000 0xFFFFffff00000000llu 
- #define UHEX_00000000FFFF0000 0x00000000FFFF0000llu 
- #define UHEX_FFFF000000000000 0xFFFF000000000000llu 
- #define UHEX_0000ffff00000000 0x0000ffff00000000llu 
- #define UHEX_00000000FFFFffff 0x00000000FFFFffffllu 
- #define UHEX_000000000000ffff 0x000000000000ffffllu 
-   
- bool testSquare(const Bitboard bitboard, const Square square); 
- Bitboard getKingMoves(const Square square); 
- Bitboard getCastlingMoves(const Color color, 
-                           const BYTE castlingRights, 
-                           const Bitboard obstacles); 
- /* 
-  Bitboard getQueenMoves(const Square square, const BYTE * obstacles); 
- */ 
- int getWidth(const Bitboard set); 
- Bitboard getMagicQueenMoves(const Square square, const Bitboard obstacles); 
- Bitboard getRookMoves(const Square square, const BYTE * obstacles); 
- Bitboard getMagicRookMoves(const Square square, const Bitboard obstacles); 
- Bitboard getBishopMoves(const Square square, const BYTE * obstacles); 
- Bitboard getMagicBishopMoves(const Square square, const Bitboard obstacles); 
- Bitboard getKnightMoves(const Square square); 
- Bitboard getPawnCaptures(const Piece piece, const Square square, 
-                          const Bitboard allPieces); 
- Bitboard getPawnAdvances(const Color color, const Square square, 
-                          const Bitboard obstacles); 
- Bitboard getInterestedPawns(const Color color, 
-                             const Square square, const Bitboard obstacles); 
- Bitboard getSquaresBetween(const Square square1, const Square square2); 
- Bitboard getSquaresBehind(const Square target, const Square viewpoint); 
- Bitboard shiftLeft(const Bitboard bitboard); 
- Bitboard shiftRight(const Bitboard bitboard); 
- Bitboard getLateralSquares(const Bitboard squares); 
- Bitboard getSquaresOfFile(const File file); 
- Bitboard getSquaresOfRank(const Rank rank); 
- int getNumberOfSetSquares(const Bitboard bitboard); 
- int getRankOverlay(const Bitboard bitboard); 
- Bitboard getMoves(Square square, Piece piece, Bitboard allPieces); 
- Bitboard getCaptureMoves(Square square, Piece piece, Bitboard allPieces); 
- void setObstacleSquare(Square square, BYTE obstacles[NUM_LANES]); 
- void clearObstacleSquare(Square square, BYTE obstacles[NUM_LANES]); 
- void calculateObstacles(Bitboard board, BYTE obstacles[NUM_LANES]); 
- Square getLastSquare(Bitboard * vector); 
- void floodBoard(Bitboard * board); 
- Bitboard getWhitePawnTargets(const Bitboard whitePawns); 
- Bitboard getBlackPawnTargets(const Bitboard blackPawns); 
- void floodBoard(Bitboard * board); 
- Square getLastSquare(Bitboard * vector); 
- Square getFirstSquare(Bitboard * vector); 
- int getSetSquares(const Bitboard board, UINT8 squares[_64_]); 
- Bitboard getMultipleSquaresBetween(const Square origin, Bitboard targets); 
-   
- #define ITERATE_BITBOARD(b,sq) while ( ( sq = getLastSquare(b) ) >= 0 ) 
-   
- unsigned int getMinimumDistance(const Bitboard targets, const Square square); 
- unsigned int getMaximumDistance(const Bitboard targets, const Square square); 
- int getFloodValue(const Square origin, const Bitboard targets, 
-                   const Bitboard permittedSquares); 
- Bitboard getFlippedBitboard(Bitboard original); 
-   
- /** 
-  * Initialize this module. 
-  * 
-  * @return 0 if no errors occurred. 
-  */ 
- int initializeModuleBitboard(void); 
-   
- /** 
-  * Test this module. 
-  * 
-  * @return 0 if all tests succeed. 
-  */ 
- int testModuleBitboard(void); 
-   
- #endif 
-