Hello Sven, ok here it is...
Code: Select all
//******************************************************************************
//* AUTHOR: Michael Hoffmann
//* FILE : attackG.cpp
//* © : Michael Hoffmann
//******************************************************************************
#include "nemo.h"
#pragma warning (disable: 4146)
static const int FILEDIR = 0;
static const int RANKDIR = 1;
static const int DIAGDIR = 2;
static const int ANTIDIR = 3;
static const int ALLDIRECTIONS = 4;
static const ui64_t lookupN[ID64] =
{
0x20400 ,0x50800 ,0xA1100 ,0x142200 ,
0x284400 ,0x508800 ,0xA01000 ,0x402000 ,
0x2040004 ,0x5080008 ,0xA110011 ,0x14220022 ,
0x28440044 ,0x50880088 ,0xA0100010 ,0x40200020 ,
0x204000402 ,0x508000805 ,0xA1100110A ,0x1422002214 ,
0x2844004428 ,0x5088008850 ,0xA0100010A0 ,0x4020002040 ,
0x20400040200 ,0x50800080500 ,0xA1100110A00 ,0x142200221400 ,
0x284400442800 ,0x508800885000 ,0xA0100010A000 ,0x402000204000 ,
0x2040004020000 ,0x5080008050000 ,0xA1100110A0000 ,0x14220022140000 ,
0x28440044280000 ,0x50880088500000 ,0xA0100010A00000 ,0x40200020400000 ,
0x204000402000000 ,0x508000805000000 ,0xA1100110A000000 ,0x1422002214000000,
0x2844004428000000,0x5088008850000000,0xA0100010A0000000,0x4020002040000000,
0x400040200000000 ,0x800080500000000 ,0x1100110A00000000,0x2200221400000000,
0x4400442800000000,0x8800885000000000,0x100010A000000000,0x2000204000000000,
0x4020000000000 ,0x8050000000000 ,0x110A0000000000 ,0x22140000000000 ,
0x44280000000000 ,0x88500000000000 ,0x10A00000000000 ,0x20400000000000 ,
};
static const ui64_t lookupK[ID64] =
{
0x302 ,0x705 ,0xE0A ,0x1C14 ,
0x3828 ,0x7050 ,0xE0A0 ,0xC040 ,
0x30203 ,0x70507 ,0xE0A0E ,0x1C141C ,
0x382838 ,0x705070 ,0xE0A0E0 ,0xC040C0 ,
0x3020300 ,0x7050700 ,0xE0A0E00 ,0x1C141C00 ,
0x38283800 ,0x70507000 ,0xE0A0E000 ,0xC040C000 ,
0x302030000 ,0x705070000 ,0xE0A0E0000 ,0x1C141C0000 ,
0x3828380000 ,0x7050700000 ,0xE0A0E00000 ,0xC040C00000 ,
0x30203000000 ,0x70507000000 ,0xE0A0E000000 ,0x1C141C000000 ,
0x382838000000 ,0x705070000000 ,0xE0A0E0000000 ,0xC040C0000000 ,
0x3020300000000 ,0x7050700000000 ,0xE0A0E00000000 ,0x1C141C00000000 ,
0x38283800000000 ,0x70507000000000 ,0xE0A0E000000000 ,0xC040C000000000 ,
0x302030000000000 ,0x705070000000000 ,0xE0A0E0000000000 ,0x1C141C0000000000,
0x3828380000000000,0x7050700000000000,0xE0A0E00000000000,0xC040C00000000000,
0x203000000000000 ,0x507000000000000 ,0xA0E000000000000 ,0x141C000000000000,
0x2838000000000000,0x5070000000000000,0xA0E0000000000000,0x40C0000000000000,
};
static const ui64_t lookupP[ID2][ID64] =
{
//whitePawnAttacks
{
0x200 ,0x500 ,0xA00 ,0x1400 ,
0x2800 ,0x5000 ,0xA000 ,0x4000 ,
0x20000 ,0x50000 ,0xA0000 ,0x140000 ,
0x280000 ,0x500000 ,0xA00000 ,0x400000 ,
0x2000000 ,0x5000000 ,0xA000000 ,0x14000000 ,
0x28000000 ,0x50000000 ,0xA0000000 ,0x40000000 ,
0x200000000 ,0x500000000 ,0xA00000000 ,0x1400000000 ,
0x2800000000 ,0x5000000000 ,0xA000000000 ,0x4000000000 ,
0x20000000000 ,0x50000000000 ,0xA0000000000 ,0x140000000000 ,
0x280000000000 ,0x500000000000 ,0xA00000000000 ,0x400000000000 ,
0x2000000000000 ,0x5000000000000 ,0xA000000000000 ,0x14000000000000 ,
0x28000000000000 ,0x50000000000000 ,0xA0000000000000 ,0x40000000000000 ,
0x200000000000000 ,0x500000000000000 ,0xA00000000000000 ,0x1400000000000000,
0x2800000000000000,0x5000000000000000,0xA000000000000000,0x4000000000000000,
0x0 ,0x0 ,0x0 ,0x0 ,
0x0 ,0x0 ,0x0 ,0x0
},
//blackPawnAttacks
{
0x0 ,0x0 ,0x0 ,0x0 ,
0x0 ,0x0 ,0x0 ,0x0 ,
0x2 ,0x5 ,0xA ,0x14 ,
0x28 ,0x50 ,0xA0 ,0x40 ,
0x200 ,0x500 ,0xA00 ,0x1400 ,
0x2800 ,0x5000 ,0xA000 ,0x4000 ,
0x20000 ,0x50000 ,0xA0000 ,0x140000 ,
0x280000 ,0x500000 ,0xA00000 ,0x400000 ,
0x2000000 ,0x5000000 ,0xA000000 ,0x14000000 ,
0x28000000 ,0x50000000 ,0xA0000000 ,0x40000000 ,
0x200000000 ,0x500000000 ,0xA00000000 ,0x1400000000 ,
0x2800000000 ,0x5000000000 ,0xA000000000 ,0x4000000000 ,
0x20000000000 ,0x50000000000 ,0xA0000000000 ,0x140000000000 ,
0x280000000000 ,0x500000000000 ,0xA00000000000 ,0x400000000000 ,
0x2000000000000 ,0x5000000000000 ,0xA000000000000 ,0x14000000000000 ,
0x28000000000000 ,0x50000000000000 ,0xA0000000000000 ,0x40000000000000
}
};
struct linemask_t {ui64_t lineLo,lineHi,lineEx;};
static linemask_t lmsk[ALLDIRECTIONS][ID64];
//******************************************************************************
//* init linemasks
//******************************************************************************
void initAttackGetter(void)
{
for(int i=a1;i<=h8;i++)
{
lmsk[FILEDIR][i].lineEx = (fileMask(i) ^ bit(i));
lmsk[FILEDIR][i].lineLo = (fileMask(i) ^ bit(i)) & loBits(i);
lmsk[FILEDIR][i].lineHi = (fileMask(i) ^ bit(i)) & hiBits(i);
lmsk[RANKDIR][i].lineEx = (rankMask(i) ^ bit(i));
lmsk[RANKDIR][i].lineLo = (rankMask(i) ^ bit(i)) & loBits(i);
lmsk[RANKDIR][i].lineHi = (rankMask(i) ^ bit(i)) & hiBits(i);
lmsk[DIAGDIR][i].lineEx = (diagMask(i) ^ bit(i));
lmsk[DIAGDIR][i].lineLo = (diagMask(i) ^ bit(i)) & loBits(i);
lmsk[DIAGDIR][i].lineHi = (diagMask(i) ^ bit(i)) & hiBits(i);
lmsk[ANTIDIR][i].lineEx = (antiMask(i) ^ bit(i));
lmsk[ANTIDIR][i].lineLo = (antiMask(i) ^ bit(i)) & loBits(i);
lmsk[ANTIDIR][i].lineHi = (antiMask(i) ^ bit(i)) & hiBits(i);
}
}
//******************************************************************************
//* obstruction difference
//******************************************************************************
static __inline ui64_t attackLine(linemask_t *lmsk,ui64_t occ)
{
ui64_t lo = -(ui64_t) 1 << bsr64((lmsk->lineLo & occ)|1);
ui64_t hi = lmsk->lineHi & occ;
return(lmsk->lineEx & (2*(hi&-hi)+lo));
}
//******************************************************************************
//* attackGetter
//******************************************************************************
extern ui64_t (*attack[ID16]) (sq_t,ui64_t) =
{
NULL,NULL,
attackWP,attackBP,attackN ,attackN ,attackB ,attackB ,attackB ,
attackB ,attackR ,attackR ,attackQ ,attackQ ,attackK ,attackK
};
extern __inline ui64_t attackWP(sq_t s,ui64_t dmy){return(lookupP[white][s]);}
extern __inline ui64_t attackBP(sq_t s,ui64_t dmy){return(lookupP[black][s]);}
extern __inline ui64_t attackN(sq_t s,ui64_t dmy) {return(lookupN[s]);}
extern __inline ui64_t attackK(sq_t s,ui64_t dmy) {return(lookupK[s]);}
extern __inline ui64_t attackB(sq_t s,ui64_t occ)
{return(attackLine(&lmsk[DIAGDIR][s],occ) | attackLine(&lmsk[ANTIDIR][s],occ));}
extern __inline ui64_t attackR(sq_t s,ui64_t occ)
{return(attackLine(&lmsk[FILEDIR][s],occ) | attackLine(&lmsk[RANKDIR][s],occ));}
extern __inline ui64_t attackQ(sq_t s,ui64_t occ)
{return(attackB(s,occ)|attackR(s,occ));}
and some more snippets... (from bittwiddle.cpp)
also doesnt help. Readability is little bit a matter of taste imho.