program eightqueens;
{$A- }
{
    Eight Queens problem - recursive edition
      from Nicklaus Wirth's book:
      Applications + Data Structures = Programs }{

    Modified 03/3013 by Leo C. (rapid)
      to benchmark the AVRCPM System
      - Start timer at program begin
      - Stop timer and print result when finished.

    Modified 11/06/2008 by David Intersimone "David I"
      to work with Turbo Pascal version 1.0:
    1 - added NumberOfIterations and loop to be able to benchmark
      on modern circa 2008 PCs
    2 - added MSDOS calls Int21h with AH=2Ch to get System Time
    3 - commented out the call to 'print' the solutions to remove
      screen output from the benchmark time
}

{ type
  MSDOS_Parameters_Type = record
    AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : Integer;
  end;
}

const
{
  NumberOfIterations = 12000;} {for benchmarking on modern PCs how many times to solve it}
  NumberOfIterations = 2; {this is enogh for AVRCPM}

  TctrPort = $40; {Timer controll port}
  CmdTStart = 1;  {Timer Start/Stop Commands}
  CmdTStop  = 15;

var
  i: Integer;
  a: array[1..8] of boolean;
  b: array[2..16] of boolean;
  c: array[-7..7] of boolean;
  x: array[1..8] of Integer;
  SolutionIterations : Integer;
{
  MSDOSParameters : MSDOS_Parameters_Type;
}

procedure print;
var
  k: Integer;
begin
  for k := 1 to 8 do Write(x[k]:4);
  Writeln;
end;

procedure try(i:Integer);
var
  j: Integer;
begin
  for j := 1 to 8 do
    if a[j] and b[i+j] and c[i-j] then
    begin
      x[i] := j;
      a[j] := false;
      b[i+j] := false;
      c[i-j] := false;
      if i < 8 then
        try(i+1)
{       else
        print} ;
      a[j] := true;
      b[i+j] := true;
      c[i-j] := true;
    end
end {try};

begin
  Write('Eight Queens. Running ',NumberOfIterations,' iterations ...');
{  Writeln;
  Write('Press ENTER to start searching for the 92 solutions...');
  Readln;

  MSDOSParameters.AX := $2C00;
  MsDos(MSDOSParameters);
  Writeln('Start Time: ',Hi(MSDOSParameters.CX),':',Lo(MSDOSParameters.CX),
      ':',Hi(MSDOSParameters.DX),'.',Lo(MSDOSParameters.DX));
}

  Port[TctrPort] := CmdTStart;

  for SolutionIterations := 0 to NumberOfIterations-1 do begin
    for i := 1 to 8 do a[i] := true;
    for i := 2 to 16 do b[i] := true;
    for i := -7 to 7 do c[i] := true;
{ writeln('----------------- ', SolutionIterations, ' --------------------');
}    try(1)
  end;
{
  MSDOSParameters.AX := $2C00;
  MsDos(MSDOSParameters);
  Writeln('End Time: ',Hi(MSDOSParameters.CX),':',Lo(MSDOSParameters.CX),
      ':',Hi(MSDOSParameters.DX),'.',Lo(MSDOSParameters.DX));
}
  Port[TctrPort] := CmdTStop;
{  Readln;
}
end.
