DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦f421d4b03⟧ Ada Source

    Length: 58368 (0xe400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Draw, seg_00535b

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦5a81ac88f⟧ »Space Info Vol 1« 
        └─⟦this⟧ 

E3 Source Code



with Text_Io;

with Board;  
use Board;  
with Button;  
use Button;  
with Main;  
use Main;  
with Tile;  
use Tile;

with Xlbt_Arithmetic;  
use Xlbt_Arithmetic;  
with Xlbt_Basic;  
use Xlbt_Basic;  
with Xlbt_Event;  
use Xlbt_Event;  
with Xlbt_Graphics;  
use Xlbt_Graphics;  
with Xlbt_String;  
use Xlbt_String;

with Xlbp_Event;  
use Xlbp_Event;  
with Xlbp_Graphics;  
use Xlbp_Graphics;

package body Draw is
------------------------------------------------------------------------------
-- Dragon - a version of Mah-Jongg for X Windows
--
-- Author: Gary E. Barnes        May 1989
--
-- Draw - Deals with the Mah-Jongg board.  Setup and drawing.
------------------------------------------------------------------------------
-- 05/30/90 GEB  - Translate to Ada
------------------------------------------------------------------------------

----Index into this array using a tile number in order to get the procedure
--  that knows how to draw the face of that tile.

    type Draw_Xyz is (Do_Draw_Error, Do_Draw_Spring, Do_Draw_Summer,  
                      Do_Draw_Fall, Do_Draw_Winter, Do_Draw_Bamboo, Do_Draw_Mum,  
                      Do_Draw_Orchid, Do_Draw_Plum, Do_Draw_Gdragon,  
                      Do_Draw_Rdragon, Do_Draw_Wdragon, Do_Draw_East,  
                      Do_Draw_West, Do_Draw_North, Do_Draw_South, Do_Draw_Bam1,  
                      Do_Draw_Bam2, Do_Draw_Bam3, Do_Draw_Bam4, Do_Draw_Bam5,  
                      Do_Draw_Bam6, Do_Draw_Bam7, Do_Draw_Bam8, Do_Draw_Bam9,  
                      Do_Draw_Dot1, Do_Draw_Dot2, Do_Draw_Dot3, Do_Draw_Dot4,  
                      Do_Draw_Dot5, Do_Draw_Dot6, Do_Draw_Dot7, Do_Draw_Dot8,  
                      Do_Draw_Dot9, Do_Draw_Crak1, Do_Draw_Crak2, Do_Draw_Crak3,  
                      Do_Draw_Crak4, Do_Draw_Crak5, Do_Draw_Crak6,  
                      Do_Draw_Crak7, Do_Draw_Crak8, Do_Draw_Crak9);

    type Draw_Xyz_Array is array (S_Long range 0 .. N_Faces) of Draw_Xyz;

    Faces : Draw_Xyz_Array :=  
       (Do_Draw_Error,

        Do_Draw_Spring, Do_Draw_Summer, Do_Draw_Fall, Do_Draw_Winter,

        Do_Draw_Bamboo, Do_Draw_Mum, Do_Draw_Orchid, Do_Draw_Plum,

        Do_Draw_Gdragon, Do_Draw_Rdragon, Do_Draw_Wdragon,

        Do_Draw_East, Do_Draw_West, Do_Draw_North, Do_Draw_South,

        Do_Draw_Bam1, Do_Draw_Bam2, Do_Draw_Bam3, Do_Draw_Bam4, Do_Draw_Bam5,  
        Do_Draw_Bam6, Do_Draw_Bam7, Do_Draw_Bam8, Do_Draw_Bam9,

        Do_Draw_Dot1, Do_Draw_Dot2, Do_Draw_Dot3, Do_Draw_Dot4, Do_Draw_Dot5,  
        Do_Draw_Dot6, Do_Draw_Dot7, Do_Draw_Dot8, Do_Draw_Dot9,

        Do_Draw_Crak1, Do_Draw_Crak2, Do_Draw_Crak3, Do_Draw_Crak4,  
        Do_Draw_Crak5, Do_Draw_Crak6, Do_Draw_Crak7, Do_Draw_Crak8,  
        Do_Draw_Crak9  
        );

    procedure Draw_Error is  
    begin  
        Text_Io.Put_Line ("Drew tile face 0??");  
        return;  
    end Draw_Error;

--\x0c
    procedure Call (What : Draw_Xyz;  
                    X    : S_Short;  
                    Y    : S_Short) is  
    begin  
        case What is  
            when Do_Draw_Error =>  
                Draw_Error;  
            when Do_Draw_Spring =>  
                Draw_Spring (X, Y);  
            when Do_Draw_Summer =>  
                Draw_Summer (X, Y);  
            when Do_Draw_Fall =>  
                Draw_Fall (X, Y);  
            when Do_Draw_Winter =>  
                Draw_Winter (X, Y);  
            when Do_Draw_Bamboo =>  
                Draw_Bamboo (X, Y);  
            when Do_Draw_Mum =>  
                Draw_Mum (X, Y);  
            when Do_Draw_Orchid =>  
                Draw_Orchid (X, Y);  
            when Do_Draw_Plum =>  
                Draw_Plum (X, Y);  
            when Do_Draw_Gdragon =>  
                Draw_Gdragon (X, Y);  
            when Do_Draw_Rdragon =>  
                Draw_Rdragon (X, Y);  
            when Do_Draw_Wdragon =>  
                Draw_Wdragon (X, Y);  
            when Do_Draw_East =>  
                Draw_East (X, Y);  
            when Do_Draw_West =>  
                Draw_West (X, Y);  
            when Do_Draw_North =>  
                Draw_North (X, Y);  
            when Do_Draw_South =>  
                Draw_South (X, Y);  
            when Do_Draw_Bam1 =>  
                Draw_Bam1 (X, Y);  
            when Do_Draw_Bam2 =>  
                Draw_Bam2 (X, Y);  
            when Do_Draw_Bam3 =>  
                Draw_Bam3 (X, Y);  
            when Do_Draw_Bam4 =>  
                Draw_Bam4 (X, Y);  
            when Do_Draw_Bam5 =>  
                Draw_Bam5 (X, Y);  
            when Do_Draw_Bam6 =>  
                Draw_Bam6 (X, Y);  
            when Do_Draw_Bam7 =>  
                Draw_Bam7 (X, Y);  
            when Do_Draw_Bam8 =>  
                Draw_Bam8 (X, Y);  
            when Do_Draw_Bam9 =>  
                Draw_Bam9 (X, Y);  
            when Do_Draw_Dot1 =>  
                Draw_Dot1 (X, Y);  
            when Do_Draw_Dot2 =>  
                Draw_Dot2 (X, Y);  
            when Do_Draw_Dot3 =>  
                Draw_Dot3 (X, Y);  
            when Do_Draw_Dot4 =>  
                Draw_Dot4 (X, Y);  
            when Do_Draw_Dot5 =>  
                Draw_Dot5 (X, Y);  
            when Do_Draw_Dot6 =>  
                Draw_Dot6 (X, Y);  
            when Do_Draw_Dot7 =>  
                Draw_Dot7 (X, Y);  
            when Do_Draw_Dot8 =>  
                Draw_Dot8 (X, Y);  
            when Do_Draw_Dot9 =>  
                Draw_Dot9 (X, Y);  
            when Do_Draw_Crak1 =>  
                Draw_Crak1 (X, Y);  
            when Do_Draw_Crak2 =>  
                Draw_Crak2 (X, Y);  
            when Do_Draw_Crak3 =>  
                Draw_Crak3 (X, Y);  
            when Do_Draw_Crak4 =>  
                Draw_Crak4 (X, Y);  
            when Do_Draw_Crak5 =>  
                Draw_Crak5 (X, Y);  
            when Do_Draw_Crak6 =>  
                Draw_Crak6 (X, Y);  
            when Do_Draw_Crak7 =>  
                Draw_Crak7 (X, Y);  
            when Do_Draw_Crak8 =>  
                Draw_Crak8 (X, Y);  
            when Do_Draw_Crak9 =>  
                Draw_Crak9 (X, Y);  
        end case;

    end Call;
--\x0c
    procedure Hilite_Tile (Row : S_Short;  
                           Col : S_Short) is
------------------------------------------------------------------------------
--   row - Specifies the row of the tile to hilite
--   col - specifies the column of the tile to hilite
--
-- Called to hilite a tile face.
------------------------------------------------------------------------------
        Bp : Board_Position renames Board_Tiles (Row, Col);  
        Pnts : X_Point_Array (0 .. 19);  
        Pnti : S_Long := 0;  
        X, Y : S_Short;  
        W, H : S_Short;  
        Left, Bottom, Left_Bottom : S_Short;

        procedure Pnt (X, Y : S_Short) is  
        begin  
            Pnts (Pnti).X := X;  
            Pnts (Pnti).Y := Y;  
            Pnti          := Pnti + 1;  
        end Pnt;

    begin

----See if we are one of the very special tiles on top.

        if Board_Tiles (Spec4_Row, Spec4_Col).Level > 0 then  
            if Row = 3 then  
                if Col = 6 then  
                    X := Bp.X + Side_X * 4 + 1;  
                    Y := Bp.Y - Side_Y * 4 + 1;  
                    W := Tile_Width / 2;  
                    H := Tile_Height / 2;  
                    Pnt (X, Y);  
                    Pnt (Tile_Width, 0);  
                    Pnt (0, H - 1);  
                    Pnt (-(W + 1), 0);  
                    Pnt (0, H + 1);  
                    Pnt (-(W - 1), 0);  
                    Pnt (0, -Tile_Height);  
                    goto Hilite;  
                elsif Col = 7 then  
                    X := Bp.X + Side_X * 4 + 1;  
                    Y := Bp.Y - Side_Y * 4 + 1;  
                    W := Board_Tiles (3, 7).X -  
                            Board_Tiles (Spec4_Row, Spec4_Col).X + 3 * Side_X;  
                    H := Tile_Height / 2;  
                    Pnt (X, Y);  
                    Pnt (Tile_Width, 0);  
                    Pnt (0, Tile_Height);  
                    Pnt (-W, 0);  
                    Pnt (0, -(H + 1));  
                    Pnt (-(Tile_Width - W), 0);  
                    Pnt (0, -(H - 1));  
                    goto Hilite;  
                end if;  
            elsif Row = 4 then  
                if Col = 6 then  
                    X := Bp.X + Side_X * 4 + 1;  
                    Y := Bp.Y - Side_Y * 4 + 1;  
                    W := Tile_Width / 2;  
                    H := Tile_Height / 2;  
                    Pnt (X, Y);  
                    Pnt (W - 1, 0);  
                    Pnt (0, H + Side_Y);  
                    Pnt (W + 1, 0);  
                    Pnt (0, H - Side_Y);  
                    Pnt (-Tile_Width, 0);  
                    Pnt (0, -Tile_Height);  
                    goto Hilite;  
                elsif Col = 7 then  
                    X := Bp.X + Side_X * 4 + 1;  
                    Y := Bp.Y - Side_Y * 4 + 1;  
                    W := Board_Tiles (4, 7).X -  
                            Board_Tiles (Spec4_Row, Spec4_Col).X + 3 * Side_X;  
                    H := Tile_Height / 2;  
                    Pnt (X + (Tile_Width - W), Y);  
                    Pnt (W, 0);  
                    Pnt (0, Tile_Height);  
                    Pnt (-Tile_Width, 0);  
                    Pnt (0, -(H - Side_Y));  
                    Pnt ((Tile_Width - W), 0);  
                    Pnt (0, -(H + Side_Y));  
                    goto Hilite;  
                end if;  
            end if;  
        end if;

----We are a normal tile that may be partially overlapped by some other
--  normal tile.

        X := Bp.X + Side_X * Bp.Level + 1;  
        Y := Bp.Y - Side_Y * Bp.Level + 1;  
        W := Tile_Width;  
        H := Tile_Height;  
        if Col > 0 then  
            Left := Board_Tiles (Row, Col - 1).Level - Bp.Level;  
            if Left < 0 then  
                Left := 0;  
            end if;  
            if Row < 7 then  
                Left_Bottom := Board_Tiles (Row + 1, Col - 1).Level - Bp.Level;  
                if Left_Bottom < 0 then  
                    Left_Bottom := 0;  
                end if;  
            else  
                Left_Bottom := 0;  
            end if;  
        else  
            Left        := 0;  
            Left_Bottom := 0;  
        end if;  
        if Row < 7 then  
            Bottom := Board_Tiles (Row + 1, Col).Level - Bp.Level;  
            if Bottom < 0 then  
                Bottom := 0;  
            end if;  
        else  
            Bottom := 0;  
        end if;  
        if Bottom > Left_Bottom and then Tile_Width = 28 then  
            Left_Bottom := Bottom;  
        end if;  
        if Left > 0 then  
            W := Left * Side_X;  
        else  
            W := 0;  
        end if;  
        Pnt (X + W, Y);  
        Pnt ((Tile_Width - W), 0);  
        if Bottom > 0 then  
            H := Bottom * Side_Y;  
        else  
            H := 0;  
        end if;  
        Pnt (0, (Tile_Height - H));  
        if Left_Bottom <= Left and then Left_Bottom <= Bottom then  
            Pnt (-(Tile_Width - Bottom * Side_X), 0);  
            if Left /= Bottom then  
                Pnt ((Left - Bottom) * Side_X, (Bottom - Left) * Side_Y);  
            end if;  
            Pnt (0, -(Tile_Height - H));  
        elsif Left_Bottom <= Left then   -- left_bottom > bottom
            Pnt (-(Tile_Width - Left_Bottom * Side_X), 0);  
            if Left_Bottom /= Left then  
                Pnt (0, (Bottom - Left_Bottom) * Side_Y);  
                Pnt ((Left - Left_Bottom) * Side_X,  
                     (Left_Bottom - Left) * Side_Y);  
                Pnt (0, -(Tile_Height - Left * Side_Y));  
            else  
                Pnt (0, -(Tile_Height - H));  
            end if;  
        elsif Left_Bottom <= Bottom then -- left_bottom > left
            if Left_Bottom = Bottom then  
                Pnt (-(Tile_Width - W), 0);  
                Pnt (0, -(Tile_Height - H));  
            else  
                Pnt (-(Tile_Width - Bottom * Side_X), 0);  
                Pnt ((Left_Bottom - Bottom) * Side_X,  
                     (Bottom - Left_Bottom) * Side_Y);  
                Pnt (-Left_Bottom * Side_X, 0);  
                Pnt (0, -(Tile_Height - Left_Bottom * Side_Y));  
            end if;  
        else            -- left_bottom > bottom && left_bottom > left
            Pnt (-(Tile_Width - Left_Bottom * Side_X), 0);  
            Pnt (0, (Bottom - Left_Bottom) * Side_Y);  
            Pnt ((Left - Left_Bottom) * Side_X, 0);  
            Pnt (0, -(Tile_Height - Left_Bottom * Side_Y));  
        end if;

----Now do it.

        <<Hilite>> null;  
        X_Fill_Polygon (Dpy, Main.Board.Drawable, Xor_Gc,  
                        Pnts (0 .. Pnti - 1), Convex, Coord_Mode_Previous);

    end Hilite_Tile;

--\x0c
    procedure Clear_Tile (Bp      : Board_Position;  
                          Pleft   : S_Short;  
                          Pbottom : S_Short) is
------------------------------------------------------------------------------
--   bp      - Specifies the Board_Position to draw
--   left    - Specifies the level of the tile on the left of this thile
--   bottom  - Specifies the level of the tile at the bottom of this tile
--
-- We clear (make totally white) the space occupied by the image of this tile.
-- We clear the face and the left and bottom sides.  Any shadowing caused by
-- the last drawing of this tile is the responsibility of the caller.
------------------------------------------------------------------------------
        Left   : S_Short := Pleft;  
        Bottom : S_Short := Pbottom;  
        Poly   : X_Point_Array (0 .. 9);  
        Polyi  : S_Natural;

        procedure Pnt (Xx, Yy : S_Short) is  
        begin  
            Poly (Polyi).X := (Xx);  
            Poly (Polyi).Y := (Yy);  
            Polyi          := Polyi + 1;  
        end Pnt;

    begin

----We will circle the tile outline clockwise.

        Polyi := 0;

----Start with the upper left corner of the tile side. This is the "bottom"
--  of that tile side if it has one. Leave x/y at the upper-left corner of the
--  tile face.

        if Left >= Bp.Level then  
            Left := Bp.Level;  
            Pnt (Bp.X + Side_X * Bp.Level, Bp.Y - Side_Y * Bp.Level);  
        else  
            Pnt (Bp.X + Side_X * Left, Bp.Y - Side_Y * Left);  
            Pnt (Side_X * (Bp.Level - Left), -Side_Y * (Bp.Level - Left));  
        end if;

----Cross the top and the right side of the tile.

        Pnt (Tile_Width + 1, 0);  
        Pnt (0, Tile_Height + 1);

----Now do the bottom side of the tile.

        if Bottom < Bp.Level then  
            Pnt (-Side_X * (Bp.Level - Bottom), Side_Y * (Bp.Level - Bottom));  
        else  
            Bottom := Bp.Level;  
        end if;  
        Pnt (-(Tile_Width + 1), 0);

----Now go up the left side of the tile.

        if Left /= Bottom then  
            Pnt (Side_X * (Left - Bottom), -Side_Y * (Left - Bottom));  
        end if;  
        Pnt (0, -(Tile_Height + 1));

----Do the actual clearing.

        X_Fill_Polygon (Dpy, Main.Board.Drawable, Reverse_Gc,  
                        Poly (0 .. Polyi - 1), Convex, Coord_Mode_Previous);

    end Clear_Tile;

--\x0c
    procedure Tile (Row : S_Short;  
                    Col : S_Short) is
------------------------------------------------------------------------------
--   row           - Specifies the tile to draw
--   col           - Specifies the tile to draw
--
-- Called to draw a tile.  We draw the face, the sides, and the shadow.
------------------------------------------------------------------------------
        Bp            : Board_Position renames Board_Tiles (Row, Col);  
        Poly          : X_Point_Array (0 .. 99);  
        Polyi         : S_Natural;  
        Left          : S_Short;  
        Bottom        : S_Short;  
        Curx          : S_Short;  
        Cury          : S_Short;  
        Sidex         : S_Short;  
        Sidey         : S_Short;  
        I, J, K, L, M : S_Short;

        L_Segs : constant := 7; -- keep this an odd number
        R_Segs : constant := 6; -- keep this an even number

        procedure Pnt (Xx, Yy : S_Short) is  
        begin  
            Poly (Polyi).X := (Xx);  
            Poly (Polyi).Y := (Yy);  
            Polyi          := Polyi + 1;  
        end Pnt;

    begin

----This tile no longer needs drawing.

        Bp.Draw := False;

----Determine the level of the tile on the left of this tile.

        if Col > 0 then  
            if Col = Spec1_Col and then Row = Spec1_Row then  
                Left := Board_Tiles (Spec2_Row, Spec2_Col).Level;  
            elsif Col = Spec2_Col and then Row = Spec2_Row then  
                if Board_Tiles (3, 12).Level = 0 or else  
                   Board_Tiles (4, 12).Level = 0 then  
                    Left := 0;  
                else  
                    Left := 1;  
                end if;  
            else  
                Left := Board_Tiles (Row, Col - 1).Level;  
            end if;  
        else  
            Left := 0;  
        end if;

----Determine the level of the tile at the bottom of this tile.

        if Row < 7 then  
            Bottom := Board_Tiles (Row + 1, Col).Level;  
        else  
            Bottom := 0;  
        end if;

----Clear the area that will be covered by this tile.

        Clear_Tile (Bp, Left, Bottom);

----Draw the tile face.

        Call (Faces (S_Long (Bp.Tiles (S_Long (Bp.Level - 1)))),  
              Bp.X + Bp.Level * Side_X + 1, Bp.Y - Bp.Level * Side_Y + 1);

----Now draw the tile edges.

        if (Tile_Control and Blackside) /= 0 then

----We want black/gray sides.

            X_Draw_Rectangle (Dpy, Main.Board.Drawable, Normal_Gc,  
                              Bp.X + Bp.Level * Side_X,  
                              Bp.Y - Bp.Level * Side_Y,  
                              U_Short (Tile_Width + 1),  
                              U_Short (Tile_Height + 1));

            if Left < Bp.Level then  
                Polyi := 0;  
                Pnt (Bp.X + Left * Side_X, Bp.Y - Left * Side_Y);  
                Pnt ((Bp.Level - Left) * Side_X, (Left - Bp.Level) * Side_Y);  
                Pnt (0, Tile_Height + 1);  
                Pnt ((Left - Bp.Level) * Side_X, (Bp.Level - Left) * Side_Y);  
                Pnt (0, -(Tile_Height + 1));  
                if (Tile_Control and Grayside) /= 0 then  
                    X_Fill_Polygon (Dpy, Main.Board.Drawable,  
                                    Gray_Gc, Poly (0 .. Polyi - 1),  
                                    Convex, Coord_Mode_Previous);  
                else  
                    X_Fill_Polygon (Dpy, Main.Board.Drawable,  
                                    Normal_Gc, Poly (0 .. Polyi - 1),  
                                    Convex, Coord_Mode_Previous);  
                end if;  
                X_Draw_Lines (Dpy, Main.Board.Drawable, Normal_Gc,  
                              Poly (0 .. Polyi - 1), Coord_Mode_Previous);  
            end if;  
            if Bottom < Bp.Level then  
                Polyi := 0;  
                Pnt (Bp.X + Bp.Level * Side_X,  
                     Bp.Y - Bp.Level * Side_Y + Tile_Height + 1);  
                Pnt (Tile_Width + 1, 0);  
                Pnt ((Bottom - Bp.Level) * Side_X,  
                     (Bp.Level - Bottom) * Side_Y);  
                Pnt (-(Tile_Width + 1), 0);  
                Pnt ((Bp.Level - Bottom) * Side_X,  
                     (Bottom - Bp.Level) * Side_Y);  
                if (Tile_Control and Grayside) /= 0 then  
                    X_Fill_Polygon (Dpy, Main.Board.Drawable,  
                                    Gray_Gc, Poly (0 .. Polyi - 1),  
                                    Convex, Coord_Mode_Previous);  
                else  
                    X_Fill_Polygon (Dpy, Main.Board.Drawable,  
                                    Normal_Gc, Poly (0 .. Polyi - 1),  
                                    Convex, Coord_Mode_Previous);  
                end if;  
                X_Draw_Lines (Dpy, Main.Board.Drawable, Normal_Gc,  
                              Poly (0 .. Polyi - 1), Coord_Mode_Previous);  
            end if;

----We want line'ed sides.

        else

            Polyi := 0;  
            if Left >= Bp.Level then  
                Pnt (Bp.X + Side_X * Bp.Level, Bp.Y - Side_Y * Bp.Level);  
            else

----First we draw the left side.  We leave x/y at the bottom left corner of
--  the tile face when we are done.

                Sidex := Side_X * (Bp.Level - Left);  
                Sidey := Side_Y * (Bp.Level - Left);  
                J     := Sidex;  
                if Tile_Width = 28 and then Bp.Level - Left = 1 then  
                    Pnt (Bp.X + Side_X * Left, Bp.Y - Side_Y * Left - Sidey);  
                    Pnt (0, Tile_Height + 1 + Sidey);  
                    K := 0;  
                else  
                    Pnt (Bp.X + Side_X * Left, Bp.Y - Side_Y * Left);  
                    Pnt (0, Tile_Height + 1);  
                    K := Sidey;  
                end if;  
                Pnt (Sidex, -Sidey);  
                I := Tile_Height / (L_Segs + 1);  
                M := Tile_Height - I * (L_Segs + 1);  
                for L in reverse 1 .. L_Segs loop  
                    Cury := -I;  
                    if M > 0 then  
                        Cury := Cury - 1;  
                        M    := M - 1;  
                    end if;  
                    Pnt (0, Cury);  
                    Pnt (-J, K);  
                    J := -J;  
                    K := -K;  
                end loop;  
                Pnt (0, -I - 1);  
                Pnt (Sidex, K);  
            end if;  
            Pnt (0, Tile_Height + 1);

----Draw the left edge of the tile and then draw the bottom side of the tile.
--  We leave x/y at the bottom right corner of the tile face when we are done.

            if Bottom < Bp.Level then  
                Sidex := Side_X * (Bp.Level - Bottom);  
                Sidey := Side_Y * (Bp.Level - Bottom);  
                I     := Tile_Width / (R_Segs + 1);  
                M     := Tile_Width - I * (R_Segs + 1);  
                if Tile_Width = 28 and then Bp.Level - Bottom = 1 then  
                    J := 0;  
                else  
                    J := Sidex;  
                end if;  
                K := Sidey;  
                for L in reverse 1 .. R_Segs loop  
                    Curx := I;  
                    if M > 0 then  
                        Curx := Curx + 1;  
                        M    := M - 1;  
                    end if;  
                    Pnt (Curx, 0);  
                    Pnt (-J, K);  
                    J := -J;  
                    K := -K;  
                end loop;  
                Pnt (I + 1, 0);  
                Pnt (-J, Sidey);  
                Pnt (-(Tile_Width + 1 + Sidex - J), 0);  
                Pnt (Sidex, -Sidey);  
            end if;  
            Pnt (Tile_Width + 1, 0);

----Draw the right side.

            Pnt (0, -(Tile_Height + 1));

----Draw the top side.

            Pnt (-(Tile_Width + 1), 0);

----Draw all of those edges.

            if (Tile_Control and Grayside) /= 0 then  
                X_Draw_Lines (Dpy, Main.Board.Drawable, Gray_Gc,  
                              Poly (0 .. Polyi - 1), Coord_Mode_Previous);  
            else  
                X_Draw_Lines (Dpy, Main.Board.Drawable, Normal_Gc,  
                              Poly (0 .. Polyi - 1), Coord_Mode_Previous);  
            end if;  
        end if;

----Now draw the tile shadow.

        if (Tile_Control and Shadow) /= 0 then  
            declare  
                Top       : S_Short;  
                Right     : S_Short;  
                Top_Right : Boolean;  
            begin

----Determine the level of the tile on the right of this tile.

                if Col = Spec1_Col then  
                    if Row = Spec2_Row then  
                        Right := Board_Tiles (Spec1_Row, Spec1_Col).Level;  
                    elsif Row = Spec3_Row then  
                        Right := 0;  
                    else  
                        Right := 0;  
                    end if;  
                else  
                    Right := Board_Tiles (Row, Col + 1).Level;  
                end if;

----Determine the level of the tile at the top of this tile.

                if Row > 0 then  
                    Top := Board_Tiles (Row - 1, Col).Level;  
                else  
                    Top := 0;  
                end if;

----Do we have an upper-right tile?

                if Row > 0 and then  
                   Board_Tiles (Row - 1, Col + 1).Level >= Bp.Level then  
                    Top_Right := True;  
                elsif Row = Spec3_Row and then Col = Spec3_Col and then  
                      Board_Tiles (3, 1).Level > 0 then  
                    Top_Right := True;  
                elsif Row = 4 and then Col = 12 and then  
                      Board_Tiles (Spec2_Row, Spec2_Col).Level > 0 then  
                    Top_Right := True;  
                else  
                    Top_Right := False;  
                end if;

----Draw the upper shadow if necessary.

                if Top < Bp.Level then  
                    Polyi := 0;  
                    Pnt (Bp.X + Bp.Level * Side_X - 1,  
                         Bp.Y - Bp.Level * Side_Y);  
                    Pnt (Shadow_X, -Shadow_Y);  
                    if Top_Right then  
                        I := Shadow_X;  
                    else  
                        I := 0;  
                    end if;  
                    Pnt (Tile_Width + 3 - I, 0);  
                    Pnt (-(Shadow_X - I), Shadow_Y);  
                    Pnt (-(Tile_Width + 3), 0);  
                    X_Fill_Polygon (Dpy, Main.Board.Drawable,  
                                    Over_Gc, Poly (0 .. Polyi - 1),  
                                    Convex, Coord_Mode_Previous);  
                end if;

----Now work on the right shadow.  It may need to be drawn in pieces.

                Polyi := 0;

----If SPEC3 has both neighbors then don't draw the right shadow.

                if Row = Spec3_Row and then Col = Spec3_Col then  
                    if Board_Tiles (3, 1).Level > 0 then  
                        if Board_Tiles (4, 1).Level > 0 then  
                            Right := Bp.Level;

----If SPEC3 has only the upper neighbor then draw just the lower shadow.

                        else  
                            I := Bp.Y - Board_Tiles (3, 1).Y;  
                            Pnt (Board_Tiles (4, 1).X + Side_X,  
                                 Board_Tiles (4, 1).Y);  
                            Pnt (Shadow_X, 0);  
                            Pnt (0, I - Shadow_Y);  
                            Pnt (-Shadow_X, Shadow_Y);  
                            Pnt (0, -I);  
                            Right := Bp.Level;  
                        end if;

----If SPEC3 has only the lower neighbor then draw just the upper shadow.

                    elsif Board_Tiles (4, 1).Level > 0 then  
                        I := Board_Tiles (4, 1).Y - Bp.Y;  
                        Pnt (Bp.X + Bp.Level * Side_X + Tile_Width + 1 + 1,  
                             Bp.Y - Bp.Level * Side_Y);  
                        Pnt (Shadow_X, -Shadow_Y);  
                        Pnt (0, I + Shadow_Y);  
                        Pnt (-Shadow_X, 0);  
                        Pnt (0, -I);  
                        Right := Bp.Level;  
                    end if;

----If SPEC2's upper neighbor is there then draw that tile's upper shadow.

                elsif Row = 3 and then Col = 12 and then  
                      Board_Tiles (Spec2_Row, Spec2_Col).Level > 0 then  
                    I := Board_Tiles (Spec2_Row, Spec2_Col).Y - Bp.Y;  
                    Pnt (Bp.X + Bp.Level * Side_X + Tile_Width + 1 + 1,  
                         Bp.Y - Bp.Level * Side_Y);  
                    Pnt (Shadow_X, -Shadow_Y);  
                    Pnt (0, I + Shadow_Y);  
                    Pnt (-Shadow_X, 0);  
                    Pnt (0, -I);  
                    Right := Bp.Level;

----If SPEC2's lower neighbor is there then draw that tile's lower shadow.

                elsif Row = 4 and then Col = 12 and then  
                      Board_Tiles (Spec2_Row, Spec2_Col).Level > 0 then  
                    I := Bp.Y - Board_Tiles (Spec2_Row, Spec2_Col).Y;  
                    Pnt (Board_Tiles (Spec2_Row, Spec2_Col).X + Side_X,  
                         Board_Tiles (Spec2_Row, Spec2_Col).Y +  
                            Tile_Height + 1);  
                    Pnt (Shadow_X, 0);  
                    Pnt (0, I - Shadow_Y);  
                    Pnt (-Shadow_X, Shadow_Y);  
                    Pnt (0, -I);  
                    Right := Bp.Level;  
                end if;

----If required, draw a normal right shadow that may be truncated by an upper
--  right neighbor.

                if Right < Bp.Level then  
                    Polyi := 0;  
                    if Top_Right then  
                        I := Shadow_Y;  
                    else  
                        I := 0;  
                    end if;  
                    Pnt (Bp.X + Bp.Level * Side_X + Tile_Width + 1 + 1,  
                         Bp.Y - Bp.Level * Side_Y);  
                    Pnt (Shadow_X, -(Shadow_Y - I));  
                    Pnt (0, Tile_Height + 1 - I);  
                    Pnt (-Shadow_X, Shadow_Y);  
                    Pnt (0, -(Tile_Height + 1));  
                end if;

----Draw any right shadow that may have been requested.

                if Polyi > 0 then  
                    X_Fill_Polygon (Dpy, Main.Board.Drawable,  
                                    Over_Gc, Poly (0 .. Polyi - 1),  
                                    Convex, Coord_Mode_Previous);  
                end if;  
            end;  
        end if;

----Now check for hiliting.

        if Board_State /= S_Sample then  
            if Click1 = Bp then  
                Hilite_Tile (Click1_Row, Click1_Col);  
            elsif Click2 = Bp then  
                Hilite_Tile (Click2_Row, Click2_Col);  
            end if;  
        end if;

    end Tile;

--\x0c
    procedure Draw_All_Tiles is
------------------------------------------------------------------------------
-- Draws all visible tiles.
------------------------------------------------------------------------------
    begin

----Draw the rightmost special tiles.

        if Board_Tiles (Spec1_Row, Spec1_Col).Draw and then  
           Board_Tiles (Spec1_Row, Spec1_Col).Level > 0 then  
            Tile (Spec1_Row, Spec1_Col);  
        end if;  
        if Board_Tiles (Spec2_Row, Spec2_Col).Draw and then  
           Board_Tiles (Spec2_Row, Spec2_Col).Level > 0 then  
            Tile (Spec2_Row, Spec2_Col);  
        end if;

----Draw the current game.  Draw the normally placed tiles.

        for I in S_Short range 0 .. 7 loop  
            for J in reverse S_Short range 1 .. 12 loop  
                if Board_Tiles (I, J).Draw and then  
                   Board_Tiles (I, J).Level > 0 then  
                    Tile (I, J);  
                end if;  
            end loop;  
        end loop;

----Now draw the other special tiles.

        if Board_Tiles (Spec4_Row, Spec4_Col).Draw and then  
           Board_Tiles (Spec4_Row, Spec4_Col).Level > 0 then  
            Tile (Spec4_Row, Spec4_Col);  
        end if;  
        if Board_Tiles (Spec3_Row, Spec3_Col).Draw and then  
           Board_Tiles (Spec3_Row, Spec3_Col).Level > 0 then  
            Tile (Spec3_Row, Spec3_Col);  
        end if;  
        Draw_Score (Score,  
                    Board_Tile0_X + 14 * (Tile_Width + 1),  
                    Board_Tile0_Y + 8 * (Tile_Height + 1));

    end Draw_All_Tiles;

--\x0c
    procedure Sample (Face : S_Long;  
                      X    : S_Short;  
                      Y    : S_Short) is
------------------------------------------------------------------------------
-- Draw one sample tile.
------------------------------------------------------------------------------
    begin

        X_Draw_Rectangle (Dpy, Main.Board.Drawable, Normal_Gc, X, Y,  
                          U_Short (Tile_Width + 1), U_Short (Tile_Height + 1));  
        Call (Faces (Face), X + 1, Y + 1);

    end Sample;

--\x0c
    procedure Tile_Samples is
------------------------------------------------------------------------------
-- Called when we want to display all tiles as a sampler.
------------------------------------------------------------------------------
        X : S_Short := Board_Tile0_X + 2 * Tile_Width;  
        Y : S_Short := Board_Tile0_Y;  
    begin

----Clear the board.


----Draw sample tiles.

        Draw_Text ("Flower", Board_Tile0_X, Y);  
        Draw_Text ("Flower", Board_Tile0_X + 1, Y);  
        Sample (5, X + (Tile_Width + 1) * 0, Y);-- Draw_Bamboo
        Sample (6, X + (Tile_Width + 1) * 1, Y);-- Draw_Mum
        Sample (7, X + (Tile_Width + 1) * 2, Y);-- Draw_Orchid
        Sample (8, X + (Tile_Width + 1) * 3, Y);-- Draw_Plum

        Y := Y + Tile_Height + 1;  
        Draw_Text ("Season", Board_Tile0_X, Y);  
        Draw_Text ("Season", Board_Tile0_X + 1, Y);  
        Sample (1, X + (Tile_Width + 1) * 0, Y);-- Draw_Spring
        Sample (2, X + (Tile_Width + 1) * 1, Y);-- Draw_Summer
        Sample (3, X + (Tile_Width + 1) * 2, Y);-- Draw_Fall
        Sample (4, X + (Tile_Width + 1) * 3, Y);-- Draw_Winter

        Y := Y + Tile_Height + 1;  
        Draw_Text ("Dragon", Board_Tile0_X, Y);  
        Draw_Text ("Dragon", Board_Tile0_X + 1, Y);  
        Sample (10, X + (Tile_Width + 1) * 1, Y);-- Draw_RDragon
        Sample (11, X + (Tile_Width + 1) * 2, Y);-- Draw_WDragon
        Sample (9, X + (Tile_Width + 1) * 0, Y); -- Draw_GDragon

        Y := Y + Tile_Height + 1;  
        Draw_Text ("Wind", Board_Tile0_X, Y);  
        Draw_Text ("Wind", Board_Tile0_X + 1, Y);  
        Sample (12, X + (Tile_Width + 1) * 0, Y);-- Draw_East
        Sample (13, X + (Tile_Width + 1) * 1, Y);-- Draw_West
        Sample (14, X + (Tile_Width + 1) * 2, Y);-- Draw_North
        Sample (15, X + (Tile_Width + 1) * 3, Y);-- Draw_South

        Y := Y + Tile_Height + 1;  
        Draw_Text ("Bam", Board_Tile0_X, Y);  
        Draw_Text ("Bam", Board_Tile0_X + 1, Y);  
        Sample (16, X + (Tile_Width + 1) * 0, Y);-- Draw_Bam1
        Sample (17, X + (Tile_Width + 1) * 1, Y);-- Draw_Bam2
        Sample (18, X + (Tile_Width + 1) * 2, Y);-- Draw_Bam3
        Sample (19, X + (Tile_Width + 1) * 3, Y);-- Draw_Bam4
        Sample (20, X + (Tile_Width + 1) * 4, Y);-- Draw_Bam5
        Sample (21, X + (Tile_Width + 1) * 5, Y);-- Draw_Bam6
        Sample (22, X + (Tile_Width + 1) * 6, Y);-- Draw_Bam7
        Sample (23, X + (Tile_Width + 1) * 7, Y);-- Draw_Bam8
        Sample (24, X + (Tile_Width + 1) * 8, Y);-- Draw_Bam9

        Y := Y + Tile_Height + 1;  
        Draw_Text ("Dot", Board_Tile0_X, Y);  
        Draw_Text ("Dot", Board_Tile0_X + 1, Y);  
        Sample (25, X + (Tile_Width + 1) * 0, Y);-- Draw_Dot1
        Sample (26, X + (Tile_Width + 1) * 1, Y);-- Draw_Dot2
        Sample (27, X + (Tile_Width + 1) * 2, Y);-- Draw_Dot3
        Sample (28, X + (Tile_Width + 1) * 3, Y);-- Draw_Dot4
        Sample (29, X + (Tile_Width + 1) * 4, Y);-- Draw_Dot5
        Sample (30, X + (Tile_Width + 1) * 5, Y);-- Draw_Dot6
        Sample (31, X + (Tile_Width + 1) * 6, Y);-- Draw_Dot7
        Sample (32, X + (Tile_Width + 1) * 7, Y);-- Draw_Dot8
        Sample (33, X + (Tile_Width + 1) * 8, Y);-- Draw_Dot9

        Y := Y + Tile_Height + 1;  
        Draw_Text ("Crak", Board_Tile0_X, Y);  
        Draw_Text ("Crak", Board_Tile0_X + 1, Y);  
        Sample (34, X + (Tile_Width + 1) * 0, Y);-- Draw_Crak1
        Sample (35, X + (Tile_Width + 1) * 1, Y);-- Draw_Crak2
        Sample (36, X + (Tile_Width + 1) * 2, Y);-- Draw_Crak3
        Sample (37, X + (Tile_Width + 1) * 3, Y);-- Draw_Crak4
        Sample (38, X + (Tile_Width + 1) * 4, Y);-- Draw_Crak5
        Sample (39, X + (Tile_Width + 1) * 5, Y);-- Draw_Crak6
        Sample (40, X + (Tile_Width + 1) * 6, Y);-- Draw_Crak7
        Sample (41, X + (Tile_Width + 1) * 7, Y);-- Draw_Crak8
        Sample (42, X + (Tile_Width + 1) * 8, Y);-- Draw_Crak9

        X_Flush (Dpy);

    end Tile_Samples;

--\x0c
    procedure Show_Samples (Event : X_Button_Press_Event) is
------------------------------------------------------------------------------
-- Called when the Samples button is presses.  Display or un-display the sample
-- tiles.
------------------------------------------------------------------------------
    begin

        X_Clear_Area (Dpy, Main.Board, 0,  
                      Board_Tile0_Y - Side_Y - Shadow_Y, 0, 0, False);  
        if Board_State = S_Play then  
            Board_State := S_Sample;  
            Tile_Samples;  
        else  
            Board_State := S_Play;  
            Board_Expose;  
        end if;

    end Show_Samples;

--\x0c
    procedure Board_Expose is
------------------------------------------------------------------------------
-- Called when the Board receives an Expose event.
------------------------------------------------------------------------------
        Success : X_Status;  
        Event2  : X_Event;  
    begin

---Draw the correct stuff.  We might not want the current game.

        if Board_State = S_Sample then  
           Tile_Samples;  
            return;  
        end if;

----Draw the entire board.

        for I in S_Short range 0 .. N_Rows - 1 loop  
            for J in S_Short range 0 .. N_Cols - 1 loop  
                if Board_Tiles (I, J).Level > 0 then  
                    Board_Tiles (I, J).Draw := True;  
                end if;  
            end loop;  
        end loop;  
        Draw_All_Tiles;

----Make sure that it all goes out to the server.

        X_Flush (Dpy);

----Getting multiple events; at least when we start.

        loop  
            X_Check_Typed_Event (Dpy, Expose, Event2, Success);  
            if Success /= Successful then  
                exit;  
            end if;  
        end loop;

    end Board_Expose;

--\x0c
    procedure Board_Configure (Event : X_Configure_Notify_Event) is
------------------------------------------------------------------------------
-- Called when the Board receives a ConfigureNotify event.
------------------------------------------------------------------------------
        Old_Height : S_Short := Tile_Height;  
    begin

----Calculate the new Board size.

        Board_Width  := S_Short (Event.Configure.Width);  
        Board_Height := S_Short (Event.Configure.Height);  
        Tile_Width   := (Board_Width - 9) / 15 - 1;  
        Tile_Height  := (Board_Height - 9) / 10 - 1;

----Pick a tile size based upon the size of the board.

        if Tile_Width >= 80 and then Tile_Height >= 96 then  
            Tile_Width  := 80;  
            Tile_Height := 96;  
            Configure_Tiles (5);  
        elsif Tile_Width >= 68 and then Tile_Height >= 80 then  
            Tile_Width  := 68;  
            Tile_Height := 80;  
            Configure_Tiles (4);  
        elsif Tile_Width >= 56 and then Tile_Height >= 64 then  
            Tile_Width  := 56;  
            Tile_Height := 64;  
            Configure_Tiles (3);  
        elsif Tile_Width >= 40 and then Tile_Height >= 48 then  
            Tile_Width  := 40;  
            Tile_Height := 48;  
            Configure_Tiles (2);  
        else  
            Tile_Width  := 28;  
            Tile_Height := 32;  
            Configure_Tiles (1);  
        end if;

----Figure the real 0,0 coordinate.

        Board_Tile0_X := 4;  
        Board_Tile0_Y := 4 + 2 * Tile_Height;

----Figure the Shadow and Side sizes.

        Shadow_X := Tile_Width / 10;  
        Shadow_Y := Tile_Height / 10;  
        Side_X   := (Tile_Width / 10) / 2 * 2;  
        Side_Y   := (Tile_Height / 10) / 2 * 2;

----See if we need to repaint.

        if Old_Height /= Tile_Height then  
            Do_Button_Configuration;  
            Set_Tile_Controls;  
            X_Clear_Area (Dpy, Main.Board, 0, 0, 0, 0, True);  
        end if;

    end Board_Configure;

--\x0c
    procedure Board_Setup is
------------------------------------------------------------------------------
-- Called to set up and create the Board widget.
------------------------------------------------------------------------------
--     static s_char actions() :=
--                             "<Expose>:    ButtonExpose() BoardExpose()\n\
--                              <Configure>: BoardConfigure()\n\
--                              <Btn1Down>:  ButtonPress() TilePress()\n\
--                              <Btn1Up>:    ButtonRelease() TileRelease()\n\
--                              <Btn2Down>:  TileHints()\n\
--                              <Btn3Down>:  TileRemove()\n";
    begin

----Define the various routines that we will be calling for various events
--  on the Board.

--     ACTION( "BoardConfigure",   Board_Configure );
--     ACTION( "BoardExpose",      Board_Expose );
--
--     ACTION( "ButtonExpose",     Button_Expose );
--     ACTION( "ButtonPress",      Button_Press );
--     ACTION( "ButtonRelease",    Button_Release );-
--     ACTION( "TileHints",        Hints );
--     ACTION( "TileRemove",       Tile_Remove );
--     ACTION( "TilePress",        Tile_Press );
--     ACTION( "TileRelease",      Tile_Release );

----Give the tiles a default initial size.

        declare  
            Event : X_Configure_Notify_Event;  
        begin  
            Event.Configure.Width  := U_Short (Board_Width);  
            Event.Configure.Height := U_Short (Board_Height);  
            Board_Configure (Event);  
        end;

----Give the buttons a default initial size based upon the Tile sizes.

        Do_Button_Configuration;

----Set up the initial game.

        Setup_New_Game;


    end Board_Setup;

--\x0c
end Draw;  

E3 Meta Data

    nblk1=38
    nid=0
    hdr6=70
        [0x00] rec0=29 rec1=00 rec2=01 rec3=00a
        [0x01] rec0=0f rec1=00 rec2=02 rec3=02a
        [0x02] rec0=1c rec1=00 rec2=03 rec3=010
        [0x03] rec0=1d rec1=00 rec2=04 rec3=02c
        [0x04] rec0=1b rec1=00 rec2=05 rec3=01a
        [0x05] rec0=1b rec1=00 rec2=06 rec3=016
        [0x06] rec0=1a rec1=00 rec2=07 rec3=01e
        [0x07] rec0=1d rec1=00 rec2=08 rec3=036
        [0x08] rec0=00 rec1=00 rec2=38 rec3=00e
        [0x09] rec0=17 rec1=00 rec2=09 rec3=030
        [0x0a] rec0=16 rec1=00 rec2=0a rec3=02a
        [0x0b] rec0=1e rec1=00 rec2=0b rec3=014
        [0x0c] rec0=00 rec1=00 rec2=37 rec3=00e
        [0x0d] rec0=1c rec1=00 rec2=0c rec3=052
        [0x0e] rec0=14 rec1=00 rec2=0d rec3=08a
        [0x0f] rec0=19 rec1=00 rec2=0e rec3=008
        [0x10] rec0=1c rec1=00 rec2=0f rec3=004
        [0x11] rec0=00 rec1=00 rec2=36 rec3=018
        [0x12] rec0=22 rec1=00 rec2=10 rec3=014
        [0x13] rec0=17 rec1=00 rec2=11 rec3=00c
        [0x14] rec0=02 rec1=00 rec2=35 rec3=034
        [0x15] rec0=20 rec1=00 rec2=12 rec3=04a
        [0x16] rec0=00 rec1=00 rec2=34 rec3=012
        [0x17] rec0=1d rec1=00 rec2=13 rec3=096
        [0x18] rec0=13 rec1=00 rec2=14 rec3=004
        [0x19] rec0=11 rec1=00 rec2=15 rec3=03e
        [0x1a] rec0=1a rec1=00 rec2=16 rec3=032
        [0x1b] rec0=01 rec1=00 rec2=33 rec3=004
        [0x1c] rec0=18 rec1=00 rec2=17 rec3=054
        [0x1d] rec0=00 rec1=00 rec2=32 rec3=006
        [0x1e] rec0=1a rec1=00 rec2=18 rec3=000
        [0x1f] rec0=01 rec1=00 rec2=31 rec3=014
        [0x20] rec0=20 rec1=00 rec2=19 rec3=00e
        [0x21] rec0=00 rec1=00 rec2=30 rec3=014
        [0x22] rec0=1a rec1=00 rec2=1a rec3=00e
        [0x23] rec0=17 rec1=00 rec2=1b rec3=05c
        [0x24] rec0=17 rec1=00 rec2=1c rec3=06c
        [0x25] rec0=16 rec1=00 rec2=1d rec3=054
        [0x26] rec0=14 rec1=00 rec2=1e rec3=008
        [0x27] rec0=1a rec1=00 rec2=1f rec3=006
        [0x28] rec0=1e rec1=00 rec2=20 rec3=018
        [0x29] rec0=1a rec1=00 rec2=21 rec3=008
        [0x2a] rec0=1a rec1=00 rec2=22 rec3=090
        [0x2b] rec0=1a rec1=00 rec2=23 rec3=030
        [0x2c] rec0=13 rec1=00 rec2=24 rec3=074
        [0x2d] rec0=12 rec1=00 rec2=25 rec3=048
        [0x2e] rec0=16 rec1=00 rec2=26 rec3=088
        [0x2f] rec0=1e rec1=00 rec2=27 rec3=008
        [0x30] rec0=00 rec1=00 rec2=2f rec3=002
        [0x31] rec0=21 rec1=00 rec2=28 rec3=066
        [0x32] rec0=1a rec1=00 rec2=29 rec3=00e
        [0x33] rec0=00 rec1=00 rec2=2d rec3=006
        [0x34] rec0=22 rec1=00 rec2=2e rec3=054
        [0x35] rec0=00 rec1=00 rec2=2a rec3=014
        [0x36] rec0=15 rec1=00 rec2=2b rec3=002
        [0x37] rec0=1d rec1=00 rec2=2c rec3=000
    tail 0x215009b548197877a327b 0x42a00088462063203