home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 17 / bigarray.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-12-29  |  3.6 KB  |  117 lines

  1. (*--------------------------------------------------------*)
  2. (*                      BIGARRAY.PAS                      *)
  3. (*  Verwaltung großer Arrays im Extended/Expanded Memory  *)
  4. (*           Turbo Pascal Versionen 4.0 und 5.x           *)
  5. (*    Copyright (c) 1989  Karsten Gieselmann & TOOLBOX    *)
  6. (*--------------------------------------------------------*)
  7.  
  8. {$R+,S+}    (* Keine Bereichs- oder Stacküberlauf-Prüfung *)
  9.  
  10. UNIT BigArray;
  11.  
  12. {$DEFINE UseEMS} (* soll EMS als Speicher benutzt werden? *)
  13.  
  14. INTERFACE
  15.  
  16. USES
  17.   {$IFDEF UseEMS} EMS {$ELSE} XMS {$ENDIF};
  18.  
  19. TYPE VArray = RECORD                (* Virtueller Feldtyp *)
  20.                 Handle : WORD;
  21.                 Rows, Cols, Size : WORD;
  22.               END;
  23.  
  24. FUNCTION  MakeArray(VAR A : VArray; Rows, Cols,
  25.                         ElementSize : WORD) : BOOLEAN;
  26. PROCEDURE DisposeArray(VAR A : VArray);
  27. PROCEDURE PutElement(VAR A : VArray; Row, Col : WORD;
  28.                      VAR Value);
  29. PROCEDURE GetElement(VAR A : VArray; Row, Col : WORD;
  30.                      VAR Value);
  31.  
  32. (* ------------------------------------------------------ *)
  33.  
  34. IMPLEMENTATION
  35.  
  36. VAR
  37.   BlockSize : WORD;   (* Größe eines Speicherblocks/seite *)
  38.  
  39. FUNCTION MakeArray(VAR A : VArray; Rows, Cols,
  40.                        ElementSize : WORD) : BOOLEAN;
  41.   (* legt ein Array mit "Rows" Zeilen und "Cols" Spalten
  42.      im erweiterten Speicher an; die Größe der Elemente
  43.      muß gerade sein! Die Funktion liefert den Wert FALSE,
  44.      falls nicht genügend Speicher zur Verfügung steht.   *)
  45. VAR
  46.   ArraySize : LONGINT;
  47. BEGIN
  48.   MakeArray := FALSE;
  49.   IF Odd(ElementSize) THEN EXIT; (* Größe muß gerade sein *)
  50.   A.Rows := Rows;
  51.   A.Cols := Cols;
  52.   A.Size := ElementSize;
  53.   ArraySize := LONGINT(A.Size) * Rows * Cols;
  54.   ArraySize := ArraySize DIV BlockSize;
  55.   IF ArraySize MOD BlockSize <> 0 THEN BEGIN
  56.     Inc(ArraySize);
  57.   END;
  58.   A.Handle := AllocateMemory(WORD(ArraySize));
  59.   MakeArray := (Result = Ok);
  60. END;
  61.  
  62. PROCEDURE DisposeArray(VAR A : VArray);
  63.   (* gibt den von einem Array belegten erweiterten Spei-
  64.      cher wieder frei.                                    *)
  65. BEGIN
  66.   DeallocateMemory(A.Handle);
  67. END;
  68.  
  69. PROCEDURE MoveElement(VAR A : VArray; Row, Col : WORD;
  70.                       VAR Value; GetValue : BOOLEAN);
  71.   (* zentrale Routine zum Transfer zwischen konventionel-
  72.      lem und erweitertem Speicher. *)
  73. VAR
  74.   Count : WORD;
  75.   Offset : LONGINT;
  76.   Cell, Matrix : Descriptor;
  77. BEGIN
  78.   Cell.RAM := TRUE;              (* Deskriptoren besetzen *)
  79.   Cell.Address := @Value;
  80.   Matrix.RAM := FALSE;
  81.   Matrix.Handle := A.Handle;
  82.   Offset := LONGINT(A.Size) * ((Row-1)*A.Cols+Col-1);
  83.   {$IFDEF UseEMS}
  84.     Matrix.LogicalPage := Offset DIV BlockSize;
  85.     Matrix.Offset := Offset MOD BlockSize;
  86.     Count := A.Size;                      (* Anzahl Bytes *)
  87.   {$ELSE}
  88.     Matrix.Offset := Offset;
  89.     Count := A.Size DIV 2;                (* Anzahl Worte *)
  90.   {$ENDIF};
  91.   IF GetValue THEN BEGIN
  92.     MoveMemory(Matrix, Cell, Count);
  93.   END ELSE BEGIN
  94.     MoveMemory(Cell, Matrix, Count);
  95.   END;
  96. END;
  97.  
  98. PROCEDURE PutElement(VAR A : VArray; Row, Col : WORD;
  99.                      VAR Value);
  100.   (* besetzt das Element A[Row,Col] mit dem Wert "Value". *)
  101. BEGIN
  102.   MoveElement(A, Row, Col, Value, FALSE);
  103. END;
  104.  
  105. PROCEDURE GetElement(VAR A : VArray; Row, Col : WORD;
  106.                      VAR Value);
  107.   (* holt den Wert des Elements A[Row,Col] nach "Value".  *)
  108. BEGIN
  109.   MoveElement(A, Row, Col, Value, TRUE);
  110. END;
  111.  
  112. BEGIN
  113.   BlockSize := {$IFDEF UseEMS} 16384 {$ELSE} 1024 {$ENDIF};
  114. END.
  115. (* ------------------------------------------------------ *)
  116. (*                 Ende von BIGARRAY.PAS                  *)
  117.