IZONES.PAS 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. procedure ouvre_fichier_zones;
  7. begin
  8. b_fichier_zones_ouvert:= true;
  9. (*$i-*)
  10. assign(fichier_zones, nom_fichier_zones);
  11. reset(fichier_zones);
  12. (*$i+*)
  13. if ioresult<> 0
  14. then begin
  15. write('pas de fichier ', nom_fichier_zones, ' Cr‚er, Quitter ? ');
  16. choix1:= f_lis_commande(['C', 'Q']);
  17. if choix1= 'C'
  18. then begin
  19. assign(fichier_zones, nom_fichier_zones);
  20. rewrite(fichier_zones);
  21. end
  22. else b_fichier_zones_ouvert:= false;
  23. end
  24. else writeln('a ouvert le fichier ', nom_fichier_zones);
  25. end;
  26. procedure ajoute_fiche_zone(p_debut: integer; p_type_zone: char);
  27. begin
  28. if not b_fichier_zones_ouvert
  29. then exit;
  30. fiche_zone.debut:= p_debut;
  31. fiche_zone.type_zone:= p_type_zone;
  32. seek(fichier_zones, filesize(fichier_zones));
  33. write(fichier_zones, fiche_zone);
  34. end;
  35. procedure charge_fichier_zones;
  36. var l_adresse_debut, l_adresse_fin: integer;
  37. l_choix: char;
  38. procedure charge_les_zones;
  39. procedure ajoute(var p: t_pt_zone);
  40. begin
  41. if p= nil
  42. then begin
  43. write('.');
  44. new(p);
  45. p^.debut:= fiche_zone.debut;
  46. p^.type_zone:= fiche_zone.type_zone;
  47. p^.pt_inferieurs:= nil; p^.pt_superieurs:= nil;
  48. end
  49. else
  50. if fiche_zone.debut- $8000< p^.debut- $8000
  51. then ajoute(p^.pt_inferieurs)
  52. else
  53. if fiche_zone.debut- $8000> p^.debut- $8000
  54. then ajoute(p^.pt_superieurs);
  55. end;
  56. begin
  57. racine_zone:= nil; seek(fichier_zones, 0);
  58. while not eof(fichier_zones) do
  59. begin
  60. read(fichier_zones, fiche_zone);
  61. with fiche_zone do
  62. begin
  63. if (debut- $8000>= l_adresse_debut- $8000) and (debut- $8000<= l_adresse_fin- $8000)
  64. then begin
  65. if fiche_zone.type_zone in ['a', 'h', 'c']
  66. then ajoute(racine_zone);
  67. end
  68. end;
  69. end;
  70. end;
  71. begin
  72. if not b_fichier_zones_ouvert
  73. then exit;
  74. l_adresse_debut:= $0100; l_adresse_fin:= $FFFF;
  75. repeat
  76. writeln;
  77. write('de $', f_entier_hexadecimal(l_adresse_debut));
  78. writeln(' … $', f_entier_hexadecimal(l_adresse_fin));
  79. write('Minimum, mAximum, charge Zones, Quitte ? ');
  80. l_choix:= f_lis_commande(['C', 'Z', 'M', 'A', 'Q', ' ', k_return]);
  81. case l_choix of
  82. 'A' : begin
  83. writeln; write('adresse maximum: <$1234> ? $');
  84. lis_entier_hexadecimal(29, wherey, l_adresse_fin);
  85. end;
  86. 'C', 'Z' : charge_les_zones;
  87. 'M' : begin
  88. writeln; write('adresse minimum: <$4567> ? $');
  89. lis_entier_hexadecimal(29, wherey, l_adresse_debut);
  90. end;
  91. end;
  92. until l_choix in ['Q', 'C', 'Z'];
  93. writeln;
  94. end;
  95. procedure liste_arbre_zones;
  96. var l_premiere_adresse: boolean;
  97. l_debut_precedent: integer;
  98. l_type_zone_precedent: char;
  99. procedure liste_les_zones(p_pt_zone: t_pt_zone);
  100. begin
  101. if p_pt_zone<> nil
  102. then begin
  103. liste_les_zones(p_pt_zone^.pt_inferieurs);
  104. with p_pt_zone^ do
  105. begin
  106. if (debut- $8000>= adresse_debut- $8000)
  107. and (debut- 1- $8000<= adresse_fin- $8000)
  108. then begin
  109. if l_premiere_adresse
  110. then l_premiere_adresse:= false
  111. else writeln(sortie, '$',
  112. f_entier_hexadecimal(l_debut_precedent),
  113. '-$',
  114. f_entier_hexadecimal(debut- 1),
  115. l_type_zone_precedent: 2);
  116. l_debut_precedent:= debut;
  117. l_type_zone_precedent:= type_zone;
  118. end;
  119. end;
  120. liste_les_zones(p_pt_zone^.pt_superieurs);
  121. end;
  122. end;
  123. begin
  124. entre_debut_fin('');
  125. writeln(sortie);
  126. l_premiere_adresse:= true;
  127. liste_les_zones(racine_zone);
  128. if l_debut_precedent- 1- $8000<= adresse_fin- $8000
  129. then writeln(sortie, '$',
  130. f_entier_hexadecimal(l_debut_precedent),
  131. '-$',
  132. f_entier_hexadecimal(adresse_fin),
  133. l_type_zone_precedent: 2);
  134. writeln(sortie);
  135. end;