| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- MODULE ED;
- (* petit ‚diteur de texte sur une page pour les enfants *)
- IMPORT IO,Window,Lib,SYSTEM,FIO,AsmLib,Str;
- VAR i : CARDINAL;
- car :CHAR;
- texte : ARRAY[1..23] OF ARRAY[0..39] OF CHAR;
- la_page:BYTE;
- x_texte,y_texte : CARDINAL;
- PROCEDURE MODE(x:BYTE);
- VAR r : SYSTEM.Registers;
- BEGIN
- r.AH := 0;
- r.AL := x;
- Lib.Intr(r,10H);
- END MODE;
- PROCEDURE page(x:BYTE);
- VAR r : SYSTEM.Registers;
- BEGIN
- la_page := x;
- r.AH := 5H;
- r.AL := x;
- Lib.Intr(r,10H);
- END page;
- PROCEDURE XGotoXY(x,y:CARDINAL);
- BEGIN
- IF ODD(y) THEN
- y :=( y DIV 2 ) + 1
- ELSE
- x := x + 40;
- y := y DIV 2;
- END;
- Window.GotoXY(x,y);
- END XGotoXY;
- PROCEDURE GotoXY(x,y:BYTE);
- VAR r : SYSTEM.Registers;
- BEGIN
- WITH r DO
- AH := 2;
- BH := la_page;
- DL := x;
- DH := y;
- END;
- Lib.Intr(r,10H);
- END GotoXY;
- PROCEDURE WrChar(a:CHAR;couleur:BYTE);
- VAR r : SYSTEM.Registers;
- BEGIN
- WITH r DO
- AL := BYTE(a);
- BH := la_page;
- BL := couleur;
- AH := 0EH;
- Lib.Intr(r,10H);
- END;
- END WrChar;
- PROCEDURE WrStr(x : ARRAY OF CHAR;couleur:BYTE);
- VAR i : CARDINAL;
- BEGIN
- i := 0;
- REPEAT
- WrChar(x[i],couleur);
- INC(i);
- UNTIL ( i = Str.Length(x) ) OR ( x[i] = CHR(0) )
- END WrStr;
- PROCEDURE WrCharRep(x : CHAR; nombre:CARDINAL;couleur:BYTE);
- VAR i : CARDINAL;
- BEGIN
- FOR i := 1 TO nombre DO
- WrChar(x,couleur);
- END;
- END WrCharRep;
- PROCEDURE RdChar():CHAR;
- VAR r : SYSTEM.Registers;
- BEGIN
- WITH r DO
- AH :=1;
- Lib.Intr(r,21H);
- RETURN CHAR(AL);
- END;
- END RdChar;
- PROCEDURE RdKey():CHAR;
- VAR r : SYSTEM.Registers;
- BEGIN
- WITH r DO
- AH :=7;
- Lib.Intr(r,21H);
- RETURN CHAR(AL);
- END;
- END RdKey;
- VAR fichier:FIO.File;
- VAR INSERT : BOOLEAN;
- PROCEDURE ouvre;
- BEGIN
- FIO.IOcheck := FALSE;
- fichier := FIO.Open('fichier.txt');
- IF FIO.IOresult()<>0 THEN fichier := FIO.Create('fichier.txt');
- END;
- END ouvre;
- PROCEDURE debut;
- BEGIN
- Window.Clear;
- GotoXY(5,5);
- WrStr("Bonjour ",1);
- GotoXY(5,7);
- WrStr("Voici un petit ‚diteur !!!!!",1);
- GotoXY(2,20);
- WrStr("Tape une touche pour continuer",1);
- car := RdKey();
- END debut;
- PROCEDURE Clear(x:BYTE);
- BEGIN
- AsmLib.Fill([0B800H:0000H],2048,20H);
- END Clear;
- PROCEDURE menu;
- VAR l_page : BYTE;
- car : CHAR;
- BEGIN
- l_page := la_page;
- page(3);
- GotoXY(5,2);
- WrStr(" M e n u P r i n c i p a l ",1);
- GotoXY(0,7);
- WrCharRep( CHR(205),40,100);
- GotoXY(3,8);
- WrStr(" Fichier Bloc Impression ",1);
- GotoXY(0,9);
- WrCharRep( CHR(205),40,1);
- REPEAT
- car := RdKey();
- UNTIL car = CHR(27);
- page(l_page);
- END menu;
- VAR choix : CHAR;
- Ligne,Colonne : ARRAY[0..1] OF CHAR;
- ok : BOOLEAN;
- PROCEDURE bip;
- BEGIN
- WrChar(7C,0);
- END bip;
- PROCEDURE ligne;
- BEGIN
- GotoXY(0,VAL(BYTE,y_texte));
- WrStr(texte[y_texte],1);
- END ligne;
- PROCEDURE xy;
- BEGIN
- GotoXY(VAL(BYTE,x_texte),VAL(BYTE,y_texte));
- END xy;
- PROCEDURE bout;
- BEGIN
- IF x_texte > Str.Length(texte[y_texte]) THEN
- x_texte := Str.Length(texte[y_texte]);
- END;
- END bout;
- PROCEDURE insere_car;
- VAR l_chaine : ARRAY[0..39] OF CHAR;
- BEGIN
- IF INSERT THEN
- IF Str.Length(texte[y_texte]) < 39 THEN
- Str.Insert(texte[y_texte],car,x_texte);
- INC(x_texte);
- GotoXY(VAL(BYTE,x_texte-1),VAL(BYTE,y_texte));
- Str.Slice(l_chaine,texte[y_texte],x_texte-1,Str.Length(texte[y_texte]));
- WrStr(l_chaine,1);
- xy;
- ELSE bip
- END;
- ELSE
- texte[y_texte][x_texte] := car;
- GotoXY(VAL(BYTE,x_texte),VAL(BYTE,y_texte));
- Str.Slice(l_chaine,texte[y_texte],x_texte,Str.Length(texte[y_texte]));
- WrStr(l_chaine,1);
- xy;
- END;
- END insere_car;
- PROCEDURE sud;
- BEGIN
- IF y_texte < 23 THEN
- INC(y_texte);
- bout;
- GotoXY(VAL(BYTE,x_texte),VAL(BYTE,y_texte));
- END;
- END sud;
- PROCEDURE nord;
- BEGIN
- IF y_texte > 2 THEN
- DEC(y_texte);
- bout;
- xy;
- END;
- END nord;
- PROCEDURE est;
- BEGIN
- IF (x_texte < 39) AND ( x_texte < Str.Length(texte[y_texte]) ) THEN
- INC(x_texte);
- xy;
- END;
- END est;
- PROCEDURE ouest;
- BEGIN
- IF x_texte > 0 THEN
- DEC(x_texte);
- xy;
- END;
- END ouest;
- PROCEDURE RC;
- BEGIN
- IF y_texte < 23 THEN
- sud;
- xy;
- END;
- END RC;
- PROCEDURE affiche_coordonnees;
- BEGIN
- GotoXY(27,0);
- Str.CardToStr(VAL(LONGCARD,y_texte-1),Ligne,10,ok);
- WrStr( Ligne,1);
- Str.CardToStr(VAL(LONGCARD,x_texte+1),Colonne,10,ok);
- GotoXY(38,0);
- WrStr(Colonne,1);
- xy;
- END affiche_coordonnees;
- PROCEDURE debut_ligne;
- BEGIN
- x_texte := 0;
- xy;
- END debut_ligne;
- PROCEDURE fin_ligne;
- BEGIN
- x_texte := Str.Length(texte[y_texte]);
- xy;
- END fin_ligne;
- PROCEDURE backspace;
- VAR l_chaine : ARRAY[0..39] OF CHAR;
- BEGIN
- IF x_texte > 0 THEN
- Str.Delete(texte[y_texte],x_texte-1,1);
- GotoXY(VAL(BYTE,x_texte-1),VAL(BYTE,y_texte));
- Str.Slice(l_chaine,texte[y_texte],x_texte-1,Str.Length(texte[y_texte]));
- WrStr(l_chaine,1);
- WrChar(" ",1);
- DEC(x_texte);
- xy;
- ELSE bip
- END;
- END backspace;
- PROCEDURE DEL;
- VAR l_chaine : ARRAY[0..39] OF CHAR;
- BEGIN
- Str.Delete(texte[y_texte],x_texte,1);
- IF x_texte > 0 THEN
- GotoXY(VAL(BYTE,x_texte-1),VAL(BYTE,y_texte));
- Str.Slice(l_chaine,texte[y_texte],x_texte-1,Str.Length(texte[y_texte]));
- WrStr(l_chaine,0);
- WrChar(" ",1);
- ELSE
- WrStr(texte[y_texte],1);
- WrChar(" ",1);
- END;
- xy;
- bout;
- END DEL;
- PROCEDURE insertion;
- BEGIN
- INSERT := NOT INSERT;
- END insertion;
- BEGIN
- MODE(1);
- page(5);
- debut;
- page(0);
- Clear(0);
- GotoXY(0,0);
- WrStr("F10:MENU Fich: Ligne: Colonne: ",1);
- GotoXY(0,1);
- WrCharRep( CHR(205),40,100);
- x_texte := 0;
- y_texte := 2;
- INSERT := TRUE;
- ligne;
- REPEAT
- affiche_coordonnees;
- car := RdKey();
- CASE car OF
- | 0C : choix := RdKey();
- CASE choix OF
- | CHR(77) : est;
- | CHR(75) : ouest;
- | CHR(72) : nord;
- | CHR(80) : sud;
- | 104C : menu; (* menu *)
- (* | CHR(59) : F1 ; (* aide *)
- | CHR(60) : F2 ; (* sauvegarde *)
- | CHR(61) : F3 ; *) (* chargement *)
- | CHR(83) : DEL; (*
- | CHR(73) : PGUP;
- | CHR(81) : PGDN;
- | CHR(71) : HOME; (* debut fichier *)
- | CHR(79) : end;*) (* fin fichier *)
- | CHR(82) : insertion;
- END;
- | CHR(1) : debut_ligne;
- | CHR(2) : fin_ligne;
- | CHR(8) : backspace;
- | ' ' .. '}' : insere_car;
- | 15C : RC;
- END;
- UNTIL car = CHR(27);
- MODE(3);
- END ED.
|