Author: Scott Gasch
Date: 11:37:34 01/14/02
Go up one level in this thread
Here's the code if anyone is interested:
Original C code:
void
GetAttacks(SEE_LIST *pList,
POSITION *pos,
COORD cSquare,
unsigned int iSide)
{
register int x;
PIECE p;
COORD c;
int iIndex;
register COORD cBlockIndex;
int iDelta;
ASSERT(pList);
ASSERT(pos);
ASSERT(ONBOARD(cSquare));
ASSERT((WHITE == iSide) || (BLACK == iSide));
pList->iCount = 0;
ASSERT(pos->iPawnCount[iSide] >= 0);
ASSERT(pos->iPawnCount[iSide] <= 8);
if (iSide == WHITE)
{
c = cSquare + 15;
p = pos->pSquare[c];
if ((ONBOARD(c) && (PIECE_PIECE(p) == WHITE_PAWN)))
{
pList->data[0].pPiece = p;
pList->data[0].cLoc = c;
pList->data[0].iVal = VALUE_PAWN;
pList->iCount = 1;
}
c = cSquare + 17;
p = pos->pSquare[c];
if ((ONBOARD(c) && (PIECE_PIECE(p) == WHITE_PAWN)))
{
pList->data[pList->iCount].pPiece = p;
pList->data[pList->iCount].cLoc = c;
pList->data[pList->iCount].iVal = VALUE_PAWN;
pList->iCount++;
}
}
else
{
c = cSquare - 17;
p = pos->pSquare[c];
if ((ONBOARD(c) && (PIECE_PIECE(p) == BLACK_PAWN)))
{
pList->data[0].pPiece = p;
pList->data[0].cLoc = c;
pList->data[0].iVal = VALUE_PAWN;
pList->iCount = 1;
}
c = cSquare - 15;
p = pos->pSquare[c];
if ((ONBOARD(c) && (PIECE_PIECE(p) == BLACK_PAWN)))
{
pList->data[pList->iCount].pPiece = p;
pList->data[pList->iCount].cLoc = c;
pList->data[pList->iCount].iVal = VALUE_PAWN;
pList->iCount++;
}
}
ASSERT(pos->iNonPawnCount[iSide] >= 1);
ASSERT(pos->iNonPawnCount[iSide] <= 16);
for (x = pos->iNonPawnCount[iSide] - 1;
x >= 0;
x--)
{
c = pos->cNonPawns[iSide][x];
ASSERT(KILLED != c);
ASSERT(ONBOARD(c));
p = pos->pSquare[c];
ASSERT(p && !IS_PAWN(p));
ASSERT(COLOR(p) == iSide);
iIndex = c - cSquare + 128;
//
// If there is no way for that kind of piece to get to this
// square then keep looking.
//
if (0 == (g_VectorDeltaTable[iIndex].iVector[iSide] &
(1 << (PIECE_PIECE(p) >> 1))))
{
continue;
}
//
// Knights and kings do not slide so if they can get there we do
// not have to look for blockers.
//
if ((IS_KNIGHT(p)) ||
(IS_KING(p)))
{
pList->data[pList->iCount].pPiece = p;
pList->data[pList->iCount].cLoc = c;
pList->data[pList->iCount].iVal = PIECE_VALUE(p);
pList->iCount++;
continue;
}
//
// Check to see if there is a piece in the path from cSquare to
// c that blocks the attack.
//
iDelta = -g_VectorDeltaTable[iIndex].iDelta;
#ifdef PARANOID
if (c == cSquare)
{
ASSERT(iDelta == 0);
}
else
{
if (RANK(c) == RANK(cSquare))
{
if (c < cSquare)
{
ASSERT(iDelta == -1);
}
else
{
ASSERT(iDelta == +1);
}
}
else if (FILE(c) == FILE(cSquare))
{
if (c < cSquare)
{
ASSERT(iDelta == -16);
}
else
{
ASSERT(iDelta == +16);
}
}
}
#endif
for (cBlockIndex = cSquare + iDelta;
cBlockIndex != c;
cBlockIndex += iDelta)
{
if (!IS_EMPTY(pos->pSquare[cBlockIndex]))
{
goto done;
}
}
//
// Nothing in the way.
//
pList->data[pList->iCount].pPiece = p;
pList->data[pList->iCount].cLoc = c;
pList->data[pList->iCount].iVal = PIECE_VALUE(p);
pList->iCount++;
done:
;
}
}
Here's my assembly version:
void
GetAttacks(SEE_LIST *pList,
POSITION *pos,
COORD cSquare,
unsigned int iSide)
{
int x;
COORD c;
int iIndex;
ASSERT(pList);
ASSERT(pos);
ASSERT(ONBOARD(cSquare));
ASSERT((WHITE == iSide) || (BLACK == iSide));
ASSERT(pos->iPawnCount[iSide] >= 0);
ASSERT(pos->iPawnCount[iSide] <= 8);
__asm
{
// pList->iCount = 0;
mov ebx,dword ptr [pList]
mov dword ptr [ebx],0
//side_is_white:
// if (iSide == WHITE)
// {
cmp dword ptr [iSide],1
jne side_is_black
//try_white_1:
//
// Test c+15 for white pawnness
//
// c = cSquare + 15;
mov ecx,dword ptr [cSquare]
add ecx,0Fh
// if (!ONBOARD(c)) goto try other white pawn
test ecx,88h
jne try_white_2
// p = pos->pSquare[c];
mov eax,dword ptr [pos]
mov edx,dword ptr [eax+ecx*4]
// if ((PIECE_PIECE(p) != WHITE_PAWN)) goto try other white pawn
mov eax,edx
and eax,0Fh
cmp eax,3
jne try_white_2
// if we get here there's a white pawn at c+17
// pList->pPiece[pList->iCount] = p;
mov dword ptr [ebx+4],edx
// pList->cLoc[pList->iCount] = c;
mov dword ptr [ebx+8],ecx
// pList->iVal[pList->iCount] = VALUE_PAWN;
mov dword ptr [ebx+0Ch],64h
// pList->iCount++;
mov dword ptr [ebx],1
try_white_2:
//
// test c + 17 for white pawnness
//
// c = cSquare + 17;
add ecx,2
// if (!ONBOARD(c)) goto done testing pawns
test ecx,88h
jne done_pawns
// p = pos->pSquare[c];
mov eax,dword ptr [pos]
mov edx,dword ptr [eax+ecx*4]
// if (PIECE_PIECE(p) != WHITE_PAWN) goto done testing pawns
mov eax,edx
and eax,0Fh
cmp eax,3
jne done_pawns
// if we get here the piece at c+15 is a white pawn
// pList->pPiece[pList->iCount] = p;
mov eax,dword ptr [ebx]
imul eax,eax,0Ch
mov dword ptr [ebx+eax+4],edx
// pList->cLoc[pList->iCount] = c;
mov dword ptr [ebx+eax+8],ecx
// pList->iVal[pList->iCount] = VALUE_PAWN;
mov dword ptr [ebx+eax+0Ch],64h
// pList->iCount++;
mov eax,dword ptr [ebx]
add eax,1
mov dword ptr [ebx],eax
// goto done testing pawns
jmp done_pawns
side_is_black:
// c = cSquare - 17;
mov ecx,dword ptr [cSquare]
sub ecx,11h
// if (!ONBOARD(c)) goto test other black pawn
test ecx,88h
jne try_black_2
// p = pos->pSquare[c];
mov eax,dword ptr [pos]
mov edx,dword ptr [eax+ecx*4]
// if (PIECE_PIECE(p) != BLACK_PAWN) goto test other black pawn
mov eax,edx
and eax,0Fh
cmp eax,2
jne try_black_2
// if we get here the piece at c-17 is a black pawn
// pList->pPiece[pList->iCount] = p;
mov dword ptr [ebx+4],edx
// pList->cLoc[pList->iCount] = c;
mov dword ptr [ebx+8],ecx
// pList->iVal[pList->iCount] = VALUE_PAWN;
mov dword ptr [ebx+0Ch],64h
// pList->iCount++;
mov dword ptr [ebx],1
try_black_2:
// c = cSquare - 15;
add ecx,2
// if (!ONBOARD(c)) goto done with pawns
test ecx,88h
jne done_pawns
// p = pos->pSquare[c];
mov eax,dword ptr [pos]
mov edx,dword ptr [eax+ecx*4]
// if (PIECE_PIECE(p) != BLACK_PAWN) goto done with pawns
mov eax,edx
and eax,0Fh
cmp eax,2
jne done_pawns
// if we get here the piece at c-15 is a black pawn
// pList->pPiece[pList->iCount] = p;
mov eax,dword ptr [ebx]
imul eax,eax,0Ch
mov dword ptr [ebx+eax+4],edx
// pList->cLoc[pList->iCount] = c;
mov dword ptr [ebx+eax+8],ecx
// pList->iVal[pList->iCount] = VALUE_PAWN;
mov dword ptr [ebx+eax+0Ch],64h
// pList->iCount++;
mov eax,dword ptr [ebx]
add eax,1
mov dword ptr [ebx],eax
done_pawns:
//
// Do pieces now
//
// for (x = pos->iNonPawnCount[iSide] - 1;
// x >= 0;
// x--)
// {
mov eax,dword ptr [iSide]
mov ecx,dword ptr [pos]
mov ebx,dword ptr [ecx+eax*4+308h]
mov dword ptr [x], ebx
loop_continue:
mov ebx,dword ptr [x]
sub ebx,1
//loop_cond:
cmp ebx,0
jl done
mov dword ptr [x],ebx
// c = pos->cNonPawns[iSide][x];
mov ecx,dword ptr [iSide]
shl ecx,6
mov edx,dword ptr [pos]
lea ecx,[edx+ecx+288h]
mov ecx,dword ptr [ecx+ebx*4]
mov dword ptr [c],ecx
// p = pos->pSquare[c];
mov ebx,dword ptr [edx+ecx*4]
// iIndex = c - cSquare + 128;
sub ecx,dword ptr [cSquare]
add ecx,80h
mov dword ptr [iIndex],ecx
//
// If there is no way for that kind of piece to get to this
// square then keep looking.
//
// if (0 == (g_VectorDeltaTable[iIndex].iVector[iSide] &
// (1 << (PIECE_PIECE(p) >> 1)))) continue;
mov edx,dword ptr [iSide]
xor eax,eax
mov al,byte ptr [edx+ecx*4+g_VectorDeltaTable]
mov ecx,ebx
and ecx,0Fh
shr ecx,1
mov edx,1
shl edx,cl
and eax,edx
test eax,eax
je loop_continue
//
// Knights and kings do not slide so if they can get there we do
// not have to look for blockers.
//
// if ((p & 0x6) == 0x4)
// {
mov eax,ebx
and eax,6
cmp eax,4
jne not_knight_king
// pList->pPiece[pList->iCount] = p;
mov edx,dword ptr [pList]
mov eax,dword ptr [edx]
imul eax,eax,0Ch
mov dword ptr [edx+eax+4],ebx
// pList->cLoc[pList->iCount] = c;
mov ecx,dword ptr [c]
mov dword ptr [edx+eax+8],ecx
// pList->iVal[pList->iCount] = PIECE_VALUE(p);
mov ecx,ebx
and ecx,0Eh
shl ecx,3
mov ecx,dword ptr g_PieceData[ecx]
mov dword ptr [edx+eax+0Ch],ecx
// pList->iCount++;
mov eax,dword ptr [edx]
add eax,1
mov dword ptr [edx],eax
// continue;
jmp loop_continue;
not_knight_king:
//
// Check to see if there is a piece in the path from cSquare to
// c that blocks the attack.
//
// iDelta = g_VectorDeltaTable[iIndex].iNegDelta;
mov eax,dword ptr [iIndex]
movsx ecx,byte ptr [eax*4+g_VectorDeltaTable+3]
// cBlockIndex = cSquare + iDelta
mov eax,dword ptr [cSquare]
block_loop:
add eax,ecx
// if (cBlockIndex != c)
// {
cmp eax,dword ptr [c]
je nothing_blocks
// if (IS_EMPTY(pos->pSquare[cBlockIndex]))
// {
mov edx,dword ptr [pos]
cmp dword ptr [edx+eax*4],0
jne loop_continue
// goto cond
jmp block_loop
nothing_blocks:
//
// nothing in the way, add to the list
//
// pList->pPiece[pList->iCount] = p;
mov eax,dword ptr [pList]
mov ecx,dword ptr [eax]
imul ecx,ecx,0Ch
mov dword ptr [eax+ecx+4],ebx
// pList->iVal[pList->iCount] = PIECE_VALUE(p);
and ebx,0Eh
shl ebx,3
mov ebx,dword ptr g_PieceData[ebx]
mov dword ptr [eax+ecx+0Ch],ebx
// pList->cLoc[pList->iCount] = c;
mov ebx,dword ptr [c]
mov dword ptr [eax+ecx+8],ebx
// pList->iCount++;
mov ecx,dword ptr [eax]
add ecx,1
mov dword ptr [eax],ecx
// next x
jmp loop_continue
}
done:
;
}
This page took 0 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.