home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / vgakit / gif / source / parray.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-09-25  |  5.8 KB  |  245 lines

  1.  
  2. UNIT PARRAY;
  3. {$F+}
  4. {
  5.   DIESE UNIT DIENT DAZU, EIN GROßES 1- DIMENSIONALES ARRAY ZU ERMÖGLICHEN,
  6.   DAS ZUERST AUF DEM HEAP ANGELEGT WIRD UND INS EMS ÜBERLÄUFT.
  7.   IM GEGENSATZ ZU DEN GROßEN ARRAYS VON TURBO PROFESSIONAL WIRD EIN
  8.   WESENTLICH SCHNELLERER ZUGRIFF ERZIELT, WEIL NICHT ARRAYINHALTE MIT DEM
  9.   HAUPTPROGRAMM AUSGETAUSCHT WERDEN SONDERN POINTER.
  10. }
  11.  
  12. INTERFACE
  13.  
  14.  
  15. USES  TPEMS,TPSTRING;
  16.  
  17.  
  18. TYPE  BYTEARR    = ARRAY[0..1] OF BYTE;
  19.       BYTEARRPTR = ^BYTEARR;
  20.       PTRARRAY   = ARRAY[0..1] OF BYTEARRPTR;
  21.  
  22.  
  23. FUNCTION  PARRINIT(ROWS,SIZE:WORD;FREEHEAP:LONGINT):WORD;
  24. PROCEDURE PARRNEW(VAR P:PTRARRAY;ROW:WORD);
  25. PROCEDURE PARRPTR(VAR P:PTRARRAY;ROW:WORD);
  26. PROCEDURE PARRPTR2(VAR P:PTRARRAY;ROW:WORD);
  27. PROCEDURE PARRDISPOSE(VAR P:PTRARRAY);
  28. PROCEDURE PASWAPOUT(VAR P:PTRARRAY;NAME:STRING);
  29. PROCEDURE PASWAPIN(VAR P:PTRARRAY;NAME:STRING;LOESCHE:BOOLEAN);
  30. PROCEDURE PARRZEIGEDATEN;
  31.  
  32.  
  33. IMPLEMENTATION
  34.  
  35.  
  36. TYPE  SOF = RECORD O,S : WORD; END;
  37.  
  38.  
  39. CONST EMSINUSE : BOOLEAN = FALSE;
  40.  
  41.  
  42. VAR   INEMS    : WORD; { ERSTES ARRAY- ELEMENT IM EMS }
  43.       EP1,EP2  : WORD;
  44.       ES1,ES2  : WORD;
  45.       USEEMS   : BOOLEAN;
  46.       EMSH     : WORD;    { EMS HANDLE }
  47.       EMSROWS  : WORD;
  48.       ROWSIZE  : WORD;
  49.       RR,AR    : WORD;
  50.  
  51.       EXITSAVE : POINTER;
  52.  
  53.  
  54. FUNCTION  PARRINIT(ROWS,SIZE:WORD;FREEHEAP:LONGINT):WORD;
  55. VAR   AVPAGES  : WORD;
  56.       EMSP     : POINTER; { PAGEFRAMEPOINTER }
  57.       L        : LONGINT;
  58. BEGIN
  59.   RR      := ROWS;
  60.   USEEMS  := FALSE;
  61.   EMSROWS := 0;
  62.   EP1     := $FFFF;
  63.   EP2     := $FFFF;
  64.   ROWSIZE := SIZE;
  65.   IF (MAXAVAIL - FREEHEAP) > LONGINT(LONGINT(SUCC(ROWS)) * LONGINT(SIZE))
  66.     THEN BEGIN
  67. { ALLES PASST AUF DEN HEAP }
  68.     INEMS := ROWS;
  69.     PARRINIT := ROWS;
  70.     AR       := ROWS;
  71.   END ELSE BEGIN
  72. { EIN TEIL MUß INS EMS }
  73.     INEMS := (MAXAVAIL - FREEHEAP) DIV SIZE;
  74.     IF EMSINSTALLED THEN BEGIN
  75.       USEEMS     := TRUE;
  76.       EMSP       := EMSPAGEFRAMEPTR;
  77.       ES1        := SOF(EMSP).S;
  78.       ES2        := ES1 + $800;
  79.       AVPAGES    := EMSPAGESAVAIL;
  80.       EMSH       := ALLOCATEEMSPAGES(AVPAGES);
  81.       EMSINUSE   := TRUE;
  82.       IF SAVEEMSCONTEXT(EMSH) THEN {};
  83.       L := LONGINT(AVPAGES) SHL 14;
  84.       IF L > (LONGINT(ROWS - INEMS) * LONGINT(SIZE)) THEN BEGIN
  85.         PARRINIT := ROWS;
  86.         AR       := ROWS;
  87.         EMSROWS  := ROWS - PRED(INEMS);
  88.       END ELSE BEGIN
  89.         EMSROWS  := L DIV SIZE;
  90.         PARRINIT := INEMS + EMSROWS;
  91.         AR       := INEMS + EMSROWS;
  92.       END;
  93.     END ELSE BEGIN
  94. { KEIN EMS VORHANDEN }
  95.       PARRINIT := PRED(INEMS);
  96.     END;
  97.   END;
  98. END; { PARRINIT }
  99.  
  100.  
  101. PROCEDURE PARRNEW(VAR P:PTRARRAY;ROW:WORD);
  102. VAR   LP  : WORD;
  103.       AA  : LONGINT;
  104. BEGIN
  105.   IF ROW < INEMS THEN BEGIN
  106. { SPEICHER AUF DEM HEAP ALLOKIEREN }
  107.     GETMEM(P[ROW],ROWSIZE);
  108.   END ELSE BEGIN
  109. { SPEICHER IM EMS ALLOKIEREN }
  110.     AA := (LONGINT(ROW - INEMS) * LONGINT(ROWSIZE));
  111.     LP := AA SHR 14;
  112.     IF EP1 <> LP THEN BEGIN
  113.       EP1 := LP;
  114.       IF MAPEMSPAGE(EMSH,EP1,0) THEN {};
  115.       IF MAPEMSPAGE(EMSH,SUCC(EP1),1) THEN {};
  116.     END;
  117.     P[ROW] := PTR(ES1,AA AND $3FFF);
  118.   END;
  119. END; { PARRNEW }
  120.  
  121.  
  122. PROCEDURE PARRPTR(VAR P:PTRARRAY;ROW:WORD);
  123. VAR   LP  : WORD;
  124. BEGIN
  125.   IF ROW >= INEMS THEN BEGIN
  126. { POINTER EMS ERMITTELN }
  127.     LP := (LONGINT(ROW - INEMS) * LONGINT(ROWSIZE)) SHR 14;
  128.     IF EP1 <> LP THEN BEGIN
  129.       EP1 := LP;
  130.       IF MAPEMSPAGE(EMSH,EP1,0) THEN {};
  131.       IF MAPEMSPAGE(EMSH,SUCC(EP1),1) THEN {};
  132.     END;
  133.     SOF(P[ROW]).S := ES1;
  134.   END;
  135. END; { PARRPTR }
  136.  
  137.  
  138. PROCEDURE PARRPTR2(VAR P:PTRARRAY;ROW:WORD);
  139. VAR   LP  : WORD;
  140. BEGIN
  141.   IF ROW >= INEMS THEN BEGIN
  142. { POINTER EMS ERMITTELN }
  143.     LP := (LONGINT(ROW - INEMS) * LONGINT(ROWSIZE)) SHR 14;
  144.     IF EP2 <> LP THEN BEGIN
  145.       EP2 := LP;
  146.       IF MAPEMSPAGE(EMSH,EP2,2) THEN {};
  147.       IF MAPEMSPAGE(EMSH,SUCC(EP2),3) THEN {};
  148.     END;
  149.     SOF(P[ROW]).S := ES2;
  150.   END;
  151. END; { PARRPTR2 }
  152.  
  153.  
  154. PROCEDURE PARRDISPOSE(VAR P:PTRARRAY);
  155. VAR   I  : WORD;
  156. BEGIN
  157.   FOR I := 0 TO PRED(INEMS) DO BEGIN
  158.     IF P[I] <> NIL THEN FREEMEM(P[I],ROWSIZE);
  159.     P[I] := NIL;
  160.   END;
  161.   IF USEEMS THEN BEGIN
  162.     IF RESTOREEMSCONTEXT(EMSH) THEN {};
  163.     IF DEALLOCATEEMSHANDLE(EMSH) THEN {};
  164.     EMSINUSE := FALSE;
  165.   END;
  166. END; { PARRDISPOSE }
  167.  
  168.  
  169. PROCEDURE PASWAPOUT(VAR P:PTRARRAY;NAME:STRING);
  170. VAR   I  : WORD;
  171.       F  : FILE;
  172. BEGIN
  173. {$I-}
  174.   ASSIGN(F,NAME);
  175.   REWRITE(F,1);
  176.   IF IORESULT = 0 THEN BEGIN
  177.     FOR I := 0 TO PRED(INEMS) DO BEGIN
  178.       IF P[I] <> NIL THEN BEGIN
  179.         BLOCKWRITE(F,P[I]^,ROWSIZE);
  180.         FREEMEM(P[I],ROWSIZE);
  181.         P[I] := NIL;
  182.       END;
  183.     END; { NEXT I }
  184.     CLOSE(F);
  185.   END;
  186. {$I+}
  187. END; { PASWAPOUT }
  188.  
  189.  
  190. PROCEDURE PASWAPIN(VAR P:PTRARRAY;NAME:STRING;LOESCHE:BOOLEAN);
  191. VAR   I,W  : WORD;
  192.       F    : FILE;
  193. BEGIN
  194. {$I-}
  195.   ASSIGN(F,NAME);
  196.   RESET(F,1);
  197.   IF IORESULT = 0 THEN BEGIN
  198.     FOR I := 0 TO PRED(INEMS) DO BEGIN
  199.       IF NOT EOF(F) THEN BEGIN
  200.         GETMEM(P[I],ROWSIZE);
  201.         BLOCKREAD(F,P[I]^,ROWSIZE,W);
  202.       END;
  203.     END; { NEXT I }
  204.     CLOSE(F);
  205.     IF LOESCHE THEN ERASE(F);
  206.   END;
  207. {$I+}
  208. END; { PASWAPIN }
  209.  
  210.  
  211. PROCEDURE PARRZEIGEDATEN;
  212. BEGIN
  213.   WRITELN;
  214.   WRITELN(ROWSIZE:10,LONGINT(ROWSIZE) * LONGINT(INEMS):10,MAXAVAIL:10);
  215.   WRITELN(RR:6,AR:6,INEMS:6,EMSROWS:6,USEEMS:6,EMSH:6);
  216.   WRITELN(HEXW(EP1),'  ',HEXW(EP2),'  ',HEXW(ES1),'  ',HEXW(ES2));
  217. (*
  218. VAR   INEMS    : WORD; { ERSTES ARRAY- ELEMENT IM EMS }
  219.       EP1,EP2  : WORD;
  220.       ES1,ES2  : WORD;
  221.       USEEMS   : BOOLEAN;
  222.       EMSH     : WORD;    { EMS HANDLE }
  223.       EMSROWS  : WORD;
  224.       ROWSIZE  : WORD;
  225. *)
  226. END;
  227.  
  228.  
  229. PROCEDURE NEWEXIT;
  230. BEGIN
  231.   IF EMSINUSE THEN BEGIN
  232.     IF RESTOREEMSCONTEXT(EMSH) THEN {};
  233.     IF DEALLOCATEEMSHANDLE(EMSH) THEN {};
  234.   END;
  235.   EXITPROC := EXITSAVE;
  236. END; { NEWEXIT }
  237.  
  238.  
  239. BEGIN
  240.   EXITSAVE := EXITPROC;
  241.   EXITPROC := @NEWEXIT;
  242. END.
  243.  
  244.  
  245.