LIM.MOD 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. (* Release 3.10 *)
  2. (*-------------------------------------------------------------------------*
  3. * *
  4. * LIM.MOD - LIM Expanded memory support *
  5. * *
  6. * COPYRIGHT (C) 1987..1992 Clarion Software Corporation. *
  7. * All Rights Reserved *
  8. * *
  9. *--------------------------------------------------------------------------*)
  10. (*%F _fdata *)
  11. (*# call(seg_name => null) *)
  12. (*# data(seg_name => null) *)
  13. (*%E *)
  14. (*# module(implementation=>off) *)
  15. (*# check(stack=>off,
  16. index=>off,
  17. range=>off,
  18. overflow=>off,
  19. nil_ptr=>off) *)
  20. IMPLEMENTATION MODULE LIM; (* LIM expanded memory *)
  21. IMPORT SYSTEM,Str,Lib ;
  22. PROCEDURE EMMError( e : SHORTCARD );
  23. VAR
  24. str : ARRAY [0..79] OF CHAR;
  25. err : ARRAY [0..79] OF CHAR ;
  26. Done : BOOLEAN;
  27. CONST
  28. Errors = 'Internal EMS driver Error|'+
  29. 'Hardware failure|'+
  30. 'Busy|'+
  31. 'Invalid handle|'+
  32. 'Undefined function|'+
  33. 'No more EMS handles available|'+
  34. 'Error in save or restore of map context|'+
  35. 'Not enough logical pages physically available|'+
  36. 'Not enough pages available|'+
  37. 'Zero allocation|'+
  38. 'Logical page number out of range|'+
  39. 'Illegal physical page number|'+
  40. 'Mapping save area full|'+
  41. 'Mapping context save failed (already saved)|'+
  42. 'Mapping context restore failed (not saved)|'+
  43. 'Subfunction parameter undefined';
  44. BEGIN
  45. IF e # 0 THEN
  46. str := 'LIM EMS error ' ;
  47. Str.CardToStr( LONGCARD(e),err,16,Done );
  48. Str.Append(str,err) ;
  49. IF (e>=80H)AND(e<=8FH) THEN
  50. Str.ItemS(err,Errors,'|',CARDINAL(e-80H)) ;
  51. Str.Append(str,' : ');
  52. Str.Append(str,err);
  53. END ;
  54. Lib.FatalError( str );
  55. END ;
  56. END EMMError;
  57. PROCEDURE GetStatus() : SHORTCARD;
  58. VAR
  59. r : SYSTEM.Registers;
  60. BEGIN
  61. WITH r DO
  62. AH := 40H;
  63. Lib.Intr(r,67H);
  64. RETURN AH;
  65. END;
  66. END GetStatus;
  67. PROCEDURE GetPageFrame(): CARDINAL;
  68. VAR
  69. r : SYSTEM.Registers;
  70. BEGIN
  71. WITH r DO
  72. AH := 41H;
  73. Lib.Intr(r,67H);
  74. IF AH#0 THEN EMMError( AH ); END;
  75. RETURN BX;
  76. END;
  77. END GetPageFrame;
  78. PROCEDURE AllocatePages( n : CARDINAL ) : CARDINAL;
  79. VAR
  80. r : SYSTEM.Registers;
  81. BEGIN
  82. WITH r DO
  83. AH := 43H;
  84. BX := n;
  85. Lib.Intr(r,67H);
  86. IF AH#0 THEN EMMError( AH ); END;
  87. RETURN DX;
  88. END;
  89. END AllocatePages;
  90. PROCEDURE FreePages() : CARDINAL;
  91. VAR
  92. r : SYSTEM.Registers;
  93. BEGIN
  94. WITH r DO
  95. AH := 42H;
  96. Lib.Intr(r,67H);
  97. IF AH#0 THEN EMMError( AH ); END;
  98. RETURN BX;
  99. END;
  100. END FreePages;
  101. PROCEDURE MapPage( PPage,LPage,Handle : CARDINAL ): CARDINAL;
  102. VAR
  103. r : SYSTEM.Registers;
  104. BEGIN
  105. WITH r DO
  106. AH := 44H;
  107. AL := SHORTCARD(PPage);
  108. BX := LPage;
  109. DX := Handle;
  110. Lib.Intr(r,67H);
  111. IF AH#0 THEN EMMError( AH ); END;
  112. RETURN PPage << 14;
  113. END;
  114. END MapPage;
  115. PROCEDURE DeAllocatePages( Handle : CARDINAL );
  116. VAR
  117. r : SYSTEM.Registers;
  118. BEGIN
  119. WITH r DO
  120. AH := 45H;
  121. DX := Handle;
  122. Lib.Intr(r,67H);
  123. IF AH#0 THEN EMMError( AH ); END;
  124. END;
  125. END DeAllocatePages;
  126. VAR
  127. Int67 [0:19CH] : FarADDRESS;
  128. TYPE b8 = ARRAY [0..7] OF CHAR;
  129. BEGIN
  130. LIMPresent := FALSE;
  131. IF (Int67 # FarNIL) AND (b8([[0:19CH+2]^:0AH]^) = b8('EMMXXXX0')) THEN
  132. LIMPresent := GetStatus()=0;
  133. IF LIMPresent THEN PageFr := GetPageFrame(); END;
  134. END;
  135. END LIM.
  136.