Code: Select all
.text:0040BCA0 start_search proc near ; CODE XREF:
start_go+35F p
.text:0040BCA0
.text:0040BCA0 var_44C = dword ptr -44Ch
.text:0040BCA0 var_440 = dword ptr -440h
.text:0040BCA0 undo = dword ptr -40h
.text:0040BCA0 var_8 = dword ptr -8
.text:0040BCA0 num_moves = dword ptr -4
.text:0040BCA0
.text:0040BCA0 push ebp
.text:0040BCA1 mov ebp, esp
.text:0040BCA3 sub esp, 440h
.text:0040BCA9 push ebx
.text:0040BCAA push esi
.text:0040BCAB push edi
.text:0040BCAC push offset dword_669C60
.text:0040BCB1 mov dword_667A0C, -500
.text:0040BCBB mov dword_667A10, 500
.text:0040BCC5 call evaluate
.text:0040BCCA add esp, 4
.text:0040BCCD test al, al
.text:0040BCCF jz short loc_40BD25
.text:0040BCD1 mov ecx, dword_669C6C
.text:0040BCD7 mov eax, dword_669C68
.text:0040BCDC not ecx
.text:0040BCDE push ecx
.text:0040BCDF not eax
.text:0040BCE1 push eax
.text:0040BCE2 push offset list_root
.text:0040BCE7 call gen_evasions
.text:0040BCEC mov ecx, list_root
.text:0040BCF2 add esp, 12
.text:0040BCF5 xor eax, eax
.text:0040BCF7 test ecx, ecx
.text:0040BCF9 jz short loc_40BD15
.text:0040BCFB jmp short loc_40BD00
.text:0040BCFB ;
---------------------------------------------------------------------------
.text:0040BCFD align 10h
.text:0040BD00
.text:0040BD00 loc_40BD00: ; CODE XREF:
start_search+5B j
.text:0040BD00 ; start_search+73 j
.text:0040BD00 mov list_root[eax*4], ecx
.text:0040BD07 mov ecx, dword_66BC78[eax*8]
.text:0040BD0E add eax, 1
.text:0040BD11 test ecx, ecx
.text:0040BD13 jnz short loc_40BD00
.text:0040BD15
.text:0040BD15 loc_40BD15: ; CODE XREF:
start_search+59 j
.text:0040BD15 mov list_root[eax*4], 0
.text:0040BD20 jmp loc_40BDC2
.text:0040BD25 ;
---------------------------------------------------------------------------
.text:0040BD25
.text:0040BD25 loc_40BD25: ; CODE XREF:
start_search+2F j
.text:0040BD25 mov edx, dword_667B9C
.text:0040BD2B mov eax, dword_667B98
.text:0040BD30 mov ecx, dword_667B94
.text:0040BD36 push edx
.text:0040BD37 mov edx, dword_667B90
.text:0040BD3D push eax
.text:0040BD3E push ecx
.text:0040BD3F push edx
.text:0040BD40 push offset dword_66C070
.text:0040BD45 mov eax, offset list_root
.text:0040BD4A call gen_captures
.text:0040BD4F xor esi, esi
.text:0040BD51 add esp, 20
.text:0040BD54 cmp list_root, esi
.text:0040BD5A jz short loc_40BD6D
.text:0040BD5C lea esp, [esp+0]
.text:0040BD60
.text:0040BD60 loc_40BD60: ; CODE XREF:
start_search+CB j
.text:0040BD60 add esi, 1
.text:0040BD63 cmp list_root[esi*4], 0
.text:0040BD6B jnz short loc_40BD60
.text:0040BD6D
.text:0040BD6D loc_40BD6D: ; CODE XREF:
start_search+BA j
.text:0040BD6D mov eax, dword_669C6C
.text:0040BD72 mov ecx, dword_669C68
.text:0040BD78 push -1
.text:0040BD7A push -1
.text:0040BD7C push -1
.text:0040BD7E push eax
.text:0040BD7F push ecx
.text:0040BD80 lea edx, [ebp+var_440]
.text:0040BD86 push edx
.text:0040BD87 call gen_quiet_moves
.text:0040BD8C mov eax, [ebp+var_440]
.text:0040BD92 add esp, 24
.text:0040BD95 xor ecx, ecx
.text:0040BD97 test eax, eax
.text:0040BD99 jz short loc_40BDB5
.text:0040BD9B lea edx, ds:66BC70h[esi*4]
.text:0040BDA2
.text:0040BDA2 loc_40BDA2: ; CODE XREF:
start_search+113 j
.text:0040BDA2 add ecx, 1
.text:0040BDA5 mov [edx], eax
.text:0040BDA7 mov eax, [ebp+ecx*4+var_440]
.text:0040BDAE add edx, 4
.text:0040BDB1 test eax, eax
.text:0040BDB3 jnz short loc_40BDA2
.text:0040BDB5
.text:0040BDB5 loc_40BDB5: ; CODE XREF:
start_search+F9 j
.text:0040BDB5 add ecx, esi
.text:0040BDB7 mov list_root[ecx*4], 0
.text:0040BDC2
.text:0040BDC2 loc_40BDC2: ; CODE XREF:
start_search+80 j
.text:0040BDC2 mov esi, list_root
.text:0040BDC8 xor edi, edi
.text:0040BDCA test esi, esi
.text:0040BDCC mov [ebp+num_moves], edi
.text:0040BDCF jz short loc_40BE4C
.text:0040BDD1 mov [ebp+num_moves], offset list_root
.text:0040BDD8
.text:0040BDD8 loc_40BDD8: ; CODE XREF:
start_search+1A7 j
.text:0040BDD8 lea eax, [ebp+undo]
.text:0040BDDB push eax
.text:0040BDDC push esi
.text:0040BDDD call make_move
.text:0040BDE2 push offset pos_info_entry
.text:0040BDE7 call evaluate
.text:0040BDEC mov ecx, dword_667C20
.text:0040BDF2 lea edx, ds:0[ecx*8]
.text:0040BDF9 mov ecx, offset dword_667BF8
.text:0040BDFE sub ecx, edx
.text:0040BE00 mov eax, [ecx]
.text:0040BE02 mov ecx, [ecx+4]
.text:0040BE05 and eax, pos_info_entry
.text:0040BE0B and ecx, dword_669C84
.text:0040BE11 add esp, 0Ch
.text:0040BE14 or eax, ecx
.text:0040BE16 jnz short loc_40BE1C
.text:0040BE18 mov bl, 1
.text:0040BE1A jmp short loc_40BE1E
.text:0040BE1C ;
---------------------------------------------------------------------------
.text:0040BE1C
.text:0040BE1C loc_40BE1C: ; CODE XREF:
start_search+176 j
.text:0040BE1C xor bl, bl
.text:0040BE1E
.text:0040BE1E loc_40BE1E: ; CODE XREF:
start_search+17A j
.text:0040BE1E lea eax, [ebp+undo]
.text:0040BE21 push eax
.text:0040BE22 push esi
.text:0040BE23 call unmake_move
.text:0040BE28 add esp, 8
.text:0040BE2B test bl, bl
.text:0040BE2D jz short loc_40BE39
.text:0040BE2F mov list_root[edi*4], esi
.text:0040BE36 add edi, 1 ; num_moves++
.text:0040BE39
.text:0040BE39 loc_40BE39: ; CODE XREF:
start_search+18D j
.text:0040BE39 mov eax, [ebp+num_moves]
.text:0040BE3C mov esi, [eax+4]
.text:0040BE3F add eax, 4 ; i++
.text:0040BE42 test esi, esi ; list_root[i].move!=0
.text:0040BE44 mov [ebp+num_moves], eax
.text:0040BE47 jnz short loc_40BDD8
.text:0040BE49 mov [ebp+num_moves], edi
.text:0040BE4C
.text:0040BE4C loc_40BE4C: ; CODE XREF:
start_search+12F j
.text:0040BE4C xor esi, esi
.text:0040BE4E cmp edi, 1 ; if (num_moves <= 1)
.text:0040BE51 mov list_root[edi*4], esi ;
list_root[num_moves].move = 0
.text:0040BE58 ja short loc_40BE64
.text:0040BE5A mov G_max_depth, 4 ; max_depth = 4;
.text:0040BE64
.text:0040BE64 loc_40BE64: ; CODE XREF:
start_search+1B8 j
.text:0040BE64 push esi
.text:0040BE65 push offset dword_667A28
.text:0040BE6A call setjmp
.text:0040BE6F add esp, 8
.text:0040BE72 test eax, eax ; if
(setjmp(jmp_buffer) != 0) return;
.text:0040BE74 jz short loc_40BE87
.text:0040BE76 mov eax, offset byte_664E08
.text:0040BE7B call sub_4092E0
.text:0040BE80 pop edi
.text:0040BE81 pop esi
.text:0040BE82 pop ebx
.text:0040BE83 mov esp, ebp
.text:0040BE85 pop ebp
.text:0040BE86 retn
.text:0040BE87 ;
---------------------------------------------------------------------------
.text:0040BE87
.text:0040BE87 loc_40BE87: ; CODE XREF:
start_search+1D4 j
.text:0040BE87 call ds:GetTickCount ; start_timer
.text:0040BE8D mov start_time, eax
.text:0040BE92 mov eax, dword_66C490
.text:0040BE97 add eax, 1 ; All of this
stuff is trans_inc_date
.text:0040BE9A and eax, 3
.text:0040BE9D mov ecx, eax
.text:0040BE9F cmp ecx, esi
.text:0040BEA1 mov dword_66C490, eax
.text:0040BEA6 jge short loc_40BEAB
.text:0040BEA8 add ecx, 4
.text:0040BEAB
.text:0040BEAB loc_40BEAB: ; CODE XREF:
start_search+206 j
.text:0040BEAB add ecx, 1
.text:0040BEAE shl ecx, 8
.text:0040BEB1 mov dword_66C498, ecx
.text:0040BEB7 lea ecx, [eax-1]
.text:0040BEBA cmp ecx, esi
.text:0040BEBC jge short loc_40BEC1
.text:0040BEBE add ecx, 4
.text:0040BEC1
.text:0040BEC1 loc_40BEC1: ; CODE XREF:
start_search+21C j
.text:0040BEC1 add ecx, 1
.text:0040BEC4 shl ecx, 8
.text:0040BEC7 mov dword_66C49C, ecx
.text:0040BECD lea ecx, [eax-2]
.text:0040BED0 cmp ecx, esi
.text:0040BED2 jge short loc_40BED7
.text:0040BED4 add ecx, 4
.text:0040BED7
.text:0040BED7 loc_40BED7: ; CODE XREF:
start_search+232 j
.text:0040BED7 add ecx, 1
.text:0040BEDA shl ecx, 8
.text:0040BEDD add eax, -3
.text:0040BEE0 cmp eax, esi
.text:0040BEE2 mov dword_66C4A0, ecx
.text:0040BEE8 jge short loc_40BEED
.text:0040BEEA add eax, 4
.text:0040BEED
.text:0040BEED loc_40BEED: ; CODE XREF:
start_search+248 j
.text:0040BEED add eax, 1
.text:0040BEF0 shl eax, 8
.text:0040BEF3 mov dword_66C4A4, eax
.text:0040BEF8 xor eax, eax
.text:0040BEFA lea ebx, [ebx+0]
.text:0040BF00
.text:0040BF00 loc_40BF00: ; CODE XREF:
start_search+274 j
.text:0040BF00 mov killer1[eax], esi ; (Pos_info + i)->killer1 = 0;
.text:0040BF06 mov killer2[eax], esi ; (Pos_info + i)->killer2 = 0;
.text:0040BF0C add eax, 32
.text:0040BF0F cmp eax, 8192
.text:0040BF14 jb short loc_40BF00
.text:0040BF16 mov eax, 256
.text:0040BF1B mov ecx, 768
.text:0040BF20 mov edi, offset History
.text:0040BF25 rep stosd ;
memset(History, 256, 12 * 64 * sizeof(int));
.text:0040BF27 mov eax, dword_667C40
.text:0040BF2C and eax, dword_66C488
.text:0040BF32 mov ecx, dword_667C44
.text:0040BF38 shl eax, 4
.text:0040BF3B add eax, dword_66C480
.text:0040BF41 cmp [eax], ecx
.text:0040BF43 jnz short loc_40BF4F
.text:0040BF45 movzx edx, word ptr [eax+4]
.text:0040BF49 mov dword_66C478, edx
.text:0040BF4F
.text:0040BF4F loc_40BF4F: ; CODE XREF:
start_search+2A3 j
.text:0040BF4F cmp [eax+10h], ecx
.text:0040BF52 jnz short loc_40BF5E
.text:0040BF54 movzx edx, word ptr [eax+14h]
.text:0040BF58 mov dword_66C478, edx
.text:0040BF5E
.text:0040BF5E loc_40BF5E: ; CODE XREF:
start_search+2B2 j
.text:0040BF5E cmp [eax+20h], ecx
.text:0040BF61 jnz short loc_40BF6D
.text:0040BF63 movzx edx, word ptr [eax+24h]
.text:0040BF67 mov dword_66C478, edx
.text:0040BF6D
.text:0040BF6D loc_40BF6D: ; CODE XREF:
start_search+2C1 j
.text:0040BF6D cmp [eax+30h], ecx
.text:0040BF70 jnz short loc_40BF7B
.text:0040BF72 movzx eax, word ptr [eax+34h]
.text:0040BF76 mov dword_66C478, eax
.text:0040BF7B
.text:0040BF7B loc_40BF7B: ; CODE XREF:
start_search+2D0 j
.text:0040BF7B mov eax, [ebp+num_moves]
.text:0040BF7E cmp eax, 2
.text:0040BF81 jb loc_40C039
.text:0040BF87 add eax, -1
.text:0040BF8A mov [ebp+var_8], eax
.text:0040BF8D js loc_40C039
.text:0040BF93
.text:0040BF93 loc_40BF93: ; CODE XREF:
start_search+393 j
.text:0040BF93 lea ebx, ds:0[eax*4]
.text:0040BF9A mov edi, list_root[ebx]
.text:0040BFA0 cmp edi, dword_66C478
.text:0040BFA6 lea edx, dword_66C074[ebx]
.text:0040BFAC jnz short loc_40BFB5
.text:0040BFAE mov ecx, 7FFFFFFFh
.text:0040BFB3 jmp short loc_40BFE1
.text:0040BFB5 ;
---------------------------------------------------------------------------
.text:0040BFB5
.text:0040BFB5 loc_40BFB5: ; CODE XREF:
start_search+30C j
.text:0040BFB5 mov ecx, edi
.text:0040BFB7 and ecx, 63
.text:0040BFBA mov ecx, dword_667A90[ecx*4]
.text:0040BFC1 test ecx, ecx
.text:0040BFC3 jz short loc_40BFDF
.text:0040BFC5 mov esi, edi
.text:0040BFC7 shr esi, 6
.text:0040BFCA and esi, 63
.text:0040BFCD shl ecx, 4
.text:0040BFD0 sub ecx, dword_667A90[esi*4]
.text:0040BFD7 add ecx, 2147483391
.text:0040BFDD jmp short loc_40BFE1
.text:0040BFDF ;
---------------------------------------------------------------------------
.text:0040BFDF
.text:0040BFDF loc_40BFDF: ; CODE XREF:
start_search+323 j
.text:0040BFDF xor ecx, ecx
.text:0040BFE1
.text:0040BFE1 loc_40BFE1: ; CODE XREF:
start_search+313 j
.text:0040BFE1 ; start_search+33D j
.text:0040BFE1 cmp ecx, [edx]
.text:0040BFE3 mov esi, eax
.text:0040BFE5 jnb short loc_40C01F
.text:0040BFE7 mov eax, ebx
.text:0040BFE9 lea esp, [esp+0]
.text:0040BFF0
.text:0040BFF0 loc_40BFF0: ; CODE XREF:
start_search+37A j
.text:0040BFF0 mov ebx, dword_66BC74[eax]
.text:0040BFF6 mov edx, [edx]
.text:0040BFF8 mov list_root[eax], ebx
.text:0040BFFE mov dword_66C070[eax], edx
.text:0040C004 add esi, 1
.text:0040C007 lea eax, ds:0[esi*4]
.text:0040C00E cmp ecx, dword_66C074[eax]
.text:0040C014 lea edx, dword_66C074[eax]
.text:0040C01A jb short loc_40BFF0
.text:0040C01C mov eax, [ebp+var_8]
.text:0040C01F
.text:0040C01F loc_40C01F: ; CODE XREF:
start_search+345 j
.text:0040C01F sub eax, 1
.text:0040C022 mov list_root[esi*4], edi
.text:0040C029 mov dword_66C070[esi*4], ecx
.text:0040C030 mov [ebp+var_8], eax
.text:0040C033 jns loc_40BF93
.text:0040C039
.text:0040C039 loc_40C039: ; CODE XREF:
start_search+2E1 j
.text:0040C039 ; start_search+2ED j
--Setjmp is called after the move generation, as in Fruit
--Something very strange: whereas in Strelka a failed setjmp call simply results in a return, in Rybka 1.0 it involves a function call, like in Fruit (there it is search_update_current()). The weird part is, it appears to be calling parse_position(). That is what the "call sub_4092E0" is for. Why would Rybka 1.0 be parsing the position after a setjmp call?
--The timer is started after the setjmp call
--depth is limited to 4 when there's only 1 legal move (commented out in Strelka, as noted in the other thread).
--I noted earlier that the history initialization was different. Strelka and Rybka 1.0 are the same here, using memset(History, 256, 12 * 64 * sizeof(int)); But what I didn't notice is, 256 is out of range for an unsigned char. So that code is the same as Fruit's memset(History, 0, 12 * 64 * sizeof(int)); Why would Rybka 1.0 have 256? Is it the optimizer gone wild, or a deliberate attempt at obfuscation?