How do you generate captures Peter?
Yes, I do understand that you can and your bitboard with each piece to generate captures almost as efficiently as using a piece list but say for example you use a SEE. You must test the target square what kind of piece it is (Rook or Queen, or Queen or Bishops for ray casting) and it makes the code much more complex. I don't believe there is an efficient way of doing these tasks without using expensive testing.
And on the topic of crafty not using some sort of piece lists, if you check movegen.c and look at function GenerateCaptures you see this in every move generation loop:
*move++ = temp | (to << 6) | ((-
PcOnSq(to)) << 15);
PcOnSq is a marco and you can check in the source. It looks like an incrementally updated piece list (correct me if I am wrong--Crafty code is very complex).
And also written by Hyatt on his website in the bitboard section (
http://www.cis.uab.edu/hyatt/boardrep.html):
Hyatt wrote:...One note is that we will likely decide to use an offset board representation to complement a bitmap approach. One reason for this is move generation. When we generate a target square for a piece, and discover this piece is occupied by an opponent's piece, we might want to store the captured piece as part of the move. Unfortunately, figuring out what we are capturing is not exactly trivial, because we have to create a bitmap with the target square bit set, and then AND this with each of the bitmaps for the opponent's pieces until we get a non-zero result. Not very efficient. It would be much better if we had a board[] offset representation as well, where board[square] contains a piece code for the piece that occupies that square. It seems redundant, and it really is, but it turns out to be more efficient to do this, ...
Although piecelists may not be the best for these tasks, it is the best I know so far so enlighten me on how you do it
.