home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / pmd110 / objmemor.pas < prev    next >
Pascal/Delphi Source File  |  1994-11-13  |  31KB  |  415 lines

  1. (* This file was mangled by Mangler 1.35 (c) Copyright 1993-1994 by Berend de Boer *)
  2. { Created : 1992-09-24
  3.  
  4. Unit to provide uniformed acces to all kinds of memory. Supported are:
  5. - Conventional memory
  6. - XHeap
  7. - EMS 4.0
  8. - XMS
  9. - Disk
  10.  
  11. Memory can be allocated up to MaxLongInt size. Memory can be divided into
  12. chunks of up to MaxConventionalMemoryBlock size.
  13.  
  14. Use the function GetObjMemory with the memfXXXX flags to designate the
  15. types of memory and a Size to get a memory object obeying your memfXXXX
  16. flags.
  17.  
  18.  
  19. Bugs:
  20. - not tested of StreamRead/Write for XMS and EMS work correctly with
  21.   different Pos. It seems ok though.
  22.  
  23. Last changes :
  24. 93-05-10  Removed XMS and EMS interfaces for DPMI
  25. 93-12-16  TConvHugeMemory's MoveTo and MoveFrom contained a bug
  26. 93-01-22  Changed MoveTo to same parameter order as recMoveTo
  27.           The number of inserted and deleted records is now counted
  28. 94-08-16  Changed parameters of BlockRead and BlockWrite
  29. 94-09-08  Moved EMS and XMS parts to different units
  30. }
  31.  
  32.  
  33.  
  34. {$IFDEF MsDos}
  35. {$F+,O+}
  36. {.$DEFINE ForceXMS}
  37. {$ENDIF}
  38.  
  39. {$X+,R-,Q-,S-,I-}
  40. unit ObjMemory;
  41.  
  42. interface
  43.  
  44. uses Objects
  45.      {$IFDEF Windows}
  46.      , BBObject
  47.      {$ENDIF}
  48.      {$IFDEF MsDos}
  49.      , EMS, XMS
  50.      {$ENDIF}
  51.      ;
  52.  
  53.  
  54. const
  55.   memfConventional      = $01;
  56.   memfConventionalLast  = memfConventional;
  57.   memfConventionalFirst = $02;
  58.   memfXHeap             = $04;
  59.   memfEMS               = $08;
  60.   memfXMS               = $10;
  61.   memfDisk              = $20;
  62.   memfAll               = memfConventional + memfXHeap + memfXMS + memfEMS + memfDisk;
  63.  
  64. const
  65.   MaxConventionalMemoryBlock = 65528;
  66.  
  67.  
  68. { if a memory block is asked with a size below ConvMemLimit, we always first }
  69. {  try to return a conventional memory block                                 }
  70. const
  71.   ConvMemLimit:word = 8192;
  72.  
  73.  
  74. type
  75.   PObjMemory = ^TObjMemory;
  76.   TObjMemory = object(TObject)
  77.     Size : longint;          {* size of memory *}
  78.     RecSize : word;          {* record size if memory is array *}
  79.     TotalRecords : longint;
  80.     procedure BlockRead(var f : file; BlockSize : longint);  virtual;
  81.     procedure BlockWrite(var f : file; BlockSize : longint);  virtual;
  82.     procedure CopyFrom(Source : PObjMemory);  virtual;
  83.     procedure Delete(APos, ASize : longint);  virtual;
  84.     procedure FillChar(Value : byte);
  85.     procedure MoveFrom(const Source; Pos, ASize : longint);  virtual;
  86.     procedure MoveTo(Pos, ASize : longint; var Dest);  virtual;
  87.     procedure StreamRead(var S : TStream; APos, ASize : longint);  virtual;
  88.     procedure StreamWrite(var S : TStream; APos, ASize : longint);  virtual;
  89.  
  90.   {* record methods *}
  91.     procedure recDelete(Item : longint);  virtual;
  92.     procedure recInsert(const Source; Item : longint);  virtual;
  93.     procedure recMoveFrom(const Source; Item : longint);
  94.     procedure recMoveTo(Item : longint; var Dest);
  95.     procedure recWrite(var f : file; recCount : longint);  virtual;
  96.   end;
  97.  
  98. {$IFDEF MsDos}
  99.   PEMSMemory = ^TEMSMemory;
  100.   TEMSMemory = object(TObjMemory)
  101.     Handle : TEMSHandle;
  102.     TotalPages : word;
  103.     constructor Init(ASize : longint; ARecSize : word; var Result : Boolean);
  104.     destructor Done;  virtual;
  105.     procedure BlockRead(var f : file; BlockSize : longint);  virtual;
  106.     procedure BlockWrite(var f : file; BlockSize : longint);  virtual;
  107.     procedure Delete(APos, ASize : longint);  virtual;
  108.     procedure MoveFrom(const Source; Pos, ASize : longint);  virtual;
  109.     procedure MoveTo(Pos, ASize : longint; var Dest);  virtual;
  110.     procedure StreamRead(var S : TStream; APos, ASize : longint);  virtual;
  111.     procedure StreamWrite(var S : TStream; APos, ASize : longint);  virtual;
  112.     procedure Map4Pages(var LogicalPage : word);
  113.  
  114.   {* record methods *}
  115.     procedure recDelete(Item : longint);  virtual;
  116.   end;
  117. {$ENDIF}
  118.  
  119.  
  120. {$IFDEF MsDos}
  121.   PXMSMemory = ^TXMSMemory;
  122.   TXMSMemory = object(TObjMemory)
  123.     Handle : TXMSHandle;
  124.     constructor Init(ASize : longint; ARecSize : word; var Result : Boolean);
  125.     destructor Done;  virtual;
  126.     procedure BlockRead(var f : file; BlockSize : longint);  virtual;
  127.     procedure BlockWrite(var f : file; BlockSize : longint);  virtual;
  128.     procedure Delete(APos, ASize : longint);  virtual;
  129.     procedure MoveFrom(const Source; Pos, ASize : longint);  virtual;
  130.     procedure MoveTo(Pos, ASize : longint; var Dest);  virtual;
  131.     procedure StreamRead(var S : TStream; APos, ASize : longint);  virtual;
  132.     procedure StreamWrite(var S : TStream; APos, ASize : longint);  virtual;
  133.  
  134.   {* record methods *}
  135.     procedure recDelete(Item : longint);  virtual;
  136.  
  137.   private
  138.     function  SaveByte(Pos : longint) : byte;
  139.     procedure RestoreByte(Pos : longint; b : byte);
  140.   end;
  141. {$ENDIF}
  142.  
  143.  
  144.   PConvMax64Memory = ^TConvMax64Memory;
  145.   TConvMax64Memory = object(TObjMemory)
  146.     Mem : PByteArray;
  147.     constructor Init(ASize : longint; ARecSize : word; var Result : Boolean);
  148.     destructor Done;  virtual;
  149.     procedure BlockRead(var f : file; BlockSize : longint);  virtual;
  150.     procedure BlockWrite(var f : file; BlockSize : longint);  virtual;
  151.     procedure StreamRead(var S : TStream; APos, ASize : longint);  virtual;
  152.     procedure StreamWrite(var S : TStream; APos, ASize : longint);  virtual;
  153.     procedure Delete(APos, ASize : longint);  virtual;
  154.     procedure MoveFrom(const Source; Pos, ASize : longint);  virtual;
  155.     procedure MoveTo(Pos, ASize : longint; var Dest);  virtual;
  156.  
  157.   {* record methods *}
  158.     procedure recDelete(Item : longint);  virtual;
  159.     procedure recInsert(const Source; Item : longint);  virtual;
  160.   end;
  161.  
  162.  
  163. const
  164.   MaxMemPtrs = 16;
  165.  
  166. type
  167.   PConvHugeMemory = ^TConvHugeMemory;
  168.   TConvHugeMemory = object(TObjMemory)
  169.     MemSizes : array[0..MaxMemPtrs-1] of word;
  170.     MemPtrs : array[0..MaxMemPtrs-1] of pointer;
  171.     TotalMemPtrs : integer;
  172.     constructor Init(ASize : longint; ARecSize : word; var Result : Boolean);
  173.     destructor Done;  virtual;
  174.     procedure BlockRead(var f : file; BlockSize : longint);  virtual;
  175.     procedure BlockWrite(var f : file; BlockSize : longint);  virtual;
  176.     procedure StreamRead(var S : TStream; APos, ASize : longint);  virtual;
  177.     procedure StreamWrite(var S : TStream; APos, ASize : longint);  virtual;
  178.     procedure Delete(APos, ASize : longint);  virtual;
  179.     procedure MoveFrom(const Source; Pos, ASize : longint);  virtual;
  180.     procedure MoveTo(Pos, ASize : longint; var Dest);  virtual;
  181.  
  182.   {* record methods *}
  183.     procedure recDelete(Item : longint);  virtual;
  184.     procedure recInsert(const Source; Item : longint);  virtual;
  185.  
  186.   private
  187.   {* specific for this object *}
  188.     function CalculateIndex(Pos : longint; var RelativePos : word) : word;
  189.   end;
  190.  
  191.  
  192.  
  193. {* call this procedure before calling any other routine! Initializes XMS and
  194.    EMS units too if compiled for MsDos *}
  195.  
  196. procedure InitObjMemory;
  197.  
  198.  
  199. {* call this function to get a memory object *}
  200.  
  201. function  GetObjMemory(Size : longint; RecSize, AFlags : word) : PObjMemory;
  202.  
  203.  
  204.  
  205.  IMPLEMENTATION USES {$IFNDEF Windows}DOS , {$ENDIF}BBUTIL , BBGUI , BBERROR , BBFILE {$IFDEF Debug}, ASSERTIONS
  206. {$ENDIF};TYPE Ol1I1l1ll=ARRAY [ 0 .. MAXWORD- 1 ]  OF BYTE;PROCEDURE TOBJMEMORY.BLOCKREAD (VAR F:FILE ;
  207. BLOCKSIZE:LONGINT);BEGIN ABSTRACT ;END ;PROCEDURE TOBJMEMORY.BLOCKWRITE (VAR F:FILE ;BLOCKSIZE:LONGINT);BEGIN ABSTRACT ;
  208. END ;PROCEDURE TOBJMEMORY.COPYFROM (SOURCE:POBJMEMORY);CONST OO00O1O1Il=32768 ;VAR OI10I1ll0l01:POINTER;
  209. O10OIOOOlI1I1:LONGINT;Olll0IOI11:LONGINT;O101l00lOI0IO:LONGINT;BEGIN GETMEM (OI10I1ll0l01 , OO00O1O1Il );
  210. {$IFDEF DEBUG}ASSERT (OI10I1ll0l01 <> NIL , 'Could not allocate Cache!');{$ENDIF}O101l00lOI0IO := 0 ;Olll0IOI11 := 0 ;
  211. O10OIOOOlI1I1 := MIN (SOURCE ^. SIZE , SIZE );WHILE O10OIOOOlI1I1 > 0  DO BEGIN SOURCE ^. MOVETO (Olll0IOI11 , MIN
  212. (OO00O1O1Il , O10OIOOOlI1I1 ), OI10I1ll0l01 ^);MOVEFROM (OI10I1ll0l01 ^, O101l00lOI0IO , MIN (OO00O1O1Il , O10OIOOOlI1I1
  213. ));DEC (O10OIOOOlI1I1 , OO00O1O1Il );INC (Olll0IOI11 , OO00O1O1Il );INC (O101l00lOI0IO , OO00O1O1Il );END ;FREEMEM
  214. (OI10I1ll0l01 , OO00O1O1Il );TOTALRECORDS := SOURCE ^. TOTALRECORDS ;RECSIZE := SOURCE ^. RECSIZE ;END ;
  215. PROCEDURE TOBJMEMORY.DELETE (APOS,ASIZE:LONGINT);BEGIN ABSTRACT ;END ;PROCEDURE TOBJMEMORY.FILLCHAR (VALUE:BYTE);
  216. BEGIN ABSTRACT ;END ;PROCEDURE TOBJMEMORY.MOVEFROM (CONST SOURCE;POS,ASIZE:LONGINT);BEGIN ABSTRACT ;END ;
  217. PROCEDURE TOBJMEMORY.MOVETO (POS,ASIZE:LONGINT;VAR DEST);BEGIN ABSTRACT ;END ;PROCEDURE TOBJMEMORY.STREAMREAD
  218. (VAR S:TSTREAM;APOS,ASIZE:LONGINT);BEGIN PRINTERROR ('Abstract method TObjMemory.StreamRead', 0 );ABSTRACT ;END ;
  219. PROCEDURE TOBJMEMORY.STREAMWRITE (VAR S:TSTREAM;APOS,ASIZE:LONGINT);BEGIN PRINTERROR
  220. ('Abstract method TObjMemory.StreamWrite', 0 );ABSTRACT ;END ;PROCEDURE TOBJMEMORY.RECDELETE (ITEM:LONGINT);
  221. BEGIN ABSTRACT ;END ;PROCEDURE TOBJMEMORY.RECINSERT (CONST SOURCE;ITEM:LONGINT);BEGIN ABSTRACT ;END ;
  222. PROCEDURE TOBJMEMORY.RECMOVEFROM (CONST SOURCE;ITEM:LONGINT);BEGIN IF (ITEM + 1 )* RECSIZE <= SIZE THEN MOVEFROM (SOURCE
  223. , ITEM * RECSIZE , RECSIZE )ELSE BEGIN PRINTERROR ('Attempt to index arrary beyond bounds.', 0 );HALT (1 );END ;END ;
  224. PROCEDURE TOBJMEMORY.RECMOVETO (ITEM:LONGINT;VAR DEST);BEGIN IF (ITEM + 1 )* RECSIZE <= SIZE THEN MOVETO (ITEM * RECSIZE
  225. , RECSIZE , DEST )ELSE BEGIN PRINTERROR ('Attempt to index arrary beyond bounds.', 0 );HALT (1 );END ;END ;
  226. PROCEDURE TOBJMEMORY.RECWRITE (VAR F:FILE ;RECCOUNT:LONGINT);BEGIN BLOCKWRITE (F , RECCOUNT * RECSIZE );END ;
  227. {$IFDEF MSDOS}CONSTRUCTOR TEMSMEMORY.INIT (ASIZE:LONGINT;ARECSIZE:WORD;VAR RESULT:BOOLEAN);BEGIN INHERITED INIT;SIZE :=
  228. ASIZE ;RECSIZE := ARECSIZE ;RESULT := EMS_ALLOCATE (HANDLE , TOTALPAGES , SIZE );IF NOT RESULT THEN BEGIN LOGERROR
  229. ('EMS allocation failed. result code: 0'+ HEXB (EMSRESULT )+ 'h');LOGERROR ('EMS free pages: '+ STRW (EMS_NUMBER_OF_PAGES
  230. ));FREE ;END ;END ;DESTRUCTOR TEMSMEMORY.DONE ;BEGIN IF (HANDLE <> 0 )AND NOT EMS_DISPOSE (HANDLE )THEN PRINTERROR
  231. ('Error '+ STRW (EMSRESULT )+ ' deallocating EMS.', 0 );INHERITED DONE;END ;PROCEDURE TEMSMEMORY.BLOCKREAD (VAR F:FILE ;
  232. BLOCKSIZE:LONGINT);VAR O1010O1II0I01:WORD;OI101IOOIO0l:WORD;OIOO101OlII:LONGINT;BEGIN OI101IOOIO0l := 0 ;OIOO101OlII :=
  233. BLOCKSIZE ;WHILE (INOUTRES =0 )AND (OIOO101OlII > 0 ) DO BEGIN IF OIOO101OlII > MAXCONVENTIONALMEMORYBLOCK THEN
  234. O1010O1II0I01 := MAXCONVENTIONALMEMORYBLOCK ELSE O1010O1II0I01 := OIOO101OlII ;MAP4PAGES (OI101IOOIO0l );
  235. SYSTEM.BLOCKREAD (F , EMSFRAME ^, O1010O1II0I01 );DEC (OIOO101OlII , O1010O1II0I01 );END ;END ;
  236. PROCEDURE TEMSMEMORY.BLOCKWRITE (VAR F:FILE ;BLOCKSIZE:LONGINT);VAR O1010l1OIOO1O:WORD;OI101IOOIO0l:WORD;
  237. OIOO101OlII:LONGINT;BEGIN OI101IOOIO0l := 0 ;OIOO101OlII := BLOCKSIZE ;WHILE (INOUTRES =0 )AND (OIOO101OlII > 0
  238. ) DO BEGIN IF OIOO101OlII > MAXCONVENTIONALMEMORYBLOCK THEN O1010l1OIOO1O := MAXCONVENTIONALMEMORYBLOCK ELSE
  239. O1010l1OIOO1O := OIOO101OlII ;MAP4PAGES (OI101IOOIO0l );SYSTEM.BLOCKWRITE (F , EMSFRAME ^, O1010l1OIOO1O );DEC
  240. (OIOO101OlII , O1010l1OIOO1O );END ;END ;PROCEDURE TEMSMEMORY.DELETE (APOS,ASIZE:LONGINT);BEGIN {$IFDEF DEBUG}ASSERT
  241. (APOS + ASIZE <= SIZE , 'Move after max memory size.');ASSERT (ASIZE >= 0 , 'Size is negative.');{$ENDIF}EMS_MOVE_REGION
  242. (HANDLE , APOS + ASIZE , HANDLE , APOS , SIZE - (APOS + ASIZE ));END ;PROCEDURE TEMSMEMORY.MOVEFROM (CONST SOURCE;
  243. POS,ASIZE:LONGINT);BEGIN {$IFDEF DEBUG}ASSERT (POS + ASIZE <= SIZE , 'Move after max memory size.');ASSERT (ASIZE >= 0 ,
  244. 'Size is negative.');{$ENDIF}EMS_MOVE_REGION (0 , LONGINT (@ SOURCE ), HANDLE , POS , ASIZE );END ;
  245. PROCEDURE TEMSMEMORY.MOVETO (POS,ASIZE:LONGINT;VAR DEST);BEGIN EMS_MOVE_REGION (HANDLE , POS , 0 , LONGINT (@ DEST ),
  246. ASIZE );END ;PROCEDURE TEMSMEMORY.MAP4PAGES (VAR LOGICALPAGE:WORD);VAR OIlO:WORD;BEGIN FOR OIlO := 0 TO 3  DO BEGIN IF
  247. LOGICALPAGE < TOTALPAGES THEN BEGIN EMS_MAP_MEMORY (HANDLE , OIlO , LOGICALPAGE );INC (LOGICALPAGE );END ;END ;END ;
  248. PROCEDURE TEMSMEMORY.STREAMREAD (VAR S:TSTREAM;APOS,ASIZE:LONGINT);VAR O1010O1II0I01:WORD;OI101IOOIO0l:WORD;
  249. OIOO101OlII:LONGINT;O10OIIlllI10O:LONGINT;OOlIll0O0lll:POINTER;O1lO01OlI1lO:WORD;BEGIN {$IFDEF Debug}ASSERT (APOS =0 ,
  250. '');{$ENDIF}IF MAXAVAIL < MAXCONVENTIONALMEMORYBLOCK THEN O1lO01OlI1lO := MAXAVAIL ELSE O1lO01OlI1lO :=
  251. MAXCONVENTIONALMEMORYBLOCK ;GETMEM (OOlIll0O0lll , O1lO01OlI1lO );O10OIIlllI10O := APOS ;OI101IOOIO0l := 0 ;OIOO101OlII
  252. := ASIZE ;WHILE (OIOO101OlII > 0 )AND (S.STATUS =STOK ) DO BEGIN IF OIOO101OlII > O1lO01OlI1lO THEN O1010O1II0I01 :=
  253. O1lO01OlI1lO ELSE O1010O1II0I01 := OIOO101OlII ;S.READ (OOlIll0O0lll ^, O1010O1II0I01 );EMS_MOVE_REGION (HANDLE ,
  254. O10OIIlllI10O , 0 , LONGINT (OOlIll0O0lll ), O1010O1II0I01 );INC (O10OIIlllI10O , O1010O1II0I01 );DEC (OIOO101OlII ,
  255. O1010O1II0I01 );END ;FREEMEM (OOlIll0O0lll , O1lO01OlI1lO );END ;PROCEDURE TEMSMEMORY.STREAMWRITE (VAR S:TSTREAM;
  256. APOS,ASIZE:LONGINT);VAR O1010l1OIOO1O:WORD;O10OIIlllI10O:LONGINT;OI101IOOIO0l:WORD;OIOO101OlII:LONGINT;
  257. OOlIll0O0lll:POINTER;O1lO01OlI1lO:WORD;BEGIN {$IFDEF Debug}ASSERT (APOS =0 , '');{$ENDIF}IF MAXAVAIL <
  258. MAXCONVENTIONALMEMORYBLOCK THEN O1lO01OlI1lO := MAXAVAIL ELSE O1lO01OlI1lO := MAXCONVENTIONALMEMORYBLOCK ;GETMEM
  259. (OOlIll0O0lll , O1lO01OlI1lO );O10OIIlllI10O := APOS ;OI101IOOIO0l := 0 ;OIOO101OlII := ASIZE ;WHILE (OIOO101OlII > 0
  260. )AND (S.STATUS =STOK ) DO BEGIN IF OIOO101OlII > O1lO01OlI1lO THEN O1010l1OIOO1O := O1lO01OlI1lO ELSE O1010l1OIOO1O :=
  261. OIOO101OlII ;EMS_MOVE_REGION (HANDLE , O10OIIlllI10O , 0 , LONGINT (OOlIll0O0lll ), O1010l1OIOO1O );S.WRITE (OOlIll0O0lll
  262. ^, O1010l1OIOO1O );INC (O10OIIlllI10O , O1010l1OIOO1O );DEC (OIOO101OlII , O1010l1OIOO1O );END ;FREEMEM (OOlIll0O0lll ,
  263. O1lO01OlI1lO );END ;PROCEDURE TEMSMEMORY.RECDELETE (ITEM:LONGINT);BEGIN EMS_MOVE_REGION (HANDLE , (ITEM + 1 )* RECSIZE ,
  264. HANDLE , ITEM * RECSIZE , SIZE - ((ITEM - 1 )* RECSIZE ));DEC (TOTALRECORDS );END ;
  265. {$ENDIF}{$IFDEF MSDOS}FUNCTION O100llIO11OlO (OO01:LONGINT):LONGINT ;ASSEMBLER;ASM {} MOV AX , WORD PTR OO01{}
  266. MOV BX , AX {} AND AX , 01h {} JZ @@even {} MOV AX , BX {} MOV DX , WORD PTR OO01+ 2 {} ADD AX , 1 {} ADC DX , 0 {}
  267. JMP @@end {} @@even : {} MOV AX , BX {} MOV DX , WORD PTR OO01+ 2 {} @@end : {} END;CONSTRUCTOR TXMSMEMORY.INIT
  268. (ASIZE:LONGINT;ARECSIZE:WORD;VAR RESULT:BOOLEAN);BEGIN INHERITED INIT;SIZE := O100llIO11OlO (ASIZE );RECSIZE :=
  269. O100llIO11OlO (ARECSIZE );RESULT := XMS_ALLOCATE (HANDLE , SIZE );IF NOT RESULT THEN FREE ;END ;
  270. DESTRUCTOR TXMSMEMORY.DONE ;BEGIN IF (HANDLE <> 0 )AND NOT XMS_DISPOSE (HANDLE )THEN PRINTERROR ('Error '+ STRW
  271. (XMSRESULT )+ ' deallocating XMS.', 0 );INHERITED DONE;END ;PROCEDURE TXMSMEMORY.BLOCKREAD (VAR F:FILE ;
  272. BLOCKSIZE:LONGINT);VAR O1010O1II0I01:WORD;OIOO101OlII:LONGINT;OOlIll0O0lll:POINTER;O1lO01OlI1lO:LONGINT;
  273. O10OIIlllI0OI:LONGINT;OIO1:BYTE;BEGIN IF ODD (BLOCKSIZE )THEN OIO1 := SAVEBYTE (BLOCKSIZE );OIOO101OlII := BLOCKSIZE ;
  274. O10OIIlllI0OI := 0 ;IF MAXAVAIL > MAXCONVENTIONALMEMORYBLOCK THEN O1lO01OlI1lO := MAXCONVENTIONALMEMORYBLOCK ELSE
  275. O1lO01OlI1lO := O100llIO11OlO (MAXAVAIL - 2 );GETMEM (OOlIll0O0lll , O1lO01OlI1lO );WHILE (INOUTRES =0 )AND (OIOO101OlII
  276. > 0 ) DO BEGIN IF OIOO101OlII >= O1lO01OlI1lO THEN O1010O1II0I01 := O1lO01OlI1lO ELSE O1010O1II0I01 := OIOO101OlII ;
  277. SYSTEM.BLOCKREAD (F , OOlIll0O0lll ^, O1010O1II0I01 );IF NOT XMS_MOVE_EMB (0 , LONGINT (OOlIll0O0lll ), HANDLE ,
  278. O10OIIlllI0OI , O100llIO11OlO (O1010O1II0I01 ))THEN PRINTERROR ('Error '+ STRW (XMSRESULT )+
  279. ' moving to XMS -- TXMSMemory.BlockRead --', 0 );DEC (OIOO101OlII , O1010O1II0I01 );INC (O10OIIlllI0OI , O1010O1II0I01 );
  280. END ;FREEMEM (OOlIll0O0lll , O1lO01OlI1lO );IF ODD (BLOCKSIZE )THEN RESTOREBYTE (BLOCKSIZE , OIO1 );END ;
  281. PROCEDURE TXMSMEMORY.BLOCKWRITE (VAR F:FILE ;BLOCKSIZE:LONGINT);VAR O1010l1OIOO1O:WORD;OIOO101OlII:LONGINT;
  282. OOlIll0O0lll:POINTER;O1lO01OlI1lO:LONGINT;O10OIIlllI0OI:LONGINT;OIO1:BYTE;BEGIN IF ODD (BLOCKSIZE )THEN OIOO101OlII :=
  283. BLOCKSIZE - 1 ELSE OIOO101OlII := BLOCKSIZE ;O10OIIlllI0OI := 0 ;IF MAXAVAIL > MAXCONVENTIONALMEMORYBLOCK THEN
  284. O1lO01OlI1lO := MAXCONVENTIONALMEMORYBLOCK ELSE O1lO01OlI1lO := O100llIO11OlO (MAXAVAIL - 2 );GETMEM (OOlIll0O0lll ,
  285. O1lO01OlI1lO );WHILE (INOUTRES =0 )AND (OIOO101OlII > 0 ) DO BEGIN IF OIOO101OlII > O1lO01OlI1lO THEN O1010l1OIOO1O :=
  286. O1lO01OlI1lO ELSE O1010l1OIOO1O := OIOO101OlII ;IF XMS_MOVE_EMB (HANDLE , O10OIIlllI0OI , 0 , LONGINT (OOlIll0O0lll ),
  287. O1010l1OIOO1O )THEN SYSTEM.BLOCKWRITE (F , OOlIll0O0lll ^, O1010l1OIOO1O )ELSE PRINTERROR ('Error '+ STRW (XMSRESULT )+
  288. ' moving from XMS -- TXMSMemory.BlockWrite --', 0 );DEC (OIOO101OlII , O1010l1OIOO1O );INC (O10OIIlllI0OI , O1010l1OIOO1O
  289. );END ;FREEMEM (OOlIll0O0lll , O1lO01OlI1lO );IF ODD (BLOCKSIZE )THEN BEGIN OIO1 := SAVEBYTE (O10OIIlllI0OI );
  290. SYSTEM.BLOCKWRITE (F , OIO1 , 1 )END ;END ;PROCEDURE TXMSMEMORY.DELETE (APOS,ASIZE:LONGINT);BEGIN {$IFDEF DEBUG}ASSERT
  291. (APOS + ASIZE <= SIZE , 'Move after max memory size.');ASSERT (ASIZE >= 0 , 'Size is negative.');{$ENDIF}XMS_MOVE_EMB
  292. (HANDLE , APOS + ASIZE , HANDLE , APOS , O100llIO11OlO (SIZE - (APOS + ASIZE )));END ;PROCEDURE TXMSMEMORY.STREAMREAD
  293. (VAR S:TSTREAM;APOS,ASIZE:LONGINT);VAR O1010O1II0I01:WORD;OIOO101OlII:LONGINT;OOlIll0O0lll:POINTER;O1lO01OlI1lO:LONGINT;
  294. O10OIIlllI0OI:LONGINT;OIO1:BYTE;BEGIN IF ODD (ASIZE )THEN OIO1 := SAVEBYTE (APOS + ASIZE );OIOO101OlII := ASIZE ;
  295. O10OIIlllI0OI := APOS ;IF MAXAVAIL > MAXCONVENTIONALMEMORYBLOCK THEN O1lO01OlI1lO := MAXCONVENTIONALMEMORYBLOCK ELSE
  296. O1lO01OlI1lO := O100llIO11OlO (MAXAVAIL - 2 );GETMEM (OOlIll0O0lll , O1lO01OlI1lO );WHILE (INOUTRES =0 )AND (OIOO101OlII
  297. > 0 ) DO BEGIN IF OIOO101OlII > O1lO01OlI1lO THEN O1010O1II0I01 := O1lO01OlI1lO ELSE O1010O1II0I01 := OIOO101OlII ;
  298. S.READ (OOlIll0O0lll ^, O1010O1II0I01 );IF NOT XMS_MOVE_EMB (0 , LONGINT (OOlIll0O0lll ), HANDLE , O10OIIlllI0OI ,
  299. O100llIO11OlO (O1010O1II0I01 ))THEN PRINTERROR ('Error '+ STRW (XMSRESULT )+
  300. ' moving to XMS -- TXMSMemory.StreamRead --', 0 );DEC (OIOO101OlII , O1010O1II0I01 );INC (O10OIIlllI0OI , O1010O1II0I01
  301. );END ;FREEMEM (OOlIll0O0lll , O1lO01OlI1lO );IF ODD (ASIZE )THEN RESTOREBYTE (APOS + ASIZE , OIO1 );END ;
  302. PROCEDURE TXMSMEMORY.STREAMWRITE (VAR S:TSTREAM;APOS,ASIZE:LONGINT);VAR O1010l1OIOO1O:WORD;OIOO101OlII:LONGINT;
  303. OOlIll0O0lll:POINTER;O1lO01OlI1lO:LONGINT;O10OIIlllI0OI:LONGINT;OIO1:BYTE;BEGIN IF ODD (ASIZE )THEN OIOO101OlII := ASIZE
  304. - 1 ELSE OIOO101OlII := ASIZE ;O10OIIlllI0OI := APOS ;IF MAXAVAIL > MAXCONVENTIONALMEMORYBLOCK THEN O1lO01OlI1lO :=
  305. MAXCONVENTIONALMEMORYBLOCK ELSE O1lO01OlI1lO := O100llIO11OlO (MAXAVAIL - 2 );GETMEM (OOlIll0O0lll , O1lO01OlI1lO );
  306. WHILE (INOUTRES =0 )AND (OIOO101OlII > 0 ) DO BEGIN IF OIOO101OlII > O1lO01OlI1lO THEN O1010l1OIOO1O := O1lO01OlI1lO ELSE
  307. O1010l1OIOO1O := OIOO101OlII ;IF XMS_MOVE_EMB (HANDLE , O10OIIlllI0OI , 0 , LONGINT (OOlIll0O0lll ), O1010l1OIOO1O )THEN
  308. S.WRITE (OOlIll0O0lll ^, O1010l1OIOO1O )ELSE PRINTERROR ('Error '+ STRW (XMSRESULT )+
  309. ' moving from XMS -- TXMSMemory.StreamWrite --', 0 );DEC (OIOO101OlII , O1010l1OIOO1O );INC (O10OIIlllI0OI ,
  310. O1010l1OIOO1O );END ;FREEMEM (OOlIll0O0lll , O1lO01OlI1lO );IF ODD (ASIZE )THEN BEGIN OIO1 := SAVEBYTE (O10OIIlllI0OI );
  311. S.WRITE (OIO1 , 1 )END ;END ;PROCEDURE TXMSMEMORY.MOVEFROM (CONST SOURCE;POS,ASIZE:LONGINT);
  312. VAR {$IFDEF Debug}OOIIO1l11O10:TXMSHANDLEINFO;{$ENDIF}OIO1:BYTE;BEGIN {$IFDEF Debug}ASSERT (POS + ASIZE <= SIZE ,
  313. 'Move after max memory size.');ASSERT (ASIZE >= 0 , 'Size is negative.');{$ENDIF}IF ODD (ASIZE )THEN OIO1 := SAVEBYTE
  314. (ASIZE );XMS_MOVE_EMB (0 , LONGINT (@ SOURCE ), HANDLE , POS , O100llIO11OlO (ASIZE ));IF ODD (ASIZE )THEN RESTOREBYTE
  315. (ASIZE , OIO1 );END ;PROCEDURE TXMSMEMORY.MOVETO (POS,ASIZE:LONGINT;VAR DEST);VAR OIO1:BYTE;BEGIN IF ODD (ASIZE )THEN
  316. OIO1 := Ol1I1l1ll (DEST )[ ASIZE ] ;XMS_MOVE_EMB (HANDLE , POS , 0 , LONGINT (@ DEST ), O100llIO11OlO (ASIZE ));IF ODD
  317. (ASIZE )THEN Ol1I1l1ll (DEST )[ ASIZE ] := OIO1 ;END ;PROCEDURE TXMSMEMORY.RECDELETE (ITEM:LONGINT);BEGIN XMS_MOVE_EMB
  318. (HANDLE , (ITEM + 1 )* RECSIZE , HANDLE , ITEM * RECSIZE , SIZE - ((ITEM - 1 )* RECSIZE ));DEC (TOTALRECORDS );END ;
  319. FUNCTION TXMSMEMORY.SAVEBYTE (POS:LONGINT):BYTE ;VAR OOII:ARRAY [ 0 .. 1 ]  OF BYTE;BEGIN XMS_MOVE_EMB (HANDLE , POS - 1
  320. , 0 , LONGINT (@ OOII ), 2 );SAVEBYTE := OOII [ 1 ] ;END ;PROCEDURE TXMSMEMORY.RESTOREBYTE (POS:LONGINT;B:BYTE);
  321. VAR OOII:ARRAY [ 0 .. 1 ]  OF BYTE;BEGIN XMS_MOVE_EMB (HANDLE , POS - 1 , 0 , LONGINT (@ OOII ), 2 );OOII [ 1 ] := B ;
  322. XMS_MOVE_EMB (0 , LONGINT (@ OOII ), HANDLE , POS - 1 , 2 );END ;{$ENDIF}CONSTRUCTOR TCONVMAX64MEMORY.INIT
  323. (ASIZE:LONGINT;ARECSIZE:WORD;VAR RESULT:BOOLEAN);BEGIN INHERITED INIT;SIZE := ASIZE ;RECSIZE := ARECSIZE ;RESULT :=
  324. MAXAVAIL >= SIZE ;IF RESULT THEN GETMEM (MEM , SIZE )ELSE FREE ;END ;DESTRUCTOR TCONVMAX64MEMORY.DONE ;BEGIN IF MEM <>
  325. NIL THEN FREEMEM (MEM , SIZE );INHERITED DONE;END ;PROCEDURE TCONVMAX64MEMORY.BLOCKREAD (VAR F:FILE ;BLOCKSIZE:LONGINT);
  326. BEGIN {$IFDEF Debug}ASSERT (ISFILEOPEN (F )AND (BLOCKSIZE <= SIZE ), '');{$ENDIF}SYSTEM.BLOCKREAD (F , MEM ^, BLOCKSIZE
  327. );END ;PROCEDURE TCONVMAX64MEMORY.BLOCKWRITE (VAR F:FILE ;BLOCKSIZE:LONGINT);BEGIN {$IFDEF Debug}ASSERT (ISFILEOPEN (F
  328. )AND (BLOCKSIZE <= SIZE ), '');{$ENDIF}SYSTEM.BLOCKWRITE (F , MEM ^, BLOCKSIZE );END ;
  329. PROCEDURE TCONVMAX64MEMORY.STREAMREAD (VAR S:TSTREAM;APOS,ASIZE:LONGINT);BEGIN S.READ (MEM ^[ APOS ] , ASIZE );END ;
  330. PROCEDURE TCONVMAX64MEMORY.STREAMWRITE (VAR S:TSTREAM;APOS,ASIZE:LONGINT);BEGIN S.WRITE (MEM ^[ APOS ] , ASIZE );END ;
  331. PROCEDURE TCONVMAX64MEMORY.DELETE (APOS,ASIZE:LONGINT);BEGIN MOVEFROM (MEM ^[ APOS + ASIZE ] , APOS , SIZE - (APOS +
  332. ASIZE ));END ;PROCEDURE TCONVMAX64MEMORY.MOVEFROM (CONST SOURCE;POS,ASIZE:LONGINT);BEGIN {$IFDEF DEBUG}ASSERT (POS +
  333. ASIZE <= SIZE , 'Move after max memory size.');ASSERT (ASIZE >= 0 , 'Size is negative.');{$ENDIF}MOVE (SOURCE , MEM ^[
  334. POS ] , ASIZE );END ;PROCEDURE TCONVMAX64MEMORY.MOVETO (POS,ASIZE:LONGINT;VAR DEST);BEGIN MOVE (MEM ^[ POS ] , DEST ,
  335. ASIZE );END ;PROCEDURE TCONVMAX64MEMORY.RECDELETE (ITEM:LONGINT);BEGIN DEC (TOTALRECORDS );MOVE (PBYTEARRAY (MEM )^[
  336. (ITEM + 1 )* RECSIZE ] , PBYTEARRAY (MEM )^[ (ITEM )* RECSIZE ] , (TOTALRECORDS - ITEM )* RECSIZE );END ;
  337. PROCEDURE TCONVMAX64MEMORY.RECINSERT (CONST SOURCE;ITEM:LONGINT);BEGIN MOVE (PBYTEARRAY (MEM )^[ (ITEM )* RECSIZE ] ,
  338. PBYTEARRAY (MEM )^[ (ITEM + 1 )* RECSIZE ] , (TOTALRECORDS - ITEM )* RECSIZE );MOVE (SOURCE , PBYTEARRAY (MEM )^[ ITEM *
  339. RECSIZE ] , RECSIZE );INC (TOTALRECORDS );END ;CONSTRUCTOR TCONVHUGEMEMORY.INIT (ASIZE:LONGINT;ARECSIZE:WORD;
  340. VAR RESULT:BOOLEAN);VAR O1011100OO11O:LONGINT;BEGIN INHERITED INIT;SIZE := ASIZE ;RECSIZE := ARECSIZE ;RESULT := MEMAVAIL
  341. >= SIZE ;IF RESULT THEN BEGIN O1011100OO11O := 0 ;WHILE O1011100OO11O < SIZE  DO BEGIN IF SIZE - O1011100OO11O >
  342. MAXCONVENTIONALMEMORYBLOCK THEN BEGIN IF MAXAVAIL >= MAXCONVENTIONALMEMORYBLOCK THEN MEMSIZES [ TOTALMEMPTRS ] :=
  343. MAXCONVENTIONALMEMORYBLOCK ELSE MEMSIZES [ TOTALMEMPTRS ] := MAXAVAIL ;END ELSE MEMSIZES [ TOTALMEMPTRS ] := SIZE -
  344. O1011100OO11O ;GETMEM (MEMPTRS [ TOTALMEMPTRS ] , MEMSIZES [ TOTALMEMPTRS ] );INC (O1011100OO11O , MEMSIZES [
  345. TOTALMEMPTRS ] );INC (TOTALMEMPTRS );END ;END ELSE FREE ;END ;DESTRUCTOR TCONVHUGEMEMORY.DONE ;VAR OIlO:INTEGER;
  346. BEGIN FOR OIlO := 0 TO TOTALMEMPTRS - 1  DO FREEMEM (MEMPTRS [ OIlO ] , MEMSIZES [ OIlO ] );INHERITED DONE;END ;
  347. PROCEDURE TCONVHUGEMEMORY.BLOCKREAD (VAR F:FILE ;BLOCKSIZE:LONGINT);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
  348. O10OII0IIOI1O:WORD;BEGIN {$IFDEF Debug}ASSERT (ISFILEOPEN (F ), '');{$ENDIF}OII0OO0lllO := CALCULATEINDEX (0 ,
  349. OI10I0OlO1lO );IF OI10I0OlO1lO + BLOCKSIZE >= MEMSIZES [ OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO
  350. ] - OI10I0OlO1lO ;WHILE BLOCKSIZE > 0  DO BEGIN SYSTEM.BLOCKREAD (F , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[
  351. OI10I0OlO1lO ] , O10OII0IIOI1O );DEC (BLOCKSIZE , O10OII0IIOI1O );INC (OII0OO0lllO );OI10I0OlO1lO := 0 ;IF BLOCKSIZE >
  352. MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE O10OII0IIOI1O := BLOCKSIZE ;END ;END ELSE
  353. SYSTEM.BLOCKREAD (F , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , BLOCKSIZE );END ;
  354. PROCEDURE TCONVHUGEMEMORY.BLOCKWRITE (VAR F:FILE ;BLOCKSIZE:LONGINT);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
  355. O10OII0IIOI1O:WORD;BEGIN {$IFDEF Debug}ASSERT (ISFILEOPEN (F ), '');{$ENDIF}OII0OO0lllO := CALCULATEINDEX (0 ,
  356. OI10I0OlO1lO );IF OI10I0OlO1lO + BLOCKSIZE >= MEMSIZES [ OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO
  357. ] - OI10I0OlO1lO ;WHILE BLOCKSIZE > 0  DO BEGIN SYSTEM.BLOCKWRITE (F , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[
  358. OI10I0OlO1lO ] , O10OII0IIOI1O );DEC (BLOCKSIZE , O10OII0IIOI1O );INC (OII0OO0lllO );OI10I0OlO1lO := 0 ;IF BLOCKSIZE >
  359. MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE O10OII0IIOI1O := BLOCKSIZE ;END ;END ELSE
  360. SYSTEM.BLOCKWRITE (F , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , BLOCKSIZE );END ;
  361. PROCEDURE TCONVHUGEMEMORY.STREAMREAD (VAR S:TSTREAM;APOS,ASIZE:LONGINT);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
  362. O10OII0IIOI1O:WORD;BEGIN OII0OO0lllO := CALCULATEINDEX (APOS , OI10I0OlO1lO );IF OI10I0OlO1lO + ASIZE >= MEMSIZES [
  363. OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] - OI10I0OlO1lO ;WHILE ASIZE > 0  DO BEGIN S.READ
  364. (PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , O10OII0IIOI1O );DEC (ASIZE , O10OII0IIOI1O );INC (OII0OO0lllO
  365. );OI10I0OlO1lO := 0 ;IF ASIZE > MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE
  366. O10OII0IIOI1O := ASIZE ;END ;END ELSE S.READ (PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , ASIZE );END ;
  367. PROCEDURE TCONVHUGEMEMORY.STREAMWRITE (VAR S:TSTREAM;APOS,ASIZE:LONGINT);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
  368. O10OII0IIOI1O:WORD;BEGIN OII0OO0lllO := CALCULATEINDEX (APOS , OI10I0OlO1lO );IF OI10I0OlO1lO + ASIZE >= MEMSIZES [
  369. OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] - OI10I0OlO1lO ;WHILE ASIZE > 0  DO BEGIN S.WRITE
  370. (PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , O10OII0IIOI1O );DEC (ASIZE , O10OII0IIOI1O );INC (OII0OO0lllO
  371. );OI10I0OlO1lO := 0 ;IF ASIZE > MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE
  372. O10OII0IIOI1O := ASIZE ;END ;END ELSE S.WRITE (PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , ASIZE );END ;
  373. PROCEDURE TCONVHUGEMEMORY.DELETE (APOS,ASIZE:LONGINT);PROCEDURE O1l1lI0O01l1 (VAR OII0OO0lllO:INTEGER;
  374. VAR OI10I0OlO1lO:WORD;O1lIIOl11IlO:WORD);BEGIN {$IFDEF Debug}ASSERT (OI10I0OlO1lO + O1lIIOl11IlO <= MEMSIZES [
  375. OII0OO0lllO ] , '');{$ENDIF}IF OI10I0OlO1lO + O1lIIOl11IlO =MEMSIZES [ OII0OO0lllO ] THEN BEGIN INC (OII0OO0lllO );
  376. OI10I0OlO1lO := 0 ;END ELSE BEGIN INC (OI10I0OlO1lO , O1lIIOl11IlO );END ;END ;VAR O1Ol1ll1OI0O,OIIOO0OllO:INTEGER;
  377. O1l01ll1l0OO,OI0lO1lIO011:WORD;O10OII0IIOI1O:WORD;OOlOIlO1lll0:LONGINT;BEGIN IF ASIZE =0 THEN EXIT ;O1Ol1ll1OI0O :=
  378. CALCULATEINDEX (APOS + ASIZE , O1l01ll1l0OO );OIIOO0OllO := CALCULATEINDEX (APOS , OI0lO1lIO011 );OOlOIlO1lll0 := SIZE -
  379. (APOS + ASIZE );WHILE OOlOIlO1lll0 > 0  DO BEGIN O10OII0IIOI1O := MIN (MEMSIZES [ O1Ol1ll1OI0O ] - O1l01ll1l0OO ,
  380. MEMSIZES [ OIIOO0OllO ] - OI0lO1lIO011 );MOVE (PBYTEARRAY (MEMPTRS [ O1Ol1ll1OI0O ] )^[ O1l01ll1l0OO ] , PBYTEARRAY
  381. (MEMPTRS [ OIIOO0OllO ] )^[ OI0lO1lIO011 ] , O10OII0IIOI1O );O1l1lI0O01l1 (O1Ol1ll1OI0O , O1l01ll1l0OO , O10OII0IIOI1O );
  382. O1l1lI0O01l1 (OIIOO0OllO , OI0lO1lIO011 , O10OII0IIOI1O );DEC (OOlOIlO1lll0 , O10OII0IIOI1O );END ;END ;
  383. PROCEDURE TCONVHUGEMEMORY.MOVEFROM (CONST SOURCE;POS,ASIZE:LONGINT);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
  384. O10OII0IIOI1O:WORD;Olll0IOI11:WORD;BEGIN {$IFDEF DEBUG}ASSERT (POS + ASIZE <= SIZE , 'Move after max memory size.');
  385. ASSERT (ASIZE >= 0 , 'Size is negative.');{$ENDIF}OII0OO0lllO := CALCULATEINDEX (POS , OI10I0OlO1lO );IF OI10I0OlO1lO +
  386. ASIZE >= MEMSIZES [ OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] - OI10I0OlO1lO ;Olll0IOI11 := 0 ;
  387. WHILE ASIZE > 0  DO BEGIN MOVE (Ol1I1l1ll (SOURCE )[ Olll0IOI11 ] , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO
  388. ] , O10OII0IIOI1O );DEC (ASIZE , O10OII0IIOI1O );INC (OII0OO0lllO );OI10I0OlO1lO := 0 ;INC (Olll0IOI11 , O10OII0IIOI1O );
  389. IF ASIZE > MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE O10OII0IIOI1O := ASIZE ;END ;
  390. END ELSE MOVE (SOURCE , PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , ASIZE );END ;
  391. PROCEDURE TCONVHUGEMEMORY.MOVETO (POS,ASIZE:LONGINT;VAR DEST);VAR OII0OO0lllO:INTEGER;OI10I0OlO1lO:WORD;
  392. O10OII0IIOI1O:WORD;O101l00lOI0IO:WORD;BEGIN OII0OO0lllO := CALCULATEINDEX (POS , OI10I0OlO1lO );IF OI10I0OlO1lO + ASIZE
  393. >= MEMSIZES [ OII0OO0lllO ] THEN BEGIN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] - OI10I0OlO1lO ;O101l00lOI0IO := 0 ;
  394. WHILE ASIZE > 0  DO BEGIN MOVE (PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , Ol1I1l1ll (DEST )[ O101l00lOI0IO
  395. ] , O10OII0IIOI1O );DEC (ASIZE , O10OII0IIOI1O );INC (OII0OO0lllO );OI10I0OlO1lO := 0 ;INC (O101l00lOI0IO , O10OII0IIOI1O
  396. );IF ASIZE > MEMSIZES [ OII0OO0lllO ] THEN O10OII0IIOI1O := MEMSIZES [ OII0OO0lllO ] ELSE O10OII0IIOI1O := ASIZE ;END ;
  397. END ELSE MOVE (PBYTEARRAY (MEMPTRS [ OII0OO0lllO ] )^[ OI10I0OlO1lO ] , DEST , ASIZE );END ;
  398. PROCEDURE TCONVHUGEMEMORY.RECDELETE (ITEM:LONGINT);BEGIN ABSTRACT ;END ;PROCEDURE TCONVHUGEMEMORY.RECINSERT
  399. (CONST SOURCE;ITEM:LONGINT);BEGIN ABSTRACT ;END ;FUNCTION TCONVHUGEMEMORY.CALCULATEINDEX (POS:LONGINT;
  400. VAR RELATIVEPOS:WORD):WORD ;VAR OII0OO0lllO:WORD;OIOO:LONGINT;BEGIN OII0OO0lllO := 0 ;WHILE POS >= MEMSIZES [ OII0OO0lllO
  401. ]  DO BEGIN DEC (POS , MEMSIZES [ OII0OO0lllO ] );INC (OII0OO0lllO );END ;RELATIVEPOS := POS ;CALCULATEINDEX :=
  402. OII0OO0lllO ;END ;PROCEDURE INITOBJMEMORY ;BEGIN {$IFDEF MsDos}EMS_INIT ;{$IFDEF Debug}IF EMSINSTALLED THEN LOGERROR
  403. ('EMS free pages: '+ STRW (EMS_NUMBER_OF_PAGES ));{$ENDIF}XMS_INIT ;{$ENDIF}END ;FUNCTION GETOBJMEMORY (SIZE:LONGINT;
  404. RECSIZE,AFLAGS:WORD):POBJMEMORY ;VAR OIO11IOOlO0:BOOLEAN;BEGIN {$IFNDEF ForceXMS}IF (AFLAGS AND MEMFCONVENTIONALFIRST <>
  405. 0 )OR (SIZE <= CONVMEMLIMIT )THEN BEGIN IF SIZE <= MAXCONVENTIONALMEMORYBLOCK THEN GETOBJMEMORY := NEW (PCONVMAX64MEMORY
  406. , INIT (SIZE , RECSIZE , OIO11IOOlO0 ))ELSE GETOBJMEMORY := NEW (PCONVHUGEMEMORY , INIT (SIZE , RECSIZE , OIO11IOOlO0 ));
  407. IF OIO11IOOlO0 THEN EXIT ;END ;{$ENDIF}{$IFDEF MsDos}{$IFNDEF ForceXMS}IF (AFLAGS AND MEMFEMS <> 0 )AND EMSINSTALLED THEN
  408. BEGIN GETOBJMEMORY := NEW (PEMSMEMORY , INIT (SIZE , RECSIZE , OIO11IOOlO0 ));IF OIO11IOOlO0 THEN EXIT ;END ;{$ENDIF}IF
  409. (AFLAGS AND MEMFXMS <> 0 )AND XMSINSTALLED THEN BEGIN GETOBJMEMORY := NEW (PXMSMEMORY , INIT (SIZE , RECSIZE ,
  410. OIO11IOOlO0 ));IF OIO11IOOlO0 THEN EXIT ;END ;{$ENDIF}IF (AFLAGS AND MEMFCONVENTIONAL <> 0 )THEN BEGIN IF SIZE <=
  411. MAXCONVENTIONALMEMORYBLOCK THEN GETOBJMEMORY := NEW (PCONVMAX64MEMORY , INIT (SIZE , RECSIZE , OIO11IOOlO0 ))ELSE
  412. GETOBJMEMORY := NEW (PCONVHUGEMEMORY , INIT (SIZE , RECSIZE , OIO11IOOlO0 ));IF OIO11IOOlO0 THEN EXIT ;END ;IF (AFLAGS
  413. AND MEMFDISK <> 0 )THEN BEGIN END ;LOGERROR ('No memory allocated. Request size: '+ STRL (SIZE ));GETOBJMEMORY := NIL ;
  414. END ;END .
  415.