TEAM-ADA Archives

Team Ada: Ada Programming Language Advocacy

TEAM-ADA@LISTSERV.ACM.ORG

Options: Use Forum View

Use Proportional Font
Show HTML Part by Default
Show All Mail Headers

Message: [<< First] [< Prev] [Next >] [Last >>]
Topic: [<< First] [< Prev] [Next >] [Last >>]
Author: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Subject:
From:
"Dale Jr, William" <[log in to unmask]>
Reply To:
Dale Jr, William
Date:
Fri, 16 Oct 1998 14:46:03 -0700
Content-Type:
text/plain
Parts/Attachments:
text/plain (90 lines)
OK, I'll try this .....

> ----------
> From:         Tucker Taft
> Reply To:     Tucker Taft
> Sent:         Friday, October 16, 1998 12:01
> To:   [log in to unmask]
> Subject:      Re: Use of attribute 'Bit_Order
>
> I would not rely on specifying the bit_order.  On the other hand,
> the value of the Default_Bit_Order constant can be useful in
> a record representation clause to control the bit positions you use,
> when combined with tricks using multiplication and Boolean'Pos().
> This is of course left as an exercise to the reader...
> -Tucker Taft
>
        ----------------

        How is this example?

with System ;
use System ;
procedure example is

-- What Tucker is alluding to is ....
--

   type Byte is mod 2 **  8;
   type Word is mod 2 ** 16;

   type Big_Endian is record
      A : Byte;
      B : Word;
      C : Byte;
   end record;

--    for Big_Endian use record
--       A at 0 range  0 ..  7;
--       B at 0 range  8 .. 23;
--       C at 0 range 24 .. 31;
--    end record;

   --  for Big_Endian'Bit_Order use System.High_Order_First;
   -- Not always supported !!!!

   -- Instead use :

   -- This is either 0 or 1 /  False or True
   Mult : constant Natural :=
     Boolean'Pos ( System.Default_Bit_Order = System.High_Order_First ) ;

   A_Low  : constant Natural :=  (Mult * 24) + 0 ;    -- 0  or 24
   A_High : constant Natural :=  (Mult * 24) + 7 ;    -- 7 or  31

   B_Low  : constant Natural :=   8 ;
   B_High : constant Natural :=  23 ;

   C_Low  : constant Natural :=  Natural ( (Mult * (-24)) + 24 ) ;
   -- 24 or 0
   C_High : constant Natural :=  Natural ( (Mult * (-24)) + 31 ) ;
   -- 31 or 7

   for Big_Endian use record
      A at 0 range  A_Low  .. A_High ;    -- 0..7   or   24..31
      B at 0 range  B_Low  .. B_High ;   -- 8..23        either way
      C at 0 range  C_Low  .. C_High ;   -- 24..31 or   0..7
   end record;

--
--
-- How's that ??? Who says you can't be clever in Ada ?
--
--


begin
   null ;

end Example;

        ---//---
"The difference between hardware and software is that the more you play with
hardware, the more likely you are to break it, but the more you play with
software the more likely you are to FIX it."
---//---
Bill Dale
LMMS
mailto:[log in to unmask]
mailto:[log in to unmask]

ATOM RSS1 RSS2