IOBJET.PAS 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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 charge_objet;
  7. var l_choix: char;
  8. procedure charge_les_blocs;
  9. var l_fichier_objet: file;
  10. l_bloc_debut, l_bloc_fin, l_nombre_blocs: integer;
  11. begin
  12. assign(l_fichier_objet, nom_fichier_objet);
  13. (*$i-*)
  14. reset(l_fichier_objet, $0100);
  15. (*$i+*)
  16. if ioresult<> 0
  17. then begin
  18. writeln('pas de fichier ', nom_fichier_objet, '. exit');
  19. close(l_fichier_objet);
  20. exit;
  21. end;
  22. l_nombre_blocs:= filesize(l_fichier_objet);
  23. if l_nombre_blocs> $80
  24. then begin
  25. if (adresse_debut- $0100<>0) or (adresse_fin- $0100<> 0)
  26. then begin
  27. l_bloc_debut:= (adresse_debut- $0100) shr 8;
  28. l_bloc_fin:= (adresse_fin- $0100) shr 8;
  29. if adresse_fin and $00FF<> 0
  30. then l_bloc_fin:= l_bloc_fin+ 1;
  31. l_nombre_blocs:= l_bloc_fin- l_bloc_debut;
  32. if l_nombre_blocs> $80
  33. then begin
  34. writeln('ne peut pas charger tout l''objet');
  35. writeln('utilisez une plus petite plage d‚but/fin');
  36. close(l_fichier_objet);
  37. exit;
  38. end
  39. else
  40. if l_bloc_debut<> 0
  41. then seek(l_fichier_objet, l_bloc_debut);
  42. end
  43. else begin
  44. writeln('ne peut pas charger tout l''objet');
  45. writeln('pr‚cisez l''adresse de d‚but et de fin');
  46. close(l_fichier_objet);
  47. exit;
  48. end;
  49. end;
  50. fillchar(tampon, sizeof(tampon), 0);
  51. blockread(l_fichier_objet, tampon, l_nombre_blocs);
  52. close(l_fichier_objet);
  53. adresse_debut_tampon:= adresse_debut and $FF00;
  54. adresse_fin_tampon:= adresse_debut_tampon+ l_nombre_blocs shl 8- 1;
  55. while tampon[adresse_fin_tampon- adresse_debut_tampon]= 0 do
  56. adresse_fin_tampon:= adresse_fin_tampon- 1;
  57. if adresse_fin- $8000> adresse_fin_tampon- $8000
  58. then adresse_fin:= adresse_fin_tampon;
  59. a_charge_objet:= true;
  60. end;
  61. begin
  62. repeat
  63. writeln;
  64. write('de $', f_entier_hexadecimal(adresse_debut));
  65. writeln(' … $', f_entier_hexadecimal(adresse_fin));
  66. write('Minimum, mAximum, Charge, Quitte ? ');
  67. l_choix:= f_lis_commande(['C', 'M', 'A', 'Q', ' ', k_return]);
  68. case l_choix of
  69. 'A' : begin
  70. writeln; write('maximum: ? $');
  71. lis_entier_hexadecimal(13, wherey, adresse_fin);
  72. end;
  73. 'C' : charge_les_blocs;
  74. 'M' : begin
  75. writeln; write('minimum: ? $');
  76. lis_entier_hexadecimal(13, wherey, adresse_debut);
  77. end;
  78. end;
  79. until l_choix in ['Q', 'C'];
  80. end;
  81. procedure lis_octet_suivant(var pv_octet: byte);
  82. begin
  83. pv_octet:= tampon[adresse- adresse_debut_tampon];
  84. adresse:= adresse+ 1;
  85. if b_avec_octets_hexadecimaux
  86. then write(sortie, f_octet_hexadecimal(pv_octet));
  87. end;
  88. procedure lis_entier_suivant(var pv_entier: integer);
  89. var l_octet1, l_octet2: byte;
  90. begin
  91. lis_octet_suivant(l_octet1);
  92. lis_octet_suivant(l_octet2);
  93. pv_entier:= l_octet2 shl 8+ l_octet1;
  94. end;
  95. procedure liste_objet;
  96. var l_indice, l_fin: integer;
  97. begin
  98. write('d‚but ? '); lis_entier(l_indice);
  99. write('fin ? '); lis_entier(l_fin);
  100. for l_indice:= l_indice to l_fin do
  101. begin
  102. write(sortie, f_octet_hexadecimal(tampon[l_indice]));
  103. if l_indice and $000F= 0
  104. then writeln(sortie);
  105. end;
  106. end;