%begin
   %externalintegerfnspec Get %alias "3L_GET_SPACE"(%integer Bytes)
   %externalroutinespec   Put %alias "3L_FREE_SPACE"(%integer Bytes, A)

   %constinteger N = 6
   %integer SIZE
   %integerarray V(1:N)

   %routine Test(%integer Size)
      %owninteger Max=-1, Min=0
      %integer J, A
      %externalintegerspec Hmin, Hmax, Hfree
      %if Size<0 %start
         Printstring("Initialised");  Newline
         Min = Hmin 
         Max = Hmax
         %return
      %finish
      %return %if Hmin = Min %and Hmax=Max %and Hfree = 0
      Newline
      Printstring(" Fail: Size=");  Write(SIZE, 1);  Newline
      Printstring("Hmax=");  Write(Hmax, 8);  Write(Max, 8);  Newline
      Printstring("Hmin=");  Write(Hmin, 8);  Write(Min, 8);  Newline
      Printstring("Free=");  Write(Hfree, 8);  Newline
      Write(V(J), 4) %for J = 1, 1, N
      Newline
      A = Hfree
      %for J = 1, 1, 20 %cycle
         %exit %if A = 0
         Write(A, 8);  Printstring(": ")
         Write(Integer(A), 12)
         Write(Integer(A+4), 12)
         Newline
         A = Integer(A+4)
      %repeat
!      %stop
   %end

   %routine Try(%routine Do)
      %routine Perm(%integer P, Used)
         %integer j, flag
         %for J = 1, 1, N %cycle
            Flag = 1<<J
            %if Flag&Used = 0 %start
               V(P) = J
               %if P = N %start
                  Do
               %else
                  Perm(P+1, Used ! Flag)
               %finish
            %finish
         %repeat
      %end
      Perm(1, 0)
   %end

   %routine Display
      %integer J
      Write(V(J), 4) %for J = 1, 1, N
      Space;  Complete Output
   %end

   %routine OK
      Printstring(" OK");  Newline
   %end

   %routine Do1
      %integerarray A(1:N)
      %integer J
      Display
      A(J) = Get(SIZE)       %for J = 1, 1, N
      Put(SIZE, A(V(J)))     %for J = 1, 1, N
      Test(SIZE)
      OK
   %end

   %routine Do2
      %integerarray A(1:N), B(1:N)
      %integer J
      Display
      B(J) = 0 %for J = 1, 1, N
      A(J) = Get(SIZE) %for J = 1, 1, N
      %for J = 1, 1, N %cycle
         %if J&1 = 0 %start
            Put(SIZE, A(V(J)))
         %else
            B(J) = Get(SIZE)
         %finish
      %repeat
      %for J = 1, 1, N %cycle
         %if J&1 = 0 %start
            B(J) = Get(SIZE)
         %else
            Put(SIZE, A(V(J)))
         %finish
      %repeat
      Put(SIZE, B(V(J))) %for J = 1, 1, N
      Test(SIZE)
      OK
   %end

   %integerfn Random(%integer Max)
      %owninteger Next = 1
      Next = (Next*1103515245 + 12345)&16_7FFFFFFF
      %result = Rem(Next, Max)+1
   %end


   %routine Do Random1
      %integerarray A, As(1:100)
      %integer X, V, J, S, Gets=0, Puts=0
      Printstring("Random test ");  Complete Output
      As(X) = 0 %for X = 1, 1, 100
      %for J = 1, 1, 1000000 %cycle
         V = Random(100)
         %if As(V) = 0 %start
            S = Random(32)
            A(V)  = Get(S)
            As(V) = S
            Gets=Gets+1
         %else
            Put(As(V), A(V))
            As(V) = 0
            Puts=Puts+1
         %finish
      %repeat
      %for J = 1, 1, 100 %cycle
         Put(As(J), A(J)) %if As(J) # 0
      %repeat
      Test(0)
      Write(Gets, 1);  Printstring(" gets")
      Write(Puts, 1);  Printstring(" puts")
      OK
   %end

   Test(-1)
   SIZE = 256;  Try(Do1);  Try(Do2)
   SIZE = 128;  Try(Do1);  Try(Do2)
   SIZE = 64;   Try(Do1);  Try(Do2)
   SIZE = 16;   Try(Do1);  Try(Do2)
   SIZE = 9;    Try(Do1);  Try(Do2)
   SIZE = 8;    Try(Do1);  Try(Do2)
   SIZE = 7;    Try(Do1);  try(Do2)
   SIZE = 4;    Try(Do1);  Try(Do2)
   SIZE = 2;    Try(Do1);  Try(Do2)
   SIZE = 1;    Try(Do1);  Try(Do2)
   SIZE = 0;  Do Random1
%end
