Some new code:
Code: Select all
type
{ Tablebase descriptor record; one per tablebase class }
tbdrtype =
record
tbc: tbctype; { Tablebase class }
osmsigvec: osmsigvectype; { One side material signature vector }
msig: msigtype; { Material signature key; not color reversed }
mancount: Integer; { Man count (total) }
mcvec: array [colorrtype] of Integer; { Man counts indexed by color }
fold: foldtype; { Folding mode }
foldslot: tbslottype; { Slot to be folded }
name: String; { Class name }
fnvec: array [colorrtype] of String { TB filenames indexed by color on the move }
end;
{ Tablebase material signature mapping descriptor record; two per tablebase class }
tbmsmtype =
record
tbc: tbctype; { Tablebase class }
msig: msigtype; { Material signature key; may be color reversed }
isrev: Boolean { Reversed sense flag }
end;
{ Tablebase file }
tbftype = file of ui8type;
tbfptrtype = ^tbftype;
{ Tablebase file record }
tbfrtype =
record
isbroken: Boolean; { True if open failed }
name: String; { File name }
tbfptr: tbfptrtype { Pointer to file }
end;
{ Tablebase file record vector }
tbfrvectype = array [tbctype, colorrtype] of tbfrtype;
tbfrvecptrtype = ^tbfrvectype;
function PosProbeTablebaseSignatureVector(var pos: postype): tbcmsxtype;
var
myresult: tbcmsxtype;
b0, b1, probe: si32type;
begin
myresult := tbcmsnil;
b0 := 0;
b1 := tbcmsmax;
repeat
probe := (b0 + b1) div 2;
if pos.msig = tbmsmvec[probe].msig then
myresult := tbcmstype(probe)
else
if pos.msig < tbmsmvec[probe].msig then
b1 := probe - 1
else
b0 := probe + 1
until (myresult <> tbcmsnil) or (b0 > b1);
PosProbeTablebaseSignatureVector := myresult
end; { PosProbeTablebaseSignatureVector }