AFFICHE.PAS 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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 affiche;
  8. type string2= string[2];
  9. string4= string[4];
  10. string64= string[64];
  11. var choix: char;
  12. nom_fichier_objet: string64;
  13. adresse_debut, adresse_fin: integer;
  14. a_charge_objet: boolean;
  15. tampon: array[$0..$7FFF] of byte;
  16. sortie: text;
  17. nom_sortie: string64;
  18. function f_octet_hexadecimal(p_octet: byte): string2;
  19. const kt_hexa: array[0..15] of char= '0123456789ABCDEF';
  20. begin
  21. f_octet_hexadecimal:= concat(kt_hexa[p_octet div 16],
  22. kt_hexa[p_octet mod 16]);
  23. end;
  24. function f_entier_hexadecimal(p_entier: integer): string4;
  25. begin
  26. f_entier_hexadecimal:= concat(f_octet_hexadecimal(hi(p_entier)),
  27. f_octet_hexadecimal(lo(p_entier)));
  28. end;
  29. procedure choisis_sortie;
  30. begin
  31. write('nom sortie <a:essai.txt> ? '); readln(nom_sortie);
  32. writeln(sortie); close(sortie);
  33. assign(sortie, nom_sortie); rewrite(sortie);
  34. writeln(sortie);
  35. end;
  36. procedure charge_objet;
  37. var l_fichier_objet: file;
  38. l_bloc_debut, l_bloc_fin, l_nombre_blocs: integer;
  39. l_fin: integer;
  40. begin
  41. assign(l_fichier_objet, nom_fichier_objet);
  42. (*$i-*)
  43. reset(l_fichier_objet, $0100);
  44. (*$i+*)
  45. if ioresult<> 0
  46. then begin
  47. writeln('pas de fichier ', nom_fichier_objet, '. exit');
  48. close(l_fichier_objet);
  49. exit;
  50. end;
  51. l_nombre_blocs:= filesize(l_fichier_objet);
  52. if l_nombre_blocs> $80
  53. then begin
  54. if (adresse_debut- $0100<>0) or (adresse_fin- $0100<> 0)
  55. then begin
  56. l_bloc_debut:= (adresse_debut- $0100) shr 8;
  57. l_bloc_fin:= (adresse_fin- $0100) shr 8;
  58. if adresse_fin and $00FF<> 0
  59. then l_bloc_fin:= l_bloc_fin+ 1;
  60. l_nombre_blocs:= l_bloc_fin- l_bloc_debut;
  61. if l_nombre_blocs> $80
  62. then begin
  63. writeln('ne peut pas charger tout l''objet');
  64. writeln('utilisez une plus petite plage d‚but/fin');
  65. close(l_fichier_objet);
  66. exit;
  67. end
  68. else
  69. if l_bloc_debut<> 0
  70. then seek(l_fichier_objet, l_bloc_debut);
  71. end
  72. else begin
  73. writeln('ne peut pas charger tout l''objet');
  74. writeln('pr‚cisez l''adresse de d‚but et de fin');
  75. close(l_fichier_objet);
  76. exit;
  77. end;
  78. end;
  79. fillchar(tampon, sizeof(tampon), 0);
  80. blockread(l_fichier_objet, tampon, l_nombre_blocs);
  81. close(l_fichier_objet);
  82. l_fin:= adresse_debut and $FF00+ l_nombre_blocs* $0100- 1;
  83. if l_fin- $8000> adresse_fin
  84. then adresse_fin:= l_fin;
  85. while tampon[adresse_fin- adresse_debut]= 0 do
  86. adresse_fin:= adresse_fin- 1;
  87. a_charge_objet:= true;
  88. end;
  89. procedure affiche_tampon;
  90. var l_colonne: integer;
  91. l_indice_debut, l_indice_tampon, l_alignement: integer;
  92. l_quantite: integer;
  93. l_octet: byte;
  94. begin
  95. if not a_charge_objet
  96. then charge_objet;
  97. l_indice_debut:= adresse_debut and $FF00;
  98. l_alignement:= adresse_debut and $0007;
  99. l_indice_tampon:= adresse_debut and $00F8;
  100. l_quantite:= adresse_fin- (adresse_debut and $FF00)+ 1;
  101. while l_quantite> 0 do
  102. begin
  103. write(sortie, '$', f_entier_hexadecimal(l_indice_tampon+ l_indice_debut), ' ');
  104. if l_alignement> 0
  105. then begin
  106. write(sortie, '': 4*l_alignement);
  107. l_colonne:= l_alignement;
  108. end
  109. else l_colonne:= 0;
  110. while (l_colonne<= 7) and (l_quantite- l_colonne> 0) do
  111. begin
  112. l_octet:= tampon[l_indice_tampon+ l_colonne];
  113. write(sortie, '$', f_octet_hexadecimal(l_octet), ' ');
  114. l_colonne:= l_colonne+ 1;
  115. end;
  116. write(sortie, '': 4* (8- l_colonne), ':');
  117. if l_alignement> 0
  118. then begin
  119. write(sortie, '': l_alignement);
  120. l_colonne:= l_alignement;
  121. l_alignement:= 0;
  122. end
  123. else l_colonne:= 0;
  124. while (l_colonne<= 7) and (l_quantite- l_colonne> 0) do
  125. begin
  126. l_octet:= tampon[l_indice_tampon+ l_colonne];
  127. if l_octet in [32..127]
  128. then write(sortie, chr(l_octet))
  129. else write(sortie, '.');
  130. l_colonne:= l_colonne+ 1;
  131. end;
  132. writeln(sortie);
  133. l_quantite:= l_quantite- 8;
  134. l_indice_tampon:= l_indice_tampon+ 8;
  135. end;
  136. end;
  137. procedure initialise;
  138. begin
  139. nom_sortie:= 'con:';
  140. assign(sortie, nom_sortie);
  141. reset(sortie);
  142. nom_fichier_objet:= 'mystere.com';
  143. a_charge_objet:= false;
  144. adresse_debut:= $0100;
  145. adresse_fin:= $80FF;
  146. end;
  147. begin
  148. initialise;
  149. repeat
  150. writeln;
  151. write(nom_fichier_objet, ' $', f_entier_hexadecimal(adresse_debut));
  152. write('-$', f_entier_hexadecimal(adresse_fin));
  153. writeln(' -> ', nom_sortie);
  154. write('Nom, D‚but, Fin, Charge, Affiche, Sortie, Quitte ? ');
  155. read(kbd, choix); writeln(choix);
  156. choix:= upcase(choix);
  157. case choix of
  158. 'A' : affiche_tampon;
  159. 'C' : charge_objet;
  160. 'D' : begin
  161. write('adresse d‚but <$1234> ? '); readln(adresse_debut);
  162. end;
  163. 'F' : begin
  164. write('adresse fin <$2345> ? '); readln(adresse_fin);
  165. end;
  166. 'N' : begin
  167. write('nom fichier <a:essai.com> ? ');
  168. readln(nom_fichier_objet);
  169. end;
  170. 'S' : choisis_sortie;
  171. end;
  172. until choix= 'Q';
  173. close(sortie);
  174. end.