ICODE2.PAS 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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 commente_dos;
  7. begin
  8. met(' ; ');
  9. case l_ah_precedent of
  10. $00 : met('termine pg. PSP= CS');
  11. $01 : met('lis clavier avec echo. Car:= AL');
  12. $02 : begin
  13. met2('affiche car: ', f_octet_hexadecimal(l_dl_precedent));
  14. if l_dl_precedent in [32..126]
  15. then met2(' ', chr(l_dl_precedent));
  16. end;
  17. $03 : met('lis aux. Car:= AL');
  18. $04 : begin
  19. met2('ecris aux: ', f_octet_hexadecimal(l_dl_precedent));
  20. if l_dl_precedent in [32..126]
  21. then met2(' ', chr(l_dl_precedent));
  22. end;
  23. $05 : begin
  24. met2('imprime car: ', f_octet_hexadecimal(l_dl_precedent));
  25. if l_dl_precedent in [32..126]
  26. then met2(' ', chr(l_dl_precedent));
  27. end;
  28. $06 : met('direct console io. Si DL= $FF teste clav, Car:= AL; sinon affiche DL');
  29. $07 : met('lis console direct. Car:= AL, ss CTRL C ni echo');
  30. $08 : met('lis clavier. ss echo, mais test CTRL C');
  31. $09 : met2('affiche chaine: DS:', f_entier_hexadecimal(l_dx_precedent));
  32. $0A : met2('lis clavier tamponne: DS:', f_entier_hexadecimal(l_dx_precedent));
  33. $0B : met('test clavier. AL= $FF => car ds tampon');
  34. $0C : met2('flush tampon, lis clavier par fct MS DOS: ', f_octet_hexadecimal(l_al_precedent));
  35. $0D : met('reset disque');
  36. $0E : met3('select disk ', chr(l_dl_precedent+ 64), ' nb dsk= DL');
  37. $0F : met3('ouvre fichier. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
  38. $10 : met3('ferme fichier. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
  39. $11 : met3('cherche 1ere entree. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
  40. $12 : met3('cherche entree suiv. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
  41. $13 : met3('efface fichier. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
  42. $14 : met3('lis sequent. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' resu: AL');
  43. $15 : met3('ecris sequent. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' resu: AL');
  44. $16 : met3('cree fichier. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
  45. $17 : met3('renomme fichier. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
  46. $19 : met('disque courant. disque:= AL');
  47. $1A : met3('cree dta. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb dir: AL= $FF');
  48. $1B : met('read alloc table adr DOS1');
  49. $21 : met3('lis random. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' resu: AL');
  50. $22 : met3('ecris random. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' resu: AL');
  51. $23 : met3('filesize. FCB: DS:', f_entier_hexadecimal(l_dx_precedent), ' pb: AL= $FF');
  52. $24 : met2('set relative record. FCB: DS:', f_entier_hexadecimal(l_dx_precedent));
  53. $25 : begin
  54. met2('set vector #', f_octet_hexadecimal(l_al_precedent));
  55. met2(' isr: DS:', f_entier_hexadecimal(l_dx_precedent));
  56. end;
  57. $26 : met('cree nouveau PSP DOS1');
  58. $27 : begin
  59. met2('lis random block. FCB: DS:', f_entier_hexadecimal(l_dx_precedent));
  60. met2(' nb: ', f_entier_hexadecimal(l_cx_precedent));
  61. met(' resu: AL= 0, 1, 2, 3, CX= nb lus');
  62. end;
  63. $28 : begin
  64. met2('ecris random block. FCB: DS:', f_entier_hexadecimal(l_dx_precedent));
  65. met2(' nb: ', f_entier_hexadecimal(l_cx_precedent));
  66. met(' resu: AL= 0, 1, 2, CX= nb lus');
  67. end;
  68. $29 : begin
  69. met2('parse nom fichier. param: ', f_octet_hexadecimal(l_al_precedent));
  70. met(' nom: DS:SI, FCB: ES:DI. resu: AL, DS:SI, ES:DI');
  71. end;
  72. $2A : met('get date. an: CX, mois: DH, quant: DL, jour: AL');
  73. $2B : begin
  74. met2('set date. an:', f_entier_hexadecimal(l_cx_precedent));
  75. met2(' mois: ', f_octet_hexadecimal(l_dh_precedent));
  76. met3(' quant: ', f_entier_hexadecimal(l_dl_precedent), ' >ok AL=0');
  77. end;
  78. $2C : met('get time. >heure= CH, min= CL, sec= DH, 1/100= DL');
  79. $2D : begin
  80. met2('set time. heure: ', f_octet_hexadecimal(l_ch_precedent));
  81. met2(' min: ', f_octet_hexadecimal(l_cl_precedent));
  82. met2(' sec: ', f_octet_hexadecimal(l_dh_precedent));
  83. met3(' 1/100: ', f_octet_hexadecimal(l_dl_precedent), ' >ok AL= 0');
  84. end;
  85. $2E : met2('set/reset verify flag ', f_octet_hexadecimal(l_al_precedent));
  86. $2F : met('get dta. >ES:BX');
  87. $30 : met('get dos version. >AH AL');
  88. $31 : begin
  89. met2('keep process. Exit code ', f_octet_hexadecimal(l_al_precedent));
  90. met2(' parg m‚moire ', f_entier_hexadecimal(l_dx_precedent));
  91. end;
  92. $33 : met('CTRL C check');
  93. $35 : met('get interrupt vect');
  94. $36 : met('get disk free space');
  95. $38 : met('return pays');
  96. $39 : met('cree dir');
  97. $3A : met('supprime entree dir');
  98. $3B : met('change dir courant');
  99. $3C : met('cree fichier');
  100. $3D : met('ouvre fichier');
  101. $3E : met('ferme file handle');
  102. $3F : met('lis fichier/periph');
  103. $40 : met('ecris fichier/periph');
  104. $41 : met('efface entree dir');
  105. $42 : met('deplace file pointer');
  106. $43 : met('change attribut');
  107. $44 : met('io controle periph');
  108. $45 : met('double un file handle');
  109. $46 : met('force un duplicat du handle');
  110. $47 : met('retourne texte du dir');
  111. $48 : met('alloue m‚moireoire');
  112. $49 : met('m‚moireoire libre');
  113. $4A : met('modif blocs allou‚s');
  114. $4B : met('charge et execute pg');
  115. $4C : met('termine un process');
  116. $4D : met('recupere code retour de fils');
  117. $4E : met('trouve fichier match');
  118. $4F : met('pas a pas des match');
  119. $54 : met('retourne status de verify');
  120. $56 : met('deplace dir entry');
  121. $57 : met('get set date of file');
  122. end;
  123. end;
  124. procedure commente_interruption;
  125. begin
  126. met(' ; ****');
  127. case l_operande of
  128. $00 : met(' div par 0');
  129. $01 : met(' pas a pas');
  130. $02 : met(' nmi');
  131. $03 : met(' trappe pt arret');
  132. $04 : met(' debordement');
  133. $05 : met(' bios imprime ecran');
  134. $08 : met(' horloge');
  135. $09 : met(' clavier');
  136. $0A..$0C : met(' res communications');
  137. $0F : met(' res imprimante');
  138. $10 : begin
  139. met(' ; BIOS ECR');
  140. case l_ah_precedent of
  141. $00 : case l_al_precedent of
  142. $00 : met(' set 40*25 bw');
  143. $01 : met(' set 40*25 coul');
  144. $02 : met(' set 80*25 bw');
  145. $03 : met(' set 80*25 coul');
  146. $04 : met(' set 320*200 coul');
  147. $05 : met(' set 320*200 bw');
  148. $06 : met(' set 640*200 bw');
  149. end;
  150. $01 : begin
  151. met(' type curseur');
  152. met(f_octet_hexadecimal(l_ch_precedent));
  153. met(' a ');
  154. met(f_octet_hexadecimal(l_cl_precedent));
  155. end;
  156. $02 : begin
  157. met(' curseur en ');
  158. met(f_octet_hexadecimal(l_dh_precedent));
  159. met(' ');
  160. met(f_octet_hexadecimal(l_dl_precedent));
  161. met(' page ');
  162. met(f_octet_hexadecimal(l_bh_precedent));
  163. end;
  164. $03 : begin
  165. met(' lit curs page ');
  166. met(f_octet_hexadecimal(l_bh_precedent));
  167. end;
  168. $04 : met(' lit crayon');
  169. $05 : begin
  170. met(' set page ');
  171. met(f_octet_hexadecimal(l_al_precedent));
  172. end;
  173. $06 : begin
  174. met(' scroll up nb ');
  175. met(f_octet_hexadecimal(l_al_precedent));
  176. met(' hg ');
  177. met(f_octet_hexadecimal(l_ch_precedent));
  178. met(f_octet_hexadecimal(l_cl_precedent));
  179. met(' bd ');
  180. met(f_octet_hexadecimal(l_dh_precedent));
  181. met(f_octet_hexadecimal(l_dl_precedent));
  182. met(' attr ');
  183. met(f_octet_hexadecimal(l_bh_precedent));
  184. end;
  185. $07 : begin
  186. met(' scroll dwn nb ');
  187. met(f_octet_hexadecimal(l_al_precedent));
  188. met(' hg ');
  189. met(f_octet_hexadecimal(l_ch_precedent));
  190. met(f_octet_hexadecimal(l_cl_precedent));
  191. met(' bd ');
  192. met(f_octet_hexadecimal(l_dh_precedent));
  193. met(f_octet_hexadecimal(l_dl_precedent));
  194. met(' attr ');
  195. met(f_octet_hexadecimal(l_bh_precedent));
  196. end;
  197. $08 : begin
  198. met(' lit car page ');
  199. met(f_octet_hexadecimal(l_al_precedent));
  200. end;
  201. $09 : begin
  202. met(' ecris car page ');
  203. met(f_octet_hexadecimal(l_al_precedent));
  204. met(' nb '); met(f_entier_hexadecimal(l_cx_precedent));
  205. met2(' car ', f_octet_hexadecimal(l_al_precedent));
  206. met2(' attr ', f_octet_hexadecimal(l_bl_precedent));
  207. end;
  208. $0A : begin
  209. met(' ecris car page ');
  210. met(f_octet_hexadecimal(l_al_precedent));
  211. met2(' nb ', f_entier_hexadecimal(l_cx_precedent));
  212. met2(' car ', f_octet_hexadecimal(l_al_precedent));
  213. end;
  214. $0B : begin
  215. met(' set palette ');
  216. met(f_octet_hexadecimal(l_bh_precedent));
  217. met(' coul ');
  218. met(f_octet_hexadecimal(l_bl_precedent));
  219. end;
  220. $0C : begin
  221. met(' ecris point ligne ');
  222. met(f_entier_hexadecimal(l_dx_precedent));
  223. met(' col ');
  224. met(f_entier_hexadecimal(l_cx_precedent));
  225. met(' coul ');
  226. met(f_octet_hexadecimal(l_al_precedent));
  227. end;
  228. $0D : begin
  229. met(' lis point ligne ');
  230. met(f_entier_hexadecimal(l_dx_precedent));
  231. met(' col ');
  232. met(f_entier_hexadecimal(l_cx_precedent));
  233. met(' coul ');
  234. met(f_octet_hexadecimal(l_al_precedent));
  235. end;
  236. $0E : begin
  237. met(' ecris tty ');
  238. met(f_octet_hexadecimal(l_al_precedent));
  239. met(' coul ');
  240. met(f_octet_hexadecimal(l_bl_precedent));
  241. met(' page ');
  242. met(f_octet_hexadecimal(l_bh_precedent));
  243. end;
  244. $0F : met(' lis l_mode video');
  245. else met2(' ?????? ', f_octet_hexadecimal(l_ah_precedent));
  246. end;
  247. end;
  248. $11 : met(' test config');
  249. $12 : met(' taille m‚moire');
  250. $13 : met(' disquette');
  251. $14 : met(' serie');
  252. $15 : met(' cassette');
  253. $16 : begin
  254. met(' ; BIOS CLAV ');
  255. case l_ah_precedent of
  256. $00 : met(' lis car');
  257. $01 : met(' test car');
  258. $02 : met(' shift status');
  259. end;
  260. end;
  261. $17 : met(' imprimante');
  262. $18 : met(' basic cassette');
  263. $19 : met(' bootstrap');
  264. $1A : met(' heure');
  265. $1B : met(' ctrl brk');
  266. $1C : met(' top horloge');
  267. $1D : met(' initialise video');
  268. $1E : met(' param disquette');
  269. $1F : met(' car graphiques');
  270. $20 : met(' DOS pg terminate. PSP= cs');
  271. $21 : commente_dos;
  272. $22 : met(' DOS terminate address');
  273. $23 : met(' DOS CTRL C exit address');
  274. $24 : met(' DOS fatal disk error address. FCB ds bp:si');
  275. $25 : begin
  276. met(' DOS absolute disk read');
  277. met2(' dr: ', chr(l_al_precedent+ 64));
  278. met2(' dta: DS:', f_entier_hexadecimal(l_bx_precedent));
  279. met2(' nb sect: ', f_entier_hexadecimal(l_cx_precedent));
  280. met2(' rel sect: ', f_entier_hexadecimal(l_dx_precedent));
  281. end;
  282. $26 : begin
  283. met(' DOS absolute disk write');
  284. met2(' dr: ', chr(l_al_precedent+ 64));
  285. met2(' dta: DS:', f_entier_hexadecimal(l_bx_precedent));
  286. met2(' nb sect: ', f_entier_hexadecimal(l_cx_precedent));
  287. met2(' rel sect: ', f_entier_hexadecimal(l_dx_precedent));
  288. end;
  289. $27 : begin
  290. met(' DOS terminate stay resident DOS1 ');
  291. met2(' dern oct: CS:', f_entier_hexadecimal(l_dx_precedent));
  292. end;
  293. $28..$40 : met(' DOS reserves');
  294. else met(' ; **************');
  295. end;
  296. end;
  297. procedure affiche_caractere;
  298. begin
  299. case l_operande of
  300. $03 : met(' ; CTRL-C');
  301. $08 : met(' ; DEL');
  302. $09 : met(' ; TAB');
  303. $0A : met(' ; INTERLIGNE');
  304. $0D : met(' ; RETURN');
  305. $1A : met(' ; CTRL-Z');
  306. $1B : met(' ; ESCAPE');
  307. $20 : met(' ; ESPACE');
  308. $7F : met(' ; DEL');
  309. else
  310. if (l_operande> $20) and (l_operande<127)
  311. then met2(' ; ', chr(l_operande));
  312. end;
  313. end;
  314. procedure recupere_valeur_stockee_dans_registre;
  315. begin
  316. case l_code_operation of
  317. $B0 : begin
  318. l_al_precedent:= l_operande_precedent;
  319. affiche_caractere;
  320. end;
  321. $B1 : l_cl_precedent:= l_operande_precedent;
  322. $B2 : l_dl_precedent:= l_operande_precedent;
  323. $B3 : l_bl_precedent:= l_operande_precedent;
  324. $B4 : l_ah_precedent:= l_operande_precedent;
  325. $B5 : l_ch_precedent:= l_operande_precedent;
  326. $B6 : l_dh_precedent:= l_operande_precedent;
  327. $B7 : l_bh_precedent:= l_operande_precedent;
  328. $B8 : begin
  329. l_ax_precedent:= l_operande_precedent;
  330. l_al_precedent:= l_operande_precedent and $00FF;
  331. l_ah_precedent:= (l_operande_precedent and $FF00) shr 8;
  332. end;
  333. $B9 : begin
  334. l_cx_precedent:= l_operande_precedent;
  335. l_cl_precedent:= l_operande_precedent and $00FF;
  336. l_ch_precedent:= (l_operande_precedent and $FF00) shr 8;
  337. end;
  338. $BA : begin
  339. l_dx_precedent:= l_operande_precedent;
  340. l_dl_precedent:= l_operande_precedent and $00FF;
  341. l_dh_precedent:= (l_operande_precedent and $FF00) shr 8;
  342. end;
  343. $BB : begin
  344. l_bx_precedent:= l_operande_precedent;
  345. l_bl_precedent:= l_operande_precedent and $00FF;
  346. l_bh_precedent:= (l_operande_precedent and $FF00) shr 8;
  347. end;
  348. end;
  349. end;