home *** CD-ROM | disk | FTP | other *** search
-
- procedure get_i (w : boolean);
-
- begin
- textattr := $30;
- if w then
- begin
- write_screen(41,18,'Sollwert: ');
- gotoxy(51,18);
- i := read_int(false,5,0,0,65535);
- end
- else
- begin
- write_screen(41,18,'Kennzahl: ');
- gotoxy(51,18);
- i := read_int(false,3,0,1,128);
- end;
- write_screen(41,18,' Beenden ');
- gotoxy (44,18);
- end;
-
-
-
- procedure led (on : boolean; m,s,p,z : integer);
-
- begin
- if (s < m) then
- begin
- if on then
- write_screen(s+p,z,eins)
- else
- write_screen(s+p,z,null);
- end;
- end;
-
-
-
- procedure ti_upd (k,w : integer);
-
- begin
- if (w < 0) then
- t_[k].ist := t_[k].ist + w
- else
- t_[k].ist := w;
- if (k < dist) then
- write_screen(ti,k+tz,int_to_str(t_[k].ist,5));
- end;
-
-
-
- procedure zi_upd (k,w : integer);
-
- begin
- if (w < 0) then
- z_[k].ist := z_[k].ist + w
- else
- z_[k].ist := w;
- if (k < disz) then
- write_screen(zi,k+zz,int_to_str(z_[k].ist,5));
- end;
-
-
-
- procedure speed_upd( w : integer );
-
- begin
- speed := speed + w;
- if (speed < 1) then
- speed := 100
- else if (speed > 100) then
- speed := 1;
- write_screen(42,4,int_to_str(speed,3));
- end;
-
-
-
- procedure displ_upd;
-
- var
- i,j : integer;
-
- begin
- for j := scrollstart to scrollende do
- begin
- i := j - scrollstart;
- with awl[j] do
- begin
- write_screen(25,disaw+i,int_to_str(j,3));
- write_screen(29,disaw+i,' ');
- write_screen(29,disaw+i,operation);
- write_screen(32,disaw+i,operand);
- if (kennzahl > 0) then
- write_screen(33,disaw+i,int_to_str(kennzahl,3));
- end;
- end;
- end;
-
-
-
- procedure sim_untermenue;
-
- begin
- write_screen(42, 8,' Eingang ');
- write_screen(42,10,' Ausgang ');
- write_screen(42,12,' Merker ');
- write_screen(42,14,' Timer ');
- write_screen(42,16,' Zaehler ');
- write_screen(42,18,' Beenden ');
- gotoxy (44,18);
- repeat
- getkey;
- case upcase(key) of
- 'E' : begin
- get_i(false);
- if (i <= maxe) then
- begin
- e_[i] := not e_[i];
- led(e_[i],dise,i,es,ez);
- end;
- end;
- 'A' : begin
- get_i(false);
- if (i <= maxa) then
- begin
- a_[i] := not a_[i];
- led(a_[i],disa,i,as,az);
- end;
- end;
- 'M' : begin
- get_i(false);
- if (i <= maxm) then
- begin
- m_[i] := not m_[i];
- led(m_[i],dism,i,ms,mz);
- end;
- end;
- 'T' : begin
- get_i(false);
- if (i <= maxt) then
- begin
- j := i;
- get_i(true);
- t_[j].soll := i;
- if (j < dist) then
- write_screen(ts,j+tz,int_to_str(t_[j].soll,5));
- ti_upd(j,i);
- end;
- end;
- 'Z' : begin
- get_i(false);
- if (i <= maxz) then
- begin
- j := i;
- get_i(true);
- z_[j].soll := i;
- if (j < disz) then
- write_screen(zs,j+zz,int_to_str(z_[j].soll,5));
- zi_upd(j,i);
- end;
- end;
-
- end;
- gotoxy (44,18);
- until (upcase(key) = 'B');
- end;
-
-
-
- procedure sim_anweisung;
-
- var
- dis_ja,
- dis_aus : boolean;
- xoperation : awtyp;
-
- begin
- with awl[aktaw] do
- begin
- if (operation = 'PE') then
- begin
- fillchar(ausgang,deep,#255);
- aktaw := 1;
- end;
- if (operation = 'SW') and ausgang[klammern] then
- begin
- fillchar(ausgang,deep,#255);
- if (kennzahl < anzaw) then
- aktaw := kennzahl
- else
- aktaw := 1;
- end;
- end;
- with awl[aktaw] do
- begin
- xoperation := operation;
- dis_ja := false;
- dis_aus := false;
- if (operand[1] in ['E','A','M','T','Z']) THEN
- begin
- case operand[1] of
- 'E' : ja := e_[kennzahl];
- 'A' : ja := a_[kennzahl];
- 'M' : ja := m_[kennzahl];
- 'T' : ja :=(t_[kennzahl].ist = 0);
- 'Z' : ja :=(z_[kennzahl].ist = 0);
- end;
- dis_ja := ja;
- end;
- if (xoperation = ')') then
- begin
- ja := ausgang[klammern];
- xoperation := opr[klammern];
- klammern := pred(klammern);
- end;
- if (xoperation = 'U') then
- ausgang[klammern] := (ausgang[klammern] and ja)
- else if (xoperation = 'O') then
- ausgang[klammern] := (ausgang[klammern] or ja)
- else if (xoperation = 'UN') then
- ausgang[klammern] := (ausgang[klammern] and not ja)
- else if (xoperation = 'ON') then
- ausgang[klammern] := (ausgang[klammern] or not ja);
-
- i := pos('(',operation);
- if (i > 1) then
- begin
- klammern := succ(klammern);
- opr[klammern] := copy(operation,1,i-1);
- end;
- dis_aus := ausgang[klammern];
- if (operation[1] = '=') then
- begin
- dis_ja := false;
- if (operation[2] = 'N') then
- ausgang[klammern]:= not ausgang[klammern];
- case operand[1] of
- 'A' : begin
- a_[kennzahl] := ausgang[klammern];
- led(a_[kennzahl],disa,kennzahl,as,az);
- end;
- 'M' : begin
- m_[kennzahl] := ausgang[klammern];
- led(m_[kennzahl],dism,kennzahl,ms,mz);
- end;
- 'E' : begin
- e_[kennzahl] := ausgang[klammern];
- led(e_[kennzahl],disa,kennzahl,es,ez);
- end;
- 'L' : if (ausgang[klammern]) then
- zi_upd(kennzahl,z_[kennzahl].soll);
- 'I' : if (ausgang[klammern] and (z_[kennzahl].ist > 0)) then
- zi_upd(kennzahl,-1);
- 'T' : if (ausgang[klammern]) then
- begin
- if (t_[kennzahl].ist > 0) then
- ti_upd(kennzahl,-1);
- end
- else
- ti_upd(kennzahl,t_[kennzahl].soll);
- end;
- fillchar(ausgang,deep,#255);
- end;
- if ((operation = 'SL') or (operation = 'RL')) then
- begin
- dis_ja := false;
- if (ausgang[klammern]) then
- case operand[1] of
- 'A' : begin
- if (operation[1] = 'S') then
- a_[kennzahl] := true
- else
- a_[kennzahl] := false;
- led(a_[kennzahl],disa,kennzahl,as,az);
- end;
- 'M' : begin
- if (operation[1] = 'S') then
- m_[kennzahl] := true
- else
- m_[kennzahl] := false;
- led(m_[kennzahl],dism,kennzahl,ms,mz);
- end;
- end;
- fillchar(ausgang,deep,#255);
- end;
- if (aktaw in [scrollstart..scrollende]) then
- begin
- j := disaw + (aktaw - scrollstart);
- led(dis_ja ,80,0,37,j);
- led(dis_aus,80,0,39,j);
- end;
- write_screen(43,10,int_to_str(aktaw,3));
- write_screen(47,10,operation + ' ');
- write_screen(50,10,operand);
- if (kennzahl > 0) then
- write_screen(51,10,int_to_str(kennzahl,3));
- end;
-
- aktaw := succ(aktaw);
- if (aktaw > anzaw) then
- aktaw := 1;
- for i := speed to 100 do
- for j := 1 to delay do;
- end;
-
-
-
- procedure ftaste;
-
- begin
- case ord(key) of
- 84..103 : begin
- i := ord(key) - 83;
- e_[i] := not e_[i];
- led(e_[i],dise,i,es,ez);
- end;
- 72 : if (scroll and (scrollstart > 1)) then
- begin
- dec(scrollstart,1);
- dec(scrollende ,1);
- displ_upd;
- end;
- 80 : if (scroll and (scrollende < anzaw)) then
- begin
- inc(scrollstart,1);
- inc(scrollende ,1);
- displ_upd;
- end;
- 77 : speed_upd(1);
- 75 : speed_upd(-1);
- end;
- end;
-
-
-
- procedure sim_hauptmenue;
-
- var
- i,j : integer;
-
- begin
- write_screen(42, 8,' Veraendern ');
- write_screen(42,10,'[ ] ');
- write_screen(42,12,' Einzelanw. ');
- write_screen(42,14,' Start Prg. ');
- write_screen(42,16,' Stop Prg. ');
- write_screen(42,18,' Quittieren ');
- displ_upd;
- repeat
- gotoxy (43,18);
- getkey;
- if fkey then
- ftaste
- else
- begin
- case upcase(key) of
- 'E' : sim_anweisung;
- 'S' : repeat
- while ((aktaw <= anzaw) and not keypressed) do
- sim_anweisung;
- if keypressed then
- if (key = #0) then
- begin
- key := readkey;
- ftaste;
- end
- else
- key := upcase(readkey);
- until (key = 'S');
- end;
- end;
- until ((upcase(key) = 'Q') or (upcase(key) = 'V')) and not fkey;
- end;
-
-
-
- procedure sim_init;
-
- begin
- fillchar(e_,maxe,#0);
- fillchar(a_,maxa,#0);
- fillchar(m_,maxm,#0);
- fillchar(t_,maxt * 2 * intsize,#0);
- fillchar(z_,maxz * 2 * intsize,#0);
- fillchar(ausgang,deep,#255);
- aktaw := 1;
- klammern := 1;
- scrollstart := 1;
- if (anzaw < 15) then
- begin
- scroll := false;
- scrollende := anzaw;
- end
- else
- begin
- scroll := true;
- scrollende := 14;
- end;
- end;
-
-
- procedure simulation;
-
- begin
- cursor_aus;
- window(1,1,80,25);
- restore_screen(3);
- sim_init;
- repeat
- sim_hauptmenue;
- if (upcase(key) = 'V') then
- begin
- cursor_ein;
- sim_untermenue;
- cursor_aus;
- end;
- until (upcase(key) = 'Q');
- cursor_ein;
- message(mess[2])
- end;