3 (* Projet LI1 : Didacticiel sur les coroutines. *)
\r
4 (* Realise par CHICHER Corinne et DOME Nadege - UPPA 1993/1994 - *)
\r
11 VAR nooper,typexec,touche:integer,
\r
12 i,b,h,v,num,xpa,ypa:integer,
\r
13 g,d,c,driver,selection,demarrage,ptarok,stopexec:boolean;
\r
15 (* nooper:correspond soit a l'execution du programmes soit a l'affichage*)
\r
16 (* d'informations sur les coroutines.*)
\r
17 (* typexec:type de l'execution du programme ou types de renseignements sur*)
\r
18 (* les coroutines.*)
\r
19 (* demarrage a vrai si choix de l'icone Execution*)
\r
20 (* ptarok a vrai l'utilisateur a choisi un point d'arret*)
\r
21 (* stopexec a vrai si l'utilisateur a clique sur l'icone Quitter*)
\r
24 (******************************************************************************)
\r
25 (* Procedures permettant la gestion de l'ecran en mode texte et graphique *)
\r
26 (******************************************************************************)
\r
28 (* NewPage vide l'ecran en mode texte *)
\r
29 UNIT NewPage : PROCEDURE;
\r
31 write( chr(27), "[2J");
\r
34 (* SetCursor positionne le curseur aux lignes et colonnes indiquees *)
\r
35 UNIT SetCursor : PROCEDURE(ligne,colonne:integer);
\r
47 write( chr(27), "[", c, d, ";", e, f, "H");
\r
51 (* inchar saisit un caractere en mode graphique *)
\r
52 UNIT inchar : FUNCTION : integer;
\r
65 (* ReadInteger lit un entier positif a 3 chiffres avec echo a l'ecran *)
\r
66 UNIT ReadInteger : FUNCTION : integer;
\r
67 VAR X,Y,i,OrdN : integer,
\r
68 Number : arrayof integer;
\r
70 array Number dim( 1 : 4 );
\r
76 if i=8 or (OrdN < 48 and OrdN > 57) then
\r
100 when 8 : if i > 0 then
\r
105 when 13 : if i > 0 then
\r
112 call hascii(48+Number(1));
\r
117 call hascii(48+Number(2));
\r
122 call hascii(48+Number(3));
\r
125 if (Number(1) = 0) or (Number(1) = 0 and Number(2) = 0)
\r
126 or (Number(1) = 0 and Number(2) = 0 and Number(3) = 0) then
\r
136 result:=10 * Number(1) + Number(2);
\r
138 result:=100 * Number(1) + 10 * Number(2) + Number(3);
\r
144 (* WriteInteger permet d'afficher un entier positif a 3 chiffres a l'ecran *)
\r
145 UNIT WriteInteger : PROCEDURE(Number:integer);
\r
148 if Number < 10 then
\r
150 call HASCII(Number+48);
\r
153 if Number < 100 then
\r
155 j:=Number - i * 10;
\r
162 j:=(Number - i * 100) div 10;
\r
163 k:=Number - i * 100 - j * 10;
\r
175 (*******************************************************************************)
\r
176 (* Procedures gerant un click de la souris sur l'ecran *)
\r
177 (*******************************************************************************)
\r
179 (* Si choix=0 l'utilisateur a clique sur l'icone Quitter*)
\r
180 (* presentbout gere le click lors de la page de presentation*)
\r
181 UNIT presentbout : PROCEDURE(x,y:integer;inout bonclic:boolean,choix:integer);
\r
183 if (x >= 12) and (x <= 92) then
\r
184 if (y >= 296) and (y <= 312) then
\r
189 if (x >= 116) and (x<=284) then
\r
190 if (y >= 296) and (y <= 312) then
\r
192 choix:=1; (* Click sur l'icone execution*)
\r
198 (* Mousepos gere la position de la souris a l'endroit ou le bouton gauche *)
\r
199 (* a ete presse dans le premier ecran *)
\r
200 UNIT MOUSEPOS : PROCEDURE(x,y:integer;inout bonclic:boolean;output choix:integer);
\r
202 if (x >= 24) and (x <= 544) then
\r
203 if (y >= 96) and (y <= 104) then
\r
204 choix:=1; (* Click sur execution du programme*)
\r
208 if (y >= 112) and (y <= 120) then
\r
209 choix:=2; (* Click sur A propos des coroutines*)
\r
213 if (y >= 160) and (y <= 168) then
\r
214 choix:=3; (* Click sur execution normale du programme *)
\r
215 (* ou sur definition et interet des coroutines*)
\r
219 if (y >= 176) and (y <= 184) then
\r
220 choix:=4; (* Click sur execution pas a pas du programme*)
\r
221 (* ou sur le schema de la semantique *)
\r
225 if (y >= 192) and (y <= 200) then
\r
226 choix:=5; (* click sur l'execution avec point d'arret*)
\r
230 if (y >= 224) and (y <= 232) then
\r
239 (* POSmouse gere la position de la souris a l'endroit ou le bouton gauche *)
\r
240 (* a ete presse dans le deuxieme ecran*)
\r
241 UNIT POSmouse : PROCEDURE(x,y:integer;inout bonclic:boolean;output choix:integer);
\r
243 if (x >= 12) and (x <= 92) then
\r
244 if (y >= 236) and (y <= 252) then
\r
248 if (y >= 256) and (y <= 272) then
\r
256 (* ptarret gere la position de la souris a l'endroit ou le bouton gauche *)
\r
257 (* a ete presse pour la selection du point d'arret*)
\r
258 UNIT ptarret : PROCEDURE(x,y:integer;inout bonclic:boolean;output choix:integer);
\r
261 (* Click sur une ligne du main*)
\r
262 if (x >= 12) and (x <= 200) then
\r
263 if ((y > 24) and (y < 32))or((y > 48) and (y < 80))
\r
264 or ((y > 88) and (y < 144)) then
\r
270 (* Click sur une ligne de producer*)
\r
271 if (x >= 216) and (x <= 412) then
\r
272 if ((y > 24) and (y < 32)) or ((y >40) and (y < 136)) then
\r
278 (* Click sur une ligne de consumer*)
\r
279 if (x >= 428) and (x <= 628) then
\r
280 if ((y > 24) and (y < 32)) or ((y > 48) and (y < 248)) then
\r
286 (* Click sur l'icone "Quitter"*)
\r
287 if (x>=12) and (x<=92) then
\r
288 if(y>=256) and (y<=272) then
\r
295 (* GoStop gere la position de la souris a l'endroit ou le bouton gauche *)
\r
296 (* a ete presse dans le deuxieme ecran avec l'execution pas a pas*)
\r
297 UNIT GoStop : PROCEDURE(x,y:integer;inout bonclic:boolean,choix:integer);
\r
299 if (x >= 120) and (x <= 200) then
\r
300 if (y >= 236) and (y <= 252) then
\r
305 if (x >= 12) and (x <= 92) then
\r
306 if (y >= 256) and (y <= 272) then
\r
314 (* clicquit gere le click sur quitter quand le point d'arret a ete atteint*)
\r
315 UNIT clicquit : PROCEDURE(x,y:integer;inout bonclic:boolean);
\r
317 if (x >= 12) and (x <= 92) then
\r
318 if (y >= 256) and (y <= 272) then
\r
324 (*textquit gere le click sur quitter quand l'utilisateur a lu les informations*)
\r
325 UNIT textquit : PROCEDURE(x,y:integer;inout bonclic:boolean,choix:integer);
\r
327 if (x >= 8) and (x <= 88) then
\r
328 if (y >= 320) and (y <= 336) then
\r
333 if (x >= 428) and (x<=558) then
\r
334 if (y >= 320) and (y <= 336) then
\r
342 (********************************************************************************)
\r
343 (* Procedures gerant les dessins geometriques a l'ecran *)
\r
344 (********************************************************************************)
\r
346 (* cadre trace un rectangle *)
\r
347 UNIT cadre : PROCEDURE(xg,yg,xd,yd,couleur:integer);
\r
349 call COLOR(couleur);
\r
360 (* encadrpt determine et encadre la ligne correspondant au point d'arret*)
\r
361 UNIT encadrpt : PROCEDURE(input numcode:integer;inout y:integer);
\r
362 VAR ycadre,bornesup,xdeb,xfin,couleur:integer,
\r
381 while not trouve and ycadre<=bornesup
\r
383 if y >=ycadre and y<=ycadre+8 then
\r
390 call cadre(xdeb,ycadre,xfin,ycadre+8,couleur);
\r
395 (********************************************************************************)
\r
396 (* Procedures mettant en place les differents ecrans *)
\r
397 (********************************************************************************)
\r
399 (* Presentation de l'application*)
\r
400 UNIT presentation : PROCEDURE;
\r
401 VAR couleur,choix:integer;
\r
405 (* Mise en place des boutons*)
\r
406 call cadre(12,296,92,312,12);
\r
408 call OUTSTRING("Quitter");
\r
410 call cadre(116,296,284,312,12);
\r
411 call MOVE(120,300);
\r
412 call OUTSTRING("Lancer l'application");
\r
415 call MOVE(370,304);
\r
416 call OUTSTRING("Licence informatique - UPPA 1994");
\r
420 call OUTSTRING("Corinne CHICHER & Nadege DOME");
\r
422 call OUTSTRING("Vous presentent");
\r
423 call MOVE(169,128);
\r
424 call OUTSTRING("UN DIDACTICIEL SUR LES COROUTINES");
\r
425 call MOVE(157,152);
\r
426 call OUTSTRING("DANS LE LANGAGE ORIENTE OBJET LOGLAN");
\r
430 call cadre(137,48,465,176,7);
\r
432 (* Gestion de la souris *)
\r
434 call SETPOSITION(0,0);
\r
437 call GETPRESS(0,h,v,b,g,d,c);
\r
439 call presentbout(h,v,selection,choix);
\r
440 if not selection then
\r
444 if choix=0 then (* L'utilisateur a selectionne Quitter*)
\r
456 (* menu propose les programmes a executer et le type d'execution *)
\r
457 UNIT menu : PROCEDURE(inout numop1,numop2:integer);
\r
458 VAR i,touche,couleur:integer,
\r
469 call OUTSTRING("DIDACTICIEL SUR LES COROUTINES");
\r
471 call cadre(24,56,544,240,couleur);
\r
474 call OUTSTRING("Execution du programme 'Producteur-Consommateur'");
\r
476 call OUTSTRING("A propos des 'Coroutines'...");
\r
479 call OUTSTRING("Quitter l'application");
\r
482 call OUTSTRING("Selectionnez l'operation avec le bouton gauche de la souris...");
\r
485 (* Gestion de la souris *)
\r
487 call SETPOSITION(0,0);
\r
490 call GETPRESS(0,h,v,b,g,d,c);
\r
492 call MOUSEPOS(h,v,selection,numop1);
\r
493 if not selection then
\r
497 if numop1=0 then (* L'utilisateur a selectionne Quitter*)
\r
508 if numop1=1 then (* L'utilisateur a selectionne l'exemple*)
\r
509 call OUTSTRING("Execution normale du programme ");
\r
511 call OUTSTRING("Execution pas a pas du programme ");
\r
513 call OUTSTRING("Execution avec point d'arret du programme ");
\r
517 call GETPRESS(0,h,v,b,g,d,c);
\r
519 call MOUSEPOS(h,v,selection,numop2);
\r
520 if not selection then
\r
530 (* L'utilisateur a selectionne le "dictionnaire" sur les coroutines*)
\r
531 call OUTSTRING("Definition et interet des coroutines ");
\r
533 call OUTSTRING("Instructions associees aux coroutines ");
\r
537 call GETPRESS(0,h,v,b,g,d,c);
\r
539 call MOUSEPOS(h,v,selection,numop2);
\r
540 if not selection then
\r
557 (* Contexte met en place les differentes parties servant a l'execution *)
\r
558 UNIT contexte : PROCEDURE(input typexec:integer,ptarok:boolean);
\r
559 VAR touche,couleur:integer;
\r
565 call OUTSTRING("EXECUTION DU PROGRAMME");
\r
566 (* Cadre entourant le code du main et coroutines *)
\r
568 call cadre(8,16,632,280,couleur);
\r
570 (* Cadre simulant l'ecran *)
\r
571 call cadre(8,288,632,336,couleur);
\r
572 (* Boutons pour lancer l'execution et quitter *)
\r
573 call cadre(12,236,92,252,couleur);
\r
575 if typexec=5 and not ptarok then
\r
580 call OUTSTRING("Execution");
\r
581 call cadre(12,256,92,272,couleur);
\r
584 call OUTSTRING("Quitter");
\r
586 call SETPOSITION(0,0);
\r
590 (* mainvisu affiche dans le cadre le code du main *)
\r
591 UNIT mainvisu : PROCEDURE;
\r
592 VAR couleur:integer;
\r
595 (* cadre entourant le code du main *)
\r
597 call cadre(12,20,200,228,couleur);
\r
601 call OUTSTRING("PROGRAM prodcons;");
\r
603 call OUTSTRING("VAR");
\r
605 call OUTSTRING(" prod:producer,");
\r
607 call OUTSTRING(" cons:consumer,");
\r
609 call OUTSTRING(" n,mag:integer,");
\r
611 call OUTSTRING(" last:boolean;");
\r
613 call OUTSTRING("BEGIN");
\r
615 call OUTSTRING(" prod:=new producer;");
\r
617 call OUTSTRING(" read(n);");
\r
619 call OUTSTRING(" cons:=new consumer(n);");
\r
621 call OUTSTRING(" attach(prod);");
\r
623 call OUTSTRING(" writeln;");
\r
625 call OUTSTRING("END prodcons;");
\r
628 (* prodvisu (coroutine 1) affiche dans le cadre le code de producer *)
\r
629 UNIT prodvisu : PROCEDURE;
\r
630 VAR couleur:integer;
\r
632 (* Cadre de la 1ere coroutine *)
\r
634 call cadre(216,20,412,272,couleur);
\r
635 (* Ecriture du code de la 1ere coroutine *)
\r
637 call OUTSTRING("UNIT producer:COROUTINE;");
\r
639 call OUTSTRING("BEGIN");
\r
641 call OUTSTRING(" return;");
\r
643 call OUTSTRING(" DO");
\r
645 call OUTSTRING(" read(mag);");
\r
647 call OUTSTRING(" if mag=0 then");
\r
649 call OUTSTRING(" last:=true;");
\r
651 call OUTSTRING(" exit;");
\r
653 call OUTSTRING(" fi;");
\r
654 call MOVE(220,104);
\r
655 call OUTSTRING(" attach(cons);");
\r
656 call MOVE(220,112);
\r
657 call OUTSTRING(" OD;");
\r
658 call MOVE(220,120);
\r
659 call OUTSTRING(" attach(cons);");
\r
660 call MOVE(220,128);
\r
661 call OUTSTRING("END producer;");
\r
664 (* consvisu (coroutine 2) affiche dans le cadre le code de consumer *)
\r
665 UNIT consvisu : PROCEDURE;
\r
666 VAR couleur:integer;
\r
669 call cadre(428,20,628,272,couleur); (* Cadre de la coroutine 2 cad consumer*)
\r
670 call MOVE(428,252);
\r
672 (* Ecriture du code de la 2eme coroutine *)
\r
674 call OUTSTRING("UNIT consumer:coroutine");
\r
676 call OUTSTRING(" (n:integer);");
\r
678 call OUTSTRING("VAR buf:arrayof integer,");
\r
680 call OUTSTRING(" i,j:integer;");
\r
682 call OUTSTRING("BEGIN");
\r
684 call OUTSTRING(" array buf dim(1:n);");
\r
686 call OUTSTRING(" return;");
\r
688 call OUTSTRING(" DO");
\r
690 call OUTSTRING(" for i:=1 to n");
\r
691 call MOVE(432,104);
\r
692 call OUTSTRING(" DO");
\r
693 call MOVE(432,112);
\r
694 call OUTSTRING(" buf(i):=mag;");
\r
695 call MOVE(432,120);
\r
696 call OUTSTRING(" attach(prod);");
\r
697 call MOVE(432,128);
\r
698 call OUTSTRING(" if last then");
\r
699 call MOVE(432,136);
\r
700 call OUTSTRING(" exit exit fi;");
\r
701 call MOVE(432,144);
\r
702 call OUTSTRING(" OD");
\r
703 call MOVE(432,152);
\r
704 call OUTSTRING(" for i:=1 to n");
\r
705 call MOVE(432,160);
\r
706 call OUTSTRING(" DO");
\r
707 call MOVE(432,168);
\r
708 call OUTSTRING(" write(' ',buf(i));");
\r
709 call MOVE(432,176);
\r
710 call OUTSTRING(" OD;");
\r
711 call MOVE(432,184);
\r
712 call OUTSTRING(" writeln;");
\r
713 call MOVE(432,192);
\r
714 call OUTSTRING(" OD");
\r
715 call MOVE(432,200);
\r
716 call OUTSTRING(" for j:=1 to i DO");
\r
717 call MOVE(432,208);
\r
718 call OUTSTRING(" write(' ',buf(i));");
\r
719 call MOVE(432,216);
\r
720 call OUTSTRING(" OD;");
\r
721 call MOVE(432,224);
\r
722 call OUTSTRING(" writeln;");
\r
723 call MOVE(432,232);
\r
724 call OUTSTRING(" attach(main);");
\r
725 call MOVE(432,240);
\r
726 call OUTSTRING("END consumer;");
\r
730 (* instalnorm affiche le code du main et attend click sur execution/quitter *)
\r
731 UNIT instalnorm : PROCEDURE(typexec,xpa,ypa:integer;inout execok:boolean);
\r
732 VAR i,touche,rep,couleur:integer,
\r
735 when fin:stopexec:=true;
\r
743 (* Affichage du code du main*)
\r
745 if typexec=5 and xpa=14 then
\r
747 call cadre(xpa,ypa-4,198,ypa+4,couleur);
\r
751 call OUTSTRING("Selectionnez 'execution' ou 'quitter' en cliquant sur l'icone correspondante");
\r
752 (* Gestion de la souris *)
\r
754 call GETPRESS(0,h,v,b,g,d,c);
\r
756 call POSmouse(h,v,selection,rep);
\r
758 if not selection then
\r
763 if rep=0 then (* l'utilisateur a clique sur quitter *)
\r
765 else (* l'utilisateur a clicke sur execution *)
\r
768 call OUTSTRING("Selectionnez 'execution' ou 'quitter' en cliquant sur l'icone correspondante");
\r
771 call OUTSTRING("Execution");
\r
773 if typexec=3 or typexec=5 then
\r
776 call OUTSTRING("Quitter");
\r
781 (* Bouton "continuer" pour avancer pas a pas dans l'execution*)
\r
783 call cadre(120,236,200,252,couleur);
\r
784 call MOVE(124,240);
\r
786 call OUTSTRING("Continuer");
\r
799 (********************************************************************************)
\r
800 (* Procedure permettant la prise en compte d'une execution avec point d'arret *)
\r
801 (********************************************************************************)
\r
803 (* selectpoint permet de prendre en compte le point d'arret choisi*)
\r
804 (* par l'utilisateur*)
\r
805 UNIT selectpoint : PROCEDURE(inout x,y:integer);
\r
806 VAR i,touche,rep,numcode:integer,
\r
809 when fin:stopexec:=true;
\r
818 (* Affichage du message demandant la selection du point d'arret*)
\r
821 call OUTSTRING("Cliquez sur la ligne qui sera le point d'arret de l'execution");
\r
823 (* Gestion de la souris *)
\r
825 call GETPRESS(0,h,v,b,g,d,c);
\r
827 call ptarret(h,v,selection,numcode);
\r
829 if not selection then
\r
837 call encadrpt(numcode,v);
\r
840 call OUTSTRING("Cliquez sur la ligne qui sera le point d'arret de l'execution");
\r
843 call OUTSTRING("Quitter");
\r
846 call OUTSTRING("Tapez <RC> pour valider votre selection");
\r
850 call OUTSTRING("Tapez <RC> pour valider votre selection");
\r
868 (********************************************************************************)
\r
869 (* Procedures utilisees pour l'execution du programme *)
\r
870 (********************************************************************************)
\r
872 (* fleche permet d'afficher une fleche devant l'instruction courante *)
\r
873 UNIT fleche : PROCEDURE(input x,y,xpa,ypa,numcode,choixexe:integer);
\r
874 VAR rempli,atteint:boolean;
\r
878 call OUTSTRING("->");
\r
880 (*Execution avec point d'arret*)
\r
882 if (xpa=x+14) and (ypa-4=y) then
\r
884 call finexecut(choixexe,rempli,atteint);
\r
887 if numcode=2 or numcode=3 then
\r
888 if (xpa=x+18) and (ypa-4=y) then
\r
890 call finexecut(choixexe,rempli,atteint);
\r
895 (* Changecoul permet de modifier la couleur du cadre des record selon*)
\r
896 (* qu'ils sont actifs ou non*)
\r
897 UNIT changecoul : PROCEDURE(couleur,numcode:integer);
\r
900 call cadre(12,20,200,228,couleur);
\r
903 call cadre(216,20,412,272,couleur);
\r
906 call cadre(428,20,628,272,couleur);
\r
911 (* restaure permet de supprimer la fleche courante et provoque un temps d'arret*)
\r
912 (* apres chaque instruction. *)
\r
913 UNIT restaure : PROCEDURE(debx,deby,choixexe,numcode:integer);
\r
914 VAR i,touche,rep:integer,
\r
922 when 3: (* Execution normale du programme choisi*)
\r
923 for i:=1 to 10000 do od;
\r
925 when 4: (* Execution pas a pas du programme choisi*)
\r
926 (* Gestion de la souris *)
\r
928 call SETPOSITION(160,244);
\r
932 call GETPRESS(0,h,v,b,g,d,c);
\r
934 call GoStop(h,v,selection,rep);
\r
936 if not selection then
\r
941 if rep=0 then (* l'utilisateur a clique sur quitter *)
\r
944 (* l'utilisateur a clique sur continuer *)
\r
950 when 5: (* Execution avec point d'arret du programme choisi*)
\r
951 for i:=1 to 10000 do od;
\r
954 (* Effacement de la fleche se trouvant devant la ligne courante*)
\r
955 call MOVE(debx,deby);
\r
957 call OUTSTRING("->");
\r
961 call VFILL(deby+8);
\r
963 call MOVE(12,deby);
\r
964 call VFILL(deby+8);
\r
967 call MOVE(200,deby);
\r
968 call VFILL(deby+8);
\r
971 call MOVE(412,deby);
\r
972 call VFILL(deby+8);
\r
976 (* execut permet l'execution du programme *)
\r
977 UNIT execut : PROCEDURE(input choixexe,xpa,ypa:integer);
\r
978 VAR touche,k,x,y,i,j,n,mag,numcode,nbaffic,nbcases,rep,couleur:integer,
\r
979 passe,last,encore,magzero,rempli,atteint:boolean,
\r
980 buf:arrayof integer;
\r
982 when fin:stopexec:=true;
\r
987 array buf dim(1:10);
\r
989 (* 1ere ligne du main*)
\r
991 call changecoul(10,numcode);
\r
994 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
995 call restaure(x,y,choixexe,numcode);
\r
996 (* 3eme ligne du main*)
\r
998 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
999 call restaure(x,y,choixexe,numcode);
\r
1000 (* 4eme ligne du main*)
\r
1002 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1003 call restaure(x,y,choixexe,numcode);
\r
1004 (* 5eme ligne du main*)
\r
1006 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1007 (* Affichage de la valeur de n et mag *)
\r
1008 call MOVE(16,196);
\r
1009 call OUTSTRING("n = 0 et mag = 0");
\r
1010 call restaure(x,y,choixexe,numcode);
\r
1011 (* 6eme ligne du main*)
\r
1013 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1014 (* Affichage de la valeur de last*)
\r
1015 call MOVE(16,212);
\r
1016 call OUTSTRING("last = false");
\r
1017 call restaure(x,y,choixexe,numcode);
\r
1018 (* 7eme ligne du main*)
\r
1020 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1021 call restaure(x,y,choixexe,numcode);
\r
1022 (* 8eme ligne du main*)
\r
1024 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1025 call changecoul(7,numcode);
\r
1027 (* Affichage du code de la coroutine 1 cad producer*)
\r
1029 if typexec=5 and xpa=218 then
\r
1031 call cadre(xpa,ypa-4,410,ypa+4,couleur);
\r
1033 (* Debut de l'execution de la 1ere coroutine*)
\r
1034 (* 1ere ligne de la coroutine 1*)
\r
1037 call changecoul(10,numcode);
\r
1039 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1040 call restaure(x,y,choixexe,numcode);
\r
1041 (* 2eme ligne de la coroutine 1*)
\r
1043 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1044 call restaure(x,y,choixexe,numcode);
\r
1045 (* 3eme ligne de la coroutine 1*)
\r
1047 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1048 call changecoul(7,numcode);
\r
1050 (* On revient au programme appelant cad le main*)
\r
1053 call changecoul(10,numcode);
\r
1055 call restaure(x,y,choixexe,numcode);
\r
1056 (* 9eme ligne du main*)
\r
1058 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1062 call MOVE(12,296);
\r
1063 call OUTSTRING("Entrez la taille du tableau buf (<=10) et tapez <RC>: ");
\r
1065 call WriteInteger(n);
\r
1068 call MOVE(12,296);
\r
1069 call OUTSTRING("Entrez la taille du tableau buf (<=10) et tapez <RC>: ");
\r
1070 call WriteInteger(n);
\r
1072 (* Test sur la valeur de la taille du tableau*)
\r
1073 if n=0 or n>10 then
\r
1075 call MOVE(12,296);
\r
1076 call OUTSTRING("Vous devez entrer une valeur comprise entre 1 et 10 (tapez <RC>) !");
\r
1079 call MOVE(12,296);
\r
1080 call OUTSTRING("Vous devez entrer une valeur comprise entre 1 et 10 (tapez <RC>) !");
\r
1086 (* Mise a jour de la valeur de n*)
\r
1088 call MOVE(48,196);
\r
1089 call WriteInteger(n);
\r
1090 call restaure(x,y,choixexe,numcode);
\r
1091 (* 10eme ligne du main*)
\r
1093 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1094 call changecoul(7,numcode);
\r
1096 (* Affichage du code de la coroutine 2 cad consumer*)
\r
1098 if typexec=5 and xpa=430 then
\r
1100 call cadre(xpa,ypa-4,626,ypa+4,couleur);
\r
1102 (* Debut de l'execution de la coroutine 2*)
\r
1103 (* ligne 1 de la coroutine 2*)
\r
1106 call changecoul(10,numcode);
\r
1108 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1109 call restaure(x,y,choixexe,numcode);
\r
1110 (* ligne 3 de la coroutine 2*)
\r
1112 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1113 call restaure(x,y,choixexe,numcode);
\r
1114 (* ligne 4 de la coroutine 2*)
\r
1116 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1117 call MOVE(432,264);
\r
1118 call OUTSTRING("i = 0 et j = 0");
\r
1119 call restaure(x,y,choixexe,numcode);
\r
1120 (* ligne 5 de la coroutine 2*)
\r
1122 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1123 call restaure(x,y,choixexe,numcode);
\r
1124 (* ligne 6 de la coroutine 2*)
\r
1126 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1127 call MOVE(432,256);
\r
1128 call OUTSTRING("buf :");
\r
1131 call MOVE(472+i*16,256);
\r
1133 call OUTSTRING("0");
\r
1135 call OUTSTRING("0,");
\r
1138 call restaure(x,y,choixexe,numcode);
\r
1139 (* ligne 7 de la coroutine 2*)
\r
1141 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1142 call changecoul(7,numcode);
\r
1144 (* Retour a la procedure appelante cad le main*)
\r
1147 call changecoul(10,numcode);
\r
1149 call restaure(x,y,choixexe,numcode);
\r
1150 (* 11eme ligne du main*)
\r
1152 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1153 call changecoul(7,numcode);
\r
1155 (* Retour a la coroutine 1 cad producer*)
\r
1158 call changecoul(10,numcode);
\r
1160 call restaure(x,y,choixexe,numcode);
\r
1165 call changecoul(10,numcode);
\r
1166 (* 4eme ligne de la coroutine 1*)
\r
1168 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1169 call restaure(x,y,choixexe,numcode);
\r
1170 (* 5eme ligne de la coroutine 1*)
\r
1172 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1176 call finexecut(choixexe,rempli,atteint);
\r
1181 call MOVE(12,296);
\r
1183 call OUTSTRING("Vous devez a present taper zero comme valeur du tableau et <RC>: ");
\r
1185 call OUTSTRING("Entrez la valeur (<10) a stocker dans le tableau et tapez <RC>: ");
\r
1188 (* Mise a jour de la valeur de mag*)
\r
1189 call MOVE(144,196);
\r
1190 call WriteInteger(mag);
\r
1192 call MOVE(12,296);
\r
1193 call OUTSTRING("Entrez la valeur (<10) a stocker dans le tableau et tapez <RC>: ");
\r
1194 call WriteInteger(mag);
\r
1195 (* Test sur la valeur de mag qui doit etre < 10*)
\r
1198 call MOVE(12,296);
\r
1199 call OUTSTRING("Vous devez entrer une valeur comprise entre 0 et 9 (tapez <RC>) !");
\r
1202 call MOVE(12,296);
\r
1203 call OUTSTRING("Vous devez entrer une valeur comprise entre 0 et 9 (tapez <RC>) !");
\r
1208 call restaure(x,y,choixexe,numcode);
\r
1209 (* 6eme ligne de la coroutine 1*)
\r
1211 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1216 call restaure(x,y,choixexe,numcode);
\r
1217 (* 7eme ligne de la coroutine 1*)
\r
1219 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1220 (* MAJ de la variable last*)
\r
1222 call MOVE(72,212);
\r
1224 call OUTSTRING("false");
\r
1225 call MOVE(72,212);
\r
1227 call OUTSTRING("true");
\r
1228 call restaure(x,y,choixexe,numcode);
\r
1229 (* 8eme ligne de la coroutine 1 *)
\r
1231 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1232 call restaure(x,y,choixexe,numcode);
\r
1233 (* 12eme ligne de la coroutine 1*)
\r
1235 call fleche(x,y,xpa,ypa,numcode,choixexe); (* on va au moyen DO*)
\r
1237 call restaure(x,y,choixexe,numcode);
\r
1238 (* 9eme ligne de la coroutine1*)
\r
1240 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1241 call restaure(x,y,choixexe,numcode);
\r
1242 (* 10eme ligne de la coroutine1 *)
\r
1244 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1246 call changecoul(7,numcode);
\r
1248 (* retour a la coroutine 2 cad consumer*)
\r
1252 call changecoul(10,numcode);
\r
1253 if not passe or encore then
\r
1256 call restaure(x,y,choixexe,numcode);
\r
1258 (* 8eme ligne de la coroutine 2 *)
\r
1260 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1261 call restaure(x,y,choixexe,numcode);
\r
1266 call restaure(x,y,choixexe,numcode);
\r
1267 (* 13eme ligne de la coroutine 2 *)
\r
1269 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1271 call restaure(x,y,choixexe,numcode);
\r
1272 (* 14eme ligne de la coroutine 2*)
\r
1274 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1275 call restaure(x,y,choixexe,numcode);
\r
1278 nbcases:=nbcases+1;
\r
1279 call restaure(x,y,choixexe,numcode);
\r
1280 (* 15eme ligne de la coroutine 2*)
\r
1282 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1283 call restaure(x,y,choixexe,numcode);
\r
1288 (* 9eme ligne de la coroutine 2 *)
\r
1290 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1291 (* Affichage de l'indice de buf*)
\r
1292 call MOVE(464,264);
\r
1293 call WriteInteger(nbcases+1);
\r
1294 call restaure(x,y,choixexe,numcode);
\r
1298 (* 10eme ligne de la coroutine 2 *)
\r
1300 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1301 call restaure(x,y,choixexe,numcode);
\r
1302 (* 11eme ligne de la coroutine 2 *)
\r
1304 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1305 (* MAJ du tableau buf avec la valeur de mag*)
\r
1306 buf(nbcases+1):=mag;
\r
1307 call MOVE(472+nbcases*16,256);
\r
1308 call WriteInteger(buf(nbcases+1));
\r
1309 if nbcases+1<>n then
\r
1310 call MOVE(480+nbcases*16,256);
\r
1311 call OUTSTRING(",");
\r
1313 call restaure(x,y,choixexe,numcode);
\r
1314 (* 12eme ligne de la coroutine 2 *)
\r
1316 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1317 call changecoul(7,numcode);
\r
1319 (* Retour a la coroutine 1 cad producer*)
\r
1322 call changecoul(10,numcode);
\r
1325 call restaure(x,y,choixexe,numcode);
\r
1326 (* 13eme ligne de la coroutine 1*)
\r
1328 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1329 call restaure(x,y,choixexe,numcode);
\r
1330 (* Destruction du record d'activation de la coroutine 1 cad producer*)
\r
1332 call MOVE(216,20);
\r
1333 call DRAW(412,272);
\r
1334 call MOVE(412,20);
\r
1335 call DRAW(216,272);
\r
1337 call changecoul(7,numcode);
\r
1338 call MOVE(12,296);
\r
1340 call OUTSTRING("ATTENTION : Le record d'activation de Producer vient d'etre detruit !");
\r
1341 for i:=1 to 20000 do od;
\r
1342 call MOVE(12,296);
\r
1344 call OUTSTRING("ATTENTION : Le record d'activation de Producer vient d'etre detruit !");
\r
1348 call restaure(x,y,choixexe,numcode);
\r
1349 (* ligne 11 de la coroutine 1*)
\r
1351 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1352 call restaure(x,y,choixexe,numcode);
\r
1357 if not magzero then
\r
1359 (* Retour a la coroutine 2 cad consumer*)
\r
1360 (* Impression du tampon buf*)
\r
1364 (* 16eme ligne de la coroutine 2*)
\r
1366 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1367 call restaure(x,y,choixexe,numcode);
\r
1368 (* Affichage de l'indice de buf*)
\r
1370 call MOVE(464,264);
\r
1371 call WriteInteger(i+1);
\r
1373 (* 17eme ligne de la coroutine 2*)
\r
1375 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1376 call restaure(x,y,choixexe,numcode);
\r
1377 (* 18eme ligne de la coroutine 2*)
\r
1379 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1380 call MOVE(12+i*16,304+nbaffic*8);
\r
1381 call OUTSTRING(" ");
\r
1382 call WriteInteger(buf(i+1));
\r
1383 call restaure(x,y,choixexe,numcode);
\r
1385 (* 19eme ligne de la coroutine 2*)
\r
1387 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1388 call restaure(x,y,choixexe,numcode);
\r
1394 (* ligne 20 de la coroutine 2*)
\r
1396 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1397 call restaure(x,y,choixexe,numcode);
\r
1398 nbaffic:=nbaffic+1;
\r
1404 (* Imprime le reste du tampon buf*)
\r
1405 (* 22eme ligne de la coroutine 2*)
\r
1407 for j:=1 to nbcases+1
\r
1410 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1411 (* Affichage de l'indice de buf*)
\r
1412 call MOVE(544,264);
\r
1413 call WriteInteger(j);
\r
1414 call restaure(x,y,choixexe,numcode);
\r
1415 (* 23eme ligne de la coroutine 2*)
\r
1417 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1418 call MOVE(12+k*16,304+nbaffic*8);
\r
1419 call OUTSTRING(" ");
\r
1420 call WriteInteger(buf(j));
\r
1421 call restaure(x,y,choixexe,numcode);
\r
1422 (* 24eme ligne de la coroutine 2*)
\r
1424 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1425 call restaure(x,y,choixexe,numcode);
\r
1428 (* 25eme ligne de la coroutine 2*)
\r
1430 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1431 call restaure(x,y,choixexe,numcode);
\r
1432 (* 26eme ligne de la coroutine 2*)
\r
1434 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1435 call changecoul(7,numcode);
\r
1437 (* Retour a la ligne 11 du main*)
\r
1440 call changecoul(10,numcode);
\r
1442 call restaure(x,y,choixexe,numcode);
\r
1443 (* 12eme ligne du main*)
\r
1445 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1446 call restaure(x,y,choixexe,numcode);
\r
1447 (* 13eme et derniere ligne du main*)
\r
1449 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1450 call restaure(x,y,choixexe,numcode);
\r
1451 (* Destruction du record d'activation du main*)
\r
1454 call DRAW(200,228);
\r
1455 call MOVE(200,20);
\r
1456 call DRAW(12,228);
\r
1457 call changecoul(7,numcode);
\r
1458 call MOVE(12,296);
\r
1460 call OUTSTRING("ATTENTION : Le record d'activation du Main vient d'etre detruit !");
\r
1461 for i:=1 to 20000 do od;
\r
1462 call MOVE(12,296);
\r
1464 call OUTSTRING("ATTENTION : Le record d'activation du Main vient d'etre detruit !");
\r
1467 (* Retour a la ligne 26 de la coroutine2*)
\r
1470 call changecoul(10,numcode);
\r
1472 call restaure(x,y,choixexe,numcode);
\r
1473 (* 27eme ligne de la coroutine2*)
\r
1475 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1476 call restaure(x,y,choixexe,numcode);
\r
1477 (* Destruction du record d'activation de la coroutine 2 cad consumer*)
\r
1479 call MOVE(428,20);
\r
1480 call DRAW(628,272);
\r
1481 call MOVE(628,20);
\r
1482 call DRAW(428,272);
\r
1483 call changecoul(7,numcode);
\r
1484 call MOVE(12,296);
\r
1486 call OUTSTRING("ATTENTION : Le record d'activation de Consumer vient d'etre detruit !");
\r
1487 for i:=1 to 20000 do od;
\r
1488 call MOVE(12,296);
\r
1490 call OUTSTRING("ATTENTION : Le record d'activation de Consumer vient d'etre detruit !");
\r
1492 if not magzero then
\r
1493 (* Retour a la ligne 12 de la coroutine1*)
\r
1496 call changecoul(10,numcode);
\r
1498 call restaure(x,y,choixexe,numcode);
\r
1499 (* 13eme ligne de la coroutine 1*)
\r
1501 call fleche(x,y,xpa,ypa,numcode,choixexe);
\r
1502 call restaure(x,y,choixexe,numcode);
\r
1503 (* Destruction du record d'activation de la coroutine 1 cad producer*)
\r
1505 call MOVE(216,20);
\r
1506 call DRAW(412,272);
\r
1507 call MOVE(412,20);
\r
1508 call DRAW(216,272);
\r
1509 call changecoul(7,numcode);
\r
1510 call MOVE(12,296);
\r
1512 call OUTSTRING("ATTENTION : Le record d'activation du Producer vient d'etre detruit !");
\r
1513 for i:=1 to 20000 do od;
\r
1514 call MOVE(12,296);
\r
1516 call OUTSTRING("ATTENTION : Le record d'activation de Producer vient d'etre detruit !");
\r
1518 if choixexe=4 then
\r
1519 call COLOR(8); (* L'execution est terminee on ne peut donc plus cliquer*)
\r
1520 (* sur Continuer*)
\r
1521 call MOVE(124,240);
\r
1522 call OUTSTRING("Continuer");
\r
1526 call finexecut(choixexe,rempli,atteint);
\r
1530 (********************************************************************************)
\r
1531 (* Procedures gerant l'option A propos des coroutines *)
\r
1532 (********************************************************************************)
\r
1534 (* boutontxt met en place et gere les boutons concernat l'option *)
\r
1535 (* A propos des coroutines*)
\r
1536 UNIT boutontxt : FUNCTION :integer;
\r
1537 VAR choix:integer;
\r
1539 (* Mise en place du bouton Page suivante*)
\r
1540 call cadre(428,320,558,336,12);
\r
1542 (* Mise en place du bouton Quitter*)
\r
1543 call cadre(8,320,88,336,12);
\r
1544 call MOVE(20,324);
\r
1546 call OUTSTRING("Quitter");
\r
1548 (* Mise en place de la souris*)
\r
1556 call GETPRESS(0,h,v,b,g,d,c);
\r
1558 call textquit(h,v,selection,choix);
\r
1560 if not selection then
\r
1577 (* afficdef affiche a l'ecran la definition et l'utilite des coroutines*)
\r
1578 UNIT afficdef : PROCEDURE;
\r
1579 VAR touche,choix:integer;
\r
1582 (* Mise en place du texte*)
\r
1583 call MOVE(170,16);
\r
1585 call OUTSTRING("DEFINITION ET INTERET DES COROUTINES");
\r
1587 call OUTSTRING("I> Definition d'une coroutine");
\r
1590 call OUTSTRING("Une coroutine est un objet tel que l'execution de sa sequence");
\r
1592 call OUTSTRING("d'instructions peut etre suspendue et relancee de maniere pro-");
\r
1594 call OUTSTRING("grammee.");
\r
1596 call OUTSTRING("Il est important de preciser, qu'a un instant donne, une seule");
\r
1598 call OUTSTRING("coroutine est active (en execution).");
\r
1599 call MOVE(56,100);
\r
1600 call OUTSTRING("Par ailleurs, c'est une extension de la notion de classe, une");
\r
1601 call MOVE(56,108);
\r
1602 call OUTSTRING("classe etant une construction dans laquelle peuvent etre regrou-");
\r
1603 call MOVE(56,116);
\r
1604 call OUTSTRING("pes toutes sortes d'objets.");
\r
1606 call MOVE(56,132);
\r
1607 call OUTSTRING("Syntaxe");
\r
1609 call MOVE(80,144);
\r
1610 call OUTSTRING("UNIT <nom_coroutine> : <prefixe> COROUTINE(<parametres formels>);");
\r
1611 call MOVE(120,152);
\r
1612 call OUTSTRING("<declarations variables locales,fonctions,procedures,classes>");
\r
1613 call MOVE(80,160);
\r
1614 call OUTSTRING("BEGIN");
\r
1615 call MOVE(120,168);
\r
1616 call OUTSTRING("<instruction 1>");
\r
1617 call MOVE(120,176);
\r
1618 call OUTSTRING("return;");
\r
1619 call MOVE(120,184);
\r
1620 call OUTSTRING("<instruction 2...instruction n>");
\r
1621 call MOVE(80,192);
\r
1622 call OUTSTRING("END nom_coroutine;");
\r
1624 call MOVE(16,216);
\r
1625 call OUTSTRING("II> Interet des coroutines");
\r
1627 call MOVE(56,232);
\r
1628 call OUTSTRING("Les coroutines jouent un role essentiel dans les taches de simu-");
\r
1629 call MOVE(56,240);
\r
1630 call OUTSTRING("lation.");
\r
1631 call MOVE(56,248);
\r
1632 call OUTSTRING("Ainsi, divers problemes de simulation de grande complexite et de");
\r
1633 call MOVE(56,256);
\r
1634 call OUTSTRING("taille importante sont traitees avec succes par les coroutines.");
\r
1636 (* Mise en place du bouton Quitter*)
\r
1637 call cadre(8,320,88,336,10);
\r
1638 call MOVE(20,324);
\r
1640 call OUTSTRING("Quitter");
\r
1642 (* Mise en place de la souris*)
\r
1649 call GETPRESS(0,h,v,b,g,d,c);
\r
1651 call textquit(h,v,selection,choix);
\r
1653 if not selection then
\r
1659 (* l'utilisateur a clique sur quitter *)
\r
1670 (* afficinstr affiche a l'ecran le schema de la semantique des coroutines*)
\r
1671 UNIT afficinstr : PROCEDURE;
\r
1672 VAR touche,choix:integer;
\r
1674 when fin:stopexec:=true;
\r
1679 (* Mise en place du texte*)
\r
1680 call MOVE(154,16);
\r
1682 call OUTSTRING("INSTRUCTIONS ASSOCIEES AUX COROUTINES");
\r
1683 call MOVE(258,32);
\r
1684 call OUTSTRING("SEMANTIQUE");
\r
1688 call OUTSTRING("Declaration : VAR C:nom_coroutine;");
\r
1691 call MOVE(206,76);
\r
1693 call MOVE(202,90);
\r
1694 call OUTSTRING("V");
\r
1695 call cadre(146,100,266,116,10);
\r
1697 call MOVE(174,104);
\r
1698 call OUTSTRING("CREATION");
\r
1699 call MOVE(222,83);
\r
1700 call OUTSTRING("C:=new nom_coroutine(<parametres formels>);");
\r
1703 call MOVE(206,118);
\r
1705 call MOVE(202,130);
\r
1706 call OUTSTRING("V");
\r
1707 call cadre(146,140,266,156,10);
\r
1709 call MOVE(150,144);
\r
1710 call OUTSTRING("INITIALISATION");
\r
1713 call MOVE(206,158);
\r
1715 call MOVE(202,170);
\r
1716 call OUTSTRING("V");
\r
1717 call cadre(146,180,266,196,10);
\r
1719 call MOVE(154,184);
\r
1720 call OUTSTRING("DESACTIVATION");
\r
1721 call MOVE(222,164);
\r
1722 call OUTSTRING("return;");
\r
1725 call MOVE(176,198);
\r
1727 call MOVE(172,210);
\r
1728 call OUTSTRING("V");
\r
1729 call MOVE(236,198);
\r
1731 call MOVE(232,198);
\r
1732 call OUTSTRING("^");
\r
1733 call cadre(146,220,266,236,10);
\r
1735 call MOVE(168,224);
\r
1736 call OUTSTRING("ACTIVATION");
\r
1737 call MOVE(80,204);
\r
1738 call OUTSTRING("attach(C);");
\r
1739 call MOVE(252,204);
\r
1740 call OUTSTRING("detach;");
\r
1743 call MOVE(206,238);
\r
1745 call MOVE(202,250);
\r
1746 call OUTSTRING("V");
\r
1747 call cadre(146,260,266,276,10);
\r
1749 call MOVE(178,264);
\r
1750 call OUTSTRING("TERMINE");
\r
1753 call MOVE(206,278);
\r
1755 call MOVE(202,290);
\r
1756 call OUTSTRING("V");
\r
1758 call MOVE(116,298);
\r
1760 call OUTSTRING("Destruction : kill(C);");
\r
1762 call MOVE(444,324);
\r
1764 call OUTSTRING("Page suivante");
\r
1767 (* l'utilisateur a clique sur quitter *)
\r
1770 (* L'utilisateur a clique sur page suivante*)
\r
1776 (* pagesuiv affiche a l'ecran les informations sur les instructions *)
\r
1777 (* associees aux coroutines*)
\r
1778 UNIT pagesuiv : PROCEDURE;
\r
1779 VAR touche,choix:integer;
\r
1782 (* Mise en place du texte*)
\r
1783 call MOVE(154,16);
\r
1785 call OUTSTRING("INSTRUCTIONS ASSOCIEES AUX COROUTINES");
\r
1786 call MOVE(258,32);
\r
1787 call OUTSTRING("Suite...");
\r
1790 call OUTSTRING("I> New");
\r
1793 call OUTSTRING("Instruction generatrice (allocateur) de creation d'un objet");
\r
1795 call OUTSTRING("d'une classe donnee (dans le cas present coroutine).");
\r
1797 call OUTSTRING("Exemple : C:=NEW nom_coroutine;");
\r
1800 call MOVE(16,100);
\r
1801 call OUTSTRING("II> Return");
\r
1803 call MOVE(56,116);
\r
1804 call OUTSTRING("Apres que le record d'activation de la coroutine ait ete cree,");
\r
1805 call MOVE(56,124);
\r
1806 call OUTSTRING("(instruction NEW), et que les initialisations aient ete effec-");
\r
1807 call MOVE(56,132);
\r
1808 call OUTSTRING("tuees, l'instruction de retour RETURN (obligatoire) a pour effet");
\r
1809 call MOVE(56,140);
\r
1810 call OUTSTRING("de rendre le controle au programme appelant.");
\r
1813 call MOVE(16,156);
\r
1814 call OUTSTRING("III> Attach");
\r
1816 call MOVE(56,172);
\r
1817 call OUTSTRING("Des qu'un objet de type coroutine a ete cree, il peut etre soit");
\r
1818 call MOVE(56,180);
\r
1819 call OUTSTRING("actif, soit suspendu. Toute reactivation d'une coroutine X ");
\r
1820 call MOVE(56,188);
\r
1821 call OUTSTRING("(ATTACH(X);) se traduit par la suspension de la coroutine active");
\r
1822 call MOVE(56,196);
\r
1823 call OUTSTRING("et par la poursuite de l'execution a l'instruction de x suivant");
\r
1824 call MOVE(56,204);
\r
1825 call OUTSTRING("celle ayant ete executee lors de la precedente reactivation.");
\r
1828 call MOVE(16,220);
\r
1829 call OUTSTRING("IV> Detach");
\r
1831 call MOVE(56,236);
\r
1832 call OUTSTRING("L'instruction DETACH a pour effet de desactiver la coroutine");
\r
1833 call MOVE(56,244);
\r
1834 call OUTSTRING("active qui contient la dite instruction et de rendre la main a");
\r
1835 call MOVE(56,252);
\r
1836 call OUTSTRING("la coroutine appelante (i.e. celle contenant le dernier ATTACH).");
\r
1839 call MOVE(16,268);
\r
1840 call OUTSTRING("V> Kill");
\r
1842 call MOVE(56,284);
\r
1843 call OUTSTRING("L'instruction KILL(X) a pour consequence la destruction du ");
\r
1844 call MOVE(56,292);
\r
1845 call OUTSTRING("record d'activation de la coroutine designee par la variable");
\r
1846 call MOVE(56,300);
\r
1847 call OUTSTRING("de reference X.");
\r
1849 call MOVE(434,324);
\r
1851 call OUTSTRING("Page precedente");
\r
1854 (* l'utilisateur a clique sur quitter *)
\r
1857 (* L'utilisateur a clique sur page suivante*)
\r
1863 (********************************************************************************)
\r
1864 (* Procedures permettant de quitter l'application ou de revenir au menu *)
\r
1865 (********************************************************************************)
\r
1867 (* Gestion du click sur l'icone 'Quitter' car execution terminee ou point *)
\r
1868 (* d'arret atteint*)
\r
1869 UNIT finexecut: PROCEDURE(typexec:integer,rempli,atteint:boolean);
\r
1870 VAR i,touche:integer,
\r
1871 selection:boolean;
\r
1873 call MOVE(16,296);
\r
1876 call OUTSTRING("LE NOMBRE MAXIMUM DE SAISIE DES VALEURS DU TABLEAU EST ATTEINT !");
\r
1877 call MOVE(150,304);
\r
1878 call OUTSTRING("Cliquez sur l'icone Quitter afin de retourner au menu");
\r
1882 call OUTSTRING("POINT D'ARRET ATTEINT !.Pour retourner au menu, cliquez sur l'icone Quitter");
\r
1884 call OUTSTRING("LE PROGRAMME S'EST TERMINE SANS ETRE PASSE PAR LE POINT D'ARRET !");
\r
1885 call MOVE(150,304);
\r
1886 call OUTSTRING("Cliquez sur l'icone Quitter afin de retourner au menu");
\r
1890 if typexec=3 or typexec=4 then
\r
1891 call OUTSTRING("PROGRAMME TERMINE !.Pour retourner au menu, cliquez sur l'icone Quitter");
\r
1896 call MOVE(16,260);
\r
1897 call OUTSTRING("Quitter");
\r
1902 (* Gestion de la souris *)
\r
1904 call GETPRESS(0,h,v,b,g,d,c);
\r
1906 call clicquit(h,v,selection);
\r
1908 if not selection then
\r
1913 (* l'utilisateur a clique sur quitter *)
\r
1920 (* quitter permet de sortir de l'application convenablement *)
\r
1921 UNIT quitter : PROCEDURE;
\r
1925 call Setcursor(5,20);
\r
1926 writeln("**********TERMINE**********");
\r
1931 (********************************************************************************)
\r
1932 (* PROGRAMME PRINCIPAL : main *)
\r
1933 (********************************************************************************)
\r
1936 (* Utilisation du mode graphique *)
\r
1938 (* Mise en place de l'ecran de presentation de l'application *)
\r
1939 call presentation;
\r
1947 call menu(nooper,typexec); (* Recuperation des choix de l'utilisateur*)
\r
1951 (*l'utilisateur veut quitter l'application*)
\r
1955 (*l'utilisateur choisit d'executer le programme prod-cons*)
\r
1957 (* L'utilisateur choisit de quitter l'application *)
\r
1960 call contexte(typexec,ptarok);
\r
1961 (* Si typexec=3 alors execution normale du programme *)
\r
1962 (* Si typexec=4 alors execution pas a pas du programme*)
\r
1963 (* Si typexec=5 alors execution avec point d'arret *)
\r
1965 if typexec=3 or typexec=4 then
\r
1966 call instalnorm(typexec,xpa,ypa,demarrage);
\r
1967 if demarrage then (* Choix de l'option execution*)
\r
1968 call execut(typexec,xpa,ypa);
\r
1970 (* Choix a un moment donne de l'option Quitter*)
\r
1984 (* Selection du point d'arret par l'utilisateur*)
\r
1985 call selectpoint(xpa,ypa);
\r
1990 call contexte(typexec,ptarok);
\r
1991 call instalnorm(typexec,xpa,ypa,demarrage);
\r
1995 call execut(typexec,xpa,ypa);
\r
2003 when 2: (* L'utilisateur desire des renseignements sur les coroutines*)
\r
2007 (* Si typexec=3 alors affichage de la definition et de l'interet*)
\r
2008 (* des coroutines*)
\r
2009 (* Si typexec=4 alors affichage du shema de la semantique des*)
\r
2033 (********************************************************************************)
\r