home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / s5 / s5.sim < prev    next >
Encoding:
Text File  |  1990-12-28  |  14.4 KB  |  507 lines

  1.  
  2. procedure get_bst_bit;
  3.  
  4. begin
  5.   if mono then
  6.     textattr       := $0F
  7.   else
  8.     textattr       := $07;
  9.   write_screen(43,18,'Baustein:     ');
  10.   gotoxy(53,18);
  11.   bst              := read_int(false,3,0,0,9);
  12.   write_screen(43,18,'Bitnr.  :     ');
  13.   gotoxy(53,18);
  14.   bit              := read_int(false,3,0,0,7);
  15.   write_screen(43,18,'    Beenden     ');
  16.   gotoxy (46,18);
  17. end;
  18.  
  19.  
  20.  
  21. procedure led (on : boolean; max,bst,bit,offsp,offz : integer);
  22.  
  23. begin
  24.   if (bst <= max) then
  25.   begin
  26.     if on then
  27.       write_screen(bst*8+bit+offsp,offz,eins)
  28.     else
  29.       write_screen(bst*8+bit+offsp,offz,null)
  30.   end;
  31. end;
  32.  
  33.  
  34.  
  35. procedure ti_upd( bst,w : integer; b : boolean);
  36.  
  37. begin
  38.   if b then
  39.     t_[bst].wert   := t_[bst].wert + w
  40.   else
  41.     t_[bst].wert   := w;
  42.  
  43.   if (t_[bst].wert < 0) then
  44.     t_[bst].wert   := 0;
  45.   if (t_[bst].wert > maxkt) then
  46.     t_[bst].wert   := maxkt;
  47.  
  48.   write_screen(ti,bst+tz,int_to_str(t_[bst].wert,5));
  49.   if not b then
  50.     write_screen(ts,bst+tz,int_to_str(t_[bst].wert,3)+'.'+int_to_str(t_[bst].einheit,1));
  51. end;
  52.  
  53.  
  54.  
  55. procedure zi_upd( bst,w : integer; b : boolean);
  56.  
  57. begin
  58.   if b then
  59.     z_[bst].wert   := z_[bst].wert + w
  60.   else
  61.     z_[bst].wert   := w;
  62.  
  63.   if (z_[bst].wert < 0) then
  64.     z_[bst].wert   := 0;
  65.   if (z_[bst].wert > maxkz) then
  66.     z_[bst].wert   := maxkz;
  67.  
  68.   write_screen(zi,bst+zz,int_to_str(z_[bst].wert,5));
  69.   if not b then
  70.     write_screen(zs,bst+zz,int_to_str(z_[bst].wert,5));
  71. end;
  72.  
  73.  
  74.  
  75. procedure speed_upd( w : integer );
  76.  
  77. begin
  78.   speed                  := speed + w;
  79.   if (speed < 1) then
  80.     speed                := 100
  81.   else if (speed > 100) then
  82.     speed                := 1;
  83.   write_screen(42,4,int_to_str(speed,3));
  84. end;
  85.  
  86.  
  87.  
  88. procedure akku_upd( w,e : integer );
  89.  
  90. begin
  91.   akku.einheit           := e;
  92.   akku.wert              := w;
  93.   write_screen(42,21,int_to_str(akku.wert,3));
  94.   if (akku.einheit > -1) then
  95.     write_screen(45,21,'.'+int_to_str(akku.einheit,1))
  96.   else
  97.     write_screen(45,21,'  ');
  98. end;
  99.  
  100.  
  101.  
  102. procedure displ_upd;
  103.  
  104. var
  105. i,j                      :  integer;
  106.  
  107. begin
  108.   for j                  := scrollstart to scrollende do
  109.   begin
  110.     i                    := j - scrollstart;
  111.     with awl[j] do
  112.     begin
  113.       write_screen(23,disaw+i,int_to_str(j,4));
  114.       write_screen(28,disaw+i,'          ');
  115.       write_screen(28,disaw+i,operation);
  116.       write_screen(31,disaw+i,operand);
  117.       if (baustein >= 0) then
  118.       begin
  119.         write_screen(33,disaw+i,int_to_str(baustein,3));
  120.         if (bitnr >= 0) then
  121.           write_screen(36,disaw+i,'.'+int_to_str(bitnr,1));
  122.       end;
  123.       write_screen(39,disaw+i,null);
  124.       write_screen(41,disaw+i,null);
  125.     end;
  126.   end;
  127. end;
  128.  
  129.  
  130.  
  131. procedure sim_untermenue;
  132.  
  133. begin
  134.   write_screen(43, 8,'    Eingang     ');
  135.   write_screen(43,10,'    Ausgang     ');
  136.   write_screen(43,12,'    Merker      ');
  137.   write_screen(43,14,'                ');
  138.   write_screen(43,16,'                ');
  139.   write_screen(43,18,'    Beenden     ');
  140.   gotoxy (47,18);
  141.   repeat
  142.     getkey;
  143.     case upcase(key) of
  144.       'E'                :  begin
  145.                               get_bst_bit;
  146.                               if (bst <= maxe) then
  147.                               begin
  148.                                 e_[bst,bit]  := not e_[bst,bit];
  149.                                 led(e_[bst,bit],dise,bst,bit,es,ez);
  150.                               end;
  151.                             end;
  152.       'A'                :  begin
  153.                               get_bst_bit;
  154.                               if (bst <= maxa) then
  155.                               begin
  156.                                 a_[bst,bit]  := not a_[bst,bit];
  157.                                 led(a_[bst,bit],disa,bst,bit,as,az);
  158.                               end;
  159.                             end;
  160.       'M'                :  begin
  161.                               get_bst_bit;
  162.                               if (bst <= maxm) then
  163.                               begin
  164.                                 m_[bst,bit]  := not m_[bst,bit];
  165.                                 led(m_[bst,bit],dism,bst,bit,ms,mz);
  166.                               end;
  167.                             end;
  168.     end;
  169.     gotoxy (47,18);
  170.   until (upcase(key) = 'B');
  171. end;
  172.  
  173.  
  174.  
  175. procedure sim_anweisung;
  176.  
  177. var
  178. dis_ja,
  179. dis_aus                  :  boolean;
  180. xoperation               :  awtyp;
  181.  
  182. begin
  183.   with awl[aktaw] do
  184.   begin
  185.     if (operation[1] = 'B') then
  186.     begin
  187.       fillchar(ausgang,deep,#255);
  188.       if (operation = 'BE') or lastausgang then
  189.       begin
  190.         aktaw            := 1;
  191.         lastausgang      := false; (* ??? *)
  192.         oder_von_und     := false;
  193.       end;
  194.     end;
  195.   end;
  196.   with awl[aktaw] do
  197.   begin
  198.     xoperation           := operation;
  199.     dis_ja               := false;
  200.     dis_aus              := false;
  201.  
  202.     if (operand[1] = 'T') then ti_upd(baustein,-1,true); (* Pseudo Timer *)
  203.  
  204.     if (operand[1] in ['E','A','M','T','Z']) THEN
  205.     begin
  206.       case operand[1] of
  207.         'E'              :  ja         := e_[baustein,bitnr];
  208.         'A'              :  ja         := a_[baustein,bitnr];
  209.         'M'              :  ja         := m_[baustein,bitnr];
  210.         'T'              :  ja         := (t_[baustein].wert = 0);
  211.         'Z'              :  ja         := (z_[baustein].wert = 0);
  212.       end;
  213.       dis_ja             := ja;
  214.     end;
  215.     if (xoperation = ')') then
  216.     begin
  217.       ja                 := ausgang[klammern];
  218.       xoperation         := opr[klammern];
  219.       klammern           := pred(klammern);
  220.     end;
  221.     if (xoperation = 'U') then
  222.       ausgang[klammern]  := (ausgang[klammern] and ja)
  223.     else
  224.     if (xoperation = 'O') then
  225.     begin
  226.       if (operand = '') then                 (* Oder von Und *)
  227.       begin
  228.         oder_von_und     := (oder_von_und or lastausgang);
  229.         fillchar(ausgang,deep,#255);
  230.       end
  231.       else
  232.         ausgang[klammern]:= (ausgang[klammern] or  ja);
  233.     end
  234.     else if (xoperation = 'UN') then
  235.       ausgang[klammern]  := (ausgang[klammern] and not ja)
  236.     else if (xoperation = 'ON') then
  237.       ausgang[klammern]  := (ausgang[klammern] or  not ja);
  238.  
  239.     i                    := pos('(',operation);
  240.     if (i > 1) then
  241.     begin
  242.       klammern           := succ(klammern);
  243.       opr[klammern]      := copy(operation,1,i-1);
  244.     end;
  245.  
  246.     if ((operation <> '=') and (operation[1] <> 'S') and (operation <> 'R')) then
  247.       dis_aus            := ausgang[klammern];
  248.  
  249.     if (operation = '=') then
  250.     begin
  251.       dis_ja             := false;
  252.       dis_aus            := (dis_aus or lastausgang or oder_von_und);
  253.       case operand[1] of
  254.         'E'              :  begin
  255.                               e_[baustein,bitnr] := dis_aus;
  256.                               led(e_[baustein,bitnr],disa,baustein,bitnr,es,ez);
  257.                             end;
  258.         'A'              :  begin
  259.                               a_[baustein,bitnr] := dis_aus;
  260.                               led(a_[baustein,bitnr],disa,baustein,bitnr,as,az);
  261.                             end;
  262.         'M'              :  begin
  263.                               m_[baustein,bitnr] := dis_aus;
  264.                               led(m_[baustein,bitnr],dism,baustein,bitnr,ms,mz);
  265.                             end;
  266.       end;
  267.       fillchar(ausgang,deep,#255);
  268.       oder_von_und       := false;
  269.     end;
  270.  
  271.     if ((operation[1] = 'S') or (operation = 'R')) then
  272.     begin
  273.       dis_ja             := false;
  274.       dis_aus            := (dis_aus or lastausgang or oder_von_und);
  275.       if dis_aus then
  276.       begin
  277.       case operand[1] of
  278.         'E'              :  begin
  279.                               if (operation = 'S') then
  280.                                 e_[baustein,bitnr] := true
  281.                               else
  282.                                 e_[baustein,bitnr] := false;
  283.                               led(e_[baustein,bitnr],dise,baustein,bitnr,es,ez);
  284.                             end;
  285.         'A'              :  begin
  286.                               if (operation = 'S') then
  287.                                 a_[baustein,bitnr] := true
  288.                               else
  289.                                 a_[baustein,bitnr] := false;
  290.                               led(a_[baustein,bitnr],disa,baustein,bitnr,as,az);
  291.                             end;
  292.         'M'              :  begin
  293.                               if (operation = 'S') then
  294.                                 m_[baustein,bitnr] := true
  295.                               else
  296.                                 m_[baustein,bitnr] := false;
  297.                               led(m_[baustein,bitnr],dism,baustein,bitnr,ms,mz);
  298.                             end;
  299.         'T'              :  begin
  300.                               if (operation[1] = 'S') then
  301.                               begin
  302.                                 t_[baustein].einheit := akku.einheit;
  303.                                 ti_upd(baustein,akku.wert,false);
  304.                               end
  305.                               else
  306.                                 ti_upd(baustein,0,false);
  307.                             end;
  308.         'Z'              :  begin
  309.                               if (operation[1] = 'S') then
  310.                                 zi_upd(baustein,akku.wert,false)
  311.                               else
  312.                                 zi_upd(baustein,0,false);
  313.                             end;
  314.       end;
  315.       end;
  316.       fillchar(ausgang,deep,#255);
  317.       oder_von_und       := false;
  318.     end;
  319.  
  320.     if ((operation = 'L') and (operand[1] = 'K')) then
  321.     begin
  322.       dis_ja             := false;
  323.       dis_aus            := (dis_aus or lastausgang);
  324.       if dis_aus then       (* ??? *)
  325.       akku_upd(baustein,bitnr);
  326.     end;
  327.  
  328.     if (operation[1] = 'Z') then
  329.     begin
  330.       dis_ja             := false;
  331.       dis_aus            := (dis_aus or lastausgang or oder_von_und);
  332.       if dis_aus then
  333.       begin
  334.       case operation[2] of
  335.         'R'              :  begin
  336.                               zi_upd(baustein,-1,true);
  337.                             end;
  338.         'V'              :  begin
  339.                               zi_upd(baustein,+1,true);
  340.                             end;
  341.       end;
  342.       end;
  343.       fillchar(ausgang,deep,#255);
  344.       oder_von_und       := false;
  345.     end;
  346.  
  347.     lastausgang          := dis_aus;
  348.  
  349.     if (aktaw in [scrollstart..scrollende]) then
  350.     begin
  351.       j                  := disaw + (aktaw - scrollstart);
  352.       led(dis_ja ,80,0,0,39,j);
  353.       led(dis_aus,80,0,0,41,j);
  354.     end;
  355.     write_screen(44,10,int_to_str(aktaw,3));
  356.     write_screen(48,10,operation + '        ');
  357.     write_screen(51,10,operand + '      ');
  358.     if (baustein >= 0) then
  359.     begin
  360.       write_screen(53,10,int_to_str(baustein,3));
  361.       if (bitnr >= 0) then
  362.         write_screen(56,10,'.'+int_to_str(bitnr,1));
  363.     end;
  364.   end;
  365.  
  366.   aktaw                  := succ(aktaw);
  367.   if (aktaw > anzaw) then
  368.     aktaw                := 1;
  369.   for i                  := speed to 100 do
  370.     for j                := 1 to delay do;
  371. end;
  372.  
  373.  
  374. procedure change_e(bst,bit : integer);
  375.  
  376. begin
  377.   e_[bst,bit]  := not e_[bst,bit];
  378.   led(e_[bst,bit],dise,bst,bit,es,ez);
  379. end;
  380.  
  381.  
  382. procedure ftaste;
  383.  
  384. begin
  385.   case ord(key) of
  386.    84.. 91 (* sf1-sf8 *) :  change_e(0,ord(key)-84);
  387.    94..101 (* cf1-cf8 *) :  change_e(1,ord(key)-94);
  388.   104..111 (* af1-af8 *) :  change_e(2,ord(key)-104);
  389.     72                   :  if (scroll and (scrollstart > 1)) then
  390.                             begin
  391.                               dec(scrollstart);
  392.                               dec(scrollende);
  393.                               displ_upd;
  394.                             end;
  395.     80                   :  if (scroll and (scrollende < anzaw)) then
  396.                             begin
  397.                               inc(scrollstart);
  398.                               inc(scrollende);
  399.                               displ_upd;
  400.                             end;
  401.     77                   :  speed_upd(1);
  402.     75                   :  speed_upd(-1);
  403.   end;
  404. end;
  405.  
  406.  
  407.  
  408. procedure sim_hauptmenue;
  409.  
  410. var
  411. i,j                      :  integer;
  412.  
  413. begin
  414.   write_screen(43, 8,'   Veraendern   ');
  415.   write_screen(43,10,'[   ]           ');
  416.   write_screen(43,12,'   Einzelanw.   ');
  417.   write_screen(43,14,'   Start Prg.   ');
  418.   write_screen(43,16,'   Stop  Prg.   ');
  419.   write_screen(43,18,'   Quittieren   ');
  420.   displ_upd;
  421.   repeat
  422.     gotoxy (46,18);
  423.     getkey;
  424.     if fkey then
  425.       ftaste
  426.     else
  427.     begin
  428.       case upcase(key) of
  429.         'E'              :  sim_anweisung;
  430.         'S'              :  repeat
  431.                               while ((aktaw <= anzaw) and not keypressed) do
  432.                                 sim_anweisung;
  433.                               if keypressed then
  434.                                 if (key = #0) then
  435.                                 begin
  436.                                   key  := readkey;
  437.                                   ftaste;
  438.                                 end
  439.                                 else
  440.                                   key  := upcase(readkey);
  441.                             until (key = 'S');
  442.       end;
  443.     end;
  444.   until ((upcase(key) = 'Q') or (upcase(key) = 'V')) and not fkey;
  445. end;
  446.  
  447.  
  448.  
  449. procedure sim_init;
  450.  
  451. begin
  452.   for j            := 0 to maxe do
  453.     for i          := 0 to 7 do
  454.       e_[j,i]      := false;
  455.   for j            := 0 to maxa do
  456.     for i          := 0 to 7 do
  457.       a_[j,i]      := false;
  458.   for j            := 0 to maxm do
  459.     for i          := 0 to 7 do
  460.       m_[j,i]      := false;
  461.   for j            := 0 to maxt do
  462.   begin
  463.     t_[j].wert     := 0; (* ??? *)
  464.     t_[j].einheit  := 0;
  465.   end;
  466.   for j            := 0 to maxz do
  467.     z_[j].wert     := 0; (* ??? *)
  468.  
  469.   fillchar(ausgang,deep,#255);
  470.   lastausgang            := false;
  471.   oder_von_und           := false;
  472.   aktaw                  := 1;
  473.   klammern               := 1;
  474.   scrollstart            := 1;
  475.   if (anzaw < 15) then
  476.   begin
  477.     scroll               := false;
  478.     scrollende           := anzaw;
  479.   end
  480.   else
  481.   begin
  482.     scroll               := true;
  483.     scrollende           := 14;
  484.   end;
  485. end;
  486.  
  487.  
  488. procedure simulation;
  489.  
  490. begin
  491.   cursor_aus;
  492.   window(1,1,80,25);
  493.   restore_screen(3);
  494.   sim_init;
  495.   repeat
  496.     sim_hauptmenue;
  497.     if (upcase(key) = 'V') then
  498.     begin
  499.       cursor_ein;
  500.       sim_untermenue;
  501.       cursor_aus;
  502.     end;
  503.   until (upcase(key) = 'Q');
  504.   cursor_ein;
  505.   message(mess[2])
  506. end;
  507.