ed.mod 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. MODULE ED;
  2. (* petit ‚diteur de texte sur une page pour les enfants *)
  3. IMPORT IO,Window,Lib,SYSTEM,FIO,AsmLib,Str;
  4. VAR i : CARDINAL;
  5. car :CHAR;
  6. texte : ARRAY[1..23] OF ARRAY[0..39] OF CHAR;
  7. la_page:BYTE;
  8. x_texte,y_texte : CARDINAL;
  9. PROCEDURE MODE(x:BYTE);
  10. VAR r : SYSTEM.Registers;
  11. BEGIN
  12. r.AH := 0;
  13. r.AL := x;
  14. Lib.Intr(r,10H);
  15. END MODE;
  16. PROCEDURE page(x:BYTE);
  17. VAR r : SYSTEM.Registers;
  18. BEGIN
  19. la_page := x;
  20. r.AH := 5H;
  21. r.AL := x;
  22. Lib.Intr(r,10H);
  23. END page;
  24. PROCEDURE XGotoXY(x,y:CARDINAL);
  25. BEGIN
  26. IF ODD(y) THEN
  27. y :=( y DIV 2 ) + 1
  28. ELSE
  29. x := x + 40;
  30. y := y DIV 2;
  31. END;
  32. Window.GotoXY(x,y);
  33. END XGotoXY;
  34. PROCEDURE GotoXY(x,y:BYTE);
  35. VAR r : SYSTEM.Registers;
  36. BEGIN
  37. WITH r DO
  38. AH := 2;
  39. BH := la_page;
  40. DL := x;
  41. DH := y;
  42. END;
  43. Lib.Intr(r,10H);
  44. END GotoXY;
  45. PROCEDURE WrChar(a:CHAR;couleur:BYTE);
  46. VAR r : SYSTEM.Registers;
  47. BEGIN
  48. WITH r DO
  49. AL := BYTE(a);
  50. BH := la_page;
  51. BL := couleur;
  52. AH := 0EH;
  53. Lib.Intr(r,10H);
  54. END;
  55. END WrChar;
  56. PROCEDURE WrStr(x : ARRAY OF CHAR;couleur:BYTE);
  57. VAR i : CARDINAL;
  58. BEGIN
  59. i := 0;
  60. REPEAT
  61. WrChar(x[i],couleur);
  62. INC(i);
  63. UNTIL ( i = Str.Length(x) ) OR ( x[i] = CHR(0) )
  64. END WrStr;
  65. PROCEDURE WrCharRep(x : CHAR; nombre:CARDINAL;couleur:BYTE);
  66. VAR i : CARDINAL;
  67. BEGIN
  68. FOR i := 1 TO nombre DO
  69. WrChar(x,couleur);
  70. END;
  71. END WrCharRep;
  72. PROCEDURE RdChar():CHAR;
  73. VAR r : SYSTEM.Registers;
  74. BEGIN
  75. WITH r DO
  76. AH :=1;
  77. Lib.Intr(r,21H);
  78. RETURN CHAR(AL);
  79. END;
  80. END RdChar;
  81. PROCEDURE RdKey():CHAR;
  82. VAR r : SYSTEM.Registers;
  83. BEGIN
  84. WITH r DO
  85. AH :=7;
  86. Lib.Intr(r,21H);
  87. RETURN CHAR(AL);
  88. END;
  89. END RdKey;
  90. VAR fichier:FIO.File;
  91. VAR INSERT : BOOLEAN;
  92. PROCEDURE ouvre;
  93. BEGIN
  94. FIO.IOcheck := FALSE;
  95. fichier := FIO.Open('fichier.txt');
  96. IF FIO.IOresult()<>0 THEN fichier := FIO.Create('fichier.txt');
  97. END;
  98. END ouvre;
  99. PROCEDURE debut;
  100. BEGIN
  101. Window.Clear;
  102. GotoXY(5,5);
  103. WrStr("Bonjour ",1);
  104. GotoXY(5,7);
  105. WrStr("Voici un petit ‚diteur !!!!!",1);
  106. GotoXY(2,20);
  107. WrStr("Tape une touche pour continuer",1);
  108. car := RdKey();
  109. END debut;
  110. PROCEDURE Clear(x:BYTE);
  111. BEGIN
  112. AsmLib.Fill([0B800H:0000H],2048,20H);
  113. END Clear;
  114. PROCEDURE menu;
  115. VAR l_page : BYTE;
  116. car : CHAR;
  117. BEGIN
  118. l_page := la_page;
  119. page(3);
  120. GotoXY(5,2);
  121. WrStr(" M e n u P r i n c i p a l ",1);
  122. GotoXY(0,7);
  123. WrCharRep( CHR(205),40,100);
  124. GotoXY(3,8);
  125. WrStr(" Fichier Bloc Impression ",1);
  126. GotoXY(0,9);
  127. WrCharRep( CHR(205),40,1);
  128. REPEAT
  129. car := RdKey();
  130. UNTIL car = CHR(27);
  131. page(l_page);
  132. END menu;
  133. VAR choix : CHAR;
  134. Ligne,Colonne : ARRAY[0..1] OF CHAR;
  135. ok : BOOLEAN;
  136. PROCEDURE bip;
  137. BEGIN
  138. WrChar(7C,0);
  139. END bip;
  140. PROCEDURE ligne;
  141. BEGIN
  142. GotoXY(0,VAL(BYTE,y_texte));
  143. WrStr(texte[y_texte],1);
  144. END ligne;
  145. PROCEDURE xy;
  146. BEGIN
  147. GotoXY(VAL(BYTE,x_texte),VAL(BYTE,y_texte));
  148. END xy;
  149. PROCEDURE bout;
  150. BEGIN
  151. IF x_texte > Str.Length(texte[y_texte]) THEN
  152. x_texte := Str.Length(texte[y_texte]);
  153. END;
  154. END bout;
  155. PROCEDURE insere_car;
  156. VAR l_chaine : ARRAY[0..39] OF CHAR;
  157. BEGIN
  158. IF INSERT THEN
  159. IF Str.Length(texte[y_texte]) < 39 THEN
  160. Str.Insert(texte[y_texte],car,x_texte);
  161. INC(x_texte);
  162. GotoXY(VAL(BYTE,x_texte-1),VAL(BYTE,y_texte));
  163. Str.Slice(l_chaine,texte[y_texte],x_texte-1,Str.Length(texte[y_texte]));
  164. WrStr(l_chaine,1);
  165. xy;
  166. ELSE bip
  167. END;
  168. ELSE
  169. texte[y_texte][x_texte] := car;
  170. GotoXY(VAL(BYTE,x_texte),VAL(BYTE,y_texte));
  171. Str.Slice(l_chaine,texte[y_texte],x_texte,Str.Length(texte[y_texte]));
  172. WrStr(l_chaine,1);
  173. xy;
  174. END;
  175. END insere_car;
  176. PROCEDURE sud;
  177. BEGIN
  178. IF y_texte < 23 THEN
  179. INC(y_texte);
  180. bout;
  181. GotoXY(VAL(BYTE,x_texte),VAL(BYTE,y_texte));
  182. END;
  183. END sud;
  184. PROCEDURE nord;
  185. BEGIN
  186. IF y_texte > 2 THEN
  187. DEC(y_texte);
  188. bout;
  189. xy;
  190. END;
  191. END nord;
  192. PROCEDURE est;
  193. BEGIN
  194. IF (x_texte < 39) AND ( x_texte < Str.Length(texte[y_texte]) ) THEN
  195. INC(x_texte);
  196. xy;
  197. END;
  198. END est;
  199. PROCEDURE ouest;
  200. BEGIN
  201. IF x_texte > 0 THEN
  202. DEC(x_texte);
  203. xy;
  204. END;
  205. END ouest;
  206. PROCEDURE RC;
  207. BEGIN
  208. IF y_texte < 23 THEN
  209. sud;
  210. xy;
  211. END;
  212. END RC;
  213. PROCEDURE affiche_coordonnees;
  214. BEGIN
  215. GotoXY(27,0);
  216. Str.CardToStr(VAL(LONGCARD,y_texte-1),Ligne,10,ok);
  217. WrStr( Ligne,1);
  218. Str.CardToStr(VAL(LONGCARD,x_texte+1),Colonne,10,ok);
  219. GotoXY(38,0);
  220. WrStr(Colonne,1);
  221. xy;
  222. END affiche_coordonnees;
  223. PROCEDURE debut_ligne;
  224. BEGIN
  225. x_texte := 0;
  226. xy;
  227. END debut_ligne;
  228. PROCEDURE fin_ligne;
  229. BEGIN
  230. x_texte := Str.Length(texte[y_texte]);
  231. xy;
  232. END fin_ligne;
  233. PROCEDURE backspace;
  234. VAR l_chaine : ARRAY[0..39] OF CHAR;
  235. BEGIN
  236. IF x_texte > 0 THEN
  237. Str.Delete(texte[y_texte],x_texte-1,1);
  238. GotoXY(VAL(BYTE,x_texte-1),VAL(BYTE,y_texte));
  239. Str.Slice(l_chaine,texte[y_texte],x_texte-1,Str.Length(texte[y_texte]));
  240. WrStr(l_chaine,1);
  241. WrChar(" ",1);
  242. DEC(x_texte);
  243. xy;
  244. ELSE bip
  245. END;
  246. END backspace;
  247. PROCEDURE DEL;
  248. VAR l_chaine : ARRAY[0..39] OF CHAR;
  249. BEGIN
  250. Str.Delete(texte[y_texte],x_texte,1);
  251. IF x_texte > 0 THEN
  252. GotoXY(VAL(BYTE,x_texte-1),VAL(BYTE,y_texte));
  253. Str.Slice(l_chaine,texte[y_texte],x_texte-1,Str.Length(texte[y_texte]));
  254. WrStr(l_chaine,0);
  255. WrChar(" ",1);
  256. ELSE
  257. WrStr(texte[y_texte],1);
  258. WrChar(" ",1);
  259. END;
  260. xy;
  261. bout;
  262. END DEL;
  263. PROCEDURE insertion;
  264. BEGIN
  265. INSERT := NOT INSERT;
  266. END insertion;
  267. BEGIN
  268. MODE(1);
  269. page(5);
  270. debut;
  271. page(0);
  272. Clear(0);
  273. GotoXY(0,0);
  274. WrStr("F10:MENU Fich: Ligne: Colonne: ",1);
  275. GotoXY(0,1);
  276. WrCharRep( CHR(205),40,100);
  277. x_texte := 0;
  278. y_texte := 2;
  279. INSERT := TRUE;
  280. ligne;
  281. REPEAT
  282. affiche_coordonnees;
  283. car := RdKey();
  284. CASE car OF
  285. | 0C : choix := RdKey();
  286. CASE choix OF
  287. | CHR(77) : est;
  288. | CHR(75) : ouest;
  289. | CHR(72) : nord;
  290. | CHR(80) : sud;
  291. | 104C : menu; (* menu *)
  292. (* | CHR(59) : F1 ; (* aide *)
  293. | CHR(60) : F2 ; (* sauvegarde *)
  294. | CHR(61) : F3 ; *) (* chargement *)
  295. | CHR(83) : DEL; (*
  296. | CHR(73) : PGUP;
  297. | CHR(81) : PGDN;
  298. | CHR(71) : HOME; (* debut fichier *)
  299. | CHR(79) : end;*) (* fin fichier *)
  300. | CHR(82) : insertion;
  301. END;
  302. | CHR(1) : debut_ligne;
  303. | CHR(2) : fin_ligne;
  304. | CHR(8) : backspace;
  305. | ' ' .. '}' : insere_car;
  306. | 15C : RC;
  307. END;
  308. UNTIL car = CHR(27);
  309. MODE(3);
  310. END ED.
  311.