--- a/LibDBlas.mod
+++ b/LibDBlas.mod
@@ -35,6 +35,7 @@
   (* 20.06.18, MRi: Erstellen der erstern uebersetzbaren Version von        *)
   (*                dznrm2,zdotc,zscal,zaxpy,zswap,zdrot                    *)
   (* 21.06.18, MRi: Korrekturen in dznrm2 und zdotc                         *)
+  (* 11.09.18, MRi: Hinzufuegen von zcopy und zgemv (definition)            *)
   (*------------------------------------------------------------------------*)
   (* Testroutinen                                                           *)
   (*                                                                        *)
@@ -49,7 +50,7 @@
   (* Licence        : GNU Lesser General Public License (LGPL)              *)
   (*------------------------------------------------------------------------*)
 
-  (* $Id: LibDBlas.mod,v 1.4 2017/10/29 09:54:58 mriedl Exp mriedl $ *)
+  (* $Id: LibDBlas.mod,v 1.6 2018/09/12 13:20:49 mriedl Exp mriedl $ *)
 
               IMPORT SYSTEM;
 FROM Deklera  IMPORT FLOAT,CFLOAT; (* REAL,COMPLEX type *)
@@ -537,7 +538,7 @@
       RETURN Sum;
 END dasum;
 
-(*============================= complexe prozedures ========================*)
+(*============================= complexe procedures ========================*)
 
 PROCEDURE zswap( N       : CARDINAL;
                 VAR X    : (* ARRAY OF *) CFLOAT;
@@ -583,6 +584,50 @@
         END;
       END;
 END zswap;
+
+PROCEDURE zcopy(    N    : INTEGER;
+                VAR X    : (* ARRAY OF *) LONGCOMPLEX;
+                    IncX : INTEGER;
+                VAR Y    : (* ARRAY OF *) LONGCOMPLEX;
+                    IncY : INTEGER);
+
+          (*----------------------------------------------------------------*)
+          (* Adopted to Modula-2, MRi, 04.04.2016, complex version 09.08.18 *)
+          (*----------------------------------------------------------------*)
+
+          CONST MAXINT     = MAX(INTEGER);
+          TYPE  PCVEKTOR0  = POINTER TO ARRAY [0..MAXINT-1] OF LONGCOMPLEX;
+          VAR   i,ix,iy,m  : INTEGER;
+                XX,YY      : PCVEKTOR0;
+BEGIN
+      IF (N <= 0) THEN RETURN; END;
+
+      XX:=SYSTEM.CAST(PCVEKTOR0,SYSTEM.ADR(X));
+      YY:=SYSTEM.CAST(PCVEKTOR0,SYSTEM.ADR(Y));
+
+      IF (IncX = 1) AND (IncY = 1) THEN
+        (* code for both increments equal to 1 *)
+        m := (N MOD 8);
+        IF (m # 0) THEN (* Clean-up loop *)
+          FOR i:=0 TO m-1 DO YY^[i] := XX^[i]; END;
+          IF (N < 8) THEN RETURN; END
+        END;
+        FOR i:=m TO N-1 BY 8 DO
+          YY^[i+0] := XX^[i+0]; YY^[i+1] := XX^[i+1];
+          YY^[i+2] := XX^[i+2]; YY^[i+3] := XX^[i+3];
+          YY^[i+4] := XX^[i+4]; YY^[i+5] := XX^[i+5];
+          YY^[i+6] := XX^[i+6]; YY^[i+7] := XX^[i+7];
+        END;
+      ELSE
+        (* code for unequal increments or equal increments not equal to 1 *)
+        IF (IncX > 0) THEN ix:=0; ELSE ix:=(1 - VAL(INTEGER,N))*IncX; END;
+        IF (IncY > 0) THEN iy:=0; ELSE iy:=(1 - VAL(INTEGER,N))*IncY; END;
+        FOR i:=0 TO N-1 DO
+          YY^[iy] := XX^[ix];
+          INC(ix,IncX); INC(iy,IncY);
+        END;
+      END;
+END zcopy;
 
 PROCEDURE zdotc(    N    : INTEGER;
                 VAR X    : (* ARRAY OF *) CFLOAT;