home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 21 / m_auto / m_auto.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-11-22  |  17.2 KB  |  607 lines

  1.  
  2. program endliche_Maschine_mit_Ausgabe;
  3.  
  4. uses tpcrt;
  5.  
  6. type Band_Fortsetzung = ^Band_Stelle;
  7.  
  8.      Band_Stelle = Record
  9.                       Stelle      : string[10];
  10.                       Stellen_Nr  : integer;
  11.                       right       : Band_Fortsetzung;
  12.                       left        : Band_Fortsetzung;
  13.                    End;
  14.  
  15.      saetze =  Record
  16.                   regel:       string[3];
  17.                   afiller:     string[1];
  18.                   code:        char;
  19.                   bfiller:     string[1];
  20.                   anweisung:   char;
  21.                   cfiller:     string[1];
  22.                   verzweigung: string[3]
  23.                end;
  24.      asaetze = array[1..100] OF saetze;
  25.  
  26.      str_1  = string[1];
  27.      str_3  = string[3];
  28.      str_10 = string[10];
  29.      str_12 = string[12];
  30.  
  31. var  j,
  32.      Stelle,
  33.      Befehl_Nr,
  34.      Max_Befehle        : integer;
  35.      Befehl             : asaetze;
  36.      Datei              : text;
  37.      DosDatei           : str_12;
  38.      Abbruch            : boolean;
  39.      Band_Anfang,
  40.      Schreibkopf,
  41.      Band_Ende,
  42.      DruckStelle,
  43.      Before,Next,
  44.      Neues_Element,
  45.      Band_Anfang2,
  46.      Schreibkopf2,
  47.      Band_Ende2,
  48.      DruckStelle2,
  49.      Before2,Next2,
  50.      Neues_Element2     : Band_Fortsetzung;
  51.      Laenge,
  52.      Anzahl,
  53.      Frequenz,
  54.      BandStelle,
  55.      BandStelle2,
  56.      Band_Stellenzahl,
  57.      Band_Stellenzahl2,
  58.      SchreibkopfStelle  : integer;
  59.      m,
  60.      l,
  61.      Art_str,
  62.      Ende               : str_1;
  63.      k,
  64.      Regel_Nr           : str_3;
  65.      Zahl               : str_10;
  66.      Art,aa             : char;
  67.  
  68. { - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
  69.  
  70.  
  71. procedure Set_Color(i:integer);
  72. begin
  73.   case i of
  74.     1 : begin TextColor(White); TextBackGround(Black); end;
  75.     2 : begin TextColor(Black); TextBackGround(White); end;
  76.   end;
  77. end;  { proc Set_Color }
  78.  
  79.  
  80. procedure set_Rahmen(x1,y1,x2,y2:integer);
  81. VAR j:integer;
  82. begin
  83.   j:=0;
  84.   GotoXY(x1,y1); write(chr(218));
  85.   FOR j:=x1+1 TO x2-1 DO write(chr(196));
  86.   write(chr(191));
  87.   FOR j:=y1+1 TO y2-1 DO
  88.   begin
  89.      GotoXY(x1,j); write(chr(179));
  90.      GotoXY(x2,j); write(chr(179));
  91.   end;
  92.   GotoXY(x1,y2); write(chr(192));
  93.   FOR j:= x1+1 TO x2-1 DO write(chr(196));
  94.   write(chr(217));
  95. end;   { proc set_Rahmen }
  96.  
  97.  
  98. procedure install_Windows;
  99. var i,j:integer;
  100. begin
  101.   set_Rahmen(1,1,26,23);
  102.   GotoXY(3,1); Write(' Lese- / Schreib-Band ');
  103.   set_Rahmen(27,1,80,17);
  104.   GotoXY(43,1); Write(' Automaten-Zustände ');
  105.   set_Rahmen(27,18,53,23);
  106.   GotoXY(28,18); Write(' Neuer Maschinen-Zustand ');
  107.   set_Rahmen(54,18,80,20);
  108.   GotoXY(58,18); Write(' Lese-Band-Stelle ');
  109.   set_Rahmen(54,21,80,23);
  110.   GotoXY(57,21); Write(' Band-Lauf-Frequenz ');
  111. end;  { proc install_Windows }
  112.  
  113.  
  114. procedure set_Window(i:integer);
  115. begin
  116.   Window(1,1,80,25);
  117.   case i of
  118.     0 : Window(1,1,80,25);
  119.    13 : Window(28,2,79,16);         { Automaten - Zustände }
  120.     2 : begin                    { Neuer Maschinen-Zustand }
  121.           Set_Color(1); Window(28,19,52,22);
  122.         end;
  123.    21 : begin                           { Lese-Band-Stelle }
  124.           Set_Color(1);
  125.           Window(55,19,79,20); GotoXY(13,1);
  126.         end;
  127.    23 : begin                         { Band-Lauf-Frequenz }
  128.           Set_Color(1);
  129.           Window(55,22,79,23); GotoXY(12,1);
  130.         end;
  131.     3 : begin                    { Eingabe/Anfrage - Zeile }
  132.           Window(1,24,80,25); Set_Color(1);
  133.           GotoXY(1,1); Write('>> '); ClrEol;
  134.         end;
  135.     4 : begin                    { Eingabe/Anfrage - Zeile }
  136.           Set_Color(1);
  137.           Window(1,24,80,25); GotoXY(1,1);
  138.           Write('>> '); ClrEol; Set_Color(2);
  139.           GotoXY(1,2); ClrEol;
  140.         end;
  141.     5 : begin
  142.           Window(2,2,25,22); LowVideo;
  143.           GotoXY(1,11); Write('==>    <==>    <== Kopf');
  144.         end;
  145.    51 : begin Window(6,2,7,22); LowVideo; end;
  146.    52 : begin Window(15,2,16,22); LowVideo; end;
  147.   end;
  148. end;  { proc set_Window }
  149.  
  150.  
  151. function Datei_einlesen(var Max_Befehle:integer;
  152.                         var Befehl:asaetze) : boolean;
  153. var i:integer; flag:boolean;
  154. begin
  155.    Datei_einlesen:=false; flag:=false; i:=0;
  156.    Repeat
  157.      set_Window(4);
  158.      GotoXY(22,2);
  159.      Write('Datei des auszuführenden Automaten?');
  160.      Set_Color(1); GotoXY(4,1); ReadLn(DosDatei);
  161.      Assign(Datei,DosDatei);
  162.      {$I-} Reset(Datei); {$I+}
  163.      if IOresult=0 then
  164.      begin
  165.        While not(EOF(Datei)) Do
  166.        begin
  167.           Max_Befehle:=Max_Befehle+1;
  168.           With Befehl[Max_Befehle] Do
  169.           ReadLn(datei,regel,afiller,code,
  170.                       bfiller,anweisung,cfiller,verzweigung);
  171.        end;
  172.        close(Datei);
  173.        flag:=true;
  174.        Datei_einlesen:=true;
  175.      end
  176.      else begin
  177.        set_Window(3); GotoXY(4,1);
  178.        Write(' Automat: ',DosDatei,' ist auf Diskette/');
  179.        Write('Platte nicht verfügbar!');
  180.        i:=i+1;
  181.        if i=4 then begin
  182.          Datei_einlesen:=false;
  183.          abbruch:=true;
  184.        end;
  185.        Delay(3000);
  186.      end;
  187.    Until flag or Abbruch;
  188. end;  { proc Datei_einlesen }
  189.  
  190.  
  191. Procedure Automaten_Druck(Befehl:asaetze;
  192.                                       Max_Befehle:integer);
  193. var j,Zeile,Spalte:integer;
  194. begin
  195.   LowVideo; set_Window(13); Zeile:=1; Spalte:=2;
  196.   For j:=1 TO Max_Befehle Do begin
  197.     Delay(50);
  198.     GotoXY(Spalte,Zeile); Zeile:=Zeile+1;
  199.     With Befehl[j] Do if j<=75 then
  200.       Write(regel,afiller,code,
  201.                   bfiller,anweisung,cfiller,verzweigung);
  202.     IF Zeile=16 THEN begin Zeile:=1; Spalte:=Spalte+13; end;
  203.   end;
  204.   HighVideo;
  205. end;  { proc Automaten_Druck }
  206.  
  207.  
  208. Procedure Zustand_Drucken(var Spalte,Zeile,j_Merker:integer;
  209.                          Befehl:asaetze; Befehl_Nr:integer);
  210. begin
  211.   set_Window(13); GotoXY(Spalte,Zeile);
  212.   LowVideo;
  213.   With Befehl[j_Merker] Do
  214.     Write(regel,afiller,code,bfiller,
  215.                 anweisung,cfiller,verzweigung);
  216.   HighVideo;
  217.   Case Befehl_Nr of
  218.     1..15  : Spalte:=2;
  219.     8..30 : Spalte:=15;
  220.    15..45 : Spalte:=28;
  221.    22..60 : Spalte:=41;
  222.    29..75 : Spalte:=56;
  223.   end;
  224.   Case Befehl_Nr of
  225.     1..15 : Zeile:=Befehl_Nr;
  226.    16..30 : Zeile:=Befehl_Nr-15;
  227.    31..45 : Zeile:=Befehl_Nr-30;
  228.    46..60 : Zeile:=Befehl_Nr-45;
  229.    61..75 : Zeile:=Befehl_Nr-60;
  230.   end;
  231.   set_Window(13); GotoXY(Spalte,Zeile);
  232.   With Befehl[Befehl_Nr] Do
  233.     Write(regel,afiller,code,bfiller,
  234.                 anweisung,cfiller,verzweigung);
  235.   LowVideo; j_Merker:=Befehl_Nr;
  236. end;  { proc Zustand_drucken }
  237.  
  238.  
  239. procedure BandStellenDruck(Druckstelle:Band_Fortsetzung;
  240.                                                  art:char);
  241. begin
  242.   Case Art of
  243.     'r' : begin
  244.             set_Window(51); GotoXY(1,1); InsLine;
  245.             Write(Druckstelle^.Stelle);
  246.           end;
  247.     'R' : begin
  248.             set_Window(52); GotoXY(1,1); InsLine;
  249.             Write(Druckstelle^.Stelle);
  250.           end;
  251.     '0' : begin
  252.             set_Window(52); GotoXY(1,11);
  253.             Write(Druckstelle^.Stelle);
  254.           end;
  255.     '1' : begin
  256.             set_Window(52); GotoXY(1,11);
  257.             Write(Druckstelle^.Stelle);
  258.           end;
  259.     's' : begin
  260.             set_Window(52); GotoXY(1,11);
  261.             Write(Druckstelle^.Stelle);
  262.           end;
  263.     '■' : begin
  264.             set_Window(51); GotoXY(1,11);
  265.             Write(Druckstelle^.Stelle);
  266.           end;
  267.     'g' : begin
  268.             set_Window(51); GotoXY(1,1);
  269.             InsLine; Write(Druckstelle^.Stelle);
  270.             Delay(100);
  271.           end;
  272.     'k' : begin
  273.             set_Window(52); GotoXY(1,1);
  274.             InsLine; Write(Druckstelle^.Stelle);
  275.             Delay(100);
  276.           end;
  277.     else begin   end;
  278.   end;
  279. end;  { proc BandStellenDruck }
  280.  
  281.  
  282. Procedure Band_Generierung(Anzahl:integer; Art_str:str_1);
  283. var i : integer;
  284. begin
  285.   if Art_str<>Chr(254) then
  286.   begin
  287.     for i:=1 to Anzahl do
  288.     begin
  289.       new(Next);
  290.       Schreibkopf^.Right:=Next;
  291.       Next^.Left:=Schreibkopf;
  292.       Schreibkopf:=Next;
  293.       Band_Stellenzahl:=Band_Stellenzahl+1;
  294.       Schreibkopf^.Stelle:=Art_str;
  295.       Schreibkopf^.Stellen_Nr:=Band_Stellenzahl;
  296.       Next:=nil;
  297.       BandStellenDruck(Schreibkopf,'g');
  298.     end
  299.   end
  300.   else begin
  301.     for i:=1 to Anzahl do
  302.     begin
  303.       new(Next);
  304.       Schreibkopf^.Right:=Next;
  305.       Next^.Left:=Schreibkopf;
  306.       Schreibkopf:=Next;
  307.       Band_Stellenzahl:=Band_Stellenzahl+1;
  308.       if i=1 then Schreibkopf^.Stelle:='s'
  309.         else Schreibkopf^.Stelle:=Art_str;
  310.       Schreibkopf^.Stellen_Nr:=Band_Stellenzahl;
  311.       Next:=nil;
  312.       BandStellenDruck(Schreibkopf,'g');
  313.     end
  314.   end;
  315. end;  { proc Band_Generierung }
  316.  
  317.  
  318. Procedure Band_Eingabe;
  319. Begin
  320.   Repeat
  321.      set_Window(4); GotoXY(2,2);
  322.      Write('Welches Zeichen:   ''0'' für Nullen, ''1''');
  323.      Write(' für Einsen bzw. ''2'' für Leerzeichen ''■''');
  324.      set_Window(3); GotoXY(4,1); ReadLn(Art_str);
  325.      if Art_str='2' then Art_str:=Chr(254);
  326.      if Art_str<>Chr(254) then begin
  327.        GotoXY(4,1); ClrEol;
  328.        set_Window(4); GotoXY(28,2);
  329.        Write('Anzahl dieses Zeichens?');
  330.        set_Window(3); GotoXY(4,1); ReadLn(Anzahl);
  331.      end
  332.      else Anzahl:=1;
  333.      GotoXY(4,1); ClrEol;
  334.      Band_Generierung(Anzahl,Art_str);
  335.   Until Art_str=Chr(254);
  336.   set_Window(3); GotoXY(1,2); ClrEol;
  337.  
  338.   set_Window(4); GotoXY(22,2);
  339.   write('Anfangszustand ist die Band-Stelle: 1 ');
  340.   Delay(2000); SchreibkopfStelle:=1;
  341.   set_Window(4); GotoXY(19,2);
  342.   write('Geben Sie die Ablaufgeschwindigkeit an ');
  343.   set_Window(3); GotoXY(4,1); ReadLn(Frequenz);
  344. end;  { proc Band_Eingabe }
  345.  
  346.  
  347. procedure Maschinen_Lauf;
  348. var c,
  349.     Spalte,Zeile,
  350.     j_Merker      : integer;
  351. begin
  352.   Regel_Nr:='000'; m:='0'; c:=0;
  353.   j_Merker:=1; Spalte:=2; Zeile:=1;
  354.   set_Window(51); GotoXY(1,1);
  355.   for j:=1 to 21 do DelLine;    { Window-Inhalt löschen }
  356.   Delay(500); set_Window(5);
  357.   Delay(700); set_Window(51);
  358.   DruckStelle:=Band_Anfang;
  359.   DruckStelle2:=Band_Anfang2;
  360.   BandStelle:=SchreibkopfStelle;
  361.   BandStelle2:=SchreibkopfStelle;
  362.   Delay(200);
  363.  
  364.   { Ausdrucken Leseband bis obere Window-Grenze Zeile 1 }
  365.   for j:=DruckStelle^.Stellen_Nr to SchreibkopfStelle+9 do
  366.   begin
  367.     if DruckStelle^.Stellen_Nr<Band_Ende^.Stellen_Nr then
  368.     begin
  369.       DruckStelle:=DruckStelle^.Right;
  370.       BandStellenDruck(DruckStelle,'g');
  371.     end
  372.     else if DruckStelle^.Stellen_Nr=Band_Ende^.Stellen_Nr then
  373.     begin
  374.       new(Next);
  375.       Band_Ende^.Right:=Next;
  376.       Next^.Left:=Band_Ende;
  377.       Band_Ende:=Next;
  378.       Band_Stellenzahl:=Band_Stellenzahl+1;
  379.       Band_Ende^.Stellen_Nr:=Band_Stellenzahl;
  380.       Band_Ende^.Stelle:='■';
  381.       DruckStelle:=Next; Next:=nil;
  382.       BandStellenDruck(DruckStelle,'g');
  383.     end
  384.     else begin
  385.       set_Window(5); GotoXY(4,1);
  386.       Write('Lauf-Fehler! Abbruch des Programms!');
  387.       HALT;
  388.     end;
  389.   end;
  390.  
  391.   { Positionieren von Schreibkopf, Next und Before }
  392.   Schreibkopf:=Band_Anfang;
  393.   while SchreibkopfStelle>Schreibkopf^.Stellen_Nr do
  394.                           Schreibkopf:=Schreibkopf^.Right;
  395.   Next:=Schreibkopf; Before:=Schreibkopf;
  396.   for j:=1 to 10 do begin
  397.     if not (Next^.Stellen_Nr=Band_Ende^.Stellen_Nr) then
  398.       Next:=Next^.Right;
  399.   end;
  400.   for j:=1 to 10 do begin
  401.     if not (Before^.Stellen_Nr=Band_Anfang^.Stellen_Nr) then
  402.       Before:=Before^.Left;
  403.   end;
  404.  
  405.   { Ausdrucken Schreibband bis obere Window-Grenze Zeile 1 }
  406.   Delay(300);
  407.   for j:=Band_Anfang2^.Stellen_Nr to 10 do
  408.   begin
  409.     if DruckStelle2^.Stellen_Nr<Band_Ende2^.Stellen_Nr then
  410.     begin
  411.       DruckStelle2:=DruckStelle2^.Right;
  412.       BandStellenDruck(DruckStelle2,'k');
  413.     end
  414.     else if DruckStelle2^.Stellen_Nr=Band_Ende2^.Stellen_Nr then
  415.     begin
  416.       new(Next2);
  417.       Band_Ende2^.Right:=Next2;
  418.       Next2^.Left:=Band_Ende2;
  419.       Band_Ende2:=Next2;
  420.       Band_Stellenzahl2:=Band_Stellenzahl2+1;
  421.       Band_Ende2^.Stellen_Nr:=Band_Stellenzahl2;
  422.       Band_Ende2^.Stelle:='■';
  423.       DruckStelle2:=Next2; Next2:=nil;
  424.       BandStellenDruck(DruckStelle2,'k');
  425.     end
  426.     else begin
  427.       set_Window(5); GotoXY(4,1);
  428.       Write('Lauf-Fehler! Abbruch des Programms!');
  429.       HALT;
  430.     end;
  431.   end;
  432.  
  433.   { Positionieren von Schreibkopf2, Next2 und Before2 }
  434.   Schreibkopf2:=Band_Anfang2;
  435.   Next2:=Schreibkopf2; Before2:=Schreibkopf2;
  436.   for j:=1 to 10 do begin
  437.     if not (Next2^.Stellen_Nr=Band_Ende2^.Stellen_Nr) then
  438.       Next2:=Next2^.Right;
  439.   end;
  440.   for j:=1 to 10 do begin
  441.     if not (Before2^.Stellen_Nr=Band_Anfang2^.Stellen_Nr) then
  442.       Before2:=Before2^.Left;
  443.   end;
  444.  
  445.   { Ermitteln und Setzen der Ablaufgeschwindigkeit }
  446.   set_Window(23); GotoXY(11,1); LowVideo; Write(Frequenz);
  447.   set_Window(21); LowVideo; Write(BandStelle);
  448.  
  449.   { Startbereitschaft hergestellt }
  450.   set_Window(3); GotoXY(4,1); ClrEol;
  451.   set_Window(4); GotoXY(25,2);
  452.   Write(' START mit beliebiger Taste ');
  453.   Repeat aa:=Readjez Until aa<>'?';
  454.   set_Window(3); GotoXY(4,1); ClrEol;
  455.   set_Window(4); GotoXY(25,2);
  456.   Write('                            ');
  457.  
  458.  
  459.   Repeat
  460.  
  461.   Delay(Frequenz);
  462.  
  463.   Repeat Befehl_Nr:=Befehl_Nr+1;
  464.          c:=c+1; if c>1000 then Abbruch:=true;
  465.          if Befehl_Nr>Max_Befehle then Befehl_Nr:=1;
  466.          k:=Befehl[Befehl_Nr].regel;
  467.          l:=Befehl[Befehl_Nr].code;
  468.   until ((Regel_Nr=k) and (Schreibkopf^.Stelle=l)) or Abbruch;
  469.  
  470.   if not Abbruch then begin
  471.     Zustand_Drucken(Spalte,Zeile,j_Merker,Befehl,Befehl_Nr);
  472.     set_Window(2); LowVideo;
  473.     with Befehl[Befehl_Nr] do begin
  474.       GotoXY(8,1); DelLine; GotoXY(8,4);
  475.       Write(regel,afiller,code,bfiller,
  476.                           anweisung,cfiller,verzweigung);
  477.     end;
  478.     set_Window(21); LowVideo;
  479.     BandStelle:=BandStelle+1; Write(BandStelle);
  480.  
  481.     { Leseband lesen + um eins nach rechts }
  482.     if not (Schreibkopf^.Stelle='■') and
  483.        not (Schreibkopf^.Stelle='s')        then
  484.     begin
  485.       if (Next^.Stellen_Nr=Band_Ende^.Stellen_Nr) then
  486.       begin
  487.         new(Neues_Element);
  488.         Band_Ende^.Right:=Neues_Element;
  489.         Neues_Element^.Left:=Band_Ende;
  490.         Band_Ende:=Neues_Element;
  491.         Neues_Element:=nil;
  492.         Band_Stellenzahl:=Band_Stellenzahl+1;
  493.         Band_Ende^.Stelle:='■';
  494.         Band_Ende^.Stellen_Nr:=Band_Stellenzahl;
  495.       end;
  496.       if Schreibkopf^.Stellen_Nr-10=Before^.Stellen_Nr then
  497.         Before:=Before^.Right;
  498.       Next:=Next^.Right; Schreibkopf:=Schreibkopf^.Right;
  499.       art:='r'; BandStellenDruck(Next,art);
  500.     end;
  501.  
  502.     { Schreibband beschreiben + um eins nach rechts }
  503.     art:=Befehl[Befehl_Nr].Anweisung;
  504.     Schreibkopf2^.Stelle:=Befehl[Befehl_Nr].Anweisung;
  505.     Delay(100); BandStellenDruck(Schreibkopf2,art);
  506.     Delay(300);
  507.     if not (Befehl[Befehl_Nr].Anweisung='s') then
  508.     begin
  509.      if Next2^.Stellen_Nr=Band_Ende2^.Stellen_Nr then
  510.      begin
  511.        new(Neues_Element2);
  512.        Band_Ende2^.Right:=Neues_Element2;
  513.        Neues_Element2^.Left:=Band_Ende2;
  514.        Band_Ende2:=Neues_Element2;
  515.        Neues_Element2:=nil;
  516.        Band_Stellenzahl2:=Band_Stellenzahl2+1;
  517.        Band_Ende2^.Stelle:='■';
  518.        Band_Ende2^.Stellen_Nr:=Band_Stellenzahl2;
  519.      end;
  520.      if Schreibkopf2^.Stellen_Nr-10=Before2^.Stellen_Nr then
  521.        Before2:=Before2^.Right;
  522.      Next2:=Next2^.Right;
  523.      Schreibkopf2:=Schreibkopf2^.Right;
  524.      art:='R';
  525.      BandStellenDruck(Next2,art);
  526.    end;
  527.  
  528.    Regel_Nr:=Befehl[Befehl_Nr].verzweigung;
  529.   end;
  530.  
  531.   Until (Befehl[Befehl_Nr].code='s') or Abbruch;
  532. end;  { proc Maschinen_Lauf }
  533.  
  534.  
  535. procedure Ende_Kommentar;
  536. begin
  537.   if Befehl[Befehl_Nr].code='s' then
  538.   begin
  539.     set_Window(4); GotoXY(20,2);
  540.     Write('Halten des endlichen Automaten im Endzustand');
  541.   end
  542.   else begin
  543.     set_Window(4); GotoXY(5,2);
  544.     Write('Vorzeitiges Halten! Das Band-Wort gehört ');
  545.     Write('nicht zum endlichen Automaten!');
  546.   end;
  547. end;  { proc Ende_Kommentar }
  548.  
  549.  
  550. Procedure Cursor(i:integer);
  551. begin
  552.   Case i of
  553.    1 : HiddenCursor;
  554.    2 : BlockCursor;
  555.    else end;
  556. end;  { proc Cursor }
  557.  
  558.  
  559. procedure initialisieren;
  560. begin
  561.   abbruch:=false;
  562.   Window(1,1,80,25); ClrScr;
  563.   j:=0; Zahl:='0'; Max_Befehle:=0; Befehl_Nr:=0;
  564. end;  { proc initialisieren }
  565.  
  566.  
  567. begin   { - - - - -  H A U P T P R O G R A M M  - - - - - }
  568.   initialisieren; install_Windows; set_Window(11); Cursor(1);
  569.  
  570.   if Datei_Einlesen(Max_Befehle,Befehl) then
  571.      Automaten_Druck(Befehl,Max_Befehle)
  572.   else begin
  573.      Set_Window(3); GotoXY(4,1);
  574.      Write('Keine Datei konnte eingelesen werden!');
  575.      Delay(2000);
  576.   end;
  577.  
  578.   if not Abbruch then begin
  579.     new(Band_Anfang); Schreibkopf:=Band_Anfang;
  580.     Band_Anfang^.Stelle:='■'; Band_Anfang^.Stellen_Nr:=0;
  581.     new(Band_Anfang2); Schreibkopf2:=Band_Anfang2;
  582.     Band_Anfang2^.Stelle:='■'; Band_Anfang2^.Stellen_Nr:=0;
  583.     Band_Stellenzahl:=0; Band_Stellenzahl2:=0; art:=' ';
  584.     SchreibkopfStelle:=0;
  585.  
  586.     Delay(600); Band_Eingabe;
  587.  
  588.     Band_Ende:=nil;          Band_Ende:=Schreibkopf;
  589.     Schreibkopf:=nil;        Schreibkopf:=Band_Anfang;
  590.     Next:=nil;               Next:=Band_Anfang;
  591.     Next:=Next^.Right;
  592.     Band_Ende2:=nil;          Band_Ende2:=Schreibkopf2;
  593.     Schreibkopf2:=nil;        Schreibkopf2:=Band_Anfang2;
  594.     Next2:=nil;               Next2:=Band_Anfang2;
  595.     Next2:=Next2^.Right;
  596.  
  597.     Maschinen_Lauf;
  598.  
  599.     Ende_Kommentar;
  600.     Repeat aa:=Readjez Until aa<>'?';
  601.   end;
  602.  
  603.   set_Window(0); GotoXY(1,1); Cursor(2);
  604. end.  { Programm endliche_Maschine_mit_Ausgabe }
  605.  
  606.  
  607.