Author: Tony Werten
Date: 03:16:25 02/20/03
Go up one level in this thread
On February 20, 2003 at 06:12:05, Tony Werten wrote:
>On February 20, 2003 at 03:16:58, Ed Schröder wrote:
>
>>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;
>
>If all is nice in cache then doing:
>
>if (move_value[x] == 255) {
> movevalue[y]=movevalue[x]
> move[y]=move[x];
> movevalue[x]=255
> return y }
Oops, you'll probably want to save the move in y first. Add a tempvar :)
Tony
>
>will reduce the number of compares.
>
>Tony
>
>> 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 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.