home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 19
/
CD_ASCQ_19_010295.iso
/
dos
/
prg
/
pas
/
pmd110
/
objmemor.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-11-13
|
31KB
|
415 lines
(* This file was mangled by Mangler 1.35 (c) Copyright 1993-1994 by Berend de Boer *)
{ Created : 1992-09-24
Unit to provide uniformed acces to all kinds of memory. Supported are:
- Conventional memory
- XHeap
- EMS 4.0
- XMS
- Disk
Memory can be allocated up to MaxLongInt size. Memory can be divided into
chunks of up to MaxConventionalMemoryBlock size.
Use the function GetObjMemory with the memfXXXX flags to designate the
types of memory and a Size to get a memory object obeying your memfXXXX
flags.
Bugs:
- not tested of StreamRead/Write for XMS and EMS work correctly with
different Pos. It seems ok though.
Last changes :
93-05-10 Removed XMS and EMS interfaces for DPMI
93-12-16 TConvHugeMemory's MoveTo and MoveFrom contained a bug
93-01-22 Changed MoveTo to same parameter order as recMoveTo
The number of inserted and deleted records is now counted
94-08-16 Changed parameters of BlockRead and BlockWrite
94-09-08 Moved EMS and XMS parts to different units
}
{$IFDEF MsDos}
{$F+,O+}
{.$DEFINE ForceXMS}
{$ENDIF}
{$X+,R-,Q-,S-,I-}
unit ObjMemory;
interface
uses Objects
{$IFDEF Windows}
, BBObject
{$ENDIF}
{$IFDEF MsDos}
, EMS, XMS
{$ENDIF}
;
const
memfConventional = $01;
memfConventionalLast = memfConventional;
memfConventionalFirst = $02;
memfXHeap = $04;
memfEMS = $08;
memfXMS = $10;
memfDisk = $20;
memfAll = memfConventional + memfXHeap + memfXMS + memfEMS + memfDisk;
const
MaxConventionalMemoryBlock = 65528;
{ if a memory block is asked with a size below ConvMemLimit, we always first }
{ try to return a conventional memory block }
const
ConvMemLimit:word = 8192;
type
PObjMemory = ^TObjMemory;
TObjMemory = object(TObject)
Size : longint; {* size of memory *}
RecSize : word; {* record size if memory is array *}
TotalRecords : longint;
procedure BlockRead(var f : file; BlockSize : longint); virtual;
procedure BlockWrite(var f : file; BlockSize : longint); virtual;
procedure CopyFrom(Source : PObjMemory); virtual;
procedure Delete(APos, ASize : longint); virtual;
procedure FillChar(Value : byte);
procedure MoveFrom(const Source; Pos, ASize : longint); virtual;
procedure MoveTo(Pos, ASize : longint; var Dest); virtual;
procedure StreamRead(var S : TStream; APos, ASize : longint); virtual;
procedure StreamWrite(var S : TStream; APos, ASize : longint); virtual;
{* record methods *}
procedure recDelete(Item : longint); virtual;
procedure recInsert(const Source; Item : longint); virtual;
procedure recMoveFrom(const Source; Item : longint);
procedure recMoveTo(Item : longint; var Dest);
procedure recWrite(var f : file; recCount : longint); virtual;
end;
{$IFDEF MsDos}
PEMSMemory = ^TEMSMemory;
TEMSMemory = object(TObjMemory)
Handle : TEMSHandle;
TotalPages : word;
constructor Init(ASize : longint; ARecSize : word; var Result : Boolean);
destructor Done; virtual;
procedure BlockRead(var f : file; BlockSize : longint); virtual;
procedure BlockWrite(var f : file; BlockSize : longint); virtual;
procedure Delete(APos, ASize : longint); virtual;
procedure MoveFrom(const Source; Pos, ASize : longint); virtual;
procedure MoveTo(Pos, ASize : longint; var Dest); virtual;
procedure StreamRead(var S : TStream; APos, ASize : longint); virtual;
procedure StreamWrite(var S : TStream; APos, ASize : longint); virtual;
procedure Map4Pages(var LogicalPage : word);
{* record methods *}
procedure recDelete(Item : longint); virtual;
end;
{$ENDIF}
{$IFDEF MsDos}
PXMSMemory = ^TXMSMemory;
TXMSMemory = object(TObjMemory)
Handle : TXMSHandle;
constructor Init(ASize : longint; ARecSize : word; var Result : Boolean);
destructor Done; virtual;
procedure BlockRead(var f : file; BlockSize : longint); virtual;
procedure BlockWrite(var f : file; BlockSize : longint); virtual;
procedure Delete(APos, ASize : longint); virtual;
procedure MoveFrom(const Source; Pos, ASize : longint); virtual;
procedure MoveTo(Pos, ASize : longint; var Dest); virtual;
procedure StreamRead(var S : TStream; APos, ASize : longint); virtual;
procedure StreamWrite(var S : TStream; APos, ASize : longint); virtual;
{* record methods *}
procedure recDelete(Item : longint); virtual;
private
function SaveByte(Pos : longint) : byte;
procedure RestoreByte(Pos : longint; b : byte);
end;
{$ENDIF}
PConvMax64Memory = ^TConvMax64Memory;
TConvMax64Memory = object(TObjMemory)
Mem : PByteArray;
constructor Init(ASize : longint; ARecSize : word; var Result : Boolean);
destructor Done; virtual;
procedure BlockRead(var f : file; BlockSize : longint); virtual;
procedure BlockWrite(var f : file; BlockSize : longint); virtual;
procedure StreamRead(var S : TStream; APos, ASize : longint); virtual;
procedure StreamWrite(var S : TStream; APos, ASize : longint); virtual;
procedure Delete(APos, ASize : longint); virtual;
procedure MoveFrom(const Source; Pos, ASize : longint); virtual;
procedure MoveTo(Pos, ASize : longint; var Dest); virtual;
{* record methods *}
procedure recDelete(Item : longint); virtual;
procedure recInsert(const Source; Item : longint); virtual;
end;
const
MaxMemPtrs = 16;
type
PConvHugeMemory = ^TConvHugeMemory;
TConvHugeMemory = object(TObjMemory)
MemSizes : array[0..MaxMemPtrs-1] of word;
MemPtrs : array[0..MaxMemPtrs-1] of pointer;
TotalMemPtrs : integer;
constructor Init(ASize : longint; ARecSize : word; var Result : Boolean);
destructor Done; virtual;
procedure BlockRead(var f : file; BlockSize : longint); virtual;
procedure BlockWrite(var f : file; BlockSize : longint); virtual;
procedure StreamRead(var S : TStream; APos, ASize : longint); virtual;
procedure StreamWrite(var S : TStream; APos, ASize : longint); virtual;
procedure Delete(APos, ASize : longint); virtual;
procedure MoveFrom(const Source; Pos, ASize : longint); virtual;
procedure MoveTo(Pos, ASize : longint; var Dest); virtual;
{* record methods *}
procedure recDelete(Item : longint); virtual;
procedure recInsert(const Source; Item : longint); virtual;
private
{* specific for this object *}
function CalculateIndex(Pos : longint; var RelativePos : word) : word;
end;
{* call this procedure before calling any other routine! Initializes XMS and
EMS units too if compiled for MsDos *}
procedure InitObjMemory;
{* call this function to get a memory object *}
function GetObjMemory(Size : longint; RecSize, AFlags : word) : PObjMemory;
IMPLEMENTATION USES {$IFNDEF Windows}DOS , {$ENDIF}BBUTIL , BBGUI , BBERROR , BBFILE {$IFDEF Debug}, ASSERTIONS
{$ENDIF};TYPE Ol1I1l1ll=ARRAY [ 0 .. MAXWORD- 1 ] OF BYTE;PROCEDURE TOBJMEMORY.BLOCKREAD (VAR F:FILE ;
BLOCKSIZE:LONGINT);BEGIN ABSTRACT ;END ;PROCEDURE TOBJMEMORY.BLOCKWRITE (VAR F:FILE ;BLOCKSIZE:LONGINT);BEGIN ABSTRACT ;
END ;PROCEDURE TOBJMEMORY.COPYFROM (SOURCE:POBJMEMORY);CONST OO00O1O1Il=32768 ;VAR OI10I1ll0l01:POINTER;
O10OIOOOlI1I1:LONGINT;Olll0IOI11:LONGINT;O101l00lOI0IO:LONGINT;BEGIN GETMEM (OI10I1ll0l01 , OO00O1O1Il );
{$IFDEF DEBUG}ASSERT (OI10I1ll0l01 <> NIL , 'Could not allocate Cache!');{$ENDIF}O101l00lOI0IO := 0 ;Olll0IOI11 := 0 ;
O10OIOOOlI1I1 := MIN (SOURCE ^. SIZE , SIZE );WHILE O10OIOOOlI1I1 > 0 DO BEGIN SOURCE ^. MOVETO (Olll0IOI11 , MIN
(OO00O1O1Il , O10OIOOOlI1I1 ), OI10I1ll0l01 ^);MOVEFROM (OI10I1ll0l01 ^, O101l00lOI0IO , MIN (OO00O1O1Il , O10OIOOOlI1I1
));DEC (O10OIOOOlI1I1 , OO00O1O1Il );INC (Olll0IOI11 , OO00O1O1Il );INC (O101l00lOI0IO , OO00O1O1Il );END ;FREEMEM
(OI10I1ll0l01 , OO00O1O1Il );TOTALRECORDS := SOURCE ^. TOTALRECORDS ;RECSIZE := SOURCE ^. RECSIZE ;END ;
PROCEDURE TOBJMEMORY.DELETE (APOS,ASIZE:LONGINT);BEGIN ABSTRACT ;END ;PROCEDURE TOBJMEMORY.FILLCHAR (VALUE:BYTE);
BEGIN ABSTRACT ;END ;PROCEDURE TOBJMEMORY.MOVEFROM (CONST SOURCE;POS,ASIZE:LONGINT);BEGIN ABSTRACT ;END ;
PROCEDURE TOBJMEMORY.MOVETO (POS,ASIZE:LONGINT;VAR DEST);BEGIN ABSTRACT ;END ;PROCEDURE TOBJMEMORY.STREAMREAD
(VAR S:TSTREAM;APOS,ASIZE:LONGINT);BEGIN PRINTERROR ('Abstract method TObjMemory.StreamRead', 0 );ABSTRACT ;END ;
PROCEDURE TOBJMEMORY.STREAMWRITE (VAR S:TSTREAM;APOS,ASIZE:LONGINT);BEGIN PRINTERROR
('Abstract method TObjMemory.StreamWrite', 0 );ABSTRACT ;END ;PROCEDURE TOBJMEMORY.RECDELETE (ITEM:LONGINT);
BEGIN ABSTRACT ;END ;PROCEDURE TOBJMEMORY.RECINSERT (CONST SOURCE;ITEM:LONGINT);BEGIN ABSTRACT ;END ;
PROCEDURE TOBJMEMORY.RECMOVEFROM (CONST SOURCE;ITEM:LONGINT);BEGIN IF (ITEM + 1 )* RECSIZE <= SIZE THEN MOVEFROM (SOURCE
, ITEM * RECSIZE , RECSIZE )ELSE BEGIN PRINTERROR ('Attempt to index arrary beyond bounds.', 0 );HALT (1 );END ;END ;
PROCEDURE TOBJMEMORY.RECMOVETO (ITEM:LONGINT;VAR DEST);BEGIN IF (ITEM + 1 )* RECSIZE <= SIZE THEN MOVETO (ITEM * RECSIZE
, RECSIZE , DEST )ELSE BEGIN PRINTERROR ('Attempt to index arrary beyond bounds.', 0 );HALT (1 );END ;END ;
PROCEDURE TOBJMEMORY.RECWRITE (VAR F:FILE ;RECCOUNT:LONGINT);BEGIN BLOCKWRITE (F , RECCOUNT * RECSIZE );END ;
{$IFDEF MSDOS}CONSTRUCTOR TEMSMEMORY.INIT (ASIZE:LONGINT;ARECSIZE:WORD;VAR RESULT:BOOLEAN);BEGIN INHERITED INIT;SIZE :=
ASIZE ;RECSIZE := ARECSIZE ;RESULT := EMS_ALLOCATE (HANDLE , TOTALPAGES , SIZE );IF NOT RESULT THEN BEGIN LOGERROR
('EMS allocation failed. result code: 0'+ HEXB (EMSRESULT )+ 'h');LOGERROR ('EMS free pages: '+ STRW (EMS_NUMBER_OF_PAGES
));FREE ;END ;END ;DESTRUCTOR TEMSMEMORY.DONE ;BEGIN IF (HANDLE <> 0 )AND NOT EMS_DISPOSE (HANDLE )THEN PRINTERROR
('Error '+ STRW (EMSRESULT )+ ' deallocating EMS.', 0 );INHERITED DONE;END ;PROCEDURE TEMSMEMORY.BLOCKREAD (VAR F:FILE ;
BLOCKSIZE:LONGINT);VAR O1010O1II0I01:WORD;OI101IOOIO0l:WORD;OIOO101OlII:LONGINT;BEGIN OI101IOOIO0l := 0 ;OIOO101OlII :=
BLOCKSIZE ;WHILE (INOUTRES =0 )AND (OIOO101OlII > 0 ) DO BEGIN IF OIOO101OlII > MAXCONVENTIONALMEMORYBLOCK THEN
O1010O1II0I01 := MAXCONVENTIONALMEMORYBLOCK ELSE O1010O1II0I01 := OIOO101OlII ;MAP4PAGES (OI101IOOIO0l );
SYSTEM.BLOCKREAD (F , EMSFRAME ^, O1010O1II0I01 );DEC (OIOO101OlII , O1010O1II0I01 );END ;END ;
PROCEDURE TEMSMEMORY.BLOCKWRITE (VAR F:FILE ;BLOCKSIZE:LONGINT);VAR O1010l1OIOO1O:WORD;OI101IOOIO0l:WORD;
OIOO101OlII:LONGINT;BEGIN OI101IOOIO0l := 0 ;OIOO101OlII := BLOCKSIZE ;WHILE (INOUTRES =0 )AND (OIOO101OlII > 0
) DO BEGIN IF OIOO101OlII > MAXCONVENTIONALMEMORYBLOCK THEN O1010l1OIOO1O := MAXCONVENTIONALMEMORYBLOCK ELSE
O1010l1OIOO1O := OIOO101OlII ;MAP4PAGES (OI101IOOIO0l );SYSTEM.BLOCKWRITE (F , EMSFRAME ^, O1010l1OIOO1O );DEC
(OIOO101OlII , O1010l1OIOO1O );END ;END ;PROCEDURE TEMSMEMORY.DELETE (APOS,ASIZE:LONGINT);BEGIN {$IFDEF DEBUG}ASSERT
(APOS + ASIZE <= SIZE , 'Move after max memory size.');ASSERT (ASIZE >= 0 , 'Size is negative.');{$ENDIF}EMS_MOVE_REGION
(HANDLE , APOS + ASIZE , HANDLE , APOS , SIZE - (APOS + ASIZE ));END ;PROCEDURE TEMSMEMORY.MOVEFROM (CONST SOURCE;
POS,ASIZE:LONGINT);BEGIN {$IFDEF DEBUG}ASSERT (POS + ASIZE <= SIZE , 'Move after max memory size.');ASSERT (ASIZE >= 0 ,
'Size is negative.');{$ENDIF}EMS_MOVE_REGION (0 , LONGINT (@ SOURCE ), HANDLE , POS , ASIZE );END ;
PROCEDURE TEMSMEMORY.MOVETO (POS,ASIZE:LONGINT;VAR DEST);BEGIN EMS_MOVE_REGION (HANDLE , POS , 0 , LONGINT (@ DEST ),
ASIZE );END ;PROCEDURE TEMSMEMORY.MAP4PAGES (VAR LOGICALPAGE:WORD);VAR OIlO:WORD;BEGIN FOR OIlO := 0 TO 3 DO BEGIN IF
LOGICALPAGE < TOTALPAGES THEN BEGIN EMS_MAP_MEMORY (HANDLE , OIlO , LOGICALPAGE );INC (LOGICALPAGE );END ;END ;END ;
PROCEDURE TEMSMEMORY.STREAMREAD (VAR S:TSTREAM;APOS,ASIZE:LONGINT);VAR O1010O1II0I01:WORD;OI101IOOIO0l:WORD;
OIOO101OlII:LONGINT;O10OIIlllI10O:LONGINT;OOlIll0O0lll:POINTER;O1lO01OlI1lO:WORD;BEGIN {$IFDEF Debug}ASSERT (APOS =0 ,
'');{$ENDIF}IF MAXAVAIL < MAXCONVENTIONALMEMORYBLOCK THEN O1lO01OlI1lO := MAXAVAIL ELSE O1lO01OlI1lO :=
MAXCONVENTIONALMEMORYBLOCK ;GETMEM (OOlIll0O0lll , O1lO01OlI1lO );O10OIIlllI10O := APOS ;OI101IOOIO0l := 0 ;OIOO101OlII
:= ASIZE ;WHILE (OIOO101OlII > 0 )AND (S.STATUS =STOK ) DO BEGIN IF OIOO101OlII > O1lO01OlI1lO THEN O1010O1II0I01 :=
O1lO01OlI1lO ELSE O1010O1II0I01 := OIOO101OlII ;S.READ (OOlIll0O0lll ^, O1010O1II0I01 );EMS_MOVE_REGION (HANDLE ,
O10OIIlllI10O , 0 , LONGINT (OOlIll0O0lll ), O1010O1II0I01 );INC (O10OIIlllI10O , O1010O1II0I01 );DEC (OIOO101OlII ,
O1010O1II0I01 );END ;FREEMEM (OOlIll0O0lll , O1lO01OlI1lO );END ;PROCEDURE TEMSMEMORY.STREAMWRITE (VAR S:TSTREAM;
APOS,ASIZE:LONGINT);VAR O1010l1OIOO1O:WORD;O10OIIlllI10O:LONGINT;OI101IOOIO0l:WORD;OIOO101OlII:LONGINT;
OOlIll0O0lll:POINTER;O1lO01OlI1lO:WORD;BEGIN {$IFDEF Debug}ASSERT (APOS =0 , '');{$ENDIF}IF MAXAVAIL <
MAXCONVENTIONALMEMORYBLOCK THEN O1lO01OlI1lO := MAXAVAIL ELSE O1lO01OlI1lO := MAXCONVENTIONALMEMORYBLOCK ;GETMEM
(OOlIll0O0lll , O1lO01OlI1lO );O10OIIlllI10O := APOS ;OI101IOOIO0l := 0 ;OIOO101OlII := ASIZE ;WHILE (OIOO101OlII > 0
)AND (S.STATUS =STOK ) DO BEGIN IF OIOO101OlII > O1lO01OlI1lO THEN O1010l1OIOO1O := O1lO01OlI1lO ELSE O1010l1OIOO1O :=
OIOO101OlII ;EMS_MOVE_REGION (HANDLE , O10OIIlllI10O , 0 , LONGINT (OOlIll0O0lll ), O1010l1OIOO1O );S.WRITE (OOlIll0O0lll
^, O1010l1OIOO1O );INC (O10OIIlllI10O , O1010l1OIOO1O );DEC (OIOO101OlII , O1010l1OIOO1O );END ;FREEMEM (OOlIll0O0lll ,
O1lO01OlI1lO );END ;PROCEDURE TEMSMEMORY.RECDELETE (ITEM:LONGINT);BEGIN EMS_MOVE_REGION (HANDLE , (ITEM + 1 )* RECSIZE ,
HANDLE , ITEM * RECSIZE , SIZE - ((ITEM - 1 )* RECSIZE ));DEC (TOTALRECORDS );END ;
{$ENDIF}{$IFDEF MSDOS}FUNCTION O100llIO11OlO (OO01:LONGINT):LONGINT ;ASSEMBLER;ASM {} MOV AX , WORD PTR OO01{}
MOV BX , AX {} AND AX , 01h {} JZ @@even {} MOV AX , BX {} MOV DX , WORD PTR OO01+ 2 {} ADD AX , 1 {} ADC DX , 0 {}
JMP @@end {} @@even : {} MOV AX , BX {} MOV DX , WORD PTR OO01+ 2 {} @@end : {} END;CONSTRUCTOR TXMSMEMORY.INIT
(ASIZE:LONGINT;ARECSIZE:WORD;VAR RESULT:BOOLEAN);BEGIN INHERITED INIT;SIZE := O100llIO11OlO (ASIZE );RECSIZE :=
O100llIO11OlO (ARECSIZE );RESULT := XMS_ALLOCATE (HANDLE , SIZE );IF NOT RESULT THEN FREE ;END ;
DESTRUCTOR TXMSMEMORY.DONE ;BEGIN IF (HANDLE <> 0 )AND NOT XMS_DISPOSE (HANDLE )THEN PRINTERROR ('Error '+ STRW
(XMSRESULT )+ ' deallocating XMS.', 0 );INHERITED DONE;END ;PROCEDURE TXMSMEMORY.BLOCKREAD (VAR F:FILE ;
BLOCKSIZE:LONGINT);VAR O1010O1II0I01:WORD;OIOO101OlII:LONGINT;OOlIll0O0lll:POINTER;O1lO01OlI1lO:LONGINT;
O10OIIlllI0OI:LONGINT;OIO1:BYTE;BEGIN IF ODD (BLOCKSIZE )THEN OIO1 := SAVEBYTE (BLOCKSIZE );OIOO101OlII := BLOCKSIZE ;
O10OIIlllI0OI := 0 ;IF MAXAVAIL > MAXCONVENTIONALMEMORYBLOCK THEN O1lO01OlI1lO := MAXCONVENTIONALMEMORYBLOCK ELSE
O1lO01OlI1lO := O100llIO11OlO (MAXAVAIL - 2 );GETMEM (OOlIll0O0lll , O1lO01OlI1lO );WHILE (INOUTRES =0 )AND (OIOO101OlII
> 0 ) DO BEGIN IF OIOO101OlII >= O1lO01OlI1lO THEN O1010O1II0I01 := O1lO01OlI1lO ELSE O1010O1II0I01 := OIOO101OlII ;
SYSTEM.BLOCKREAD (F , OOlIll0O0lll ^, O1010O1II0I01 );IF NOT XMS_MOVE_EMB (0 , LONGINT (OOlIll0O0lll ), HANDLE ,
O10OIIlllI0OI , O100llIO11OlO (O1010O1II0I01 ))THEN PRINTERROR ('Error '+ STRW (XMSRESULT )+
' moving to XMS -- TXMSMemory.BlockRead --', 0 );DEC (OIOO101OlII , O1010O1II0I01 );INC (O10OIIlllI0OI , O1010O1II0I01 );
END ;FREEMEM (OOlIll0O0lll , O1lO01OlI1lO );IF ODD (BLOCKSIZE )THEN RESTOREBYTE (BLOCKSIZE , OIO1 );END ;
PROCEDURE TXMSMEMORY.BLOCKWRITE (VAR F:FILE ;BLOCKSIZE:LONGINT);VAR O1010l1OIOO1O:WORD;OIOO101OlII:LONGINT;
OOlIll0O0lll:POINTER;O1lO01OlI1lO:LONGINT;O10OIIlllI0OI:LONGINT;OIO1:BYTE;BEGIN IF ODD (BLOCKSIZE )THEN OIOO101OlII :=
BLOCKSIZE - 1 ELSE OIOO101OlII := BLOCKSIZE ;O10OIIlllI0OI := 0 ;IF MAXAVAIL > MAXCONVENTIONALMEMORYBLOCK THEN
O1lO01OlI1lO := MAXCONVENTIONALMEMORYBLOCK ELSE O1lO01OlI1lO := O100llIO11OlO (MAXAVAIL - 2 );GETMEM (OOlIll0O0lll ,
O1lO01OlI1lO );WHILE (INOUTRES =0 )AND (OIOO101OlII > 0 ) DO BEGIN IF OIOO101OlII > O1lO01OlI1lO THEN O1010l1OIOO1O :=
O1lO01OlI1lO ELSE O1010l1OIOO1O := OIOO101OlII ;IF XMS_MOVE_EMB (HANDLE , O10OIIlllI0OI , 0 , LONGINT (OOlIll0O0lll ),
O1010l1OIOO1O )THEN SYSTEM.BLOCKWRITE (F , OOlIll0O0lll ^, O1010l1OIOO1O )ELSE PRINTERROR ('Error '+ STRW (XMSRESULT )+
' moving from XMS -- TXMSMemory.BlockWrite --', 0 );DEC (OIOO101OlII , O1010l1OIOO1O );INC (O10OIIlllI0OI , O1010l1OIOO1O
);END ;FREEMEM (OOlIll0O0lll , O1lO01OlI1lO );IF ODD (BLOCKSIZE )THEN BEGIN OIO1 := SAVEBYTE (O10OIIlllI0OI );
SYSTEM.BLOCKWRITE (F , OIO1 , 1 )END ;END ;PROCEDURE TXMSMEMORY.DELETE (APOS,ASIZE:LONGINT);BEGIN {$IFDEF DEBUG}ASSERT
(APOS + ASIZE <= SIZE , 'Move after max memory size.');ASSERT (ASIZE >= 0 , 'Size is negative.');{$ENDIF}XMS_MOVE_EMB
(HANDLE , APOS + ASIZE , HANDLE , APOS , O100llIO11OlO (SIZE - (APOS + ASIZE )));END ;PROCEDURE TXMSMEMORY.STREAMREAD
(VAR S:TSTREAM;APOS,ASIZE:LONGINT);VAR O1010O1II0I01:WORD;OIOO101OlII:LONGINT;OOlIll0O0lll:POINTER;O1lO01OlI1lO:LONGINT;
O10OIIlllI0OI:LONGINT;OIO1:BYTE;BEGIN IF ODD (ASIZE )THEN OIO1 := SAVEBYTE (APOS + ASIZE );OIOO101OlII := ASIZE ;
O10OIIlllI0OI := APOS ;IF MAXAVAIL > MAXCONVENTIONALMEMORYBLOCK THEN O1lO01OlI1lO := MAXCONVENTIONALMEMORYBLOCK ELSE
O1lO01OlI1lO := O100llIO11OlO (MAXAVAIL - 2 );GETMEM (OOlIll0O0lll , O1lO01OlI1lO );WHILE (INOUTRES =0 )AND (OIOO101OlII
> 0 ) DO BEGIN IF OIOO101OlII > O1lO01OlI1lO THEN O1010O1II0I01 := O1lO01OlI1lO ELSE O1010O1II0I01 := OIOO101OlII ;
S.READ (OOlIll0O0lll ^, O1010O1II0I01 );IF NOT XMS_MOVE_EMB (0 , LONGINT (OOlIll0O0lll ), HANDLE , O10OIIlllI0OI ,
O100llIO11OlO (O1010O1II0I01 ))THEN PRINTERROR ('Error '+ STRW (XMSRESULT )+
' moving to XMS -- TXMSMemory.StreamRead --', 0 );DEC (OIOO101OlII , O1010O1II0I01 );INC (O10OIIlllI0OI , O1010O1II0I01
);END ;FREEMEM (OOlIll0O0lll , O1lO01OlI1lO );IF ODD (ASIZE )THEN RESTOREBYTE (APOS + ASIZE , OIO1 );END ;
PROCEDURE TXMSMEMORY.STREAMWRITE (VAR S:TSTREAM;APOS,ASIZE:LONGINT);VAR O1010l1OIOO1O:WORD;OIOO101OlII:LONGINT;
OOlIll0O0lll:POINTER;O1lO01OlI1lO:LONGINT;O10OIIlllI0OI:LONGINT;OIO1:BYTE;BEGIN IF ODD (ASIZE )THEN OIOO101OlII := ASIZE
- 1 ELSE OIOO101OlII := ASIZE ;O10OIIlllI0OI := APOS ;IF MAXAVAIL > MAXCONVENTIONALMEMORYBLOCK THEN O1lO01OlI1lO :=
MAXCONVENTIONALMEMORYBLOCK ELSE O1lO01OlI1lO := O100llIO11OlO (MAXAVAIL - 2 );GETMEM (OOlIll0O0lll , O1lO01OlI1lO );
WHILE (INOUTRES =0 )AND (OIOO101OlII > 0 ) DO BEGIN IF OIOO101OlII > O1lO01OlI1lO THEN O1010l1OIOO1O := O1lO01OlI1lO ELSE
O1010l1OIOO1O := OIOO101OlII ;IF XMS_MOVE_EMB (HANDLE , O10OIIlllI0OI , 0 , LONGINT (OOlIll0O0lll ), O1010l1OIOO1O )THEN
S.WRITE (OOlIll0O0lll ^, O1010l1OIOO1O )ELSE PRINTERROR ('Error '+ STRW (XMSRESULT )+
' moving from XMS -- TXMSMemory.StreamWrite --', 0 );DEC (OIOO101OlII , O1010l1OIOO1O );INC (O10OIIlllI0OI ,
O1010l1OIOO1O );END ;FREEMEM (OOlIll0O0lll , O1lO01OlI1lO );IF ODD (ASIZE )THEN BEGIN OIO1 := SAVEBYTE (O10OIIlllI0OI );
S.WRITE (OIO1 , 1 )END ;END ;PROCEDURE TXMSMEMORY.MOVEFROM (CONST SOURCE;POS,ASIZE:LONGINT);
VAR {$IFDEF Debug}OOIIO1l11O10:TXMSHANDLEINFO;{$ENDIF}OIO1:BYTE;BEGIN {$IFDEF Debug}ASSERT (POS + ASIZE <= SIZE ,
'Move after max memory size.');ASSERT (ASIZE >= 0 , 'Size is negative.');{$ENDIF}IF ODD (ASIZE )THEN OIO1 := SAVEBYTE
(ASIZE );XMS_MOVE_EMB (0 , LONGINT (@ SOURCE ), HANDLE , POS , O100llIO11OlO (ASIZE ));IF ODD (ASIZE )THEN RESTOREBYTE
(ASIZE , OIO1 );END ;PROCEDURE TXMSMEMORY.MOVETO (POS,ASIZE:LONGINT;VAR DEST);VAR OIO1:BYTE;BEGIN IF ODD (ASIZE )THEN
OIO1 := Ol1I1l1ll (DEST )[ ASIZE ] ;XMS_MOVE_EMB (HANDLE , POS , 0 , LONGINT (@ DEST ), O100llIO11OlO (ASIZE ));IF ODD
(ASIZE )THEN Ol1I1l1ll (DEST )[ ASIZE ] := OIO1 ;END ;PROCEDURE TXMSMEMORY.RECDELETE (ITEM:LONGINT);BEGIN XMS_MOVE_EMB
(HANDLE , (ITEM + 1 )* RECSIZE , HANDLE , ITEM * RECSIZE , SIZE - ((ITEM - 1 )* RECSIZE ));DEC (TOTALRECORDS );END ;
FUNCTION TXMSMEMORY.SAVEBYTE (POS:LONGINT):BYTE ;VAR OOII:ARRAY [ 0 .. 1 ] OF BYTE;BEGIN XMS_MOVE_EMB (HANDLE , POS - 1
, 0 , LONGINT (@ OOII ), 2 );SAVEBYTE := OOII [ 1 ] ;END ;PROCEDURE TXMSMEMORY.RESTOREBYTE (POS:LONGINT;B:BYTE);
VAR OOII:ARRAY [ 0 .. 1 ] OF BYTE;BEGIN XMS_MOVE_EMB (HANDLE , POS - 1 , 0 , LONGINT (@ OOII ), 2 );OOII [ 1 ] := B ;
XMS_MOVE_EMB (0 , LONGINT (@ OOII ), HANDLE , POS - 1 , 2 );END ;{$ENDIF}CONSTRUCTOR TCONVMAX64MEMORY.INIT
(ASIZE:LONGINT;ARECSIZE:WORD;VAR RESULT:BOOLEAN);BEGIN INHERITED INIT;SIZE := ASIZE ;RECSIZE := ARECSIZE ;RESULT :=
MAXAVAIL >= SIZE ;IF RESULT THEN GETMEM (MEM , SIZE )ELSE FREE ;END ;DESTRUCTOR TCONVMAX64MEMORY.DONE ;BEGIN IF MEM <>
NIL THEN FREEMEM (MEM , SIZE );INHERITED DONE;END ;PROCEDURE TCONVMAX64MEMORY.BLOCKREAD (VAR F:FILE ;BLOCKSIZE:LONGINT);
BEGIN {$IFDEF Debug}ASSERT (ISFILEOPEN (F )AND (BLOCKSIZE <= SIZE ), '');{$ENDIF}SYSTEM.BLOCKREAD (F , MEM ^, BLOCKSIZE
);END ;PROCEDURE TCONVMAX64MEMORY.BLOCKWRITE (VAR F:FILE ;BLOCKSIZE:LONGINT);BEGIN {$IFDEF Debug}ASSERT (ISFILEOPEN (F
)AND (BLOCKSIZE <= SIZE ), '');{$ENDIF}SYSTEM.BLOCKWRITE (F , MEM ^, BLOCKSIZE );END ;
PROCEDURE TCONVMAX64MEMORY.STREAMREAD (VAR S:TSTREAM;APOS,ASIZE:LONGINT);BEGIN S.READ (MEM ^[ APOS ] , ASIZE );END ;
PROCEDURE TCONVMAX64MEMORY.STREAMWRITE (VAR S:TSTREAM;APOS,ASIZE:LONGINT);BEGIN S.WRITE (MEM ^[ APOS ] , ASIZE );END ;
PROCEDURE TCONVMAX64MEMORY.DELETE (APOS,ASIZE:LONGINT);BEGIN MOVEFROM (MEM ^[ APOS + ASIZE ] , APOS , SIZE - (APOS +
ASIZE ));END ;PROCEDURE TCONVMAX64MEMORY.MOVEFROM (CONST SOURCE;POS,ASIZE:LONGINT);BEGIN {$IFDEF DEBUG}ASSERT (POS +
ASIZE <= SIZE , 'Move after max memory size.');ASSERT (ASIZE >= 0 , 'Size is negative.');{$ENDIF}MOVE (SOURCE , MEM ^[
POS ] , ASIZE );END ;PROCEDURE TCONVMAX64MEMORY.MOVETO (POS,ASIZE:LONGINT;VAR DEST);BEGIN MOVE (MEM ^[ POS ] , DEST ,
ASIZE );END ;PROCEDURE TCONVMAX64MEMORY.RECDELETE (ITEM:LONGINT);BEGIN DEC (TOTALRECORDS );MOVE (PBYTEARRAY (MEM )^[
(ITEM + 1 )* RECSIZE ] , PBYTEARRAY (MEM )^[ (ITEM )* RECSIZE ] , (TOTALRECORDS - ITEM )* RECSIZE );END ;
PROCEDURE TCONVMAX64MEMORY.RECINSERT (CONST SOURCE;ITEM:LONGINT);BEGIN MOVE (PBYTEARRAY (MEM )^[ (ITEM )* RECSIZE ] ,
PBYTEARRAY (MEM )^[ (ITEM + 1 )* RECSIZE ] , (TOTALRECORDS - ITEM )* RECSIZE );MOVE (SOURCE , PBYTEARRAY (MEM )^[ ITEM *
RECSIZE ] , RECSIZE );INC (TOTALRECORDS );END ;CONSTRUCTOR TCONVHUGEMEMORY.INIT (ASIZE:LONGINT;ARECSIZE:WORD;
VAR RESULT:BOOLEAN);VAR O1011100OO11O:LONGINT;BEGIN INHERITED INIT;SIZE := ASIZE ;RECSIZE := ARECSIZE ;RESULT := MEMAVAIL
>= SIZE ;IF RESULT THEN BEGIN O1011100OO11O := 0 ;WHILE O1011100OO11O < SIZE DO BEGIN IF SIZE - O1011100OO11O >
MAXCONVENTIONALMEMORYBLOCK THEN BEGIN IF MAXAVAIL >= MAXCONVENTIONALMEMORYBLOCK THEN MEMSIZES [ TOTALMEMPTRS ] :=
MAXCONVENTIONALMEMORYBLOCK ELSE MEMSIZES [ TOTALMEMPTRS ] := MAXAVAIL ;END ELSE MEMSIZES [ TOTALMEMPTRS ] := SIZE -
O1011100OO11O ;GETMEM (MEMPTRS [ TOTALMEMPTRS ] , MEMSIZES [ TOTALMEMPTRS ] );INC (O1011100OO11O , MEMSIZES [
TOTALMEMPTRS ] );INC (TOTALMEMPTRS );END ;END ELSE FREE ;END ;DESTRUCTOR TCONVHUGEMEMORY.DONE ;VAR OIlO:INTEGER;
BEGIN FOR OIlO := 0 TO TOTALMEMPTRS - 1 DO FREEMEM (MEMPTRS [ OIlO ] , MEMSIZES [ OIlO ] );INHERITED DONE;END ;
PROCEDURE TCONVHUGEMEMORY.BLOCKREAD (VAR F:FILE ;BLOCKSIZE:LONGINT);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
O10OII0IIOI1O:WORD;BEGIN {$IFDEF Debug}ASSERT (ISFILEOPEN (F ), '');{$ENDIF}OII0OO0lllO := CALCULATEINDEX (0 ,
OI10I0OlO1lO );IF OI10I0OlO1lO + BLOCKSIZE >= MEMSIZES [ OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO
] - OI10I0OlO1lO ;WHILE BLOCKSIZE > 0 DO BEGIN SYSTEM.BLOCKREAD (F , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[
OI10I0OlO1lO ] , O10OII0IIOI1O );DEC (BLOCKSIZE , O10OII0IIOI1O );INC (OII0OO0lllO );OI10I0OlO1lO := 0 ;IF BLOCKSIZE >
MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE O10OII0IIOI1O := BLOCKSIZE ;END ;END ELSE
SYSTEM.BLOCKREAD (F , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , BLOCKSIZE );END ;
PROCEDURE TCONVHUGEMEMORY.BLOCKWRITE (VAR F:FILE ;BLOCKSIZE:LONGINT);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
O10OII0IIOI1O:WORD;BEGIN {$IFDEF Debug}ASSERT (ISFILEOPEN (F ), '');{$ENDIF}OII0OO0lllO := CALCULATEINDEX (0 ,
OI10I0OlO1lO );IF OI10I0OlO1lO + BLOCKSIZE >= MEMSIZES [ OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO
] - OI10I0OlO1lO ;WHILE BLOCKSIZE > 0 DO BEGIN SYSTEM.BLOCKWRITE (F , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[
OI10I0OlO1lO ] , O10OII0IIOI1O );DEC (BLOCKSIZE , O10OII0IIOI1O );INC (OII0OO0lllO );OI10I0OlO1lO := 0 ;IF BLOCKSIZE >
MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE O10OII0IIOI1O := BLOCKSIZE ;END ;END ELSE
SYSTEM.BLOCKWRITE (F , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , BLOCKSIZE );END ;
PROCEDURE TCONVHUGEMEMORY.STREAMREAD (VAR S:TSTREAM;APOS,ASIZE:LONGINT);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
O10OII0IIOI1O:WORD;BEGIN OII0OO0lllO := CALCULATEINDEX (APOS , OI10I0OlO1lO );IF OI10I0OlO1lO + ASIZE >= MEMSIZES [
OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] - OI10I0OlO1lO ;WHILE ASIZE > 0 DO BEGIN S.READ
(PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , O10OII0IIOI1O );DEC (ASIZE , O10OII0IIOI1O );INC (OII0OO0lllO
);OI10I0OlO1lO := 0 ;IF ASIZE > MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE
O10OII0IIOI1O := ASIZE ;END ;END ELSE S.READ (PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , ASIZE );END ;
PROCEDURE TCONVHUGEMEMORY.STREAMWRITE (VAR S:TSTREAM;APOS,ASIZE:LONGINT);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
O10OII0IIOI1O:WORD;BEGIN OII0OO0lllO := CALCULATEINDEX (APOS , OI10I0OlO1lO );IF OI10I0OlO1lO + ASIZE >= MEMSIZES [
OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] - OI10I0OlO1lO ;WHILE ASIZE > 0 DO BEGIN S.WRITE
(PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , O10OII0IIOI1O );DEC (ASIZE , O10OII0IIOI1O );INC (OII0OO0lllO
);OI10I0OlO1lO := 0 ;IF ASIZE > MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE
O10OII0IIOI1O := ASIZE ;END ;END ELSE S.WRITE (PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , ASIZE );END ;
PROCEDURE TCONVHUGEMEMORY.DELETE (APOS,ASIZE:LONGINT);PROCEDURE O1l1lI0O01l1 (VAR OII0OO0lllO:INTEGER;
VAR OI10I0OlO1lO:WORD;O1lIIOl11IlO:WORD);BEGIN {$IFDEF Debug}ASSERT (OI10I0OlO1lO + O1lIIOl11IlO <= MEMSIZES [
OII0OO0lllO ] , '');{$ENDIF}IF OI10I0OlO1lO + O1lIIOl11IlO =MEMSIZES [ OII0OO0lllO ] THEN BEGIN INC (OII0OO0lllO );
OI10I0OlO1lO := 0 ;END ELSE BEGIN INC (OI10I0OlO1lO , O1lIIOl11IlO );END ;END ;VAR O1Ol1ll1OI0O,OIIOO0OllO:INTEGER;
O1l01ll1l0OO,OI0lO1lIO011:WORD;O10OII0IIOI1O:WORD;OOlOIlO1lll0:LONGINT;BEGIN IF ASIZE =0 THEN EXIT ;O1Ol1ll1OI0O :=
CALCULATEINDEX (APOS + ASIZE , O1l01ll1l0OO );OIIOO0OllO := CALCULATEINDEX (APOS , OI0lO1lIO011 );OOlOIlO1lll0 := SIZE -
(APOS + ASIZE );WHILE OOlOIlO1lll0 > 0 DO BEGIN O10OII0IIOI1O := MIN (MEMSIZES [ O1Ol1ll1OI0O ] - O1l01ll1l0OO ,
MEMSIZES [ OIIOO0OllO ] - OI0lO1lIO011 );MOVE (PBYTEARRAY (MEMPTRS [ O1Ol1ll1OI0O ] )^[ O1l01ll1l0OO ] , PBYTEARRAY
(MEMPTRS [ OIIOO0OllO ] )^[ OI0lO1lIO011 ] , O10OII0IIOI1O );O1l1lI0O01l1 (O1Ol1ll1OI0O , O1l01ll1l0OO , O10OII0IIOI1O );
O1l1lI0O01l1 (OIIOO0OllO , OI0lO1lIO011 , O10OII0IIOI1O );DEC (OOlOIlO1lll0 , O10OII0IIOI1O );END ;END ;
PROCEDURE TCONVHUGEMEMORY.MOVEFROM (CONST SOURCE;POS,ASIZE:LONGINT);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
O10OII0IIOI1O:WORD;Olll0IOI11:WORD;BEGIN {$IFDEF DEBUG}ASSERT (POS + ASIZE <= SIZE , 'Move after max memory size.');
ASSERT (ASIZE >= 0 , 'Size is negative.');{$ENDIF}OII0OO0lllO := CALCULATEINDEX (POS , OI10I0OlO1lO );IF OI10I0OlO1lO +
ASIZE >= MEMSIZES [ OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] - OI10I0OlO1lO ;Olll0IOI11 := 0 ;
WHILE ASIZE > 0 DO BEGIN MOVE (Ol1I1l1ll (SOURCE )[ Olll0IOI11 ] , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO
] , O10OII0IIOI1O );DEC (ASIZE , O10OII0IIOI1O );INC (OII0OO0lllO );OI10I0OlO1lO := 0 ;INC (Olll0IOI11 , O10OII0IIOI1O );
IF ASIZE > MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE O10OII0IIOI1O := ASIZE ;END ;
END ELSE MOVE (SOURCE , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , ASIZE );END ;
PROCEDURE TCONVHUGEMEMORY.MOVETO (POS,ASIZE:LONGINT;VAR DEST);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
O10OII0IIOI1O:WORD;O101l00lOI0IO:WORD;BEGIN OII0OO0lllO := CALCULATEINDEX (POS , OI10I0OlO1lO );IF OI10I0OlO1lO + ASIZE
>= MEMSIZES [ OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] - OI10I0OlO1lO ;O101l00lOI0IO := 0 ;
WHILE ASIZE > 0 DO BEGIN MOVE (PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , Ol1I1l1ll (DEST )[ O101l00lOI0IO
] , O10OII0IIOI1O );DEC (ASIZE , O10OII0IIOI1O );INC (OII0OO0lllO );OI10I0OlO1lO := 0 ;INC (O101l00lOI0IO , O10OII0IIOI1O
);IF ASIZE > MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE O10OII0IIOI1O := ASIZE ;END ;
END ELSE MOVE (PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , DEST , ASIZE );END ;
PROCEDURE TCONVHUGEMEMORY.RECDELETE (ITEM:LONGINT);BEGIN ABSTRACT ;END ;PROCEDURE TCONVHUGEMEMORY.RECINSERT
(CONST SOURCE;ITEM:LONGINT);BEGIN ABSTRACT ;END ;FUNCTION TCONVHUGEMEMORY.CALCULATEINDEX (POS:LONGINT;
VAR RELATIVEPOS:WORD):WORD ;VAR OII0OO0lllO:WORD;OIOO:LONGINT;BEGIN OII0OO0lllO := 0 ;WHILE POS >= MEMSIZES [ OII0OO0lllO
] DO BEGIN DEC (POS , MEMSIZES [ OII0OO0lllO ] );INC (OII0OO0lllO );END ;RELATIVEPOS := POS ;CALCULATEINDEX :=
OII0OO0lllO ;END ;PROCEDURE INITOBJMEMORY ;BEGIN {$IFDEF MsDos}EMS_INIT ;{$IFDEF Debug}IF EMSINSTALLED THEN LOGERROR
('EMS free pages: '+ STRW (EMS_NUMBER_OF_PAGES ));{$ENDIF}XMS_INIT ;{$ENDIF}END ;FUNCTION GETOBJMEMORY (SIZE:LONGINT;
RECSIZE,AFLAGS:WORD):POBJMEMORY ;VAR OIO11IOOlO0:BOOLEAN;BEGIN {$IFNDEF ForceXMS}IF (AFLAGS AND MEMFCONVENTIONALFIRST <>
0 )OR (SIZE <= CONVMEMLIMIT )THEN BEGIN IF SIZE <= MAXCONVENTIONALMEMORYBLOCK THEN GETOBJMEMORY := NEW (PCONVMAX64MEMORY
, INIT (SIZE , RECSIZE , OIO11IOOlO0 ))ELSE GETOBJMEMORY := NEW (PCONVHUGEMEMORY , INIT (SIZE , RECSIZE , OIO11IOOlO0 ));
IF OIO11IOOlO0 THEN EXIT ;END ;{$ENDIF}{$IFDEF MsDos}{$IFNDEF ForceXMS}IF (AFLAGS AND MEMFEMS <> 0 )AND EMSINSTALLED THEN
BEGIN GETOBJMEMORY := NEW (PEMSMEMORY , INIT (SIZE , RECSIZE , OIO11IOOlO0 ));IF OIO11IOOlO0 THEN EXIT ;END ;{$ENDIF}IF
(AFLAGS AND MEMFXMS <> 0 )AND XMSINSTALLED THEN BEGIN GETOBJMEMORY := NEW (PXMSMEMORY , INIT (SIZE , RECSIZE ,
OIO11IOOlO0 ));IF OIO11IOOlO0 THEN EXIT ;END ;{$ENDIF}IF (AFLAGS AND MEMFCONVENTIONAL <> 0 )THEN BEGIN IF SIZE <=
MAXCONVENTIONALMEMORYBLOCK THEN GETOBJMEMORY := NEW (PCONVMAX64MEMORY , INIT (SIZE , RECSIZE , OIO11IOOlO0 ))ELSE
GETOBJMEMORY := NEW (PCONVHUGEMEMORY , INIT (SIZE , RECSIZE , OIO11IOOlO0 ));IF OIO11IOOlO0 THEN EXIT ;END ;IF (AFLAGS
AND MEMFDISK <> 0 )THEN BEGIN END ;LOGERROR ('No memory allocated. Request size: '+ STRL (SIZE ));GETOBJMEMORY := NIL ;
END ;END .