*/
Stuck? Need help? Ask questions on our forums.
*/

View \EMS.PAS

Borland Pascal Debug Kit 1.10b by NederWare

Submitted By: Unknown
Rating: (Not rated) (Rate It)


(* This file was mangled by Mangler 1.35 (c) Copyright 1993-1994 by Berend de Boer *)
{ Created : 1994-09-08  (c) Copyright 1994 by Berend de Boer

EMS unit created from ObjMemory. Implements subset of EMS functions.
Needs EMS 4.0!


Last changes :
}



{$IFNDEF MsDos}
Error
{$ENDIF}


{$F+,O+,X+}
unit EMS;

interface


const
  _16K = $4000;


type
  TEMSHandle = word;

type
  EMSAddrStruct = record
    MemType : (emsConventional, emsExpanded);
    Handle : TEMSHandle;
    case integer of
      0 : (Offs : word;
           LPage : word);
      1 : (Ptr : pointer);
  end;

type
  EMSMoveStruct = record
    Count : longint;
    Source : EMSAddrStruct;
    Dest : EMSAddrStruct;
  end;

const
  EMSInstalled:Boolean = FALSE;        {* set by calling ems_init *}
  EMSVersion:byte = 0;                 {* set by ems_init *}
  EMSResult:byte = 0;                  {* result of last int 67h call *}
  EMSFrame:pointer = nil;              {* EMS page frame *}


procedure ems_init;

function  ems_allocate(var Handle : TEMSHandle; var TotalPages : word; Size : longint) : Boolean;
function  ems_dispose(Handle : TEMSHandle) : Boolean;
function  ems_get_version : Boolean;
function  ems_get_frame : Boolean;
function  ems_get_status : byte;
procedure ems_map_memory(Handle : TEMSHandle; PhysicalPage : byte; LogicalPage : word);
procedure ems_move_region(SourceHandle : TEMSHandle; SourceOffs : longint;
                          DestHandle : TEMSHandle; DestOffs : longint;
                          Count : longint);
function  ems_number_of_pages : word;
function  ems_present : Boolean;



 IMPLEMENTATION {$IFDEF Debug}USES ASSERTIONS ;{$ENDIF}PROCEDURE EMS_INIT ;BEGIN IF NOT EMS_PRESENT THEN EXIT ;IF NOT
