[INHERIT ('SYS$LIBRARY:STARLET.PEN')]
MODULE Negate;

{ Routines for performing the NEGATE command }

(***************** Declare External Variables and Constants *******************)

%INCLUDE 'HEX$DIRECTORY:HEXGLOB.INC/NOLIST'

(********************* External RTL Routine Declarations **********************)

%INCLUDE 'HEX$DIRECTORY:LIB.INC/NOLIST'

(****************** External Homemade Routine Declarations ********************)

[EXTERNAL] PROCEDURE Check_Extra_Chars; EXTERN;

(******************************************************************************)
(*									      *)
(*			    Procedure Do_Negate				      *)
(*									      *)
(******************************************************************************)

[GLOBAL] FUNCTION Do_Negate: INTEGER;

{ This function negates the bytes in the designated range of virtual memory,
  treating the values as two's complement signed byte value.}

VAR
	I		: UNSIGNED;
	VM_Index	: INTEGER;
	Temp		: INTEGER;

BEGIN

  I := From;
  WHILE (I <= Thru) DO
    BEGIN
      VM_Index := (I - Offset)::INTEGER;
      Temp := 256 - VM[VM_Index];
      IF (Temp = 256) THEN Temp := 256;
      VM[VM_Index] := ORD(Temp);
      I := I + Step_Param;
    END;
  Check_Extra_Chars;
  Do_Negate := SS$_NORMAL;

END;

(******************************************************************************)

END. { module negate }
