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;