#include #include #include #include #include #include #include "common.h" #define NBITS 16 void Initialize(void) { InitLzArray(); InitBitPosArray(); InitMoveArray(); InitRay(); InitFromToRay(); InitRankFileBit(); InitPassedPawnMask(); InitIsolaniMask(); InitSquarePawnMask(); InitBitCount(); InitRotAtak(); InitRandomMasks(); InitDistance(); InitVars(); InitHashCode(); InitHashTable(); CalcHashKey(); } void InitLzArray(void) { int i,j,s,n; s=n=1; for(i=0;i=0;i--) { BitPosArray[i]=b; NotBitPosArray[i]=~b; b<<=1; } } static const int dir[8][8]= { {0,0,0,0,0,0,0,0}, {9,11,0,0,0,0,0,0}, {-21,-19,-12,-8,8,12,19,21}, {-11,-9,9,11,0,0,0,0}, {-10,-1,1,10,0,0,0,0}, {-11,-10,-9,-1,1,9,10,11}, {-11,-10,-9,-1,1,9,10,11}, {-9,-11,0,0,0,0,0,0} }; static const int ndir[8]={0,2,8,4,4,8,8,2}; static const int map[120]= { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,0,1,2,3,4,5,6,7,-1, -1,8,9,10,11,12,13,14,15,-1, -1,16,17,18,19,20,21,22,23,-1, -1,24,25,26,27,28,29,30,31,-1, -1,32,33,34,35,36,37,38,39,-1, -1,40,41,42,43,44,45,46,47,-1, -1,48,49,50,51,52,53,54,55,-1, -1,56,57,58,59,60,61,62,63,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }; void InitMoveArray(void) { int piece,fsq,tsq,f,t,n; BitBoard *b; for(piece=pawn;piece<=bpawn;piece++) { for(fsq=0;fsq<120;fsq++) { if((f=map[fsq])==-1) continue; b=&MoveArray[piece][f]; *b=NULLBITBOARD; for(n=0;n0) { if(cmap[--sq1]&map) break; } while(sq2<7) { if(cmap[++sq2]&map) break; } Rook00Atak[sq][map]=FromToRay[sq][sq1]|FromToRay[sq][sq2]; Rook90Atak[rot1[sq]][map]=FromToRay[rot1[sq]][rot1[sq1]]|FromToRay[rot1[sq]][rot1[sq2]]; Bishop45Atak[rot2[sq]][map]=FromToRay[rot2[sq]][rot2[sq1]]|FromToRay[rot2[sq]][rot2[sq2]]; Bishop315Atak[rot3[sq]][map]=FromToRay[rot3[sq]][rot3[sq1]]|FromToRay[rot3[sq]][rot3[sq2]]; } } for(map=0;map<256;map++) { for(sq=A2;sq<=H8;sq++) { Rook00Atak[sq][map]=Rook00Atak[sq-8][map]>>8; } for(sq1=B_FILE;sq1<=H_FILE;sq1++) { for(sq2=0;sq2<64;sq2+=8) { sq=sq2+sq1; Rook90Atak[sq][map]=Rook90Atak[sq-1][map]>>1; } } for(sq1=B1,sq2=H7;sq1<=H1;sq1++,sq2-=8) { for(sq=sq1;sq<=sq2;sq+=9) { Bishop45Atak[sq][map]=Bishop45Atak[sq+8][map]<<8; } } for(sq1=A2,sq2=G8;sq1<=A8;sq1+=8,sq2--) { for(sq=sq1;sq<=sq2;sq+=9) { Bishop45Atak[sq][map]=(Bishop45Atak[sq+1][map]&NotBitPosArray[sq1-8])<<1; } } for(sq1=H2,sq2=B8;sq1<=H8;sq1+=8,sq2++) { for(sq=sq1;sq<=sq2;sq+=7) { Bishop315Atak[sq][map]=Bishop315Atak[sq-8][map]>>8; } } for(sq1=G1,sq2=A7;sq1>=A1;sq1--,sq2-=8) { for(sq=sq1;sq<=sq2;sq+=7) { Bishop315Atak[sq][map]=(Bishop315Atak[sq+1][map]&NotBitPosArray[sq2+8])<<1; } } } } void InitDistance(void) { int f,t,j,d1,d2; for(f=0;f<64;f++) for(t=0;t<8;t++) DistMap[f][t]=0; for(f=0;f<64;f++) for(t=f;t<64;t++) { d1=(t&0x07)-(f&0x07); if(d1<0) d1=-d1; d2=(t>>3)-(f>>3); if(d2<0) d2=-d2; distance[f][t]=MAX(d1,d2); distance[t][f]=MAX(d1,d2); taxicab[f][t]=d1+d2; taxicab[t][f]=d1+d2; } for(f=0;f<64;f++) for(t=0;t<64;t++) DistMap[f][distance[t][f]]|=BitPosArray[t]; for(f=0;f<64;f++) for(t=0;t<8;t++) for(j=0;j>=1)>0) { TTHashMask<<=1; TTHashMask|=1; } HashSize=TTHashMask+1; i=PAWNSLOTS; PHashMask=0; while((i>>=1)>0) { PHashMask<<=1; PHashMask|=1; } // signal(SIGINT,EndSearch); nmovesfrombook=0; } void InitHashCode(void) { int color,piece,sq; for(color=white;color<=black;color++) { for(piece=pawn;piece<=king;piece++) { for(sq=0;sq<64;sq++) hashcode[color][piece][sq]=Rand64(); } } for(sq=0;sq<64;sq++) ephash[sq]=Rand64(); WKCastlehash=Rand64(); WQCastlehash=Rand64(); BKCastlehash=Rand64(); BQCastlehash=Rand64(); Sidehash=Rand64(); } void InitHashTable(void) { for(;;) { free(HashTab[0]); free(HashTab[1]); HashTab[0]=malloc(HashSize*sizeof(HashSlot)); HashTab[1]=malloc(HashSize*sizeof(HashSlot)); if(HashTab[0]&&HashTab[1]) break; HashSize>>=1; TTHashMask>>=1; if(!HashSize) #ifdef __PPC__ FromPPCexit(RETURN_FAIL); #else exit(RETURN_FAIL); #endif } PawnTab[0]=realloc(PawnTab[0],PAWNSLOTS*sizeof(PawnSlot)); PawnTab[1]=realloc(PawnTab[1],PAWNSLOTS*sizeof(PawnSlot)); if(!PawnTab[0]||!PawnTab[1]) #ifdef __PPC__ FromPPCexit(RETURN_FAIL); #else exit(RETURN_FAIL); #endif } void NewPosition(void) { CLEAR(flags,ENDED); Game50=0; RealGameCnt=GameCnt=-1; Game[0].hashkey=HashKey; TTClear(); PTClear(); nmovesfrombook=0; ExchCnt[white]=ExchCnt[black]=0; }