This commit is contained in:
2024-03-19 16:27:38 +01:00
parent d49e1971e1
commit f0fe9454f8
2 changed files with 12 additions and 4 deletions

View File

@ -5,7 +5,8 @@ include_directories(include)
file(GLOB SOURCES "src/chess/*.c")
file(GLOB LIB_SOURCES "lib/chess/*.c")
add_executable(genMoveConsts src/generateCode/moveConsts.c ${LIB_SOURCES})
add_executable(genMoveConsts src/generateCode/moveConsts.c lib/chess/bitboard.c
lib/chess/print.c)
add_custom_command(
OUTPUT moveConsts.h # Output file from code generation
COMMAND genMoveConsts > include/chess/generated/moveConsts.h

View File

@ -25,7 +25,7 @@ static uint_least8_t getDirectionOffset(uint_least8_t field, uint_least8_t direc
return DIRECTION_OFFSET[field * DIRECTION_LENGTH + direction];
}
static uint_least8_t getMagicSize(const struct magic_t magic) {
static size_t getMagicSize(const struct magic_t magic) {
return 1 << (64 - magic.shift);
}
@ -37,15 +37,21 @@ static size_t getTotalMagicSize(const struct magic_t *magic) {
return size;
}
uint_least64_t *overflowPtr;
static void initMagicHelper(uint_least64_t *attackTable, struct magic_t *magic,
const uint_least8_t *direction, const uint_least8_t directionLength) {
for(uint_least8_t field = 0; field < TOTAL_BOARD_SIZE; ++field, ++magic) {
attackTable += getMagicSize(*magic);
magic->attackTable = attackTable;
attackTable += getMagicSize(*magic);
uint_least64_t pieceArangement = 0;
do { // https://stackoverflow.com/questions/7277554/what-is-a-good-way-to-iterate-a-number-through-all-the-possible-values-of-a-mask
const uint_least64_t attackMask = slidingMovementMask(direction, directionLength, field, pieceArangement);
*getMagicAttackPtr(pieceArangement, *magic) = attackMask;
uint_least64_t *ptr = getMagicAttackPtr(pieceArangement, *magic);
if(ptr >= overflowPtr) {
printf("overflow\n");
}
*ptr = attackMask;
pieceArangement = (pieceArangement - magic->mask) & magic->mask;
} while(pieceArangement != 0);
}
@ -55,6 +61,7 @@ void initMagicTable() {
const size_t rookMagicSize = getTotalMagicSize(rookMagic);
const size_t size = rookMagicSize + getTotalMagicSize(bishopMagic);
uint_least64_t *attackTable = malloc(size * sizeof *attackTable);
overflowPtr = attackTable + size;
if(attackTable == NULL) {
perror("failed to allocate memory: ");
exit(1);