I'm close to having a working program. The move generator and make/unmake move code all work as they should, and the code runs with assertions enabled, so that's so far so good.
However, I seem to have a problem with check detection, so it isn't quite working correctly yet. The move generator is also missing castling at the moment because the castle tests are hard-coded for an 8x8 board. That's easy to fix though, and when I have I should be able to to Fischer Random Chess as well as a side-effect (not that I'm particularly interested in that, but if it's no effort to include I might as well).
Of course, when that's all done, the real fun that is tuning the evaluation function can start.
Speaking of the check detection, this seems to be really slow (even when it doesn't actually work correctly), so I may look for ways to accelerate it. I could just not check and return a flag from the move generator when the child node is searched, but the move generator is actually even more expensive than the in-check test. I may look into incrementally updated attack tables though, which should help. Testing whether they have to be updated in response to a move is easy and should be cheaper than the in-check test is right now, while the in-check test itself becomes very cheap.
Anyway, that's one for the TODO list.