home *** CD-ROM | disk | FTP | other *** search
/ The Pier Shareware 6 / The_Pier_Shareware_Number_6_(The_Pier_Exchange)_(1995).iso / 038 / pmd110.zip / EMS.PAS < prev    next >
Pascal/Delphi Source File  |  1994-11-14  |  5KB  |  99 lines

  1. (* This file was mangled by Mangler 1.35 (c) Copyright 1993-1994 by Berend de Boer *)
  2. { Created : 1994-09-08  (c) Copyright 1994 by Berend de Boer
  3.  
  4. EMS unit created from ObjMemory. Implements subset of EMS functions.
  5. Needs EMS 4.0!
  6.  
  7.  
  8. Last changes :
  9. }
  10.  
  11.  
  12. {$IFNDEF MsDos}
  13. Error
  14. {$ENDIF}
  15.  
  16.  
  17. {$F+,O+,X+}
  18. unit EMS;
  19.  
  20. interface
  21.  
  22.  
  23. const
  24.   _16K = $4000;
  25.  
  26.  
  27. type
  28.   TEMSHandle = word;
  29.  
  30. type
  31.   EMSAddrStruct = record
  32.     MemType : (emsConventional, emsExpanded);
  33.     Handle : TEMSHandle;
  34.     case integer of
  35.       0 : (Offs : word;
  36.            LPage : word);
  37.       1 : (Ptr : pointer);
  38.   end;
  39.  
  40. type
  41.   EMSMoveStruct = record
  42.     Count : longint;
  43.     Source : EMSAddrStruct;
  44.     Dest : EMSAddrStruct;
  45.   end;
  46.  
  47. const
  48.   EMSInstalled:Boolean = FALSE;        {* set by calling ems_init *}
  49.   EMSVersion:byte = 0;                 {* set by ems_init *}
  50.   EMSResult:byte = 0;                  {* result of last int 67h call *}
  51.   EMSFrame:pointer = nil;              {* EMS page frame *}
  52.  
  53.  
  54. procedure ems_init;
  55.  
  56. function  ems_allocate(var Handle : TEMSHandle; var TotalPages : word; Size : longint) : Boolean;
  57. function  ems_dispose(Handle : TEMSHandle) : Boolean;
  58. function  ems_get_version : Boolean;
  59. function  ems_get_frame : Boolean;
  60. function  ems_get_status : byte;
  61. procedure ems_map_memory(Handle : TEMSHandle; PhysicalPage : byte; LogicalPage : word);
  62. procedure ems_move_region(SourceHandle : TEMSHandle; SourceOffs : longint;
  63.                           DestHandle : TEMSHandle; DestOffs : longint;
  64.                           Count : longint);
  65. function  ems_number_of_pages : word;
  66. function  ems_present : Boolean;
  67.  
  68.  
  69.  
  70.  IMPLEMENTATION {$IFDEF Debug}USES ASSERTIONS ;{$ENDIF}PROCEDURE EMS_INIT ;BEGIN IF NOT EMS_PRESENT THEN EXIT ;IF NOT
  71. EMS_GET_VERSION OR (EMSVERSION < $40 )THEN EXIT ;IF NOT EMS_GET_FRAME THEN EXIT ;EMSINSTALLED := TRUE ;END ;
  72. FUNCTION EMS_ALLOCATE (VAR HANDLE:TEMSHANDLE;VAR TOTALPAGES:WORD;SIZE:LONGINT):BOOLEAN ;ASSEMBLER;ASM {}
  73. MOV AX , WORD PTR SIZE{} MOV DX , WORD PTR SIZE+ 2 {} MOV CX , 4000h {} DIV CX {} CMP DX , 0 {} JZ @1 {} INC AX {}
  74. @1 : {} MOV BX , AX {} LES DI , TOTALPAGES{} MOV WORD PTR ES : [ DI ] , BX {} MOV AH , 43h {} INT 67h {}
  75. MOV EMSRESULT, AH {} CMP AH , 0 {} JZ @ok {} @error : {} XOR AX , AX {} LES DI , HANDLE{}
  76. MOV WORD PTR ES : [ DI ] , AX {} JMP @end {} @ok : {} LES DI , HANDLE{} MOV WORD PTR ES : [ DI ] , DX {} MOV AX , 1 {}
  77. @end : {} END;FUNCTION EMS_DISPOSE (HANDLE:TEMSHANDLE):BOOLEAN ;ASSEMBLER;ASM {} MOV DX , HANDLE{} MOV AH , 45h {}
  78. INT 67h {} MOV EMSRESULT, AH {} MOV AL , 1 {} CMP AH , 0 {} JZ @end {} XOR AX , AX {} @end : {} END;
  79. FUNCTION EMS_GET_FRAME :BOOLEAN ;ASSEMBLER;ASM {} MOV AH , 41h {} INT 67h {} MOV EMSRESULT, AH {}
  80. MOV WORD PTR EMSFRAME+ 2 , BX {} MOV AL , 1 {} CMP AH , 0 {} JZ @end {} XOR AX , AX {} @end : {} END;
  81. FUNCTION EMS_GET_VERSION :BOOLEAN ;ASSEMBLER;ASM {} MOV AH , 46h {} INT 67h {} MOV EMSRESULT, AH {} MOV EMSVERSION, AL {}
  82. MOV AL , 1 {} CMP AH , 0 {} JZ @end {} XOR AX , AX {} @end : {} END;FUNCTION EMS_GET_STATUS :BYTE ;ASSEMBLER;ASM {}
  83. MOV AH , 040h {} INT 67h {} MOV AL , AH {} XOR AH , AH {} END;PROCEDURE EMS_MAP_MEMORY (HANDLE:TEMSHANDLE;
  84. PHYSICALPAGE:BYTE;LOGICALPAGE:WORD);ASSEMBLER;ASM {} MOV AL , PHYSICALPAGE{} MOV AH , 044h {} MOV BX , LOGICALPAGE{}
  85. MOV DX , HANDLE{} INT 67h {} MOV EMSRESULT, AH {} END;PROCEDURE EMS_MOVE_REGION (SOURCEHANDLE:TEMSHANDLE;
  86. SOURCEOFFS:LONGINT;DESTHANDLE:TEMSHANDLE;DESTOFFS:LONGINT;COUNT:LONGINT);VAR OIOI101O0I:EMSMOVESTRUCT;
  87. BEGIN WITH OIOI101O0I DO BEGIN WITH SOURCE DO BEGIN HANDLE := SOURCEHANDLE ;IF HANDLE =0 THEN BEGIN MEMTYPE :=
  88. EMSCONVENTIONAL ;PTR := POINTER (SOURCEOFFS );END ELSE BEGIN MEMTYPE := EMSEXPANDED ;LPAGE := SOURCEOFFS DIV _16K ;OFFS
  89. := SOURCEOFFS MOD _16K ;END ;END ;WITH DEST DO BEGIN HANDLE := DESTHANDLE ;IF HANDLE =0 THEN BEGIN MEMTYPE :=
  90. EMSCONVENTIONAL ;PTR := POINTER (DESTOFFS );END ELSE BEGIN MEMTYPE := EMSEXPANDED ;LPAGE := DESTOFFS DIV _16K ;OFFS :=
  91. DESTOFFS MOD _16K ;END ;END ;END ;OIOI101O0I.COUNT := COUNT ;ASM {} PUSH DS {} MOV AX , SS {} MOV DS , AX {}
  92. LEA SI , OIOI101O0I{} MOV AX , 5700h {} INT 67h {} POP DS {} MOV EMSRESULT, AH {} END;END ;FUNCTION EMS_NUMBER_OF_PAGES
  93. :WORD ;ASSEMBLER;ASM {} MOV AH , 42h {} INT 67h {} MOV EMSRESULT, AH {} MOV AX , BX {} END;FUNCTION EMS_PRESENT :BOOLEAN
  94. ;ASSEMBLER;CONST O1lO1llIO0OO:ARRAY [ 0 .. 8 ]  OF CHAR='EMMXXXX0'#0;ASM {} PUSH DS {} MOV DX , SEG O1lO1llIO0OO{}
  95. MOV DS , DX {} MOV DX , OFFSET O1lO1llIO0OO{} MOV AX , 3d00h {} INT 21h {} JC @error {} MOV BX , AX {} MOV AX , 4400h {}
  96. INT 21h {} JC @error {} AND DX , 80h {} JZ @error {} MOV AX , 4407h {} INT 21h {} JC @error {} OR AL , AL {} JZ @error {}
  97. MOV AH , 3eh {} INT 21h {} JC @error {} MOV AX , 1 {} JMP @end {} @error : {} MOV AX , 0 {} @end : {} POP DS {} END;
  98. END .
  99.