%begin
%string(8)%array ending(0:255)
%integer i
ending(i) = "" %for i = 0,1,255

%const %integer dict size=175616
%byte %array dict(0:dict size-1)

%byte %array new dict(0:200000)
%integer next free

%external %routine %spec  XLoad File (%string (255) file name,
                                     %integer      buffer size,
                                     %integer      address)

%integer each length, tot words

%routine STARTUP
printstring ("Scanning words of length ".itos(each length,0).nl)
  tot words = 0; next free=0
%end

%routine HANDLE(%string(63) word)
%integer i,j
  %return %if each length#LENGTH(word)
  j = next free
  tot words=tot words+1
  %for i = 1,1,each length %cycle
    new dict(next free) = CHARNO(word,i)
    %unless 'a'<=new dict(next free)<='z' %start
      printstring("excluding ".word.nl)
      next free = j
      tot words = tot words-1
      %return
    %finish
    next free = next free+1
  %repeat
  new dict(next free)=NL;next free= next free+1
%end
%external %integerfn %spec Save File (%integer straddr,strlen,
                                     %integer     buffer size,
                                                  address)

%routine INFORM
%string(63) fname="testdir.".itos(each length,0)
%integer i
  %if tot words=0 %then %return
printstring("saving ".fname.nl)
  i = SaveFile(ADDR(fname)+1,length(fname),next free,ADDR(new dict(0)))
%end

%string(255) Curr word, last word
%integer fp, trunc len

%routine Monitor(%string(255) S)
  printstring(itos(fp,0))
  printstring(" (".itos(dict(fp),0)."): ".curr word)  
  printstring(s);newline
%end

%integer %array letter start(0:26)
%integer Next letter
XLoadFile("dfs::3.o.master1", 27*4, ADDR(letter start(0)))

! First, steal dict space to build ending lists
XLoadFile("dfs::3.t.maste                  {Start sentinel}
    dict(i) = '~' %c
      %for i = dict length+step factor,1,dict length+step factor+word length-1
    dict(dict length+step factor+word length)=NL {End sentinel}
    printstring("Duplicating...".nl)
    duplicate(0,dict length+step factor)
    printstring("shuffling...".nl)
    step factor=step factor*2
    dict length=dict length*2
    shuffle dict(0, dict length+step factor)
    printstring("sorting...".nl)
    vsort(step factor, dict length)
    pogle(0,dict length+step factor)
    ! printdict(0, dict length+step factor)
    writeout( %c
     anagram dict dir.itos(word length,0), %c
     ADDR(dict(0)), %c
     dict length+step factor*2)
  %finish
%repeat
%endofprogram
                                                   %begin
%string(8)%array ending(0:255)
%integer i
ending(i) = "" %for i = 0,1,255

%const %integer dict size=175616
%byte %array dict(0:dict size-1)

%byte %array new dict(0:200000)
%integer next free

%external %routine %spec  XLoad File (%string (255) file name,
                                     %integer      buffer size,
                                     %integer      address)

%integer each length, tot words

%routine STARTUP
printstring ("Scanning words of length ".itos(each length,0).nl)
  tot wo.ending(dict(fp))
    HANDLE(last word)
!Monitor("-".ending(dict(fp)))
    fp=fp+1; %if fp=Letter start(next letter) %then -> Next let
  %repeat
  curr word = last word
  ! get length modifier, truncate to length+1
  trunc len = Dict(fp)+1
  %if trunc len xt free)<='z' %start
      printstring("excluding ".word.nl)
      next free = j
      tot words = tot words-1
      %return
    %finish
    next free = next free+1
  %repeat
  new dict(next free)=NL;next free= next free+1
%end
%external %integerfn %spec St
  %else %if 39<=dict(fp)<=90
!    printstring("Code ")
!    write(dict(fp),0)
!    printstring(" ? - truncation to 1 assumed".nl)
    Length(curr word)=1
  %else
    printstring("Code ")
    write(dict(fp),0)
    printstring(" at fp=".itos(fp,0).nl)
    n %return
printstring("saving ".fname.nl)
  i = SaveFile(ADDR(fname)+1,length(fname),next free,