home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / tiftool / parray.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-12-12  |  4.4 KB  |  177 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 PARRZEIGEDATEN;
  29.  
  30.  
  31. IMPLEMENTATION
  32.  
  33.  
  34. TYPE  SOF = RECORD O,S : WORD; END;
  35.  
  36. VAR   INEMS    : WORD; { ERSTES ARRAY- ELEMENT IM EMS }
  37.       EP1,EP2  : WORD;
  38.       ES1,ES2  : WORD;
  39.       USEEMS   : BOOLEAN;
  40.       EMSH     : WORD;    { EMS HANDLE }
  41.       EMSROWS  : WORD;
  42.       ROWSIZE  : WORD;
  43.       RR,AR    : WORD;
  44.  
  45.  
  46. FUNCTION  PARRINIT(ROWS,SIZE:WORD;FREEHEAP:LONGINT):WORD;
  47. VAR   AVPAGES  : WORD;
  48.       EMSP     : POINTER; { PAGEFRAMEPOINTER }
  49.       L        : LONGINT;
  50. BEGIN
  51.   RR      := ROWS;
  52.   USEEMS  := FALSE;
  53.   EMSROWS := 0;
  54.   EP1     := $FFFF;
  55.   EP2     := $FFFF;
  56.   ROWSIZE := SIZE;
  57.   IF (MAXAVAIL - FREEHEAP) > LONGINT(LONGINT(SUCC(ROWS)) * LONGINT(SIZE))
  58.     THEN BEGIN
  59. { ALLES PASST AUF DEN HEAP }
  60.     INEMS := ROWS;
  61.     PARRINIT := ROWS;
  62.     AR       := ROWS;
  63.   END ELSE BEGIN
  64. { EIN TEIL MUß INS EMS }
  65.     INEMS := (MAXAVAIL - FREEHEAP) DIV SIZE;
  66.     IF EMSINSTALLED THEN BEGIN
  67.       USEEMS  := TRUE;
  68.       EMSP    := EMSPAGEFRAMEPTR;
  69.       ES1     := SOF(EMSP).S;
  70.       ES2     := ES1 + $800;
  71.       AVPAGES := EMSPAGESAVAIL;
  72.       EMSH    := ALLOCATEEMSPAGES(AVPAGES);
  73.       IF SAVEEMSCONTEXT(EMSH) THEN {};
  74.       L := LONGINT(AVPAGES) SHL 14;
  75.       IF L > (LONGINT(ROWS - INEMS) * LONGINT(SIZE)) THEN BEGIN
  76.         PARRINIT := ROWS;
  77.         AR       := ROWS;
  78.         EMSROWS  := ROWS - PRED(INEMS);
  79.       END ELSE BEGIN
  80.         EMSROWS  := L DIV SIZE;
  81.         PARRINIT := INEMS + EMSROWS;
  82.         AR       := INEMS + EMSROWS;
  83.       END;
  84.     END ELSE BEGIN
  85. { KEIN EMS VORHANDEN }
  86.       PARRINIT := PRED(INEMS);
  87.     END;
  88.   END;
  89. END; { PARRINIT }
  90.  
  91.  
  92. PROCEDURE PARRNEW(VAR P:PTRARRAY;ROW:WORD);
  93. VAR   LP  : WORD;
  94.       AA  : LONGINT;
  95. BEGIN
  96.   IF ROW < INEMS THEN BEGIN
  97. { SPEICHER AUF DEM HEAP ALLOKIEREN }
  98.     GETMEM(P[ROW],ROWSIZE);
  99.   END ELSE BEGIN
  100. { SPEICHER IM EMS ALLOKIEREN }
  101.     AA := (LONGINT(ROW - INEMS) * LONGINT(ROWSIZE));
  102.     LP := AA SHR 14;
  103.     IF EP1 <> LP THEN BEGIN
  104.       EP1 := LP;
  105.       IF MAPEMSPAGE(EMSH,EP1,0) THEN {};
  106.       IF MAPEMSPAGE(EMSH,SUCC(EP1),1) THEN {};
  107.     END;
  108.     P[ROW] := PTR(ES1,AA AND $3FFF);
  109.   END;
  110. END; { PARRNEW }
  111.  
  112.  
  113. PROCEDURE PARRPTR(VAR P:PTRARRAY;ROW:WORD);
  114. VAR   LP  : WORD;
  115. BEGIN
  116.   IF ROW >= INEMS THEN BEGIN
  117. { POINTER EMS ERMITTELN }
  118.     LP := (LONGINT(ROW - INEMS) * LONGINT(ROWSIZE)) SHR 14;
  119.     IF EP1 <> LP THEN BEGIN
  120.       EP1 := LP;
  121.       IF MAPEMSPAGE(EMSH,EP1,0) THEN {};
  122.       IF MAPEMSPAGE(EMSH,SUCC(EP1),1) THEN {};
  123.     END;
  124.     SOF(P[ROW]).S := ES1;
  125.   END;
  126. END; { PARRPTR }
  127.  
  128.  
  129. PROCEDURE PARRPTR2(VAR P:PTRARRAY;ROW:WORD);
  130. VAR   LP  : WORD;
  131. BEGIN
  132.   IF ROW >= INEMS THEN BEGIN
  133. { POINTER EMS ERMITTELN }
  134.     LP := (LONGINT(ROW - INEMS) * LONGINT(ROWSIZE)) SHR 14;
  135.     IF EP2 <> LP THEN BEGIN
  136.       EP2 := LP;
  137.       IF MAPEMSPAGE(EMSH,EP2,2) THEN {};
  138.       IF MAPEMSPAGE(EMSH,SUCC(EP2),3) THEN {};
  139.     END;
  140.     SOF(P[ROW]).S := ES2;
  141.   END;
  142. END; { PARRPTR2 }
  143.  
  144.  
  145. PROCEDURE PARRDISPOSE(VAR P:PTRARRAY);
  146. VAR   I  : WORD;
  147. BEGIN
  148.   FOR I := 0 TO PRED(INEMS) DO FREEMEM(P[I],ROWSIZE);
  149.   IF USEEMS THEN BEGIN
  150.     IF RESTOREEMSCONTEXT(EMSH) THEN {};
  151.     IF DEALLOCATEEMSHANDLE(EMSH) THEN {};
  152.   END;
  153. END; { PARRDISPOSE }
  154.  
  155.  
  156. PROCEDURE PARRZEIGEDATEN;
  157. BEGIN
  158.   WRITELN;
  159.   WRITELN(ROWSIZE:10,LONGINT(ROWSIZE) * LONGINT(INEMS):10,MAXAVAIL:10);
  160.   WRITELN(RR:6,AR:6,INEMS:6,EMSROWS:6,USEEMS:6,EMSH:6);
  161.   WRITELN(HEXW(EP1),'  ',HEXW(EP2),'  ',HEXW(ES1),'  ',HEXW(ES2));
  162. (*
  163. VAR   INEMS    : WORD; { ERSTES ARRAY- ELEMENT IM EMS }
  164.       EP1,EP2  : WORD;
  165.       ES1,ES2  : WORD;
  166.       USEEMS   : BOOLEAN;
  167.       EMSH     : WORD;    { EMS HANDLE }
  168.       EMSROWS  : WORD;
  169.       ROWSIZE  : WORD;
  170. *)
  171. END;
  172.  
  173.  
  174. END.
  175.  
  176.  
  177.