|
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 - download
Length: 29696 (0x7400) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Xlbmp_Generic_Converters, seg_004f07
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦this⟧
--/ if R1000 then with Unchecked_Conversions; --/ elsif Cdf_Hpux then --// with Unchecked_Conversion; --/ elsif TeleGen2 and then Unix then --// with System; --/ end if; with Xlbt_Arithmetic; use Xlbt_Arithmetic; package body Xlbmp_Generic_Converters is ------------------------------------------------------------------------------ -- X Library Machine Types -- -- Xlbmp_Generic_Converters - Machine/Compiler dependent conversions to/from -- system data types. ------------------------------------------------------------------------------ -- Copyright 1989 - 1991 by Rational, Santa Clara, California. -- -- All Rights Reserved. -- -- Permission to use, copy, modify, and distribute this software and its -- documentation for any purpose and without fee is hereby granted, -- provided that the above copyright notice(s) appear in all copies and that -- both that copyright notice(s) and this permission notice appear in -- supporting documentation, and that the name of Rational not be used in -- advertising or publicity pertaining to distribution of the software -- without specific, written prior permission. -- -- Rational disclaims all warranties with regard to this software, including -- all implied warranties of merchantability and fitness, in no event shall -- Rational be liable for any special, indirect or consequential damages or -- any damages whatsoever resulting from loss of use, data or profits, whether -- in an action of contract, negligence or other tortious action, arising out -- of or in connection with the use or performance of this software. ------------------------------------------------------------------------------ --/ if TeleGen2 and then Unix then --// procedure Xlbmt_Mem_Copy (To : System.Address; --// From : System.Address; --// Bytes : S_Long); --// pragma Interface (Assembler, Xlbmt_Mem_Copy); --// pragma Linkname (Xlbmt_Mem_Copy, "_Xlbmt_Mem_Copy"); --/ end if; --\x0c ------------------------------------------------------------------------------ -- Convert a Discrete type. ------------------------------------------------------------------------------ --/ if R1000 then procedure Convert_Discrete_To_Raw (Raw : out X_Raw_Data_Array; Orig : Original) is function To_Raw is new Unchecked_Conversions.Convert_To_Byte_String (Original); begin Raw := To_Raw (Orig); end Convert_Discrete_To_Raw; --/ elsif TeleGen2 and then Unix then --// --// procedure Convert_Discrete_To_Raw (Raw : out X_Raw_Data_Array; --// Orig : Original) is --// begin --// --/ if DEBUG then --// if Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// if Raw'Length > 0 then --// if Original'Size < 32 then --// declare --// ----TeleGen2 places "small" things into "large" places on --// -- the stack and 'Address gives you the address of the --// -- place and not the address of the data! --// type A_Record is --// record --// A : Original; --// end record; --// A : A_Record; --// begin --// A.A := Orig; --// Xlbmt_Mem_Copy (Raw (Raw'First)'Address, --// A.A'Address, Raw'Length); --// end; --// else --// Xlbmt_Mem_Copy (Raw (Raw'First)'Address, Orig'Address, --// Raw'Length); --// end if; --// end if; --// --// end Convert_Discrete_To_Raw; --// --/ else --// --// ----Note: This is "generic" code for any Ada compiler; --// -- it may not work for you. Do not modify this code. Copy it into --// -- a new ELSE arm aimed at your particular taget. It *does* work for --// -- some targets. --// --// procedure Convert_Discrete_To_Raw (Raw : out X_Raw_Data_Array; --// Orig : Original) is --// subtype Rdt is X_Raw_Data_Array (Raw'Range); --// function To_Raw is new Unchecked_Conversion (Original, Rdt); --// begin --// --/ if DEBUG then --// if Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// Raw := To_Raw (Orig); --// --// end Convert_Discrete_To_Raw; --// --/ end if; --\x0c ------------------------------------------------------------------------------ -- Convert a Private type. ------------------------------------------------------------------------------ --/ if R1000 then procedure Convert_Private_To_Raw (Raw : out X_Raw_Data_Array; Orig : Original) is function To_Raw is new Unchecked_Conversions.Convert_To_Byte_String (Original); begin Raw := To_Raw (Orig); end Convert_Private_To_Raw; --/ elsif TeleGen2 and then Unix then --// --// procedure Convert_Private_To_Raw (Raw : out X_Raw_Data_Array; --// Orig : Original) is --// begin --// --/ if DEBUG then --// if Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// if Raw'Length > 0 then --// Xlbmt_Mem_Copy (Raw (Raw'First)'Address, Orig'Address, --// Raw'Length); --// end if; --// --// end Convert_Private_To_Raw; --// --/ else --// --// ----Note: This is "generic" code for any Ada compiler; --// -- it may not work for you. Do not modify this code. Copy it into --// -- a new ELSE arm aimed at your particular taget. It *does* work for --// -- some targets. --// --// procedure Convert_Private_To_Raw (Raw : out X_Raw_Data_Array; --// Orig : Original) is --// subtype Rdt is X_Raw_Data_Array (Raw'Range); --// function To_Raw is new Unchecked_Conversion (Original, Rdt); --// begin --// --/ if DEBUG then --// if Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// Raw := To_Raw (Orig); --// --// end Convert_Private_To_Raw; --// --/ end if; --\x0c ------------------------------------------------------------------------------ -- Convert an Array type. ------------------------------------------------------------------------------ --/ if R1000 then procedure Convert_Array_To_Raw (Raw : out X_Raw_Data_Array; Orig : Original_Array) is subtype Oat is Original_Array (Orig'Range); Oad : Oat := Orig; function To_Raw is new Unchecked_Conversions.Convert_To_Byte_String (Oat); begin --/ if DEBUG then if Orig'Length * Original'Size / X_Raw_Data'Size /= Raw'Length then raise Constraint_Error; end if; --/ end if; if Orig'Length > 0 then Raw := To_Raw (Oad); end if; end Convert_Array_To_Raw; --/ elsif TeleGen2 and then Unix then --// --// procedure Convert_Array_To_Raw (Raw : out X_Raw_Data_Array; --// Orig : Original_Array) is --// begin --// --/ if DEBUG then --// if Orig'Length * Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// if Orig'Length > 0 then --// Xlbmt_Mem_Copy (Raw (Raw'First)'Address, --// Orig (Orig'First)'Address, Raw'Length); --// end if; --// --// end Convert_Array_To_Raw; --// --/ else --// --// ----Note: This is "generic" code for any Ada compiler; --// -- it may not work for you. Do not modify this code. Copy it into --// -- a new ELSE arm aimed at your particular taget. It *does* work for --// -- some targets. --// --// procedure Convert_Array_To_Raw (Raw : out X_Raw_Data_Array; --// Orig : Original_Array) is --// subtype Rdt is X_Raw_Data_Array (Raw'Range); --// subtype Oat is Original_Array (Orig'Range); --// Oad : Oat := Orig; --// function To_Raw is new Unchecked_Conversion (Oat, Rdt); --// begin --// --/ if DEBUG then --// if Orig'Length * Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// Raw := To_Raw (Oad); --// --// end Convert_Array_To_Raw; --// --/ end if; --\x0c ------------------------------------------------------------------------------ -- Convert a 2-dimensional Array type. ------------------------------------------------------------------------------ --/ if Row_Major_Order then --/ if R1000 then procedure Convert_2d_Array_To_Raw (Raw : out X_Raw_Data_Array; Orig : Original_Array) is ----Row_Major_Order, R1000 subtype Oat is Original_Array (Orig'Range (1), Orig'Range (2)); Oad : Oat := Orig; function To_Raw is new Unchecked_Conversions.Convert_To_Byte_String (Oat); begin --/ if DEBUG then if Orig'Length (1) * Orig'Length (2) * Original'Size / X_Raw_Data'Size /= Raw'Length then raise Constraint_Error; end if; --/ end if; if Raw'Length /= 0 then Raw := To_Raw (Oad); end if; end Convert_2d_Array_To_Raw; --/ elsif TeleGen2 and then Unix then --// --// procedure Convert_2d_Array_To_Raw (Raw : out X_Raw_Data_Array; --// Orig : Original_Array) is --// ----Row_Major_Order, not R1000 --// begin --// --/ if DEBUG then --// if Orig'Length (1) * Orig'Length (2) * --// Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// if Raw'Length /= 0 then --// Xlbmt_Mem_Copy --// (Raw (Raw'First)'Address, --// Orig (Orig'First (1), Orig'First (2))'Address, Raw'Length); --// end if; --// --// end Convert_2d_Array_To_Raw; --// --/ else --// --// ----Note: This is "generic" code for any Ada compiler; --// -- it may not work for you. Do not modify this code. Copy it into --// -- a new ELSE arm aimed at your particular taget. It *does* work for --// -- some targets. --// --// procedure Convert_2d_Array_To_Raw (Raw : out X_Raw_Data_Array; --// Orig : Original_Array) is --// ----Row_Major_Order, not R1000 --// subtype Rdt is X_Raw_Data_Array (Raw'Range); --// subtype Oat is Original_Array (Orig'Range (1), Orig'Range (2)); --// Oad : Oat := Orig; --// function To_Raw is new Unchecked_Conversion (Oat, Rdt); --// begin --// --/ if DEBUG then --// if Orig'Length (1) * Orig'Length (2) * --// Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// Raw := To_Raw (Oad); --// --// end Convert_2d_Array_To_Raw; --// --/ end if; --/ else --// --// ----Note: This is "generic" code for any Ada compiler; --// -- it may not work for you. Do not modify this code. Copy it into --// -- a new ELSE arm aimed at your particular taget. It *does* work for --// -- some targets. --// --// procedure Convert_2d_Array_To_Raw (Raw : out X_Raw_Data_Array; --// Orig : Original_Array) is --// ----Not Row_Major_Order --// subtype Rdt is X_Raw_Data_Array (Raw'Range); --// type Oatype2 is array (Index2 range <>, Index1 range <>) of Original; --// subtype Oat2 is Oatype2 (Orig'Range (2), Orig'Range (1)); --// Oad : Oat2; --// function To_Raw is new Unchecked_Conversion (Oat2, Rdt); --// begin --// --/ if DEBUG then --// if Orig'Length (1) * Orig'Length (2) * --// Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// for I in Orig'Range (1) loop --// for J in Orig'Range (2) loop --// Oad (J, I) := Orig (I, J); --// end loop; --// end loop; --// Raw := To_Raw (Oad); --// --// end Convert_2d_Array_To_Raw; --// --/ end if; --\x0c ------------------------------------------------------------------------------ -- Convert to a Discrete type. ------------------------------------------------------------------------------ --/ if R1000 then procedure Convert_Raw_To_Discrete (Orig : out Original; Raw : X_Raw_Data_Array) is function From_Raw is new Unchecked_Conversions.Convert_From_Byte_String (Original); begin --/ if DEBUG then if Original'Size / X_Raw_Data'Size /= Raw'Length then raise Constraint_Error; end if; --/ end if; Orig := From_Raw (Raw); end Convert_Raw_To_Discrete; --/ elsif TeleGen2 and then Unix then --// --// procedure Convert_Raw_To_Discrete (Orig : out Original; --// Raw : X_Raw_Data_Array) is --// begin --// --/ if DEBUG then --// if Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// if Original'Size < 32 then --// declare --// ----TeleGen2 places "small" things into "large" places on --// -- the stack and 'Address gives you the address of the --// -- place and not the address of the data! --// type A_Record is --// record --// A : Original; --// end record; --// A : A_Record; --// begin --// Xlbmt_Mem_Copy --// (A.A'Address, Raw (Raw'First)'Address, Raw'Length); --// Orig := A.A; --// end; --// else --// Xlbmt_Mem_Copy (Orig'Address, Raw (Raw'First)'Address, Raw'Length); --// end if; --// --// end Convert_Raw_To_Discrete; --// --/ else --// --// ----Note: This is "generic" code for any Ada compiler; --// -- it may not work for you. Do not modify this code. Copy it into --// -- a new ELSE arm aimed at your particular taget. It *does* work for --// -- some targets. --// --// procedure Convert_Raw_To_Discrete (Orig : out Original; --// Raw : X_Raw_Data_Array) is --// subtype Rdt is X_Raw_Data_Array (Raw'Range); --// function From_Raw is new Unchecked_Conversion (Rdt, Original); --// begin --// --/ if DEBUG then --// if Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// Orig := From_Raw (Raw); --// --// end Convert_Raw_To_Discrete; --// --/ end if; --\x0c ------------------------------------------------------------------------------ -- Convert to a Private type. ------------------------------------------------------------------------------ --/ if R1000 then procedure Convert_Raw_To_Private (Orig : out Original; Raw : X_Raw_Data_Array) is function From_Raw is new Unchecked_Conversions.Convert_From_Byte_String (Original); begin --/ if DEBUG then if Original'Size / X_Raw_Data'Size /= Raw'Length then raise Constraint_Error; end if; --/ end if; Orig := From_Raw (Raw); end Convert_Raw_To_Private; --/ elsif TeleGen2 and then Unix then --// --// procedure Convert_Raw_To_Private (Orig : out Original; --// Raw : X_Raw_Data_Array) is --// begin --// --/ if DEBUG then --// if Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// if Raw'Length > 0 then --// Xlbmt_Mem_Copy (Orig'Address, Raw (Raw'First)'Address, Raw'Length); --// end if; --// --// end Convert_Raw_To_Private; --// --/ else --// --// ----Note: This is "generic" code for any Ada compiler; --// -- it may not work for you. Do not modify this code. Copy it into --// -- a new ELSE arm aimed at your particular taget. It *does* work for --// -- some targets. --// --// procedure Convert_Raw_To_Private (Orig : out Original; --// Raw : X_Raw_Data_Array) is --// subtype Rdt is X_Raw_Data_Array (Raw'Range); --// function From_Raw is new Unchecked_Conversion (Rdt, Original); --// begin --// --/ if DEBUG then --// if Original'Size / X_Raw_Data'Size /= Raw'Length then --// raise Constraint_Error; --// end if; --/ end if; --// Orig := From_Raw (Raw); --// --// end Convert_Raw_To_Private; --// --/ end if; --\x0c ------------------------------------------------------------------------------ -- Convert to an Array type. ------------------------------------------------------------------------------ --/ if R1000 then procedure Convert_Raw_To_Array (Orig : out Original_Array; Raw : X_Raw_Data_Array) is begin ----The lengths must correspond. --/ if DEBUG then if Raw'Length /= Orig'Length * Original'Size / X_Raw_Data'Size then raise Constraint_Error; end if; --/ end if; ----If the length is non-zero then create a subtype with the correct indices -- so that the R1000 architecture will store the index values in the subtype -- descriptor and not in the data area. Then instantiate a new From_Raw -- using that subtype. Then convert and return the result. if Raw'Length > 0 then declare subtype Oat is Original_Array (Orig'Range); function From_Raw is new Unchecked_Conversions. Convert_From_Byte_String (Oat); begin Orig := From_Raw (Raw); end; end if; end Convert_Raw_To_Array; --/ elsif TeleGen2 and then Unix then --// --// procedure Convert_Raw_To_Array --// (Orig : out Original_Array; Raw : X_Raw_Data_Array) is --// begin --// --/ if DEBUG then --// if Raw'Length /= Orig'Length * Original'Size / X_Raw_Data'Size then --// raise Constraint_Error; --// end if; --/ end if; --// if Raw'Length > 0 then --// Xlbmt_Mem_Copy (Orig (Orig'First)'Address, --// Raw (Raw'First)'Address, Raw'Length); --// end if; --// --// end Convert_Raw_To_Array; --// --/ else --// --// ----Note: This is "generic" code for any Ada compiler; --// -- it may not work for you. Do not modify this code. Copy it into --// -- a new ELSE arm aimed at your particular taget. It *does* work for --// -- some targets. --// --// procedure Convert_Raw_To_Array (Orig : out Original_Array; --// Raw : X_Raw_Data_Array) is --// begin --// --// ----The lengths must correspond --// --/ if DEBUG then --// if Raw'Length /= Orig'Length * Original'Size / X_Raw_Data'Size then --// raise Constraint_Error; --// end if; --/ end if; --// --// ----If the length is non-zero then create a subtype with the correct indices --// -- so that the R1000 architecture will store the index values in the subtype --// -- descriptor and not in the data area. Then instantiate a new From_Raw --// -- using that subtype. Then convert and return the result. --// --// if Raw'Length > 0 then --// declare --// type Rdt is new X_Raw_Data_Array (Raw'Range); --// type Oat is new Original_Array (Orig'Range); --// function From_Raw is new Unchecked_Conversion (Rdt, Oat); --// begin --// Orig := Original_Array (From_Raw (Rdt (Raw))); --// end; --// end if; --// --// end Convert_Raw_To_Array; --// --/ end if; --\x0c ------------------------------------------------------------------------------ -- Convert to a 2-dimensional Array type. ------------------------------------------------------------------------------ --/ if Row_Major_Order then --/ if R1000 then procedure Convert_Raw_To_2d_Array (Orig : out Original_Array; Raw : X_Raw_Data_Array) is begin ----The array lengths must correspond. --/ if DEBUG then if Raw'Length /= Orig'Length (1) * Orig'Length (2) * Original'Size / X_Raw_Data'Size then raise Constraint_Error; end if; --/ end if; ----If the length is non-zero then create a subtype with the correct indices -- so that the R1000 architecture will store the index values in the subtype -- descriptor and not in the data area. Then instantiate a new From_Raw -- using that subtype. Then convert and return the result. if Raw'Length > 0 then declare subtype Oat is Original_Array (Orig'Range (1), Orig'Range (2)); function From_Raw is new Unchecked_Conversions. Convert_From_Byte_String (Oat); begin Orig := From_Raw (Raw); end; end if; end Convert_Raw_To_2d_Array; --/ elsif TeleGen2 and then Unix then --// --// procedure Convert_Raw_To_2d_Array --// (Orig : out Original_Array; Raw : X_Raw_Data_Array) is --// begin --// --/ if DEBUG then --// if Raw'Length /= Orig'Length (1) * Orig'Length (2) * --// Original'Size / X_Raw_Data'Size then --// raise Constraint_Error; --// end if; --/ end if; --// if Raw'Length > 0 then --// Xlbmt_Mem_Copy (Orig (Orig'First (1), Orig'First (2))'Address, --// Raw (Raw'First)'Address, Raw'Length); --// end if; --// --// end Convert_Raw_To_2d_Array; --// --/ else --// --// ----Row_Major_Order, Not R1000 --// ----Note: This is "generic" code for any Ada compiler; --// -- it may not work for you. Do not modify this code. Copy it into --// -- a new ELSE arm aimed at your particular taget. It *does* work for --// -- some targets. --// --// procedure Convert_Raw_To_2d_Array (Orig : out Original_Array; --// Raw : X_Raw_Data_Array) is --// begin --// --// ----Check size constraints. --// --/ if DEBUG then --// if Raw'Length /= Orig'Length (1) * Orig'Length (2) * --// Original'Size / X_Raw_Data'Size then --// raise Constraint_Error; --// end if; --/ end if; --// --// ----If there is no data then just return. --// --// if Raw'Length = 0 then --// return; --// --// ----If the length is non-zero then create a subtype with the correct indices --// -- so that the R1000 architecture will store the index values in the subtype --// -- descriptor and not in the data area. Then instantiate a new From_Raw --// -- using that subtype. Then convert and return the result. --// --// else --// declare --// subtype Oat is Original_Array (Orig'Range (1), Orig'Range (2)); --// subtype Rdt is X_Raw_Data_Array (Raw'Range); --// function From_Raw is new Unchecked_Conversion (Rdt, Oat); --// begin --// Orig := From_Raw (Raw); --// end; --// end if; --// --// end Convert_Raw_To_2d_Array; --// --/ end if; --/ else --// --// ----Note: This is "generic" code for any Ada compiler; --// -- it may not work for you. Do not modify this code. Copy it into --// -- a new ELSE arm aimed at your particular taget. It *does* work for --// -- some targets. --// --// procedure Convert_Raw_To_2d_Array (Orig : out Original_Array; --// Raw : X_Raw_Data_Array) is --// begin --// --// ----Check size constraints. --// --/ if DEBUG then --// if Raw'Length /= Orig'Length (1) * Orig'Length (2) * --// Original'Size / X_Raw_Data'Size then --// raise Constraint_Error; --// end if; --/ end if; --// --// ----If there is no data then just return. --// --// if Raw'Length = 0 then --// return; --// --// ----If the length is non-zero then create a subtype with the correct indices --// -- so that the R1000 architecture will store the index values in the subtype --// -- descriptor and not in the data area. Then instantiate a new From_Raw --// -- using that subtype. Then convert and return the result. --// --// else --// declare --// subtype Rdt is X_Raw_Data_Array (1 .. Len); --// type Oatype2 is --// array (Index2 range <>, Index1 range <>) of Original; --// subtype Oat2 is Oatype2 (Orig'Range (2), Orig'Range (1)); --// D2 : Oat2; --// function From_Raw is new Unchecked_Conversion (Rdt, Oat2); --// begin --// D2 := From_Raw (Orig); --// for I in D2'Range (1) loop --// for J in D2'Range (2) loop --// Orig (J, I) := D2 (I, J); --// end loop; --// end loop; --// end; --// end if; --// --// end Convert_Raw_To_2d_Array; --// --/ end if; --\x0c end Xlbmp_Generic_Converters;
nblk1=1c nid=0 hdr6=38 [0x00] rec0=1c rec1=00 rec2=01 rec3=024 [0x01] rec0=11 rec1=00 rec2=02 rec3=016 [0x02] rec0=1e rec1=00 rec2=03 rec3=016 [0x03] rec0=17 rec1=00 rec2=04 rec3=008 [0x04] rec0=1d rec1=00 rec2=05 rec3=00c [0x05] rec0=1c rec1=00 rec2=06 rec3=01c [0x06] rec0=1d rec1=00 rec2=07 rec3=02a [0x07] rec0=1e rec1=00 rec2=08 rec3=066 [0x08] rec0=19 rec1=00 rec2=09 rec3=008 [0x09] rec0=1e rec1=00 rec2=0a rec3=052 [0x0a] rec0=1e rec1=00 rec2=0b rec3=020 [0x0b] rec0=18 rec1=00 rec2=0c rec3=042 [0x0c] rec0=19 rec1=00 rec2=0d rec3=006 [0x0d] rec0=20 rec1=00 rec2=0e rec3=014 [0x0e] rec0=1b rec1=00 rec2=0f rec3=01c [0x0f] rec0=19 rec1=00 rec2=10 rec3=008 [0x10] rec0=21 rec1=00 rec2=11 rec3=048 [0x11] rec0=1b rec1=00 rec2=12 rec3=016 [0x12] rec0=1f rec1=00 rec2=13 rec3=096 [0x13] rec0=1c rec1=00 rec2=14 rec3=05c [0x14] rec0=1b rec1=00 rec2=15 rec3=01c [0x15] rec0=1a rec1=00 rec2=16 rec3=048 [0x16] rec0=19 rec1=00 rec2=17 rec3=01c [0x17] rec0=1c rec1=00 rec2=18 rec3=080 [0x18] rec0=1c rec1=00 rec2=19 rec3=010 [0x19] rec0=1a rec1=00 rec2=1a rec3=036 [0x1a] rec0=16 rec1=00 rec2=1b rec3=090 [0x1b] rec0=11 rec1=00 rec2=1c rec3=000 tail 0x21700648281978043514c 0x42a00088462063203