biosfio.mod 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. IMPLEMENTATION MODULE biosfio;
  2. PROCEDURE erreur(x : SHORTCARD): CARDINAL;
  3. BEGIN
  4. IF x < 0BH THEN RETURN CARDINAL(x)
  5. ELSE
  6. CASE x OF
  7. | 10H : RETURN 10;
  8. | 20H : RETURN 11
  9. | 40H : RETURN 12;
  10. | 80H : RETURN 13;
  11. ELSE RETURN 255
  12. END;
  13. END;
  14. END erreur;
  15. PROCEDURE reset(): SHORTCARD;
  16. VAR regs : Registers;
  17. BEGIN
  18. regs.AH := 00H;
  19. Intr(regs,13H);
  20. RETURN VAL(SHORTCARD,regs.AX);
  21. END reset;
  22. PROCEDURE lit_secteur ( piste,tete,secteur,nbre_secteurs,drive : SHORTCARD ;
  23. VAR buffer : ARRAY OF BYTE) : SHORTCARD ;
  24. VAR nbre_essais : CARDINAL;
  25. VAR regs : Registers;
  26. BEGIN
  27. nbre_essais := 0;
  28. LOOP
  29. INC(nbre_essais);
  30. WITH regs DO
  31. AH := 02H; (* code de la fonction 13H *)
  32. AL := nbre_secteurs; (* nombre de secteurs … lire *)
  33. CH := piste;
  34. CL := secteur; (* numero du 1er secteur … lire *)
  35. DH := tete; (* numero de tete ou face *)
  36. DL := drive; (* numero du lecteur *)
  37. ES := Seg(buffer); (* adresse ou ranger les donn‚es*)
  38. BX := Ofs(buffer); (* *)
  39. Intr(regs,13H);
  40. AH := 01H;
  41. DL := drive;
  42. Intr(regs,13H);
  43. RETURN SHORTCARD(AH);
  44. END;
  45. IF (regs.AH = 0) OR (nbre_essais > 20) THEN EXIT END;
  46. END;
  47. END lit_secteur;
  48. PROCEDURE ecrit_secteur ( piste,tete,secteur,nbre_secteurs,drive : SHORTCARD ;
  49. VAR buffer : ARRAY OF BYTE) : SHORTCARD ;
  50. VAR regs : Registers;
  51. VAR nbre_essais : CARDINAL;
  52. BEGIN
  53. nbre_essais := 0;
  54. LOOP
  55. INC(nbre_essais);
  56. WITH regs DO
  57. AH := 03H; (* code de la fonction 13H *)
  58. AL := nbre_secteurs; (* nombre de secteurs … lire *)
  59. CH := piste;
  60. CL := secteur; (* numero du 1er secteur … lire *)
  61. DH := tete; (* numero de tete ou face *)
  62. DL := drive; (* numero du lecteur *)
  63. ES := Seg(buffer); (* adresse ou ranger les donn‚es*)
  64. BX := Ofs(buffer); (* *)
  65. Intr(regs,13H);
  66. AH := 01H;
  67. DL := drive;
  68. Intr(regs,13H);
  69. RETURN SHORTCARD(AH);
  70. END;
  71. IF (regs.AH = 0) OR (nbre_essais > 20) THEN EXIT END;
  72. END;
  73. END ecrit_secteur;
  74. END biosfio.