Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / HTML / MicroMan / monitors.htm
1 <PRE>
2 <B>program</B> monitors;
3  
4 (* this an example showing 5 processes: two of them are in fact monitors, one controls the screen=ekran *)
5
6   <B>unit</B> ANSI: <B>class</B>;  
7   (* CHECK whether config.sys contains a line device=ansi.sy the class ANSI enables operations on cursor, and bold, blink, underscore etc. *) 
8                                
9   <B>unit</B> Bold : <B>procedure</B>;
10   <B>begin</B>
11     write( chr(27), "[1m")
12   <B>end</B> Bold;
13     
14   <B>unit</B> Blink : <B>procedure</B>;
15   <B>begin</B>
16     write( chr(27), "[5m")
17   <B>end</B> Blink;
18   
19   <B>unit</B> Reverse : <B>procedure</B>;
20   <B>begin</B>
21     write( chr(27), "[7m")
22   <B>end</B> Reverse;
23
24   <B>unit</B> Normal : <B>procedure</B>;
25   <B>begin</B>
26     write( chr(27), "[0m")
27   <B>end</B> Normal;
28   
29   <B>unit</B> Underscore : <B>procedure</B>;
30   <B>begin</B>
31     write( chr(27), "[4m")
32   <B>end</B> Underscore;
33
34   <B>unit</B> inchar : IIUWgraph <B>function</B> : integer;
35     (*podaj nr znaku przeslanego z klawiatury *)
36     <B>var</B> i : integer;
37   <B>begin</B>
38     <B>do</B>
39       i := inkey;
40       <B>if</B> i <> 0 <B>then</B> <B>exit</B> <B>fi</B>;
41     <B>od</B>;
42     <B>result</B> := i;
43   <B>end</B> inchar;
44   
45   <B>unit</B> NewPage : <B>procedure</B>;
46   <B>begin</B>
47     write( chr(27), "[2J")
48   <B>end</B> NewPage;
49   
50   <B>unit</B>  SetCursor : <B>procedure</B>(row, column : integer);
51     <B>var</B> c,d,e,f  : char,
52         i,j : integer;
53   <B>begin</B>
54     i := row <B>div</B> 10;
55     j := row <B>mod</B> 10;
56     c := chr(48+i);
57     d := chr(48+j);
58     i := column <B>div</B> 10;
59     j := column <B>mod</B> 10;
60     e := chr(48+i);
61     f := chr(48+j);
62     write( chr(27), "[", c, d, ";", e, f, "H")
63   <B>end</B> SetCursor;        
64 <B>end</B> ANSI;
65
66   
67     <B>unit</B> monitor:  process(node:integer, size:integer,e: ekran);
68
69        <B>var</B> buf: <B>arrayof</B> integer,
70            nr,i,j,k1,k2,n1,n2: integer;
71
72         
73     <B>unit</B> lire: <B>procedure</B>(<B>output</B> k: integer);
74     <B>begin</B>
75       <B>call</B> e.druk(13,2+nr*30+k1,0,k2);
76       <B>call</B> e.druk(13,2+nr*30+(i-1)*6,1,buf(i));
77       k1:=(i-1)*6;
78       k:=buf(i);
79       k2:=k;
80       i:= (i <B>mod</B> size)+1;
81       <B>if</B> i=j
82       <B>then</B>
83         <B>call</B> e.printtext("i equal j")
84       <B>fi</B>; 
85     <B>end</B> lire;
86     
87     <B>unit</B> ecrire: <B>procedure</B>(n:integer);
88     <B>begin</B>
89       <B>call</B> e.druk(13,2+nr*30+n1,0,n2);
90       <B>call</B> e.druk(13,2+nr*30+(j-1)*6,2,n);
91       n1:=(j-1)*6;
92       buf(j) := n;
93       n2:=buf(j);
94       j := (j <B>mod</B> size)+1;
95       <B>if</B> i=j
96       <B>then</B>
97         <B>call</B> e.printtext("j equal i")
98       <B>fi</B>; 
99     <B>end</B> ecrire;
100   <B>begin</B>
101     <B>array</B> buf <B>dim</B>(1:size);
102     nr := size - 4;
103     <B>for</B> i := 1 to size
104     <B>do</B>
105       buf(i) :=  i+nr*4;
106       <B>call</B> e.druk(13,2+nr*30+(i-1)*6,0,buf(i));
107     <B>od</B>;
108     i:=1;  
109     j := size;
110     k1:=0;
111     k2:=buf(1);
112     n1:=(size-1)*6;
113     n2:=buf(size);
114     (* <B>end</B> initialize buffer *)
115     <B>return</B>;
116     
117     <B>do</B>
118       <B>accept</B> lire, ecrire
119     <B>od</B>
120   <B>end</B> monitor;
121   
122   <B>unit</B> prcs:  process(node,nr:integer, mleft,mright:
123                                                          monitor, e: ekran);
124     <B>var</B> l,o: integer;
125
126   <B>begin</B>
127     <B>call</B> e.SetCursor(8+(nr-1)*10,29);
128     <B>if</B> nr = 1
129     <B>then</B>
130       <B>call</B> e.printtext("<-- p1 <--");
131     <B>else</B>
132       <B>call</B> e.printtext("--> p2 -->");
133     <B>fi</B>;    
134     <B>return</B>;
135     <B>do</B>
136       <B>call</B> mleft.lire(l) ;
137       <B>call</B> e.druk(11+(nr-1)*4,31-(nr-1)*8,1,l);
138       l:= l+1;
139       <B>call</B> mright.ecrire(l) ; 
140       <B>call</B> e.druk(10+(nr-1)*6,23+(nr-1)*8,2,l);
141       <B>if</B> l <B>mod</B> 15 = 0 
142       <B>then</B>
143         o:= e.inchar;
144               <B>if</B> o = -79 <B>then</B> <B>call</B> <B>endrun</B> <B>fi</B>;
145       <B>fi</B>;        
146     <B>od</B>;
147   <B>end</B> prcs;
148   
149 <B>unit</B> ekran : ANSI process(nrprocesora: integer);
150     <B>unit</B> printtext: <B>procedure</B>(s:string);
151     <B>begin</B>
152       write(s);
153       <B>call</B> Normal;
154     <B>end</B> printtext;
155
156     <B>unit</B>  druk: <B>procedure</B>(gdzieW,gdzieK,jak,co:integer);
157     <B>begin</B>
158       <B>call</B> SetCursor(gdzieW,gdzieK);
159       write("   ");
160       <B>if</B> jak=0 <B>then</B> <B>call</B> Normal <B>else</B>
161         <B>if</B> jak=1 <B>then</B> <B>call</B> Reverse <B>else</B>
162           <B>if</B> jak=2 <B>then</B> <B>call</B> Bold 
163           <B>fi</B>
164         <B>fi</B>
165       <B>fi</B>;
166       write(co:3);
167       <B>call</B> Normal;
168     <B>end</B> druk;
169
170     <B>unit</B> print: <B>procedure</B> (i:integer);
171     <B>begin</B>
172       write(i:4)
173     <B>end</B> print;
174   <B>begin</B>
175     <B>return</B>;
176     
177     <B>do</B> <B>accept</B> inchar, 
178               Normal,NewPage, SetCursor, Bold, Underscore,
179               Reverse, Blink, print, printtext, druk
180     <B>od</B>
181   <B>end</B> ekran;
182   
183 <B>var</B> m1,m2:monitor,
184     e:ekran,
185     p1,p2:prcs;
186      
187 <B>begin</B>     (* ----- HERE IS THE MAIN PROGRAM ----- *)
188   (* create a  configuration *)
189   e:= <B>new</B> ekran(0);
190   <B>resume</B>(e);
191   <B>call</B> e.Normal;
192   <B>call</B> e.NewPage;
193   m1 := <B>new</B> monitor(0,4,e);
194   m2 := <B>new</B> monitor(0,5,e);
195   
196   p1 := <B>new</B> prcs(0,1,m2,m1,e);
197   p2 := <B>new</B> prcs(0,2,m1,m2,e);
198     
199   <B>resume</B>(m1);
200   <B>resume</B>(m2);
201   <B>resume</B>(p1);
202   <B>resume</B>(p2);
203 <B>end</B> monitors;
204 </PRE>