internal static void setup_pieces_pawn_dtz(DTZEntry_pawn ptr, byte[] data, ulong[] tb_size, int f) { int i; int j; int order; int order2; j = 1 + (ptr.pawns[1] > 0); order = data[0] & 0x0f; order2 = ptr.pawns[1] != 0 ? (data[1] & 0x0f) : 0x0f; for (i = 0; i < ptr.num; i++) { ptr.file[f].pieces[i] = (byte)(data[i + j] & 0x0f); } GlobalMembersTbcore.set_norm_pawn((TBEntry_pawn)ptr, ptr.file[f].norm, ptr.file[f].pieces); tb_size[0] = GlobalMembersTbcore.calc_factors_pawn(ptr.file[f].factor, ptr.num, order, order2, ptr.file[f].norm, f); }
internal static void free_dtz_entry(TBEntry entry) { GlobalMembersTbcore.unmap_file(ref entry.data, entry.mapping); if (entry.has_pawns == 0) { DTZEntry_piece ptr = (DTZEntry_piece)entry; //C++ TO C# CONVERTER TODO TASK: The memory management function 'free' has no equivalent in C#: free(ptr.precomp); } else { DTZEntry_pawn ptr = (DTZEntry_pawn)entry; int f; for (f = 0; f < 4; f++) { //C++ TO C# CONVERTER TODO TASK: The memory management function 'free' has no equivalent in C#: free(ptr.file[f].precomp); } } //C++ TO C# CONVERTER TODO TASK: The memory management function 'free' has no equivalent in C#: free(entry); }
internal static int init_table_dtz(TBEntry entry) { byte[] data = (byte)entry.data; //C++ TO C# CONVERTER TODO TASK: C# does not have an equivalent for pointers to value types: //ORIGINAL LINE: byte *next; byte next; int f; int s; ulong[] tb_size = new ulong[4]; ulong[] size = new ulong[4 * 3]; if (!data) { return(0); } if (data[0] != DTZ_MAGIC[0] || data[1] != DTZ_MAGIC[1] || data[2] != DTZ_MAGIC[2] || data[3] != DTZ_MAGIC[3]) { Console.Write("Corrupted table.\n"); return(0); } int files = (data[4] & 0x02) != 0 ? 4 : 1; data += 5; if (entry.has_pawns == 0) { DTZEntry_piece ptr = (DTZEntry_piece)entry; GlobalMembersTbcore.setup_pieces_piece_dtz(ptr, data, tb_size[0]); data += ptr.num + 1; data += ((ushort)data) & 0x01; ptr.precomp = GlobalMembersTbcore.setup_pairs(data, tb_size[0], size[0], next, ref (ptr.flags), 0); data = next; ptr.map = data; if ((ptr.flags & 2) != 0) { int i; for (i = 0; i < 4; i++) { ptr.map_idx[i] = (ushort)(data + 1 - ptr.map); data += 1 + data[0]; } data += ((ushort)data) & 0x01; } ptr.precomp.indextable = (string)data; data += size[0]; ptr.precomp.sizetable = (ushort)data; data += size[1]; data = (byte)((((ushort)data) + 0x3f) & ~0x3f); ptr.precomp.data = data; data += size[2]; } else { DTZEntry_pawn ptr = (DTZEntry_pawn)entry; s = 1 + (ptr.pawns[1] > 0); for (f = 0; f < 4; f++) { GlobalMembersTbcore.setup_pieces_pawn_dtz(ptr, data, tb_size[f], f); data += ptr.num + s; } data += ((ushort)data) & 0x01; for (f = 0; f < files; f++) { ptr.file[f].precomp = GlobalMembersTbcore.setup_pairs(data, tb_size[f], size[3 * f], next, ref (ptr.flags[f]), 0); data = next; } ptr.map = data; for (f = 0; f < files; f++) { if ((ptr.flags[f] & 2) != 0) { int i; for (i = 0; i < 4; i++) { ptr.map_idx[f, i] = (ushort)(data + 1 - ptr.map); data += 1 + data[0]; } } } data += ((ushort)data) & 0x01; for (f = 0; f < files; f++) { ptr.file[f].precomp.indextable = (string)data; data += size[3 * f]; } for (f = 0; f < files; f++) { ptr.file[f].precomp.sizetable = (ushort)data; data += size[3 * f + 1]; } for (f = 0; f < files; f++) { data = (byte)((((ushort)data) + 0x3f) & ~0x3f); ptr.file[f].precomp.data = data; data += size[3 * f + 2]; } } return(1); }
internal static int probe_dtz_table(Position pos, int wdl, ref int success) { TBEntry ptr; ulong idx; int i; int res; int[] p = new int[DefineConstants.TBPIECES]; // Obtain the position's material signature key. ulong key = pos.material_key(); if (GlobalMembersTbcore.DTZ_table[0].key1 != key && GlobalMembersTbcore.DTZ_table[0].key2 != key) { for (i = 1; i < DefineConstants.DTZ_ENTRIES; i++) { if (GlobalMembersTbcore.DTZ_table[i].key1 == key) { break; } } if (i < DefineConstants.DTZ_ENTRIES) { DTZTableEntry table_entry = GlobalMembersTbcore.DTZ_table[i]; for (; i > 0; i--) { GlobalMembersTbcore.DTZ_table[i] = GlobalMembersTbcore.DTZ_table[i - 1]; } GlobalMembersTbcore.DTZ_table[0] = table_entry; } else { TBHashEntry[] ptr2 = GlobalMembersTbcore.TB_hash[key >> (64 - DefineConstants.TBHASHBITS)]; for (i = 0; i < DefineConstants.HSHMAX; i++) { if (ptr2[i].key == key) { break; } } if (i == DefineConstants.HSHMAX) { success = 0; return(0); } ptr = ptr2[i].ptr; string str = new string(new char[16]); int mirror = (ptr.key != key); GlobalMembersTbprobe.prt_str(pos, str, mirror); if (GlobalMembersTbcore.DTZ_table[DefineConstants.DTZ_ENTRIES - 1].entry != null) { GlobalMembersTbcore.free_dtz_entry(GlobalMembersTbcore.DTZ_table[DefineConstants.DTZ_ENTRIES - 1].entry); } for (i = DefineConstants.DTZ_ENTRIES - 1; i > 0; i--) { GlobalMembersTbcore.DTZ_table[i] = GlobalMembersTbcore.DTZ_table[i - 1]; } GlobalMembersTbcore.load_dtz_table(ref str, GlobalMembersTbprobe.calc_key(pos, mirror), GlobalMembersTbprobe.calc_key(pos, mirror == 0)); } } ptr = GlobalMembersTbcore.DTZ_table[0].entry; if (ptr == null) { success = 0; return(0); } int bside; int mirror; int cmirror; if (ptr.symmetric == 0) { if (key != ptr.key) { cmirror = 8; mirror = 0x38; bside = (pos.side_to_move() == Color.WHITE); } else { cmirror = mirror = 0; bside = !(pos.side_to_move() == Color.WHITE); } } else { cmirror = (int)pos.side_to_move() == ((int)Color.WHITE) != 0 ? 0 : 8; mirror = (int)pos.side_to_move() == ((int)Color.WHITE) != 0 ? 0 : 0x38; bside = 0; } if (ptr.has_pawns == 0) { DTZEntry_piece entry = (DTZEntry_piece)ptr; if ((entry.flags & 1) != bside && entry.symmetric == 0) { success = -1; return(0); } byte[] pc = entry.pieces; for (i = 0; i < entry.num;) { uint GlobalMembersBitboard.long bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), (PieceType)(pc[i] & 0x07)); do { p[i++] = (int)GlobalMembersBitboard.pop_lsb(ref bb); } while (bb); } idx = GlobalMembersTbcore.encode_piece((TBEntry_piece)entry, entry.norm, p, entry.factor); res = GlobalMembersTbcore.decompress_pairs(entry.precomp, idx); if ((entry.flags & 2) != 0) { res = entry.map[entry.map_idx[GlobalMembersTbcore.wdl_to_map[wdl + 2]] + res]; } if (!(entry.flags & GlobalMembersTbcore.pa_flags[wdl + 2]) || (wdl & 1)) { res *= 2; } } else { DTZEntry_pawn entry = (DTZEntry_pawn)ptr; int k = entry.file[0].pieces[0] ^ cmirror; uint GlobalMembersBitboard.long bb = pos.pieces((Color)(k >> 3), (PieceType)(k & 0x07)); i = 0; do { p[i++] = (int)GlobalMembersBitboard.pop_lsb(ref bb) ^ mirror; } while (bb); int f = GlobalMembersTbcore.pawn_file((TBEntry_pawn)entry, p); if ((entry.flags[f] & 1) != bside) { success = -1; return(0); } byte[] pc = entry.file[f].pieces; for (; i < entry.num;) { bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), (PieceType)(pc[i] & 0x07)); do { p[i++] = (int)GlobalMembersBitboard.pop_lsb(ref bb) ^ mirror; } while (bb); } idx = GlobalMembersTbcore.encode_pawn((TBEntry_pawn)entry, entry.file[f].norm, p, entry.file[f].factor); res = GlobalMembersTbcore.decompress_pairs(entry.file[f].precomp, idx); if ((entry.flags[f] & 2) != 0) { res = entry.map[entry.map_idx[f, GlobalMembersTbcore.wdl_to_map[wdl + 2]] + res]; } if (!(entry.flags[f] & GlobalMembersTbcore.pa_flags[wdl + 2]) || (wdl & 1)) { res *= 2; } } return(res); }