Author: Ed Schröder
Date: 00:16:58 02/20/03
Taken from my web-page: Contrary to most chess programs, when going one ply deeper in the chess tree REBEL generates all moves for the given (and new) ply. During move generation REBEL quickly evaluates each move generated by using the piece-square technique, this evaluation is only used for move ordering later, it is certainly not for evaluating the position. The advantage of this time consuming process is that it pays off later when move ordering becomes an issue, this provided you have created 12 reasonable organized piece-square tables for the move generator. REBEL's data structure for move generation looks as follows: static char move_from [5000]; static char move_to [5000]; static char move_value [5000]; So when adding a new generated move to "move_from" and "move_to" REBEL also will fill "move_value" via the corresponding piece-square table using the formula: move_value = table[move_to] - table[move_from]; http://members.home.nl/matador/chess840.htm ============== Data structure of "move_value" : 255 : end of move list. 1-254 : move_value = table[move_to] - table[move_from]; 0 : move already searched. Now whenever the Search needs a (new) move a routine is called that gets the (next) highest move from the move list and then this move is marked (zeroed) as being searched. This is a costly operation, during the years this is the best (fastest) code I was able to produce. The question is if there are better (faster) methods to get the highest value from an unsorted table. The main loop: value=1; // work variable x=.... // pointer to move list table y=-1; // pointer to highest value loop: x++; if (move_value[x] <= value) goto loop; if (move_value[x] == 255) return y; value=move_value[x]; y=x; goto loop; -> "y" is the highest move from the table. =================== in ASM I have this: mov BL,1 // work variable mov EDX,... // pointer to move list table mov ESI,-1 // pointer to highest value loop: mov CL,move_value[EDX] // CL = move_value[x] inc EDX // x++ cmp CL,BL // if (move_value[x] <= value) jbe loop cmp CL,0FFh // if (move_value[x]==255) je done mov BL,CL // value=move_value[x] mov ESI,EDX // y=x jmp loop ============== Any faster methods? Ed
This page took 0.01 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.