| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- (* programme comment‚ et expliqu‚ dans le livre *)
- (* LE DESASSEMBLEUR 8086 COLIBRI, publi‚ par *)
- (* L'INSTITUT PASCAL: *)
- (* 26 Rue Lamartine, 75009 PARIS *)
- (* Tel: (1) 42.85.10.82 *)
- procedure charge_objet;
- var l_choix: char;
- procedure charge_les_blocs;
- var l_fichier_objet: file;
- l_bloc_debut, l_bloc_fin, l_nombre_blocs: integer;
- begin
- assign(l_fichier_objet, nom_fichier_objet);
- (*$i-*)
- reset(l_fichier_objet, $0100);
- (*$i+*)
- if ioresult<> 0
- then begin
- writeln('pas de fichier ', nom_fichier_objet, '. exit');
- close(l_fichier_objet);
- exit;
- end;
- l_nombre_blocs:= filesize(l_fichier_objet);
- if l_nombre_blocs> $80
- then begin
- if (adresse_debut- $0100<>0) or (adresse_fin- $0100<> 0)
- then begin
- l_bloc_debut:= (adresse_debut- $0100) shr 8;
- l_bloc_fin:= (adresse_fin- $0100) shr 8;
- if adresse_fin and $00FF<> 0
- then l_bloc_fin:= l_bloc_fin+ 1;
- l_nombre_blocs:= l_bloc_fin- l_bloc_debut;
- if l_nombre_blocs> $80
- then begin
- writeln('ne peut pas charger tout l''objet');
- writeln('utilisez une plus petite plage d‚but/fin');
- close(l_fichier_objet);
- exit;
- end
- else
- if l_bloc_debut<> 0
- then seek(l_fichier_objet, l_bloc_debut);
- end
- else begin
- writeln('ne peut pas charger tout l''objet');
- writeln('pr‚cisez l''adresse de d‚but et de fin');
- close(l_fichier_objet);
- exit;
- end;
- end;
- fillchar(tampon, sizeof(tampon), 0);
- blockread(l_fichier_objet, tampon, l_nombre_blocs);
- close(l_fichier_objet);
- adresse_debut_tampon:= adresse_debut and $FF00;
- adresse_fin_tampon:= adresse_debut_tampon+ l_nombre_blocs shl 8- 1;
- while tampon[adresse_fin_tampon- adresse_debut_tampon]= 0 do
- adresse_fin_tampon:= adresse_fin_tampon- 1;
- if adresse_fin- $8000> adresse_fin_tampon- $8000
- then adresse_fin:= adresse_fin_tampon;
- a_charge_objet:= true;
- end;
- begin
- repeat
- writeln;
- write('de $', f_entier_hexadecimal(adresse_debut));
- writeln(' … $', f_entier_hexadecimal(adresse_fin));
- write('Minimum, mAximum, Charge, Quitte ? ');
- l_choix:= f_lis_commande(['C', 'M', 'A', 'Q', ' ', k_return]);
- case l_choix of
- 'A' : begin
- writeln; write('maximum: ? $');
- lis_entier_hexadecimal(13, wherey, adresse_fin);
- end;
- 'C' : charge_les_blocs;
- 'M' : begin
- writeln; write('minimum: ? $');
- lis_entier_hexadecimal(13, wherey, adresse_debut);
- end;
- end;
- until l_choix in ['Q', 'C'];
- end;
- procedure lis_octet_suivant(var pv_octet: byte);
- begin
- pv_octet:= tampon[adresse- adresse_debut_tampon];
- adresse:= adresse+ 1;
- if b_avec_octets_hexadecimaux
- then write(sortie, f_octet_hexadecimal(pv_octet));
- end;
- procedure lis_entier_suivant(var pv_entier: integer);
- var l_octet1, l_octet2: byte;
- begin
- lis_octet_suivant(l_octet1);
- lis_octet_suivant(l_octet2);
- pv_entier:= l_octet2 shl 8+ l_octet1;
- end;
- procedure liste_objet;
- var l_indice, l_fin: integer;
- begin
- write('d‚but ? '); lis_entier(l_indice);
- write('fin ? '); lis_entier(l_fin);
- for l_indice:= l_indice to l_fin do
- begin
- write(sortie, f_octet_hexadecimal(tampon[l_indice]));
- if l_indice and $000F= 0
- then writeln(sortie);
- end;
- end;
|