#pragma GCC optimize ("-O3") #include #include "Config.h" #include "Board.h" #include "Move.h" #include "Movegen.h" #include "Types.h" unsigned int pseudo_perft(byte depth) { // only checks pseudolegality // but, it should work overall if(depth == 0) return 1; Serial.print(F("Start a PERFT ")); Serial.print(depth); Serial.println('-'); print(); unsigned int move_count = 0; Movegen gen; Move m; do { m = gen.next_move(); //make(m); move_count += pseudo_perft(depth-1); //unmake(); } while (m.sq_from != 255); return move_count - 1; } void perft_test() { for(byte i = 0; i < 2; i++) { Serial.print(F("Perft ")); Serial.print(i); Serial.print(F(": ")); Serial.println(pseudo_perft(i)); } } void debug_movegen() { Movegen gen = Movegen(); Move m; do { DEBUG("start movegen"); m = gen.next_move(); Serial.print(F("FROM ")); Serial.print(m.sq_from, HEX); Serial.print(F(" TO ")); Serial.print(m.sq_to, HEX); Serial.print(F(" PROMOTE ")); Serial.println(m.pc_prom); if(m.sq_from != 255) { DEBUG("make"); make(m); print(); DEBUG("unmake"); unmake(); DEBUG("unmake done"); } } while (m.sq_from != 255); } void debug_castle() { print(); make({0x06, 0x25, P_EMPTY}); print(); make({0x76, 0x55, P_EMPTY}); print(); make({0x16, 0x26, P_EMPTY}); print(); make({0x63, 0x43, P_EMPTY}); print(); make({0x05, 0x16, P_EMPTY}); print(); make({0x62, 0x42, P_EMPTY}); print(); make({0x04, 0x06, P_EMPTY}); print(); unmake(); print(); unmake(); print(); unmake(); print(); unmake(); print(); unmake(); print(); unmake(); print(); unmake(); print(); } void debug_ep() { print(); make({0x14, 0x34, P_EMPTY}); print(); make({0x64, 0x54, P_EMPTY}); print(); make({0x34, 0x44, P_EMPTY}); print(); make({0x63, 0x43, P_EMPTY}); print(); make({0x44, 0x53, P_EMPTY}); print(); unmake(); print(); unmake(); print(); unmake(); print(); unmake(); print(); unmake(); print(); } void bench() { int startTime = micros(); make({0x14, 0x34, P_EMPTY}); make({0x64, 0x54, P_EMPTY}); make({0x34, 0x44, P_EMPTY}); make({0x63, 0x43, P_EMPTY}); make({0x44, 0x53, P_EMPTY}); unmake(); unmake(); unmake(); unmake(); unmake(); make({0x06, 0x25, P_EMPTY}); make({0x76, 0x55, P_EMPTY}); make({0x16, 0x26, P_EMPTY}); make({0x63, 0x43, P_EMPTY}); make({0x05, 0x16, P_EMPTY}); make({0x62, 0x42, P_EMPTY}); make({0x04, 0x06, P_EMPTY}); unmake(); unmake(); unmake(); unmake(); unmake(); unmake(); unmake(); int elapsed = micros() - startTime; Serial.print(elapsed); Serial.println(F(" microseconds")); } void setup() { // put your setup code here, to run once: board_init(); Serial.begin(115200); bench(); } void loop() { // put your main code here, to run repeatedly: }