%begin; !DD11

!Convert data in files DD11%.RAW into more palatable form

%string(15)%array name(0:255)

%byteintegerarray p('A':'F',1:9,'A':'V',1:2)

%integer group,slot,pin,side, sym,signal

%string(15)signal name

%routine read signal name
  signal name=""
  %cycle
    readsymbol(sym); %exitif sym=' '
    %signal 14,0,nl %if sym=nl
    sym=sym-32 %if 'a'<=sym<='z'
    signal name=signal name.tostring(sym)
  %repeat
  signal=0
  %cycle
    signal=signal+1; %signal 15,0,256 %if signal=256
    %exitif name(signal)=signal name
    %if name(signal)="" %start
      name(signal)=signal name
      name(signal+1)="" %unless signal=255
      %exit
    %finish
  %repeat
%end

%routine read pin name
  readsymbol(group); group=group-32 %if 'a'<=group<='f'
  %signal 15,1,group %unless 'A'<=group<='F'
  sym=nextsymbol
  %if sym='!' %or sym='#' %or sym='*' %start
    readsymbol(slot)
  %finishelsestart
    read(slot)
    %signal 15,2,slot %unless 1<=slot<=9
  %finish
  readsymbol(pin); pin=pin-32 %if 'a'<=pin<='v'
  %signal 15,3,pin %if pin<'A' %or pin>'V' %c
  %or pin='G' %or pin='I' %or pin='O' %or pin='Q'
  read(side)
  %signal 15,4,side %unless side=1 %or side=2
  readsymbol(sym)
%end

%routine store information
  %routine do(%integer slot)
  %byteintegername q
    q==p(group,slot,pin,side)
    q=signal %andreturnif q=0
    printsymbol(group); printsymbol(slot+'0')
    printsymbol(pin);   printsymbol(side+'0'); printstring(": ")
    printstring(name(signal)); printstring(" replaces ")
    printstring(name(q)); newline; q=signal
  %end
  %if 1<=slot<=9 %start
    do(slot)
  %finishelseif slot='#' %start
    do(1); do(9)
  %finishelsestart
    do(1) %unless slot='*'
    do(9) %unless slot='*'
    do(slot) %for slot=2,1,8
  %finish
%end

%routine print slot(%integer slot)
  printstring("
  Slot "); printsymbol(slot+'0'); newline
  %for group='A',1,'F' %cycle
    newline
    %for pin='A',1,'V' %cycle
    %unless pin='I' %or pin='G' %or pin='O' %or pin='Q' %start
      signal name=name(p(group,slot,pin,1))
      printsymbol(group); printsymbol(pin); printstring("1  ")
      printstring(signal name); spaces(20-length(signal name))
      printsymbol(group); printsymbol(pin); printstring("2  ")
      printstring(name(p(group,slot,pin,2))); newline
    %finish
    %repeat
  %repeat
%end

%routine compare(%integer slota,slotb)
%integer a,b,ok
  ok=1
  printstring("Comparing slots "); printsymbol(slota+'0')
  printstring(" and "); printsymbol(slotb+'0'); printsymbol(':')
  %for group='A',1,'F' %cycle
    %for pin='A',1,'V' %cycle
      %for side=1,1,2 %cycle
        a=p(group,slota,pin,side)
        b=p(group,slotb,pin,side)
        %if a#b %start
          newline %unless ok=0; ok=0
          printsymbol(group); printsymbol(slota+'0')
          printsymbol(pin); printsymbol(side+'0'); space
          printstring(name(a)); newline
          printsymbol(group); printsymbol(slotb+'0')
          printsymbol(pin); printsymbol(side+'0'); space
          printstring(name(b)); newline; newline
        %finish
      %repeat
    %repeat
  %repeat
  %if ok#0 %start
    printstring(" identical
")
  %finish
%end

%onevent 9 %start
  selectoutput(1)
  print slot(1); print slot(2); print slot(9)
  selectoutput(2)
  compare(2,slot) %for slot=3,1,8
  compare(1,2); compare(1,9)
  %stop
%finish

selectinput(1); selectoutput(1)
name(0)=" unassigned"
name(1)=""
%for group='A',1,'F' %cycle
  %for slot=1,1,9 %cycle
    %for pin='A',1,'V' %cycle
      p(group,slot,pin,1)=0; p(group,slot,pin,2)=0
    %repeat
  %repeat
%repeat
%cycle
  read signal name
  read pin name %and store information %until sym=nl
%repeat

%endofprogram
