home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / passmsrc / passm.pas < prev    next >
Pascal/Delphi Source File  |  1989-02-04  |  47KB  |  1,375 lines

  1. {***************************************************************************}
  2. {* This program is a general purpose PAL assembler. You may copy and use   *}
  3. {* it for personal purposes. No commercial use of this program is allowed  *}
  4. {* without the consent of the author.                                      *}
  5. {* THIS IS THE Atari ST Version                                            *}
  6. {* (c) Copyright 1987,1988 by Erasmo Brenes.                               *}
  7. {***************************************************************************}
  8. program passm (input,output,source,simfile);
  9.  const
  10.   linewidth = 40;
  11.   blank = ' ';  semicol = ';';  comment = '"';
  12.   maxterms = 19;        maxinputs = 22;
  13.   maxpins = 24;         npals   = 23;
  14.   maxcols = 44;         maxouts = 10;
  15.  
  16.  type
  17.   symbol =( ident, int, num, eql, quotes, semicolon, apostrophe,
  18.             leftbrkt, rightbrkt, device, pin, equations,module,flag,
  19.             lftparen,rgtparen,title,node,stype,macro,andoperator,
  20.             oroperator,invert,colon,ends,enable,preset,clear);
  21.   palsymb = ( p10l8,p12l6,p14l4,p16l2,p16l8,p16rx,p12l10,p14l8,p16l6,
  22.               p18l4,p20l2,p20l10,p20l8,p20rx,p22vx);
  23.   tkens = packed array [1..15] of char;
  24.   kind  = (reg, nonreg, bidir, tristate);
  25.   palsize = (input18, input22);
  26.   logic = (high, low);
  27.   trans1typ =
  28.    record
  29.         transfer : array[1..maxpins] of integer
  30.    end;
  31.   outtype =
  32.    record
  33.         outnumb : integer;
  34.         outname : tkens;
  35.         outkind : kind;
  36.         size    : palsize;
  37.         form    : logic;
  38.         matrix  : array [1..maxterms,1..maxcols] of char
  39.    end;
  40.   entrytype =
  41.    record
  42.         name : tkens;
  43.         pinn : integer
  44.    end;
  45.   string2 = packed array [1..4] of char;
  46.   filnam = packed array [1..80] of char;
  47.   ptermtyp = array [1..maxcols] of char;
  48.  
  49.  var
  50.   source,simfile : text;
  51.   token  : tkens;
  52.   palknds : array [1..npals] of char;
  53.   pals    : array [1..npals] of tkens;
  54.   symtable: array [1..maxpins] of entrytype;
  55.   outtable: array [1..11] of outtype;
  56.   palkind : palsymb;
  57.   fusetoinp,fusetopin : array [palsymb] of trans1typ;
  58.   paltyp  : array [1..npals] of palsymb;
  59.   filspc : string[80];
  60.   sym : symbol;
  61.   reserved : array [1..13] of tkens;
  62.   pdevice : tkens;
  63.   wsym : array [1..13] of symbol;
  64.   ptype,ch,tab : char;
  65.   nexout,outindex : integer;
  66.   nexin : integer;
  67.   value,i,j,pointer,iterm,totalterms : integer;
  68.   Abort,empty,pal16,found : boolean;
  69.   ar, sp : ptermtyp;
  70.  
  71.  procedure bgetchar (var ch:char);
  72.   begin
  73.    empty := false;
  74.    if eof(source)
  75.     then begin
  76.           empty := true;
  77.           ch := blank
  78.          end
  79.     else begin
  80.           if eoln(source)
  81.            then begin
  82.                  readln (source);
  83.                  ch := blank
  84.                 end
  85.            else
  86.           if eof(source)
  87.            then begin
  88.                  empty := true;
  89.                  ch := blank
  90.                 end
  91.            else begin
  92.                  read (source,ch);
  93.                  if ch = comment
  94.                   then begin
  95.                         repeat
  96.                         readln (source);
  97.                         if eof(source)
  98.                          then begin
  99.                                 empty := true;  ch := blank
  100.                               end
  101.                          else read (source,ch)
  102.                         until (ch <> comment) or (eof(source))
  103.                        end
  104.                 end
  105.          end
  106.   end; {bgetchar}
  107.  
  108.  procedure numbr;
  109. {this routine always leaves with ch containing the next character!}
  110.   var
  111.    j : integer;
  112.   begin
  113.    sym := int;
  114.    value := 0;  j:= 0;
  115.    repeat
  116.     value := 10*value + (ord(ch) - ord('0'));
  117.     bgetchar (ch);       j:= j + 1
  118.    until not(ch in ['0'..'9'])
  119.   end; {numbr}
  120.  
  121.  procedure gettoken;
  122.   var
  123.    i,j,k : integer;
  124.   begin
  125.    i:= 0;
  126.    while ((ch=blank)or(ch=tab))and(not empty) do bgetchar(ch);
  127.    if (ch in ['A'..'Z'])or(ch in['a'..'z'])or(ch = '-')
  128.     then begin
  129.           repeat
  130.            i:= i + 1;
  131.            token [i]:= ch;      bgetchar(ch)
  132.           until not((ch in ['A'..'Z'])or(ch in['a'..'z'])or(ch in ['0'..'9'])
  133.            or (ch='_')) or empty or (i = 15);
  134.           if not empty
  135.            then begin
  136.                  if (i < 15) then repeat
  137.                                    i:= i + 1; token[i]:= blank
  138.                                   until (i=15);
  139.                  k := 0;
  140.                  for j:=1 to 13 do
  141.                   if token = reserved[j]
  142.                    then k := j;
  143.                  if k = 0
  144.                   then sym := ident
  145.                   else sym := wsym [k]
  146.                 end
  147.          end
  148.     else begin
  149.           if (ch in ['0'..'9'])
  150.            then numbr
  151.            else case ch of
  152.                  '^':  begin
  153.                         sym := num;
  154.                         bgetchar (ch)
  155.                        end;
  156.                  '=':  begin
  157.                         sym := eql;
  158.                         bgetchar (ch)
  159.                        end;
  160.                  ';':  begin
  161.                         sym := semicolon;
  162.                         bgetchar (ch)
  163.                        end;
  164.                  '''': begin
  165.                         sym := apostrophe;
  166.                         bgetchar (ch)
  167.                        end;
  168.                  '`':  begin
  169.                         sym := apostrophe;
  170.                         bgetchar (ch)
  171.                        end;
  172.                  '"':  begin
  173.                         sym := quotes;
  174.                         bgetchar (ch)
  175.                        end;
  176.                  '[':  begin
  177.                         sym := leftbrkt;
  178.                         bgetchar (ch)
  179.                        end;
  180.                  ']':  begin
  181.                         sym := rightbrkt;
  182.                         bgetchar (ch)
  183.                        end;
  184.                  '(':  begin
  185.                         sym := lftparen;
  186.                         bgetchar (ch)
  187.                        end;
  188.                  ')':  begin
  189.                         sym := rgtparen;
  190.                         bgetchar (ch)
  191.                        end;
  192.                  '!':  begin
  193.                         sym := invert;
  194.                         bgetchar (ch)
  195.                        end;
  196.                  '&':  begin
  197.                         sym := andoperator;
  198.                         bgetchar (ch)
  199.                        end;
  200.                  '#':  begin
  201.                         sym := oroperator;
  202.                         bgetchar (ch)
  203.                        end;
  204.                  ':':  begin
  205.                         sym := colon;
  206.                         bgetchar (ch)
  207.                        end;
  208.                  otherwise:
  209.                     begin
  210.                      bgetchar (ch);
  211.                      gettoken { get next token }
  212.                     end
  213.                 end
  214.          end
  215.   end; {gettoken}
  216.  
  217.  procedure semimodule;
  218.   begin
  219.    gettoken;
  220.    while sym = semicolon
  221.     do gettoken;
  222.   end;
  223.  
  224.  procedure search ( kind : integer);
  225.   var
  226.    i,j : integer;
  227.   begin
  228.    case kind of
  229.     1:   begin
  230.           pointer := 0;
  231.           for i:=1 to npals do
  232.            if token = pals[i]
  233.             then pointer := i
  234.          end;
  235.     2:  begin
  236.          j := pointer;
  237.          pointer := 0;
  238.          for i:=1 to 24 do
  239.           with symtable[i] do
  240.            if pinn = j
  241.             then pointer := i
  242.         end;
  243.     3:  begin      { search a signal name for its corresponding pin }
  244.          pointer := 0;  found := false;
  245.          for i:= 1 to maxpins do
  246.           with symtable[i] do
  247.            if token = name
  248.             then begin
  249.                   pointer := pinn; found := true
  250.                  end
  251.         end;
  252.     otherwise:
  253.         writeln ('!!! software error in search procedure')
  254.    end
  255.   end; {search}
  256.  
  257.  procedure start;
  258.   var
  259.    first : integer;
  260.   begin
  261.    while not(sym = equations) and (not Abort) and not(eof(source))do
  262.     begin
  263.      first := nexin + 1;
  264.      if sym = ident
  265.       then begin
  266.             nexin := nexin + 1;
  267.             symtable[nexin].name := token;
  268.             gettoken;
  269.             while sym = ident do
  270.              begin      { get list of identifiers }
  271.               nexin := nexin + 1;
  272.               symtable[nexin].name := token;
  273.               gettoken
  274.              end;
  275.             case sym of
  276.              device: begin
  277.                       nexin := first - 1;  {ignore all previous identifiers}
  278.                       gettoken;
  279.                       if sym = apostrophe
  280.                        then begin
  281.                              gettoken;
  282.                              search (1);
  283.                              if pointer = 0
  284.                               then begin
  285.                                     writeln ('** not a valid part ',token);
  286.                                     Abort := true
  287.                                    end
  288.                               else begin
  289.                                     pdevice := token;
  290.                                     ptype := palknds[pointer];
  291.                                     palkind := paltyp [pointer];
  292.                                     gettoken;
  293.                                     if sym = apostrophe
  294.                                      then gettoken;
  295.                                     if sym = semicolon
  296.                                      then gettoken
  297.                                      else Abort := true {screw the idiot***}
  298.                                    end
  299.                             end
  300.                      end;
  301.              pin:    begin
  302.                       gettoken; { it must be a pin number }
  303.                       while not(sym = int) do gettoken;
  304.                       repeat
  305.                        symtable[first].pinn := value;
  306.                        first := first + 1;
  307.                        gettoken
  308.                       until first > nexin;
  309.                       if sym = semicolon
  310.                        then gettoken
  311.                        else Abort := true       {screw the idiot ***}
  312.                      end;
  313.              otherwise:
  314.                      begin
  315.                       nexin := first - 1;
  316.                       while not (sym = semicolon)
  317.                         do gettoken;
  318.                       gettoken
  319.                      end
  320.             end
  321.            end
  322.     end
  323.   end;   {start}
  324.  
  325.  procedure titlemodule;
  326.   begin
  327.    gettoken;
  328.    if sym = apostrophe
  329.     then begin
  330.           repeat
  331.            gettoken
  332.           until sym = apostrophe;
  333.           gettoken;
  334.           if sym = semicolon
  335.            then begin
  336.                  semimodule;
  337.                  start
  338.                 end
  339.            else start
  340.          end
  341.     else begin
  342.           writeln ('** illegal construct for the title section');
  343.           Abort := true
  344.          end
  345.   end;  {titlemodule}
  346.  
  347.  procedure flagmodule;
  348.   begin
  349.    gettoken;
  350.    if sym = apostrophe
  351.     then begin
  352.           repeat
  353.            gettoken
  354.           until sym = apostrophe;
  355.           gettoken;
  356.           case sym of
  357.            title : titlemodule;
  358.            semicolon: begin
  359.                         semimodule;
  360.                         if sym = title
  361.                          then titlemodule
  362.                          else start
  363.                       end;
  364.            otherwise:
  365.                 start
  366.           end
  367.          end
  368.     else begin
  369.           writeln ('** illegal construct for the flag section');
  370.           Abort := true
  371.          end
  372.   end;  {flagmodule}
  373.  
  374.  procedure arguments;
  375.   begin
  376.    gettoken;
  377.    case sym of
  378.     ident : begin
  379.              gettoken;
  380.              while not(sym = rgtparen)
  381.               do gettoken;
  382.              gettoken;
  383.              case sym of
  384.               flag : flagmodule;
  385.               title: titlemodule;
  386.               semicolon: begin
  387.                           semimodule;
  388.                           if sym = flag
  389.                            then flagmodule
  390.                            else if sym = title
  391.                                  then titlemodule
  392.                                  else start
  393.                          end;
  394.               otherwise:
  395.                 begin
  396.                  writeln ('** illegal path after module arguments');
  397.                  Abort := true
  398.                 end
  399.              end
  400.             end;
  401.     rgtparen: begin
  402.                 gettoken;
  403.                 case sym of
  404.                  flag : flagmodule;
  405.                  title: titlemodule;
  406.                  semicolon: begin
  407.                              semimodule;
  408.                              if sym = flag
  409.                               then flagmodule
  410.                               else if sym = title
  411.                                     then titlemodule
  412.                                     else start
  413.                             end;
  414.                  otherwise:
  415.                         start
  416.                 end
  417.               end;
  418.     otherwise:
  419.         begin
  420.          writeln ('** missing right parenthesis in dummy argument list');
  421.          Abort := true
  422.         end
  423.    end
  424.   end;   {arguments}
  425.  
  426.  procedure getnames;
  427.   begin
  428.    gettoken;
  429.    while not((sym = module))and (not empty)
  430.     do gettoken;
  431.    gettoken;
  432.    if sym = ident
  433.     then begin
  434.           gettoken;
  435.           case sym of
  436.            lftparen :   arguments;
  437.            flag:        flagmodule;
  438.            title:       titlemodule;
  439.            semicolon:   begin
  440.                          semimodule;
  441.                          case sym of
  442.                           flag : flagmodule;
  443.                           title: titlemodule;
  444.                           otherwise:
  445.                             start
  446.                          end
  447.                         end;
  448.            otherwise:
  449.              start
  450.           end
  451.          end
  452.     else begin
  453.           Abort := true;
  454.           writeln ('** missing module name')
  455.          end
  456.   end; {getnames}
  457.  
  458.  procedure error (errnmbr : integer);
  459.   begin
  460.    case errnmbr of
  461.     1 : begin
  462.          writeln ('Signal name undefined: ',token)
  463.         end;
  464.     2 : begin
  465.          writeln ('error in andoperator!')
  466.         end;
  467.     3 : begin
  468.          writeln ('Expecting a signal name');
  469.          writeln ('Undetermined token ',token)
  470.         end;
  471.     4 : begin
  472.          writeln ('Expecting a "=" operator');
  473.          writeln ('Got instead ',token)
  474.         end;
  475.     5 : begin
  476.          writeln ('Expecting either a ":" or "=" operator');
  477.          writeln ('Instead it got ',token)
  478.         end;
  479.     6 : begin
  480.          writeln ('Expecting a boolean equation');
  481.          writeln ('Unexpected token ',token)
  482.         end;
  483.     7 : begin
  484.          writeln ('Exceeded total or-terms');
  485.          writeln ('Output =',outtable[nexout].outname);
  486.         end;
  487.     8 : begin
  488.          writeln (token,' not a valid input or feedback factor')
  489.         end;
  490.     9 : begin
  491.          writeln ('Expecting ";" at end of equation')
  492.         end;
  493.    10 : begin
  494.          writeln ('This device is not capable of this function')
  495.         end;
  496.    11 : begin
  497.          writeln ('This device is not capable of true-form output ',token)
  498.         end;
  499.    12 : begin
  500.          writeln ('Not a valid output pin for ',token);
  501.         end;
  502.     otherwise:
  503.         writeln ('software error in error routine')
  504.    end
  505.   end; {error}
  506.  
  507.  procedure andterm;
  508.   begin
  509.    gettoken;
  510.    case sym of
  511.     ident :
  512.      begin
  513.       search (3);     {find pin number attached to this signal name}
  514.       if not found
  515.        then begin error(1); gettoken end
  516.        else begin
  517.              j := fusetoinp[palkind].transfer[pointer]; {get fuse number}
  518.              if j < 0
  519.               then error (8)   {not a valid input or feedback factor}
  520.               else outtable[outindex].matrix[iterm,j]:= '1';
  521.              gettoken;
  522.              if sym = andoperator then andterm  {call back recursively}
  523.             end
  524.      end;
  525.     invert :
  526.      begin
  527.       gettoken;     {get signal name}
  528.       if sym = ident
  529.        then
  530.         begin
  531.          search (3);     {find pin number attached to this signal name}
  532.          if not found
  533.           then begin error(1); gettoken end
  534.           else begin
  535.                 j := fusetoinp[palkind].transfer[pointer]; {get fuse number}
  536.                 if j < 0
  537.                  then error (8)   {not a valid input or feedback factor}
  538.                  else begin
  539.                        j := j + 1;    {increment fuse number}
  540.                        outtable[outindex].matrix[iterm,j]:= '1'
  541.                       end;
  542.                 gettoken;
  543.                 if sym = andoperator then andterm  {call back recursively}
  544.                end
  545.         end
  546.        else error (3)   {expecting an identifier, i.e. signal name}
  547.      end;
  548.     otherwise:  error (2)
  549.    end
  550.   end; {andterm}
  551.  
  552.  procedure nodeterm (var pterm : ptermtyp);
  553.   begin
  554.    gettoken;
  555.    case sym of
  556.     ident :
  557.      begin
  558.       search (3);     {find pin number attached to this signal name}
  559.       if not found
  560.        then begin error(1); gettoken end
  561.        else begin
  562.              j := fusetoinp[palkind].transfer[pointer]; {get fuse number}
  563.              if j < 0
  564.               then error (8)   {not a valid input or feedback factor}
  565.               else pterm[j]:= '1';
  566.              gettoken;
  567.              if sym = andoperator then nodeterm(pterm)  {call back recursively}
  568.             end
  569.      end;
  570.     invert :
  571.      begin
  572.       gettoken;     {get signal name}
  573.       if sym = ident
  574.        then
  575.         begin
  576.          search (3);     {find pin number attached to this signal name}
  577.          if not found
  578.           then begin error(1); gettoken end
  579.           else begin
  580.                 j := fusetoinp[palkind].transfer[pointer]; {get fuse number}
  581.                 if j < 0
  582.                  then error (8)   {not a valid input or feedback factor}
  583.                  else begin
  584.                        j := j + 1;    {increment fuse number}
  585.                        pterm[j]:= '1'
  586.                       end;
  587.                 gettoken;
  588.                 if sym = andoperator then nodeterm(pterm)
  589.                end
  590.         end
  591.        else error (3)   {expecting an identifier, i.e. signal name}
  592.      end;
  593.     otherwise:  error (2)
  594.    end
  595.   end; {nodeterm}
  596.  
  597.   procedure setiterm;
  598.    begin
  599.     case palkind of
  600.      p22vx, p16l8,
  601.      p20l10,p20l8 :  iterm := 2;   { all outputs have OE term }
  602.      p16rx:
  603.       case pointer of
  604.         19,12 : if (ptype = '5')or(ptype='6')
  605.                   then iterm := 2  else iterm := 1;
  606.         18,13 : if (ptype = '6') then iterm :=2 else iterm := 1;
  607.         otherwise:  iterm := 1
  608.       end;
  609.      p20rx:
  610.       case pointer of
  611.         22,15 : if (ptype = 'B')or(ptype='C')
  612.                   then iterm := 2  else iterm := 1;
  613.         21,16 : if (ptype = 'C') then iterm :=2 else iterm := 1;
  614.         otherwise:  iterm := 1
  615.       end;
  616.      otherwise: iterm := 1
  617.     end
  618.    end; {setiterm}
  619.  
  620.   procedure getterms;
  621.    begin
  622.     case palkind of
  623.      p10l8,p12l10:
  624.         totalterms := 2;
  625.      p14l4,p20l10:
  626.         totalterms := 4;
  627.      p12l6:
  628.         if (pointer = 18) or (pointer = 13)
  629.           then totalterms := 4
  630.           else totalterms := 2;
  631.      p14l8:
  632.         if (pointer = 22) or (pointer = 15)
  633.           then totalterms := 4
  634.           else totalterms := 2;
  635.      p16l6:
  636.         if (pointer = 19) or (pointer = 18)
  637.           then totalterms := 2
  638.           else totalterms := 4;
  639.      p18l4:
  640.         if (pointer = 19) or (pointer = 18)
  641.           then totalterms := 4
  642.           else totalterms := 6;
  643.      p22vx:
  644.         case pointer of
  645.          23,14 :  totalterms := 9;
  646.          22,15 :  totalterms := 11;
  647.          21,16 :  totalterms := 13;
  648.          20,17 :  totalterms := 15;
  649.          19,18 :  totalterms := 17;
  650.          otherwise:  writeln ('Software error in procedure getterms!')
  651.         end;
  652.      otherwise:
  653.         totalterms := 8
  654.     end
  655.    end; {getterms}
  656.  
  657.  procedure map (typ : char);
  658.   var i,j : integer;
  659.   begin {map}
  660.    case typ of
  661.     '0' : {initialize a new output}
  662.         begin
  663.          {first find out if output already has been defined, that is if
  664.            output has an enable previously defined }
  665.          found := false;
  666. writeln ('output : ',token,' nexout=',nexout);
  667.          for i:=1 to nexout do
  668.            with outtable[i] do
  669.             if outname = token
  670.              then begin
  671.                    found := true;     outindex := i
  672.                   end;
  673.          getterms;   {find out how many or-terms this output has }
  674.          setiterm;   {find out where to start orterms }
  675.          if not found
  676.           then begin
  677.                 nexout := nexout + 1;
  678.                 outtable[nexout].outnumb := pointer; {store output pin number}
  679.                 outtable[nexout].outname := token;   {store output name }
  680.                 for i:=1 to maxterms do
  681.                  for j:=1 to maxcols do
  682.                   outtable[nexout].matrix[i,j]:= '0';
  683.                 outtable[nexout].outkind := nonreg;     {default}
  684.                 if iterm > 1 then outtable[nexout].matrix[1,1]:= 'H';
  685.                 case ptype of
  686.                  '2' :  outtable[nexout].form := high;
  687.                  otherwise:  outtable[nexout].form := low
  688.                 end;
  689.                 outindex := nexout
  690.                end
  691.         end
  692.    end
  693.   end; {map}
  694.  
  695.  procedure orterms;
  696.   begin
  697.    andterm;
  698.    if sym = oroperator
  699.     then begin
  700.           iterm := iterm + 1;
  701.           if iterm > totalterms
  702.            then error (7)
  703.            else orterms
  704.          end
  705.     else begin    {mark termination of equation}
  706.           iterm := iterm + 1;
  707.           outtable[outindex].matrix[iterm,1]:= 'X'
  708.          end
  709.   end; {orterms}
  710.  
  711.  procedure getmatrix;
  712.   begin {getmatrix}
  713.    case sym of
  714.      enable :
  715.       begin
  716.        gettoken;
  717.        if sym = ident
  718.         then begin
  719.               search (3);  {find out pin number}
  720.               if not found
  721.                then error (1)
  722.                else begin
  723.                       map ('0');   {create an output description database}
  724.                       if iterm > 1 then
  725.                        begin
  726.                         outtable[nexout].matrix[1,1]:= '0'; {clear possible H}
  727.                         gettoken;    {get equal sign}
  728.                         if sym = eql
  729.                          then begin
  730.                                iterm := 1;
  731.                                andterm;
  732.                                if sym = semicolon
  733.                                 then begin
  734.                                       gettoken;   {find out next step}
  735.                                       if sym <> ends then getmatrix
  736.                                      end
  737.                                 else error (9)   {missing semicolon}
  738.                               end
  739.                          else error (4)
  740.                        end
  741.                        else error (10)  { Output has no OE term }
  742.                     end
  743.              end
  744.         else error (3)          {expecting a signal name}
  745.       end;
  746.      clear:
  747.       begin
  748.        {find out if this is a Pal 22v10}
  749.        if ptype <> 'D'
  750.         then error (10)
  751.         else begin
  752.               gettoken;  { read dummy pseudo pin name }
  753.               gettoken;  { get equal sign }
  754.               if (sym = eql)
  755.                then begin
  756.                      ar[1]:= '0';   {erase default}
  757.                      nodeterm (ar);
  758.                      if sym = semicolon
  759.                       then begin
  760.                             gettoken;  {find out next step}
  761.                             if sym <> ends then getmatrix
  762.                            end
  763.                       else error (9)
  764.                     end
  765.                else error (4)
  766.              end
  767.       end;
  768.      preset:
  769.       begin
  770.        {find out if this is a Pal 22v10}
  771.        if ptype <> 'D'
  772.         then error (10)
  773.         else begin
  774.               gettoken;  { read dummy pseudo pin name }
  775.               gettoken;  { get equal sign }
  776.               if (sym = eql)
  777.                then begin
  778.                      sp[1]:= '0';   {erase default}
  779.                      nodeterm (sp);
  780.                      if sym = semicolon
  781.                       then begin
  782.                             gettoken;  {find out next step}
  783.                             if sym <> ends then getmatrix
  784.                            end
  785.                       else error (9)
  786.                     end
  787.                else error (4)
  788.              end
  789.       end;
  790.      ident : {a min-term equation}
  791.       begin
  792.        if (ptype = 'D') or (ptype = '2')
  793.         then begin
  794.               search (3);
  795.               if not found
  796.                then error (1)
  797.                else begin
  798.                      map ('0');    {initialize new entry in the output table}
  799.                      outtable[nexout].form := high;      {set output pol }
  800.                      gettoken;  { get equal sign }
  801.                      case sym of
  802.                       colon : {it is a registered output }
  803.                        begin
  804.                         gettoken;     {get equal sign}
  805.                         if (sym = eql)
  806.                          then
  807.                           begin
  808.                            outtable[outindex].outkind := reg;
  809.                            orterms;
  810.                            if sym = semicolon
  811.                             then begin
  812.                                   gettoken; {find out next step}
  813.                                   if sym <> ends then getmatrix
  814.                                  end
  815.                             else error (9)
  816.                           end
  817.                          else error (4)
  818.                        end;
  819.                       eql : {it is a non_registered output }
  820.                        begin
  821.                         outtable[outindex].outkind := nonreg;
  822.                         orterms;
  823.                         if sym = semicolon
  824.                          then begin
  825.                                gettoken; {find out next step}
  826.                                if sym <> ends then getmatrix
  827.                               end
  828.                          else error (9)
  829.                        end;
  830.                       otherwise:  error (5)
  831.                      end
  832.                     end
  833.              end
  834.         else error (11)    {this device is not capable of true form output}
  835.       end;
  836.      invert: {a max-term equation}
  837.       begin
  838.        gettoken;    {get signal name}
  839.        if sym = ident
  840.         then begin
  841.               search (3);       {obtain pin number from table}
  842.               if (not found)
  843.                then error (1)
  844.                else begin
  845.                      map ('0');    {initialize new entry in the output table}
  846.                      gettoken;  { get equal sign }
  847.                      case sym of
  848.                       colon : {it is a registered output }
  849.                        begin
  850.                         gettoken;     {get equal sign}
  851.                         if (sym = eql)
  852.                          then
  853.                           begin
  854.                            outtable[outindex].outkind := reg;
  855.                            orterms;
  856.                            if sym = semicolon
  857.                             then begin
  858.                                   gettoken; {find out next step}
  859.                                   if sym <> ends then getmatrix
  860.                                  end
  861.                             else error (9)
  862.                           end
  863.                          else error (4)
  864.                        end;
  865.                       eql : {it is a non_registered output }
  866.                        begin
  867.                         outtable[outindex].outkind := nonreg;
  868.                         orterms;
  869.                         if sym = semicolon
  870.                          then begin
  871.                                gettoken; {find out next step}
  872.                                if sym <> ends then getmatrix
  873.                               end
  874.                          else error (9)
  875.                        end;
  876.                       otherwise:  error (5)
  877.                      end
  878.                     end
  879.              end
  880.         else error (3)
  881.       end;
  882.      otherwise: error (6) {fatal error, not a valid equation}
  883.    end {case of sym}
  884.   end; {getmatrix}
  885.  
  886.  procedure convrt (var numbr1 : Long_Integer; var ihex : string2);
  887.   var
  888.    i : integer;
  889.    res,zero,a : Long_Integer;
  890.    vel : Long_Integer;
  891.   begin
  892.    zero := ord ('0');
  893.    a := ord ('A');
  894.    i := 0;
  895.    ihex [1]:= '0';     ihex [2]:= '0';
  896.    ihex [3]:= '0';     ihex [4]:= '0';
  897.    vel := numbr1 & $0000ffff;
  898.    repeat
  899.     res := vel mod 16;
  900.     vel := vel div 16;
  901.     if res < 10
  902.       then  ihex [4-i]:= chr(res + zero)
  903.       else  ihex [4-i]:= chr(res + a - 10);
  904.     i:= i + 1
  905.    until (vel = 0)
  906.   end; {convrt}
  907.  
  908.  procedure dojedec;
  909. {This procedure generates the jedec file based on information from getmatrix}
  910.   var
  911.    stx,etx : char;
  912.    i,j,k : integer;
  913.    totalcol,totalfuse,nouts,firstp : integer;
  914.    outn,bitn, n : integer;
  915.    checksum : Long_Integer;
  916.    power2 : array [1..8] of integer;
  917.    scksum : string2;
  918.    finish : boolean;
  919.   begin
  920.    i:= 2;       stx:= chr(i);   i:= 3;  etx := chr(i);
  921.    power2[1]:= 1;
  922.    for i:=2 to 8 do power2[i]:= 2*power2[i-1];
  923.    pal16 := false;
  924.    case palkind of
  925.     p10l8: begin
  926.             pal16 := true;      totalcol := 20;
  927.             totalfuse := 320;   nouts := 8;     firstp := 19;
  928.            end;
  929.     p12l6: begin
  930.             pal16 := true;      totalcol := 24;
  931.             totalfuse := 384;   nouts := 6;     firstp := 18;
  932.            end;
  933.     p14l4: begin
  934.             pal16 := true;      totalcol := 28;
  935.             totalfuse := 448;   nouts := 4;     firstp := 17;
  936.            end;
  937.     p16l2: begin
  938.             pal16 := true;      totalcol := 32;
  939.             totalfuse := 512;   nouts := 2;     firstp := 16;
  940.            end;
  941.     p16l8,p16rx:
  942.            begin
  943.             pal16 := true;      totalcol := 32;
  944.             totalfuse := 2048;  nouts := 8;     firstp := 19;
  945.            end;
  946.     p12l10:begin
  947.             totalcol := 24;     totalfuse := 480;
  948.             nouts := 10;        firstp := 23;
  949.            end;
  950.     p14l8: begin
  951.             totalcol := 28;     totalfuse := 560;
  952.             nouts := 8;         firstp := 22;
  953.            end;
  954.     p16l6: begin
  955.             totalcol := 32;     totalfuse := 640;
  956.             nouts := 6;         firstp := 21;
  957.            end;
  958.     p18l4: begin
  959.             totalcol := 36;     totalfuse := 720;
  960.             nouts := 4;         firstp := 20;
  961.            end;
  962.     p20l2: begin
  963.             totalcol := 40;     totalfuse := 640;
  964.             nouts := 2;         firstp := 19;
  965.            end;
  966.     p20l10:begin
  967.             totalcol := 40;     totalfuse := 1600;
  968.             nouts := 10;        firstp := 23;
  969.            end;
  970.     p20l8,p20rx:
  971.            begin
  972.             totalcol := 40;     totalfuse := 2560;
  973.             nouts := 8;         firstp := 22;
  974.            end;
  975.     p22vx: begin
  976.             totalcol := 44;     totalfuse := 5828;
  977.             nouts := 10;        firstp := 23;
  978.            end
  979.    end; {case of ptype}
  980.    write (source,stx);     {write start of text}
  981.    write (source,'Portable Pal Assembler Jedec Output for device :');
  982.    writeln (source,pdevice,'*');
  983.    if pal16 then  write (source,'QP20* ')
  984.             else  write (source,'QP24* ');
  985.    writeln (source,'QF',totalfuse:4,'*');
  986.    write (source,'L0000');
  987.    {at this point in time, it is assumed that every output signal has a valid
  988.     output pin }
  989.    checksum := 0;    bitn:= 0;    {initialize checksum variables}
  990.    if palkind = p22vx
  991.     then {let us take care of special nodes}
  992.      begin
  993.       writeln(source);
  994.       if ar[1] = 'L'
  995.        then begin
  996.               for k:=1 to totalcol do
  997.                write (source,'0');    {unblown fuse}
  998.               bitn := bitn + totalcol   {increment fuse count}
  999.             end
  1000.        else begin
  1001.              for k:=1 to totalcol do
  1002.               if ar[k] = '1' then begin
  1003.                                    write (source,'0');
  1004.                                    bitn := bitn + 1
  1005.                                   end
  1006.                              else begin
  1007.                                    write (source,'1');
  1008.                                    n := (bitn mod 8) + 1;
  1009.                                    checksum := checksum + power2[n];
  1010.                                    bitn := bitn + 1
  1011.                                   end
  1012.             end
  1013.      end;
  1014.    for i:= 1 to nouts do
  1015.     begin
  1016.     {first find out if there is an output with such pin}
  1017.      outn := 0;    {default to no output defined for current pin}
  1018.      pointer := firstp;
  1019.      getterms;   {find out how many or-terms for this output}
  1020.      for j:=1 to nexout do
  1021.       with outtable[j] do
  1022.        if outnumb = firstp   then outn := j;
  1023.      if outn = 0
  1024.       then begin  {no output defined for this output pin}
  1025.             for j:=1 to totalterms do
  1026.              begin
  1027.               writeln (source);
  1028.               for k:=1 to totalcol do
  1029.                write (source,'0');    {unblown fuse}
  1030.               bitn := bitn + totalcol   {increment fuse count}
  1031.              end
  1032.            end
  1033.       else begin  {there is an output definition for this output pin}
  1034.             finish := false;
  1035.             for j:=1 to totalterms do
  1036.              begin
  1037.               writeln (source);     {terminate previous line}
  1038.               with outtable[outn] do
  1039.                if (matrix[j,1] <> 'X') and not finish
  1040.                 then
  1041.                  for k:=1 to totalcol do
  1042.                   if matrix[j,k] = '1' then begin
  1043.                                              write (source,'0');
  1044.                                              bitn := bitn + 1
  1045.                                             end
  1046.                                        else begin
  1047.                                              write (source,'1');
  1048.                                              n := (bitn mod 8) + 1;
  1049.                                              checksum := checksum + power2[n];
  1050.                                              bitn := bitn + 1
  1051.                                             end
  1052.                 else begin
  1053.                       for k:=1 to totalcol do write (source,'0');
  1054.                       bitn := bitn + totalcol;
  1055.                       finish := true     {note that this method is redundant}
  1056.                      end
  1057.              end
  1058.            end;
  1059.      firstp := firstp - 1         {step to next valid output}
  1060.     end;
  1061.    if palkind = p22vx
  1062.     then {let us take care of special nodes}
  1063.      begin
  1064.       writeln(source);
  1065.       if sp[1] = 'L'
  1066.        then begin
  1067.               for k:=1 to totalcol do
  1068.                write (source,'0');    {unblown fuse}
  1069.               bitn := bitn + totalcol   {increment fuse count}
  1070.             end
  1071.        else begin
  1072.              for k:=1 to totalcol do
  1073.               if sp[k] = '1' then begin
  1074.                                    write (source,'0');
  1075.                                    bitn := bitn + 1
  1076.                                   end
  1077.                              else begin
  1078.                                    write (source,'1');
  1079.                                    n := (bitn mod 8) + 1;
  1080.                                    checksum := checksum + power2[n];
  1081.                                    bitn := bitn + 1
  1082.                                   end
  1083.             end;
  1084.       writeln (source,'*');  {terminate main fuse body}
  1085.       {now let's take care of output macro cells}
  1086.       write (source,'L5808 '); {it must be 5808 }
  1087.       firstp := 23;
  1088.       for i:=1 to nouts do
  1089.        begin
  1090.         outn := 0;
  1091.         for j:=1 to nexout do
  1092.          with outtable[j] do
  1093.           if outnumb = firstp then outn := j;
  1094.         if outn <> 0
  1095.          then begin
  1096.                if outtable[outn].form = high
  1097.                 then begin
  1098.                       write (source,'1');
  1099.                       n := (bitn mod 8) + 1;
  1100.                       checksum := checksum + power2[n];
  1101.                       bitn := bitn + 1
  1102.                      end
  1103.                 else begin write(source,'0'); bitn := bitn + 1 end;
  1104.                if outtable[outn].outkind = reg
  1105.                 then begin write(source,'0'); bitn := bitn + 1 end
  1106.                 else begin
  1107.                       write (source,'1');
  1108.                       n := (bitn mod 8) + 1;
  1109.                       checksum := checksum + power2[n];
  1110.                       bitn := bitn + 1
  1111.                      end
  1112.               end
  1113.          else begin
  1114.                write (source,'00');     bitn := bitn + 2
  1115.               end;
  1116.         firstp := firstp - 1   {get next valid output}
  1117.        end;
  1118.       writeln (source,'*')
  1119.      end
  1120.     else writeln (source,'*');  {terminate fuse list}
  1121.    convrt (checksum,scksum);
  1122.    writeln (source,'C',scksum,'*');
  1123.    writeln (source,etx,'0000');     {write end of transmission}
  1124.   end; {dojedec}
  1125.  
  1126.  begin { plassm }
  1127.   nexout := 0;
  1128.   reserved[1]:= 'device         ';     reserved[2]:= 'pin            ';
  1129.   reserved[3]:= 'equations      ';     reserved[4]:= 'module         ';
  1130.   reserved[5]:= 'flag           ';     reserved[6]:= 'title          ';
  1131.   reserved[7]:= 'node           ';     reserved[8]:= 'istype         ';
  1132.   reserved[9]:= 'macro          ';     reserved[10]:='ENABLE         ';
  1133.   reserved[11]:='RESET          ';     reserved[12]:='PRESET         ';
  1134.   reserved[13]:='end            ';
  1135.   wsym [1]:= device;    wsym[2]:= pin;  wsym[3]:= equations;
  1136.   wsym [4]:= module;    wsym[5]:= flag; wsym[6]:= title;
  1137.   wsym [7]:= node;      wsym[8]:= stype; wsym[9]:= macro;
  1138.   wsym [10]:= enable;   wsym[11]:= clear; wsym[12]:= preset;
  1139.   wsym [13]:= ends;
  1140.   palknds[1]:= '1';     pals[1]:= 'p10l8          ';
  1141.   paltyp [1]:= p10l8;
  1142.   palknds[2]:= '1';     pals[2]:= 'p12l6          ';
  1143.   paltyp [2]:= p12l6;
  1144.   palknds[3]:= '1';     pals[3]:= 'p14l4          ';
  1145.   paltyp [3]:= p14l4;
  1146.   palknds[4]:= '1';     pals[4]:= 'p16l2          ';
  1147.   paltyp [4]:= p16l2;
  1148.   palknds[5]:= '2';     pals[5]:= 'p10h8          ';
  1149.   paltyp [5]:= p10l8;
  1150.   palknds[6]:= '2';     pals[6]:= 'p12h6          ';
  1151.   paltyp [6]:= p12l6;
  1152.   palknds[7]:= '2';     pals[7]:= 'p14h4          ';
  1153.   paltyp [7]:= p14l4;
  1154.   palknds[8]:= '2';     pals[8]:= 'p16h2          ';
  1155.   paltyp [8]:= p16l2;
  1156.   palknds[9]:= '3';     pals[9]:= 'p16l8          ';
  1157.   paltyp [9]:= p16l8;
  1158.   palknds[10]:= '4';    pals[10]:= 'p16r8          ';
  1159.   paltyp [10]:= p16rx;
  1160.   palknds[11]:= '5';    pals[11]:= 'p16r6          ';
  1161.   paltyp [11]:= p16rx;
  1162.   palknds[12]:= '6';    pals[12]:= 'p16r4          ';
  1163.   paltyp [12]:= p16rx;
  1164.   palknds[13]:= '7';    pals[13]:= 'p12l10         ';
  1165.   paltyp [13]:= p12l10;
  1166.   palknds[14]:= '7';    pals[14]:= 'p14l8          ';
  1167.   paltyp [14]:= p14l8;
  1168.   palknds[15]:= '7';    pals[15]:= 'p16l6          ';
  1169.   paltyp [15]:= p16l6;
  1170.   palknds[16]:= '7';    pals[16]:= 'p18l4          ';
  1171.   paltyp [16]:= p18l4;
  1172.   palknds[17]:= '7';    pals[17]:= 'p20l2          ';
  1173.   paltyp [17]:= p20l2;
  1174.   palknds[18]:= '8';    pals[18]:= 'p20l10         ';
  1175.   paltyp [18]:= p20l10;
  1176.   palknds[19]:= '9';    pals[19]:= 'p20l8          ';
  1177.   paltyp [19]:= p20l8;
  1178.   palknds[20]:= 'A';    pals[20]:= 'p20r8          ';
  1179.   paltyp [20]:= p20rx;
  1180.   palknds[21]:= 'B';    pals[21]:= 'p20r6          ';
  1181.   paltyp [21]:= p20rx;
  1182.   palknds[22]:= 'C';    pals[22]:= 'p20r4          ';
  1183.   paltyp [22]:= p20rx;
  1184.   palknds[23]:= 'D';    pals[23]:= 'p22v10         ';
  1185.   paltyp [23]:= p22vx;
  1186.   { pin number to fuse column transform }
  1187.   with fusetoinp [p10l8] do
  1188.    begin
  1189.     for i:=1 to maxpins do transfer[i]:= -1;
  1190.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1191.     transfer[4]:= 7;    transfer[5]:= 9;        transfer[6]:= 11;
  1192.     transfer[7]:= 13;   transfer[8]:= 15;       transfer[9]:= 17;
  1193.     transfer[11]:= 19
  1194.    end;
  1195.   with fusetoinp [p12l6] do
  1196.    begin
  1197.     for i:=1 to maxpins do transfer[i]:= -1;
  1198.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1199.     transfer[4]:= 9;    transfer[5]:= 11;       transfer[6]:= 13;
  1200.     transfer[7]:= 15;   transfer[8]:= 17;       transfer[9]:= 21;
  1201.     transfer[11]:= 23;  transfer[12]:= 19;      transfer[19]:= 7
  1202.    end;
  1203.   with fusetoinp [p14l4] do
  1204.    begin
  1205.     for i:=1 to maxpins do transfer[i]:= -1;
  1206.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1207.     transfer[4]:= 9;    transfer[5]:= 13;       transfer[6]:= 15;
  1208.     transfer[7]:= 17;   transfer[8]:= 21;       transfer[9]:= 25;
  1209.     transfer[11]:= 27;  transfer[12]:= 23;      transfer[13]:= 19;
  1210.     transfer[18]:= 11;  transfer[19]:= 7
  1211.    end;
  1212.   with fusetoinp [p16l2] do
  1213.    begin
  1214.     for i:=1 to maxpins do transfer[i]:= -1;
  1215.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1216.     transfer[4]:= 9;    transfer[5]:= 13;       transfer[6]:= 17;
  1217.     transfer[7]:= 21;   transfer[8]:= 25;       transfer[9]:= 29;
  1218.     transfer[11]:= 31;  transfer[12]:= 27;      transfer[13]:= 23;
  1219.     transfer[14]:= 19;  transfer[17]:= 15;      transfer[18]:= 11;
  1220.     transfer[19]:= 7
  1221.    end;
  1222.   with fusetoinp [p16l8] do
  1223.    begin
  1224.     for i:=1 to maxpins do transfer[i]:= -1;
  1225.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1226.     transfer[4]:= 9;    transfer[5]:= 13;       transfer[6]:= 17;
  1227.     transfer[7]:= 21;   transfer[8]:= 25;       transfer[9]:= 29;
  1228.     transfer[11]:= 31;  transfer[13]:= 27;      transfer[14]:= 23;
  1229.     transfer[15]:= 19;  transfer[16]:= 15;      transfer[17]:= 11;
  1230.     transfer[18]:= 7
  1231.    end;
  1232.   with fusetoinp [p16rx] do
  1233.    begin
  1234.     for i:=1 to maxpins do transfer[i]:= -1;
  1235.                          transfer[2]:= 1;       transfer[3]:= 5;
  1236.     transfer[4]:= 9;     transfer[5]:= 13;      transfer[6]:= 17;
  1237.     transfer[7]:= 21;    transfer[8]:= 25;      transfer[9]:= 29;
  1238.                          transfer[12]:= 31;     transfer[13]:= 27;
  1239.     transfer[14]:= 23;   transfer[15]:= 19;     transfer[16]:= 15;
  1240.     transfer[17]:= 11;   transfer[18]:= 7;      transfer[19]:= 3
  1241.    end;
  1242.   with fusetoinp [p12l10] do
  1243.    begin
  1244.     for i:=1 to maxpins do transfer[i]:= -1;
  1245.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1246.     transfer[4]:= 7;    transfer[5]:= 9;        transfer[6]:= 11;
  1247.     transfer[7]:= 13;   transfer[8]:= 15;       transfer[9]:= 17;
  1248.     transfer[10]:= 19;  transfer[11]:= 21;      transfer[13]:= 23
  1249.    end;
  1250.   with fusetoinp [p14l8] do
  1251.    begin
  1252.     for i:=1 to maxpins do transfer[i]:= -1;
  1253.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1254.     transfer[4]:= 9;    transfer[5]:= 11;       transfer[6]:= 13;
  1255.     transfer[7]:= 15;   transfer[8]:= 17;       transfer[9]:= 19;
  1256.     transfer[10]:= 21;  transfer[11]:= 25;
  1257.     transfer[13]:= 27;  transfer[14]:= 23;      transfer[23]:= 7
  1258.    end;
  1259.   with fusetoinp [p16l6] do
  1260.    begin
  1261.     for i:=1 to maxpins do transfer[i]:= -1;
  1262.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1263.     transfer[4]:= 9;    transfer[5]:= 13;       transfer[6]:= 15;
  1264.     transfer[7]:= 17;   transfer[8]:= 19;       transfer[9]:= 21;
  1265.     transfer[10]:= 25;  transfer[11]:= 29;
  1266.     transfer[13]:= 31;  transfer[14]:= 27;      transfer[15]:= 23;
  1267.     transfer[22]:= 11;  transfer[23]:= 7
  1268.    end;
  1269.   with fusetoinp [p18l4] do
  1270.    begin
  1271.     for i:=1 to maxpins do transfer[i]:= -1;
  1272.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1273.     transfer[4]:= 9;    transfer[5]:= 13;       transfer[6]:= 17;
  1274.     transfer[7]:= 19;   transfer[8]:= 21;       transfer[9]:= 25;
  1275.     transfer[10]:= 29;  transfer[11]:= 33;
  1276.     transfer[13]:= 35;  transfer[14]:= 31;     transfer[15]:= 27;
  1277.     transfer[16]:= 23;  transfer[21]:= 15;     transfer[22]:= 11;
  1278.     transfer[23]:= 7
  1279.    end;
  1280.   with fusetoinp [p20l2] do
  1281.    begin
  1282.     for i:=1 to maxpins do transfer[i]:= -1;
  1283.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1284.     transfer[4]:= 9;    transfer[5]:= 13;       transfer[6]:= 17;
  1285.     transfer[7]:= 21;   transfer[8]:= 25;       transfer[9]:= 29;
  1286.     transfer[10]:= 33;  transfer[11]:= 37;
  1287.     transfer[13]:= 39;  transfer[14]:= 35;      transfer[15]:= 31;
  1288.     transfer[16]:= 27;  transfer[17]:= 23;
  1289.     transfer[20]:= 19;  transfer[21]:= 15;      transfer[22]:= 11;
  1290.     transfer[23]:= 7
  1291.    end;
  1292.   with fusetoinp [p20l10] do
  1293.    begin
  1294.     for i:=1 to maxpins do transfer[i]:= -1;
  1295.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1296.     transfer[4]:= 9;    transfer[5]:= 13;       transfer[6]:= 17;
  1297.     transfer[7]:= 21;   transfer[8]:= 25;       transfer[9]:= 29;
  1298.     transfer[10]:= 33;  transfer[11]:= 37;
  1299.     transfer[13]:= 39;  transfer[15]:= 35;      transfer[16]:= 31;
  1300.     transfer[17]:= 27;  transfer[18]:= 23;      transfer[19]:= 19;
  1301.     transfer[20]:= 15;  transfer[21]:= 11;      transfer[22]:= 7
  1302.    end;
  1303.   with fusetoinp [p20l8] do
  1304.    begin
  1305.     for i:=1 to maxpins do transfer[i]:= -1;
  1306.     transfer[1]:= 3;    transfer[2]:= 1;        transfer[3]:= 5;
  1307.     transfer[4]:= 9;    transfer[5]:= 13;       transfer[6]:= 17;
  1308.     transfer[7]:= 21;   transfer[8]:= 25;       transfer[9]:= 29;
  1309.     transfer[10]:= 33;  transfer[11]:= 37;
  1310.     transfer[13]:= 39;  transfer[14]:= 35;
  1311.     transfer[16]:= 31;  transfer[17]:= 27;      transfer[18]:= 23;
  1312.     transfer[19]:= 19;  transfer[20]:= 15;      transfer[21]:= 11;
  1313.     transfer[23]:= 7
  1314.    end;
  1315.   with fusetoinp [p20rx] do
  1316.    begin
  1317.     for i:=1 to maxpins do transfer[i]:= -1;
  1318.                         transfer[2]:= 1;        transfer[3]:= 5;
  1319.     transfer[4]:= 9;    transfer[5]:= 13;       transfer[6]:= 17;
  1320.     transfer[7]:= 21;   transfer[8]:= 25;       transfer[9]:= 29;
  1321.     transfer[10]:= 33;  transfer[11]:= 37;
  1322.                         transfer[14]:= 39;      transfer[15]:= 35;
  1323.     transfer[16]:= 31;  transfer[17]:= 27;      transfer[18]:= 23;
  1324.     transfer[19]:= 19;  transfer[20]:= 15;      transfer[21]:= 11;
  1325.     transfer[22]:= 7;   transfer[23]:= 3
  1326.    end;
  1327.   with fusetoinp [p22vx] do
  1328.    begin
  1329.     for i:=1 to maxpins do transfer[i]:= -1;
  1330.     transfer[1]:= 1;    transfer[2]:= 5;        transfer[3]:= 9;
  1331.     transfer[4]:= 13;   transfer[5]:= 17;       transfer[6]:= 21;
  1332.     transfer[7]:= 25;   transfer[8]:= 29;       transfer[9]:= 33;
  1333.     transfer[10]:= 37;  transfer[11]:= 41;
  1334.     transfer[13]:= 43;  transfer[14]:= 39;      transfer[15]:= 35;
  1335.     transfer[16]:= 31;  transfer[17]:= 27;      transfer[18]:= 23;
  1336.     transfer[19]:= 19;  transfer[20]:= 15;      transfer[21]:= 11;
  1337.     transfer[22]:= 7;   transfer[23]:= 3
  1338.    end;
  1339.   tab := chr(9);        nexin := 0;     Abort := false;    ch:= blank;
  1340.   writeln;
  1341.   writeln ('  Portable Pal Assembler');
  1342.   writeln ('  Rev.1  Sep 1988');
  1343.   writeln ('  By: Erasmo Brenes ');
  1344.   writeln ('  (c) Copyright 1987,1988');
  1345.   writeln;
  1346.   for i:=1 to 80 do filspc[i]:= blank;
  1347.   for i:=1 to maxcols do begin ar[i]:= '0'; sp[i]:= '0'  end;
  1348.   { Default to inactive for ar and sp}
  1349.   ar[1]:= 'L';  sp[1]:= 'L';
  1350.   write ('Enter source filename_');
  1351.   readln (filspc);
  1352.   reset(source,filspc);
  1353.   getnames;
  1354. {*** diag print ***}
  1355.  for i:= 1 to nexin do
  1356.   with symtable[i] do
  1357.    writeln ('pin name= ',name,' pin#=',pinn:3);
  1358.  i:= 1;
  1359.  if not Abort
  1360.   then begin
  1361.         gettoken;    {get first token before calling getmatrix}
  1362.         getmatrix;
  1363.         close (source);   {release previous handle}
  1364.         while (filspc[i] <> '.') do i:= i + 1;
  1365.         i:= i + 1;    j:= i;
  1366.         filspc[i]:= 'j';      i:= i + 1;
  1367.         filspc[i]:= 'e';      i:= i + 1;
  1368.         filspc[i]:= 'd';
  1369.         rewrite (source,filspc);
  1370.         if not Abort then dojedec;
  1371.         writeln ('Press any key to return');
  1372.         while (not Keypress) do begin end    {ie do nothing}
  1373.        end
  1374.  end.
  1375.