comp.lang.ada
 help / color / mirror / Atom feed
From: Mark Johnson <Mark_H_Johnson@Raytheon.com>
Subject: Query on portable bit extraction
Date: Fri, 26 Oct 2001 11:49:11 -0500
Date: 2001-10-26T11:49:11-05:00	[thread overview]
Message-ID: <3BD99406.62B13405@Raytheon.com> (raw)

We have code that we want to run on both a big (sgi) and little (pc)
endian machine. As an example, the layout of the data in memory is...
[big_endian bit order]
Byte  0 1 2 3 4 5 6 7
21 -  X X X Y Y Y Y Y
22 -  Y Y Z Z Z Z Z Z
where we need to extract XXX as the "wait code", YYYYYYY as the "value",
and ZZZZZZ is a pad area (don't care).

On the big endian machine it was coded like this...
 Wait := (byte 21) / 2**5;
 T1 := (move bytes from bytes 21 & 22)
 T2 := T1 / 2**6;
 T1 := T2 / 2**7;
 T1 := T1 * 2**7;
 Value := T2-T1;
which won't work on the PC unless we swap the bytes in the first
assignment to T1 and looks ugly as all get out.

Thinking of records & representation specifications, I'd like to be able
to do something like this...
  subtype Wv is Natural range 0..7;
  subtype Vv is Natural range 0..127;
  subtype Pv is Natural range 0..63;
  type Wait_Value is
    record
      Wait : Wv;
      Value : Vv;
      Pad : Pv;
    end record;
  for Wait_Value use
    record
      Wait at 0 range 0..2;
      Value at 0 range 3..9;
      Pad at 1 range 2..7;
    end record;
  for Wait_Value'Bit_Order use System.High_Order_First;
which looks pretty reasonable until I get the following GNAT error
messages on the PC...
 error: attempt to specify non-contiguous field not permitted
 error: (caused by non-standard Bit_Order specified)
Hmm. After drawing it out on the white board - sure enough, the bits are
not contiguous, a byte swap is needed. Assuming I do a byte swap
somewhere, I recode the representation specification to be...
  for Wait_Value use
    record
      Wait at 1 range 5..7;
      Value at 0 range 6..12;
      Pad at 0 range 0..5;
    end record;
(assuming System.Low_Order_First bit order) which works as expected.

So - I can probably code up a portable version based on...
 - byte swap or not based on System.Default_Bit_Order
 - representation specification also based on System.Default_Bit_Order
but is this the best way to do it or should I stick w/ the original
code?

Thanks.
  --Mark Johnson
  <mailto:Mark_H_Johnson@Raytheon.com>





             reply	other threads:[~2001-10-26 16:49 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-10-26 16:49 Mark Johnson [this message]
2001-10-26 17:08 ` Query on portable bit extraction Lutz Donnerhacke
2001-10-27  0:06 ` Jeffrey Carter
2001-10-27  4:23   ` Steven Deller
2001-10-27 16:31     ` Nick Roberts
2001-10-28  1:30       ` Jeffrey Carter
2001-10-28 19:07         ` Bit_Order useful [was Query on portable bit extraction] Nick Roberts
2001-10-29  1:23           ` Robert Dewar
2001-10-29  1:25       ` Query on portable bit extraction Robert Dewar
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox