(* 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;