	with ErroAKD;
	with ScrnAKD;
	with TypeAKD;  use TypeAKD;

	package body HexaAKD is
	---------------------------------------------------------------------------
	---------------------------------------------------------------------------

	function Hex_Complement ( Hex: in Hex8 ) return Hex8 is
	---------------------------------------------------------------------------
	-- Performs the 2s-complement function
	---------------------------------------------------------------------------
	  Carry : Int32 := 1;
	  Temp  : Hex8;
	begin
	  for index in reverse Hex'range loop
	 if 16#F# - HexChar'pos ( Hex ( index ) ) + Carry > 16#F# then
	   Temp ( index ) := '0';
	 else
	   Temp ( index )
		:= HexChar'val ( 16#F# - HexChar'pos ( Hex ( index ) ) + Carry );
	   Carry := 0;
	 end if;
	  end loop;
	  return Temp;
	end Hex_Complement;

	function Hex_To_Char ( Hex : in HexChar ) return character is
	---------------------------------------------------------------------------
	  Temp: character;
	begin
	  case Hex is
	 when '0' =>  Temp := '0';
	 when '1' =>  Temp := '1';
	 when '2' =>  Temp := '2';
	 when '3' =>  Temp := '3';
	 when '4' =>  Temp := '4';
	 when '5' =>  Temp := '5';
	 when '6' =>  Temp := '6';
	 when '7' =>  Temp := '7';
	 when '8' =>  Temp := '8';
	 when '9' =>  Temp := '9';
	 when 'A' =>  Temp := 'A';
	 when 'B' =>  Temp := 'B';
	 when 'C' =>  Temp := 'C';
	 when 'D' =>  Temp := 'D';
	 when 'E' =>  Temp := 'E';
	 when 'F' =>  Temp := 'F';
	  end case;
	  return Temp;
	exception
	  when others =>
	 ErroAKD.Notify ( "DC_Hex.Hex_To_Char" );
	 raise;
	end Hex_To_Char;

	function Hex_To_Int ( Hex : in Hex8 ) return Int32 is
	--=========================================================================
	-- "FFFFFFFF" ==> -1
	-- "FFFFFFFE" ==> -2
	-- "0000000A" ==> 10
	--=========================================================================
	  Hex_Tmp :  Hex8  := Hex;
	  Temp    :  Int32 := 0;
	begin
	  if HexChar'pos ( Hex ( 1 ) ) >= 8 then
	 Hex_Tmp ( 1 ) := HexChar'val ( HexChar'pos ( Hex ( 1 ) ) - 8 );
	  end if;
	  for index in reverse Hex'range loop
	 Temp := Temp + HexChar'pos ( Hex_Tmp ( index ) )
	   * ( 16 ** ( Hex'length  - index ) );
	  end loop;
	  if HexChar'pos ( Hex ( 1 ) ) >= 8 then
	--  Note:  the following commented code line won't work but the following
	--  uncommented code line will due to weird effects at 16#7FFF_FFFF#.
	--  Temp := Temp - 16#7FFF_FFFF# - 1;
	 Temp := Temp - 16#7FFF_FFFE# - 2;
	  end if;
	  return Temp;
	end Hex_To_Int;

	function  Hex_To_Str ( Hex : in Hex8 ) return string is
	---------------------------------------------------------------------------
	  Temp: string ( Hex'range );
	begin
	  for index in Hex'range loop
	 Temp ( index ) := Hex_To_Char ( Hex ( index ) );
	  end loop;
	  return Temp;
	end Hex_To_Str;

	function Int_To_Hex ( Int : in Int32 ) return Hex8 is
	---------------------------------------------------------------------------
	--               -1 ==> "FFFFFFFF"
	--               -2 ==> "FFFFFFFE"
	--               10 ==> "0000000A"
	--   -1_287_154_453 ==> "B34794EB"
	---------------------------------------------------------------------------
	  Int_Rem,
	  Int_Tmp : Int32 := abs ( Int );
	  Temp    : Hex8;
	begin
	  for index in reverse Hex8'range loop
	 Int_Rem := Int_Tmp rem 16;
	 case Int_Rem is
	   when  0 => Temp ( index ) := '0';
	   when  1 => Temp ( index ) := '1';
	   when  2 => Temp ( index ) := '2';
	   when  3 => Temp ( index ) := '3';
	   when  4 => Temp ( index ) := '4';
	   when  5 => Temp ( index ) := '5';
	   when  6 => Temp ( index ) := '6';
	   when  7 => Temp ( index ) := '7';
	   when  8 => Temp ( index ) := '8';
	   when  9 => Temp ( index ) := '9';
	   when 10 => Temp ( index ) := 'A';
	   when 11 => Temp ( index ) := 'B';
	   when 12 => Temp ( index ) := 'C';
	   when 13 => Temp ( index ) := 'D';
	   when 14 => Temp ( index ) := 'E';
	   when 15 => Temp ( index ) := 'F';
	   when others => null;
	 end case;
	 Int_Tmp := Int_Tmp / 16;
	  end loop;
	  if Int < 0 then
	 Temp := Hex_Complement ( Temp );
	  end if;
	  return Temp;
	exception
	  when others =>
	 ErroAKD.Notify ( "DC_Hex.Int_To_Hex" );
	 raise;
	end Int_To_Hex;

	procedure Put_Line ( Hex : in Hex8 ) is
	---------------------------------------------------------------------------
	begin
	  for index in Hex'range loop
	 ScrnAKD.Put ( Hex_To_Char ( Hex ( index ) ) );
	  end loop;
	  ScrnAKD.Put_Line;
	exception
	  when others =>
	 ErroAKD.Notify ( "DC_Hex.Put_Line" );
	 raise;
	end Put_Line;

	function Str_To_Hex ( Str : in string ) return Hex8 is
	---------------------------------------------------------------------------
	  Bad_Hex_Char : exception;
	  Temp : Hex8;
	begin
	  for index in Temp'range loop
	 case Str ( index ) is
	   when '0'    => Temp ( index ) := '0';
	   when '1'    => Temp ( index ) := '1';
	   when '2'    => Temp ( index ) := '2';
	   when '3'    => Temp ( index ) := '3';
	   when '4'    => Temp ( index ) := '4';
	   when '5'    => Temp ( index ) := '5';
	   when '6'    => Temp ( index ) := '6';
	   when '7'    => Temp ( index ) := '7';
	   when '8'    => Temp ( index ) := '8';
	   when '9'    => Temp ( index ) := '9';
	   when 'A'    => Temp ( index ) := 'A';
	   when 'B'    => Temp ( index ) := 'B';
	   when 'C'    => Temp ( index ) := 'C';
	   when 'D'    => Temp ( index ) := 'D';
	   when 'E'    => Temp ( index ) := 'E';
	   when 'F'    => Temp ( index ) := 'F';
	   when 'a'    => Temp ( index ) := 'A';
	   when 'b'    => Temp ( index ) := 'B';
	   when 'c'    => Temp ( index ) := 'C';
	   when 'd'    => Temp ( index ) := 'D';
	   when 'e'    => Temp ( index ) := 'E';
	   when 'f'    => Temp ( index ) := 'F';
	   when others => raise Bad_Hex_Char;
	 end case;
	  end loop;
	  return Temp;
	end Str_To_Hex;

	---------------------------------------------------------------------------
	---------------------------------------------------------------------------
	end HexaAKD;
