lim.mod 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. IMPLEMENTATION MODULE LIM; (* LIM expanded memory *)
  2. IMPORT SYSTEM,Str,Lib ;
  3. PROCEDURE EMMError( e : SHORTCARD );
  4. VAR str : ARRAY [0..79] OF CHAR;
  5. err : ARRAY [0..79] OF CHAR ;
  6. Done : BOOLEAN;
  7. CONST
  8. Errors = 'Internal EMS driver Error|'+
  9. 'Hardware failure|'+
  10. 'Busy|'+
  11. 'Invalid handle|'+
  12. 'Undefined function|'+
  13. 'No more EMS handles available|'+
  14. 'Error in save or restore of map context|'+
  15. 'Not enough logical pages physically available|'+
  16. 'Not enough pages available|'+
  17. 'Zero allocation|'+
  18. 'Logical page number out of range|'+
  19. 'Illegal physical page number|'+
  20. 'Illegal physical page in mapping request|'+
  21. 'Mapping save area full|'+
  22. 'Mapping context save failed (already saved)|'+
  23. 'Mapping context restore failed (not saved)|'+
  24. 'Subfunction parameter undefined';
  25. BEGIN
  26. IF e<>0 THEN
  27. str := 'LIM EMS error ' ;
  28. Str.CardToStr( LONGCARD(e),err,16,Done );
  29. Str.Append(str,err) ;
  30. IF (e>80H)AND(e<=8FH) THEN
  31. Str.ItemS(err,Errors,'|',CARDINAL(e-81H)) ;
  32. Str.Append(str,' : ');
  33. Str.Append(str,err);
  34. END ;
  35. Lib.FatalError( str );
  36. END ;
  37. END EMMError;
  38. PROCEDURE GetStatus() : SHORTCARD;
  39. VAR r : SYSTEM.Registers;
  40. BEGIN
  41. WITH r DO
  42. AH := 40H;
  43. Lib.Intr(r,67H);
  44. RETURN AH;
  45. END;
  46. END GetStatus;
  47. PROCEDURE GetPageFrame(): CARDINAL;
  48. VAR r : SYSTEM.Registers;
  49. BEGIN
  50. WITH r DO
  51. AH := 41H;
  52. Lib.Intr(r,67H);
  53. IF AH#0 THEN EMMError( AH ); END;
  54. RETURN BX;
  55. END;
  56. END GetPageFrame;
  57. PROCEDURE AllocatePages( n : CARDINAL ) : CARDINAL;
  58. VAR r : SYSTEM.Registers;
  59. BEGIN
  60. WITH r DO
  61. AH := 43H;
  62. BX := n;
  63. Lib.Intr(r,67H);
  64. IF AH#0 THEN EMMError( AH ); END;
  65. RETURN DX;
  66. END;
  67. END AllocatePages;
  68. PROCEDURE FreePages() : CARDINAL;
  69. VAR r : SYSTEM.Registers;
  70. BEGIN
  71. WITH r DO
  72. AH := 42H;
  73. Lib.Intr(r,67H);
  74. IF AH#0 THEN EMMError( AH ); END;
  75. RETURN BX;
  76. END;
  77. END FreePages;
  78. PROCEDURE MapPage( PPage,LPage,Handle : CARDINAL ): CARDINAL;
  79. VAR r : SYSTEM.Registers;
  80. BEGIN
  81. WITH r DO
  82. AH := 44H;
  83. AL := SHORTCARD(PPage);
  84. BX := LPage;
  85. DX := Handle;
  86. Lib.Intr(r,67H);
  87. IF AH#0 THEN EMMError( AH ); END;
  88. RETURN PPage << 14;
  89. END;
  90. END MapPage;
  91. PROCEDURE DeAllocatePages( Handle : CARDINAL );
  92. VAR r : SYSTEM.Registers;
  93. BEGIN
  94. WITH r DO
  95. AH := 45H;
  96. DX := Handle;
  97. Lib.Intr(r,67H);
  98. IF AH#0 THEN EMMError( AH ); END;
  99. END;
  100. END DeAllocatePages;
  101. VAR Int67 [0:19CH] : ADDRESS;
  102. TYPE b8 = ARRAY [0..7] OF CHAR;
  103. BEGIN
  104. LIMPresent := FALSE;
  105. IF (Int67 # [0:0]) AND (b8([[0:19CH+2]^:0AH]^) = b8('EMMXXXX0')) THEN
  106. LIMPresent := GetStatus()=0;
  107. IF LIMPresent THEN PageFr := GetPageFrame(); END;
  108. END;
  109. END LIM.
  110.