|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6144 (0x1800)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Hex, seg_04b937
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
--
-- This package contains some functions for converting binary values to
-- ascii hex (so they can be printed in hex) and for converting hex to
-- ascii.
--
with Unsigned_Types;
with Unchecked_Conversion;
with V_I_Bits;
package body Hex is
-- number of hex digits in an integer
Hex_Digits : constant Integer := Integer'Size / 4;
subtype Nibble is Integer range 0 .. 15;
-- mapping of nibbles to character representation, normal and complement
Int_To_Char_Pos : constant array (Nibble) of Character :=
"0123456789ABCDEF";
Int_To_Char_Neg : constant array (Nibble) of Character :=
"FEDCBA9876543210";
-- mapping of hex digits to values
function Char_To_Int_Pos (C : Character) return Integer is
begin
case C is
when 'a' .. 'f' =>
return Character'Pos (C) - Character'Pos ('a') + 10;
when 'A' .. 'F' =>
return Character'Pos (C) - Character'Pos ('A') + 10;
when '0' .. '9' =>
return Character'Pos (C) - Character'Pos ('0');
when others =>
raise Constraint_Error;
end case;
end Char_To_Int_Pos;
function To_Unsigned_Integer is
new Unchecked_Conversion (Integer, Unsigned_Types.Unsigned_Integer);
function Hex_To_Integer (Str : String) return Integer is
First : Integer := Str'First;
Last : Integer := Str'Last;
Result : Integer := 0;
begin
-- strip off trailing blanks
while First < Last and Str (Last) = ' ' loop
Last := Last - 1;
end loop;
-- strip off leading blanks
while First < Last and then Str (First) = ' ' loop
First := First + 1;
end loop;
-- strip off leading 0s
while First < Last and then Str (First) = '0' loop
First := First + 1;
end loop;
if Last - First + 1 > Hex_Digits then
raise Constraint_Error; -- number too long
end if;
if Last - First + 1 < Hex_Digits or else Str (First) in '0' .. '7' then
for I in First .. Last loop
Result := 16 * Result + Nibble (Char_To_Int_Pos (Str (I)));
end loop;
else
-- str >= 80000000, so result is negative
for I in First .. Last loop
Result := 16 * Result + Nibble (15 - Char_To_Int_Pos (Str (I)));
end loop;
Result := -Result - 1;
end if;
return Result;
end Hex_To_Integer;
function Unsigned_To_Hex (Uint : Unsigned_Types.Unsigned_Integer;
Width : Integer := 0;
Fill : Character := ' ') return String is
use Unsigned_Types;
U16 : constant Unsigned_Integer := 16;
U0 : constant Unsigned_Integer := 0;
Result : String (1 .. Hex_Digits);
Val : Unsigned_Integer;
Start : Integer;
J : Integer := Hex_Digits;
Blanks : constant String (1 .. Width - Hex_Digits) := (others => Fill);
begin
Val := Uint;
loop
Result (J) := Int_To_Char_Pos
(V_I_Bits.Bit_And (Integer (Val), 16#0F#));
Val := Unsigned_Integer (V_I_Bits.Bit_Srl (Integer (Val), 4));
exit when Val = U0;
J := J - 1;
end loop;
if Width > Hex_Digits then
Start := 1;
elsif Width <= 0 then
Start := J;
else
Start := Hex_Digits - Width + 1;
end if;
while J > Start loop
J := J - 1;
Result (J) := Fill;
end loop;
--
-- blanks is usually a null string (for width <= HEX_DIGITS);
--
return Blanks & Result (Start .. Hex_Digits);
end Unsigned_To_Hex;
-- width specifies the minimum width of the result string. If it needs
-- to be widened it is padded on the left with fill.
function Integer_To_Hex
(Int : Integer; Width : Integer := 0; Fill : Character := ' ')
return String is
use Unsigned_Types;
begin
return Unsigned_To_Hex (To_Unsigned_Integer (Int), Width, Fill);
end Integer_To_Hex;
function Word_To_Hex (W : Machine_Types.Word; Fill : Character := ' ')
return String is
begin
return Integer_To_Hex (Integer (W), 4, Fill);
end Word_To_Hex;
function Byte_To_Hex (B : Machine_Types.Byte; Fill : Character := ' ')
return String is
begin
return Integer_To_Hex (Integer (B), 2, Fill);
end Byte_To_Hex;
end Hex;
nblk1=5
nid=0
hdr6=a
[0x00] rec0=1e rec1=00 rec2=01 rec3=06c
[0x01] rec0=20 rec1=00 rec2=02 rec3=01e
[0x02] rec0=1c rec1=00 rec2=03 rec3=018
[0x03] rec0=1d rec1=00 rec2=04 rec3=018
[0x04] rec0=1c rec1=00 rec2=05 rec3=000
tail 0x21750b83a868434e89a4e 0x42a00088462060003