Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Programmer challenge

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.