| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- (* 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 commente_dos;
- begin
- met(' ; ');
- case l_ah_precedent of
- $00 : met('termine pg. PSP= CS');
- $01 : met('lis clavier avec echo. Car:= AL');
- $02 : begin
- met2('affiche car: ', f_octet_hexadecimal(l_dl_precedent));
- if l_dl_precedent in [32..126]
- then met2(' ', chr(l_dl_precedent));
- end;
- $03 : met('lis aux. Car:= AL');
- $04 : begin
- met2('ecris aux: ', f_octet_hexadecimal(l_dl_precedent));
- if l_dl_precedent in [32..126]
- then met2(' ', chr(l_dl_precedent));
- end;
- $05 : begin
- met2('imprime car: ', f_octet_hexadecimal(l_dl_precedent));
- if l_dl_precedent in [32..126]
- then met2(' ', chr(l_dl_precedent));
- end;
- $06 : met('direct console io. Si DL= $FF teste clav, Car:= AL; sinon affiche DL');
- $07 : met('lis console direct. Car:= AL, ss CTRL C ni echo');
- $08 : met('lis clavier. ss echo, mais test CTRL C');
- $09 : met2('affiche chaine: DS:', f_entier_hexadecimal(l_dx_precedent));
- $0A : met2('lis clavier tamponne: DS:', f_entier_hexadecimal(l_dx_precedent));
- $0B : met('test clavier. AL= $FF => car ds tampon');
- $0C : met2('flush tampon, lis clavier par fct MS DOS: ', f_octet_hexadecimal(l_al_precedent));
- $0D : met('reset disque');
- $0E : met3('select disk ', chr(l_dl_precedent+ 64), ' nb dsk= DL');
- $0F : met3('ouvre fichier. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
- $10 : met3('ferme fichier. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
- $11 : met3('cherche 1ere entree. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
- $12 : met3('cherche entree suiv. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
- $13 : met3('efface fichier. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
- $14 : met3('lis sequent. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' resu: AL');
- $15 : met3('ecris sequent. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' resu: AL');
- $16 : met3('cree fichier. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
- $17 : met3('renomme fichier. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
- $19 : met('disque courant. disque:= AL');
- $1A : met3('cree dta. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb dir: AL= $FF');
- $1B : met('read alloc table adr DOS1');
- $21 : met3('lis random. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' resu: AL');
- $22 : met3('ecris random. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' resu: AL');
- $23 : met3('filesize. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
- $24 : met2('set relative record. FCB: DS:', f_entier_hexadecimal(l_dx_precedent));
- $25 : begin
- met2('set vector #', f_octet_hexadecimal(l_al_precedent));
- met2(' isr: DS:', f_entier_hexadecimal(l_dx_precedent));
- end;
- $26 : met('cree nouveau PSP DOS1');
- $27 : begin
- met2('lis random block. FCB: DS:', f_entier_hexadecimal(l_dx_precedent));
- met2(' nb: ', f_entier_hexadecimal(l_cx_precedent));
- met(' resu: AL= 0, 1, 2, 3, CX= nb lus');
- end;
- $28 : begin
- met2('ecris random block. FCB: DS:', f_entier_hexadecimal(l_dx_precedent));
- met2(' nb: ', f_entier_hexadecimal(l_cx_precedent));
- met(' resu: AL= 0, 1, 2, CX= nb lus');
- end;
- $29 : begin
- met2('parse nom fichier. param: ', f_octet_hexadecimal(l_al_precedent));
- met(' nom: DS:SI, FCB: ES:DI. resu: AL, DS:SI, ES:DI');
- end;
- $2A : met('get date. an: CX, mois: DH, quant: DL, jour: AL');
- $2B : begin
- met2('set date. an:', f_entier_hexadecimal(l_cx_precedent));
- met2(' mois: ', f_octet_hexadecimal(l_dh_precedent));
- met3(' quant: ', f_entier_hexadecimal(l_dl_precedent), ' >ok AL=0');
- end;
- $2C : met('get time. >heure= CH, min= CL, sec= DH, 1/100= DL');
- $2D : begin
- met2('set time. heure: ', f_octet_hexadecimal(l_ch_precedent));
- met2(' min: ', f_octet_hexadecimal(l_cl_precedent));
- met2(' sec: ', f_octet_hexadecimal(l_dh_precedent));
- met3(' 1/100: ', f_octet_hexadecimal(l_dl_precedent), ' >ok AL= 0');
- end;
- $2E : met2('set/reset verify flag ', f_octet_hexadecimal(l_al_precedent));
- $2F : met('get dta. >ES:BX');
- $30 : met('get dos version. >AH AL');
- $31 : begin
- met2('keep process. Exit code ', f_octet_hexadecimal(l_al_precedent));
- met2(' parg m‚moire ', f_entier_hexadecimal(l_dx_precedent));
- end;
- $33 : met('CTRL C check');
- $35 : met('get interrupt vect');
- $36 : met('get disk free space');
- $38 : met('return pays');
- $39 : met('cree dir');
- $3A : met('supprime entree dir');
- $3B : met('change dir courant');
- $3C : met('cree fichier');
- $3D : met('ouvre fichier');
- $3E : met('ferme file handle');
- $3F : met('lis fichier/periph');
- $40 : met('ecris fichier/periph');
- $41 : met('efface entree dir');
- $42 : met('deplace file pointer');
- $43 : met('change attribut');
- $44 : met('io controle periph');
- $45 : met('double un file handle');
- $46 : met('force un duplicat du handle');
- $47 : met('retourne texte du dir');
- $48 : met('alloue m‚moireoire');
- $49 : met('m‚moireoire libre');
- $4A : met('modif blocs allou‚s');
- $4B : met('charge et execute pg');
- $4C : met('termine un process');
- $4D : met('recupere code retour de fils');
- $4E : met('trouve fichier match');
- $4F : met('pas a pas des match');
- $54 : met('retourne status de verify');
- $56 : met('deplace dir entry');
- $57 : met('get set date of file');
- end;
- end;
- procedure commente_interruption;
- begin
- met(' ; ****');
- case l_operande of
- $00 : met(' div par 0');
- $01 : met(' pas a pas');
- $02 : met(' nmi');
- $03 : met(' trappe pt arret');
- $04 : met(' debordement');
- $05 : met(' bios imprime ecran');
- $08 : met(' horloge');
- $09 : met(' clavier');
- $0A..$0C : met(' res communications');
- $0F : met(' res imprimante');
- $10 : begin
- met(' ; BIOS ECR');
- case l_ah_precedent of
- $00 : case l_al_precedent of
- $00 : met(' set 40*25 bw');
- $01 : met(' set 40*25 coul');
- $02 : met(' set 80*25 bw');
- $03 : met(' set 80*25 coul');
- $04 : met(' set 320*200 coul');
- $05 : met(' set 320*200 bw');
- $06 : met(' set 640*200 bw');
- end;
- $01 : begin
- met(' type curseur');
- met(f_octet_hexadecimal(l_ch_precedent));
- met(' a ');
- met(f_octet_hexadecimal(l_cl_precedent));
- end;
- $02 : begin
- met(' curseur en ');
- met(f_octet_hexadecimal(l_dh_precedent));
- met(' ');
- met(f_octet_hexadecimal(l_dl_precedent));
- met(' page ');
- met(f_octet_hexadecimal(l_bh_precedent));
- end;
- $03 : begin
- met(' lit curs page ');
- met(f_octet_hexadecimal(l_bh_precedent));
- end;
- $04 : met(' lit crayon');
- $05 : begin
- met(' set page ');
- met(f_octet_hexadecimal(l_al_precedent));
- end;
- $06 : begin
- met(' scroll up nb ');
- met(f_octet_hexadecimal(l_al_precedent));
- met(' hg ');
- met(f_octet_hexadecimal(l_ch_precedent));
- met(f_octet_hexadecimal(l_cl_precedent));
- met(' bd ');
- met(f_octet_hexadecimal(l_dh_precedent));
- met(f_octet_hexadecimal(l_dl_precedent));
- met(' attr ');
- met(f_octet_hexadecimal(l_bh_precedent));
- end;
- $07 : begin
- met(' scroll dwn nb ');
- met(f_octet_hexadecimal(l_al_precedent));
- met(' hg ');
- met(f_octet_hexadecimal(l_ch_precedent));
- met(f_octet_hexadecimal(l_cl_precedent));
- met(' bd ');
- met(f_octet_hexadecimal(l_dh_precedent));
- met(f_octet_hexadecimal(l_dl_precedent));
- met(' attr ');
- met(f_octet_hexadecimal(l_bh_precedent));
- end;
- $08 : begin
- met(' lit car page ');
- met(f_octet_hexadecimal(l_al_precedent));
- end;
- $09 : begin
- met(' ecris car page ');
- met(f_octet_hexadecimal(l_al_precedent));
- met(' nb '); met(f_entier_hexadecimal(l_cx_precedent));
- met2(' car ', f_octet_hexadecimal(l_al_precedent));
- met2(' attr ', f_octet_hexadecimal(l_bl_precedent));
- end;
- $0A : begin
- met(' ecris car page ');
- met(f_octet_hexadecimal(l_al_precedent));
- met2(' nb ', f_entier_hexadecimal(l_cx_precedent));
- met2(' car ', f_octet_hexadecimal(l_al_precedent));
- end;
- $0B : begin
- met(' set palette ');
- met(f_octet_hexadecimal(l_bh_precedent));
- met(' coul ');
- met(f_octet_hexadecimal(l_bl_precedent));
- end;
- $0C : begin
- met(' ecris point ligne ');
- met(f_entier_hexadecimal(l_dx_precedent));
- met(' col ');
- met(f_entier_hexadecimal(l_cx_precedent));
- met(' coul ');
- met(f_octet_hexadecimal(l_al_precedent));
- end;
- $0D : begin
- met(' lis point ligne ');
- met(f_entier_hexadecimal(l_dx_precedent));
- met(' col ');
- met(f_entier_hexadecimal(l_cx_precedent));
- met(' coul ');
- met(f_octet_hexadecimal(l_al_precedent));
- end;
- $0E : begin
- met(' ecris tty ');
- met(f_octet_hexadecimal(l_al_precedent));
- met(' coul ');
- met(f_octet_hexadecimal(l_bl_precedent));
- met(' page ');
- met(f_octet_hexadecimal(l_bh_precedent));
- end;
- $0F : met(' lis l_mode video');
- else met2(' ?????? ', f_octet_hexadecimal(l_ah_precedent));
- end;
- end;
- $11 : met(' test config');
- $12 : met(' taille m‚moire');
- $13 : met(' disquette');
- $14 : met(' serie');
- $15 : met(' cassette');
- $16 : begin
- met(' ; BIOS CLAV ');
- case l_ah_precedent of
- $00 : met(' lis car');
- $01 : met(' test car');
- $02 : met(' shift status');
- end;
- end;
- $17 : met(' imprimante');
- $18 : met(' basic cassette');
- $19 : met(' bootstrap');
- $1A : met(' heure');
- $1B : met(' ctrl brk');
- $1C : met(' top horloge');
- $1D : met(' initialise video');
- $1E : met(' param disquette');
- $1F : met(' car graphiques');
- $20 : met(' DOS pg terminate. PSP= cs');
- $21 : commente_dos;
- $22 : met(' DOS terminate address');
- $23 : met(' DOS CTRL C exit address');
- $24 : met(' DOS fatal disk error address. FCB ds bp:si');
- $25 : begin
- met(' DOS absolute disk read');
- met2(' dr: ', chr(l_al_precedent+ 64));
- met2(' dta: DS:', f_entier_hexadecimal(l_bx_precedent));
- met2(' nb sect: ', f_entier_hexadecimal(l_cx_precedent));
- met2(' rel sect: ', f_entier_hexadecimal(l_dx_precedent));
- end;
- $26 : begin
- met(' DOS absolute disk write');
- met2(' dr: ', chr(l_al_precedent+ 64));
- met2(' dta: DS:', f_entier_hexadecimal(l_bx_precedent));
- met2(' nb sect: ', f_entier_hexadecimal(l_cx_precedent));
- met2(' rel sect: ', f_entier_hexadecimal(l_dx_precedent));
- end;
- $27 : begin
- met(' DOS terminate stay resident DOS1 ');
- met2(' dern oct: CS:', f_entier_hexadecimal(l_dx_precedent));
- end;
- $28..$40 : met(' DOS reserves');
- else met(' ; **************');
- end;
- end;
- procedure affiche_caractere;
- begin
- case l_operande of
- $03 : met(' ; CTRL-C');
- $08 : met(' ; DEL');
- $09 : met(' ; TAB');
- $0A : met(' ; INTERLIGNE');
- $0D : met(' ; RETURN');
- $1A : met(' ; CTRL-Z');
- $1B : met(' ; ESCAPE');
- $20 : met(' ; ESPACE');
- $7F : met(' ; DEL');
- else
- if (l_operande> $20) and (l_operande<127)
- then met2(' ; ', chr(l_operande));
- end;
- end;
- procedure recupere_valeur_stockee_dans_registre;
- begin
- case l_code_operation of
- $B0 : begin
- l_al_precedent:= l_operande_precedent;
- affiche_caractere;
- end;
- $B1 : l_cl_precedent:= l_operande_precedent;
- $B2 : l_dl_precedent:= l_operande_precedent;
- $B3 : l_bl_precedent:= l_operande_precedent;
- $B4 : l_ah_precedent:= l_operande_precedent;
- $B5 : l_ch_precedent:= l_operande_precedent;
- $B6 : l_dh_precedent:= l_operande_precedent;
- $B7 : l_bh_precedent:= l_operande_precedent;
- $B8 : begin
- l_ax_precedent:= l_operande_precedent;
- l_al_precedent:= l_operande_precedent and $00FF;
- l_ah_precedent:= (l_operande_precedent and $FF00) shr 8;
- end;
- $B9 : begin
- l_cx_precedent:= l_operande_precedent;
- l_cl_precedent:= l_operande_precedent and $00FF;
- l_ch_precedent:= (l_operande_precedent and $FF00) shr 8;
- end;
- $BA : begin
- l_dx_precedent:= l_operande_precedent;
- l_dl_precedent:= l_operande_precedent and $00FF;
- l_dh_precedent:= (l_operande_precedent and $FF00) shr 8;
- end;
- $BB : begin
- l_bx_precedent:= l_operande_precedent;
- l_bl_precedent:= l_operande_precedent and $00FF;
- l_bh_precedent:= (l_operande_precedent and $FF00) shr 8;
- end;
- end;
- end;
|