Author: Vincent Diepeveen
Date: 20:48:51 08/07/03
You guys can figure out the rest i bet seeing this code.
All that bitboard idiocy always. This kicks the hell out of it.
Vincent Diepeveen,
8 august 2003 5:53 AM
#if MSVC
__inline
#endif
void GenMovesI(RecursionBlock *rb,int sq) {
int SRsq,piece,u,xside,*s,*t,side,*v,*w;
side = rb->side;
xside = rb->xside;
SRsq = (sq<<6);
piece = board[sq];
if( piece == pawn ) {
v = ipiecepos[side][sq];
w = ipawndir[side][sq];
u = *v++;
if( row(u) != 0 && row(u) != 7 ) {
if( color[u] == neutral) {
rb->zetend->zet = (SRsq|u);
rb->zetend++;
if( (u=*v) != 128 && color[u] == neutral ) { /* indien u == sq dan false
*/
rb->zetend->zet = (SRsq|u);
rb->zetend++;
}
}
u = *w++;
if( color[u] == xside ) {/* ppos bevat geen 100, maar sq. */
rb->zetend->zet = (SRsq|u|move_captures);
rb->zetend++;
}
if( (u=*w) != 128 && color[u] == xside ) {
rb->zetend->zet = (SRsq|u|move_captures);
rb->zetend++;
}
}
else {
if( color[u] == neutral) {
rb->zetend->zet = (SRsq|u|move_pqueen);
rb->zetend++;
rb->zetend->zet = (SRsq|u|move_pknight);
rb->zetend++;
rb->zetend->zet = (SRsq|u|move_prook);
rb->zetend++;
rb->zetend->zet = (SRsq|u|move_pbishop);
rb->zetend++;
}
u = *w++;
if( color[u] == xside) {/* captures */
rb->zetend->zet = (SRsq|u|move_captures|move_pqueen);
rb->zetend++;
rb->zetend->zet = (SRsq|u|move_captures|move_pknight);
rb->zetend++;
rb->zetend->zet = (SRsq|u|move_captures|move_prook);
rb->zetend++;
rb->zetend->zet = (SRsq|u|move_captures|move_pbishop);
rb->zetend++;
}
if( (u=*w) != 128 && color[u] == xside) {
rb->zetend->zet = (SRsq|u|move_captures|move_pqueen);
rb->zetend++;
rb->zetend->zet = (SRsq|u|move_captures|move_pknight);
rb->zetend++;
rb->zetend->zet = (SRsq|u|move_captures|move_prook);
rb->zetend++;
rb->zetend->zet = (SRsq|u|move_captures|move_pbishop);
rb->zetend++;
}
}
}
else {
t = cancapside[side];
if( sweep[piece] ) {
int *vh,*wh,uh;
s = andscan[0];
vh = ipiecepos[piece][sq];
wh = iskippos[sq];
uh = *vh++;
do {
int p1=snelbord[uh],sh=wh[uh]; /* local variables is faster for GCC/MSVC
*/
vh += (s[p1]&sh);
if( color[uh] != side ) {
rb->zetend->zet = (SRsq|uh|t[p1]);
rb->zetend++;
}
} while( (uh=*vh++) != 128 );
/*vi = gentable[piece-3][sq];
s = doorscan[0];
u = vi[sq];
do {
if( color[u] != side ) {
cappiece = snelbord[u];
rb->zetend->zet = (SRsq|u|t[cappiece]);
rb->zetend++;
u = vi[(s[cappiece]|u)];
}
else {
u = vi[(64|u)];
}
} while( u != 128 );*/
}
else {
v = ipiecepos[piece][sq];
u = *v++;
do {
if( color[u] != side ) {
rb->zetend->zet = (SRsq|u|t[snelbord[u]]);
rb->zetend++;
}
} while( (u=*v++) != 128 );
}
}
}
void MoveListI(RecursionBlock *rb,struct Move *CFEP) {
/* Generate all semi-legal moves. Check is ignored.
*/
int f,to,from,u,*psq,*pend,*w;
to = CFEP->zet&63;
rb->zetend = rb->SemiLegals;
if( board[to] == pawn ) { /* for enpassant */
from = (CFEP->zet>>6)&63;
if( to-from == 16 || from-to == 16 ) {
f = (to+from)>>1;
w = ipawndir[rb->xside][f];
u = *w++;
if( color[u] == rb->side && board[u] == pawn ) {
rb->zetend->zet = ((u<<6)|f|move_captures|move_enpassant);
rb->zetend++;
}
if( (u=*w) != 128 && color[u] == rb->side && board[u] == pawn ) {
rb->zetend->zet = ((u<<6)|f|move_captures|move_enpassant);
rb->zetend++;
}
}
}
psq = PieceList[rb->side];
pend = PieceList[rb->side]+PieceMax[rb->side];
if( !castld[rb->side] ) {
u = *psq;
if( castle(rb->side,u,u+2) ) {
rb->zetend->zet = ((u<<6)|(u+2)|move_castles);
rb->zetend++;
}
if( castle(rb->side,u,u-2) ) {
rb->zetend->zet = ((u<<6)|(u-2)|move_castles);
rb->zetend++;
}
}
#if BOUNDSCHECKING
pend++;
do {
pend--;
if( *pend != 64 )
GenMovesI(rb,*pend);
} while( pend > psq );
#else
do {
if( *pend != 64 )
GenMovesI(rb,*pend);
} while( --pend >= psq );
#endif
} /* End MoveList() */
This page took 0.02 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.