EMS_GET_VERSION OR (EMSVERSION < $40 )THEN EXIT ;IF NOT EMS_GET_FRAME THEN EXIT ;EMSINSTALLED := TRUE ;END ;
FUNCTION EMS_ALLOCATE (VAR HANDLE:TEMSHANDLE;VAR TOTALPAGES:WORD;SIZE:LONGINT):BOOLEAN ;ASSEMBLER;ASM {}
MOV AX , WORD PTR SIZE{} MOV DX , WORD PTR SIZE+ 2 {} MOV CX , 4000h {} DIV CX {} CMP DX , 0 {} JZ @1 {} INC AX {}
@1 : {} MOV BX , AX {} LES DI , TOTALPAGES{} MOV WORD PTR ES : [ DI ] , BX {} MOV AH , 43h {} INT 67h {}
MOV EMSRESULT, AH {} CMP AH , 0 {} JZ @ok {} @error : {} XOR AX , AX {} LES DI , HANDLE{}
MOV WORD PTR ES : [ DI ] , AX {} JMP @end {} @ok : {} LES DI , HANDLE{} MOV WORD PTR ES : [ DI ] , DX {} MOV AX , 1 {}
@end : {} END;FUNCTION EMS_DISPOSE (HANDLE:TEMSHANDLE):BOOLEAN ;ASSEMBLER;ASM {} MOV DX , HANDLE{} MOV AH , 45h {}
INT 67h {} MOV EMSRESULT, AH {} MOV AL , 1 {} CMP AH , 0 {} JZ @end {} XOR AX , AX {} @end : {} END;
FUNCTION EMS_GET_FRAME :BOOLEAN ;ASSEMBLER;ASM {} MOV AH , 41h {} INT 67h {} MOV EMSRESULT, AH {}
MOV WORD PTR EMSFRAME+ 2 , BX {} MOV AL , 1 {} CMP AH , 0 {} JZ @end {} XOR AX , AX {} @end : {} END;
FUNCTION EMS_GET_VERSION :BOOLEAN ;ASSEMBLER;ASM {} MOV AH , 46h {} INT 67h {} MOV EMSRESULT, AH {} MOV EMSVERSION, AL {}
MOV AL , 1 {} CMP AH , 0 {} JZ @end {} XOR AX , AX {} @end : {} END;FUNCTION EMS_GET_STATUS :BYTE ;ASSEMBLER;ASM {}
MOV AH , 040h {} INT 67h {} MOV AL , AH {} XOR AH , AH {} END;PROCEDURE EMS_MAP_MEMORY (HANDLE:TEMSHANDLE;
PHYSICALPAGE:BYTE;LOGICALPAGE:WORD);ASSEMBLER;ASM {} MOV AL , PHYSICALPAGE{} MOV AH , 044h {} MOV BX , LOGICALPAGE{}
MOV DX , HANDLE{} INT 67h {} MOV EMSRESULT, AH {} END;PROCEDURE EMS_MOVE_REGION (SOURCEHANDLE:TEMSHANDLE;
SOURCEOFFS:LONGINT;DESTHANDLE:TEMSHANDLE;DESTOFFS:LONGINT;COUNT:LONGINT);VAR OIOI101O0I:EMSMOVESTRUCT;
BEGIN WITH OIOI101O0I DO BEGIN WITH SOURCE DO BEGIN HANDLE := SOURCEHANDLE ;IF HANDLE =0 THEN BEGIN MEMTYPE :=
EMSCONVENTIONAL ;PTR := POINTER (SOURCEOFFS );END ELSE BEGIN MEMTYPE := EMSEXPANDED ;LPAGE := SOURCEOFFS DIV _16K ;OFFS
:= SOURCEOFFS MOD _16K ;END ;END ;WITH DEST DO BEGIN HANDLE := DESTHANDLE ;IF HANDLE =0 THEN BEGIN MEMTYPE :=
EMSCONVENTIONAL ;PTR := POINTER (DESTOFFS );END ELSE BEGIN MEMTYPE := EMSEXPANDED ;LPAGE := DESTOFFS DIV _16K ;OFFS :=
DESTOFFS MOD _16K ;END ;END ;END ;OIOI101O0I.COUNT := COUNT ;ASM {} PUSH DS {} MOV AX , SS {} MOV DS , AX {}
LEA SI , OIOI101O0I{} MOV AX , 5700h {} INT 67h {} POP DS {} MOV EMSRESULT, AH {} END;END ;FUNCTION EMS_NUMBER_OF_PAGES
:WORD ;ASSEMBLER;ASM {} MOV AH , 42h {} INT 67h {} MOV EMSRESULT, AH {} MOV AX , BX {} END;FUNCTION EMS_PRESENT :BOOLEAN
;ASSEMBLER;CONST O1lO1llIO0OO:ARRAY [ 0 .. 8 ]  OF CHAR='EMMXXXX0'#0;ASM {} PUSH DS {} MOV DX , SEG O1lO1llIO0OO{}
MOV DS , DX {} MOV DX , OFFSET O1lO1llIO0OO{} MOV AX , 3d00h {} INT 21h {} JC @error {} MOV BX , AX {} MOV AX , 4400h {}
INT 21h {} JC @error {} AND DX , 80h {} JZ @error {} MOV AX , 4407h {} INT 21h {} JC @error {} OR AL , AL {} JZ @error {}
MOV AH , 3eh {} INT 21h {} JC @error {} MOV AX , 1 {} JMP @end {} @error : {} MOV AX , 0 {} @end : {} POP DS {} END;
END .

corner
© 1996-2008 CommunityHeaven LLC. All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
North American business development: Nicolai Wadstrom. Publisher: Lars Hagelin.