COMMENTA.PAS 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. (* programme comment‚ et expliqu‚ dans le livre *)
  2. (* LE DESASSEMBLEUR 8086 COLIBRI, publi‚ par *)
  3. (* L'INSTITUT PASCAL: *)
  4. (* 26 Rue Lamartine, 75009 PARIS *)
  5. (* Tel: (1) 42.85.10.82 *)
  6. (*$r+*)
  7. program gestion_des_commentaires;
  8. type string2= string[2];
  9. string4= string[4];
  10. string64= string[64];
  11. string127= string[127];
  12. set_of_char= set of char;
  13. t_fiche= record
  14. adresse: integer;
  15. position_commentaire: char;
  16. commentaire: string127;
  17. end;
  18. var choix, choix1: char;
  19. nom_fichier: string64;
  20. fiche: t_fiche;
  21. fichier: file of t_fiche;
  22. resultat_entree_sortie: byte;
  23. function f_octet_hexadecimal(p_octet: byte): string2;
  24. const kt_hexa: array[0..15] of char= '0123456789ABCDEF';
  25. begin
  26. f_octet_hexadecimal:= concat(kt_hexa[p_octet div 16],
  27. kt_hexa[p_octet mod 16]);
  28. end;
  29. function f_entier_hexadecimal(p_entier: integer): string4;
  30. begin
  31. f_entier_hexadecimal:= concat(f_octet_hexadecimal(hi(p_entier)),
  32. f_octet_hexadecimal(lo(p_entier)));
  33. end;
  34. function f_lis_commande(p_ensemble_ok: set_of_char): char;
  35. var l_touche: char;
  36. begin
  37. repeat
  38. read(kbd, l_touche);
  39. l_touche:= upcase(l_touche); write(l_touche);
  40. until l_touche in p_ensemble_ok;
  41. f_lis_commande:= l_touche;
  42. end;
  43. function f_fichier_existe(p_nom_fichier: string64): boolean;
  44. begin
  45. assign(fichier, p_nom_fichier);
  46. (*$i-*)
  47. reset(fichier);
  48. (*$i+*)
  49. f_fichier_existe:= ioresult= 0;
  50. close(fichier);
  51. end;
  52. procedure change_nom_fichier;
  53. begin
  54. write('nom <a:zones.dta> ? '); readln(nom_fichier);
  55. end;
  56. procedure cree_fichier;
  57. begin
  58. if f_fichier_existe(nom_fichier)
  59. then begin
  60. writeln;
  61. write('le fichier existe d‚j…. D‚truire, Quitter ? ');
  62. if f_lis_commande(['D', 'Q'])<> 'D'
  63. then exit;
  64. end;
  65. assign(fichier, nom_fichier);
  66. rewrite(fichier);
  67. close(fichier);
  68. end;
  69. procedure ouvre_fichier;
  70. begin
  71. assign(fichier, nom_fichier);
  72. (*$i-*)
  73. reset(fichier);
  74. (*$i+*)
  75. resultat_entree_sortie:= ioresult;
  76. if resultat_entree_sortie<> 0
  77. then writeln('le fichier ', nom_fichier, ' n''a pas ‚t‚ ouvert');
  78. end;
  79. procedure affiche_fiche(p_numero, p_adresse: integer;
  80. p_position_commentaire: char; p_commentaire: string127);
  81. begin
  82. write(p_numero: 5);
  83. write(' $', f_entier_hexadecimal(p_adresse));
  84. write(p_position_commentaire: 2, ' ');
  85. write(p_commentaire);
  86. end;
  87. procedure liste_fichier;
  88. var l_numero_fiche: integer;
  89. l_dernier_numero: integer;
  90. begin
  91. ouvre_fichier;
  92. if resultat_entree_sortie<> 0
  93. then exit;
  94. repeat
  95. write('num‚ro d‚but <0> ? '); readln(l_numero_fiche);
  96. until (l_numero_fiche>= 0) and (l_numero_fiche< filesize(fichier));
  97. write('num‚ro fin <', filesize(fichier), '> ? '); readln(l_dernier_numero);
  98. seek(fichier, l_numero_fiche);
  99. while not eof(fichier) and (l_numero_fiche<= l_dernier_numero) do
  100. begin
  101. read(fichier, fiche);
  102. with fiche do
  103. affiche_fiche(l_numero_fiche, adresse, position_commentaire, commentaire);
  104. writeln;
  105. l_numero_fiche:= l_numero_fiche+ 1;
  106. end;
  107. close(fichier);
  108. end;
  109. procedure ajoute_fichier;
  110. begin
  111. ouvre_fichier;
  112. if resultat_entree_sortie<> 0
  113. then exit;
  114. seek(fichier, filesize(fichier));
  115. repeat
  116. writeln;
  117. writeln('ajoute la fiche: ', filepos(fichier));
  118. write('adresse <$1234> ? '); readln(fiche.adresse);
  119. write('D‚but, Milieu, Fin ? ');
  120. fiche.position_commentaire:= f_lis_commande(['D', 'M', 'F']);
  121. writeln;
  122. write('commentaire <; calcul> ? '); readln(fiche.commentaire);
  123. write(fichier, fiche);
  124. write('Continuer, Quitter ? ');
  125. read(kbd, choix1); writeln(choix1);
  126. until upcase(choix1)= 'Q';
  127. close(fichier);
  128. end;
  129. procedure modifie_fichier;
  130. var l_numero_fiche: integer;
  131. begin
  132. ouvre_fichier;
  133. if resultat_entree_sortie<> 0
  134. then exit;
  135. repeat
  136. writeln;
  137. repeat
  138. write('modifie la fiche fiche num‚ro <0..', filesize(fichier)- 1, '> ? ');
  139. readln(l_numero_fiche);
  140. until (l_numero_fiche>= 0) and (l_numero_fiche< filesize(fichier));
  141. seek(fichier, l_numero_fiche); read(fichier, fiche);
  142. with fiche do
  143. affiche_fiche(l_numero_fiche, adresse, position_commentaire, commentaire);
  144. writeln;
  145. write('adresse ? '); readln(fiche.adresse);
  146. write('D‚but, Milieu, Fin ? ');
  147. fiche.position_commentaire:= f_lis_commande(['D', 'M', 'F']);
  148. writeln;
  149. write('commentaire <; calcul> ? '); readln(fiche.commentaire);
  150. seek(fichier, l_numero_fiche); write(fichier, fiche);
  151. write('Continuer, Quitter ? ');
  152. read(kbd, choix1); writeln(choix1);
  153. until upcase(choix1)= 'Q';
  154. close(fichier);
  155. end;
  156. procedure supprime_fiche;
  157. var l_numero_fiche: integer;
  158. begin
  159. ouvre_fichier;
  160. if resultat_entree_sortie<> 0
  161. then exit;
  162. repeat
  163. writeln;
  164. repeat
  165. write('supprime la fiche fiche num‚ro <0..', filesize(fichier)- 1, '> ? ');
  166. readln(l_numero_fiche);
  167. until (l_numero_fiche>= 0) and (l_numero_fiche< filesize(fichier));
  168. seek(fichier, l_numero_fiche); read(fichier, fiche);
  169. with fiche do
  170. affiche_fiche(l_numero_fiche, adresse, position_commentaire, commentaire);
  171. writeln;
  172. write('Supprime ? '); read(kbd, choix1); writeln(choix1);
  173. if upcase(choix1)= 'S'
  174. then begin
  175. fiche.position_commentaire:= '?';
  176. seek(fichier, l_numero_fiche); write(fichier, fiche);
  177. end;
  178. write('Continuer, Quitter ? ');
  179. read(kbd, choix1); writeln(choix1);
  180. until upcase(choix1)= 'Q';
  181. close(fichier);
  182. end;
  183. procedure initialise;
  184. begin
  185. nom_fichier:= 'commenta.dta';
  186. end;
  187. begin
  188. initialise;
  189. repeat
  190. writeln;
  191. writeln(nom_fichier);
  192. write('Cr‚e, Ajoute, Liste, Modifie, Supprime, Nom, Quitte ?');
  193. read(kbd, choix); writeln(choix); choix:= upcase(choix);
  194. case choix of
  195. 'A' : ajoute_fichier;
  196. 'C' : cree_fichier;
  197. 'L' : liste_fichier;
  198. 'M' : modifie_fichier;
  199. 'N' : change_nom_fichier;
  200. 'R' : supprime_fiche;
  201. 'S' : supprime_fiche;
  202. end;
  203. until choix= 'Q';
  204. end.