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

⟦a54575275⟧ Ada Source

    Length: 14336 (0x3800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Trame_Serie, seg_05191a

Derivation

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

E3 Source Code



with File_Attente;
with Simple_Io;
package body Trame_Serie is

    type Etat_Reception is (Etat_Attente, Etat_Traitement_Debut,  
                            Etat_Traitement_Taille, Etat_Recoit,
                            Etat_Traitement_Fin, Etat_Trame_Dispo);

    Occurence_Debut : Integer range 1 .. G_Defs.Debut_Trame'Length := 1;
    Occurence_Fin : Integer range 1 .. G_Defs.Fin_Trame'Length := 1;
    Occurence_Taille : Integer range 1 .. 2 := 1;
    Octet_Poids_Fort, Octet_Poids_Faible : G_Defs.Byte;
    Taille_A_Recevoir : Integer := 0;
    Trame_Reception : Trame_Serie.Objet;

    Etat_Recep : Etat_Reception := Etat_Attente;

    procedure Raz (Trame : in out Objet) is
    begin
        Trame.Nbre_Elements := 0;
        File.Raz (Trame.Contenu_Trame);
    end Raz;

    procedure Init is  
    begin
        Etat_Recep := Etat_Attente;
        Occurence_Debut := 1;
        Occurence_Fin := 1;
        Occurence_Taille := 1;
        Taille_A_Recevoir := 0;  
        Raz (Trame => Trame_Reception);
    end Init;

    function Calcul_Longueur_Trame
                (Octet_Poids_Fort : G_Defs.Byte;
                 Octet_Poids_Faible : G_Defs.Byte) return Integer is
        Poids_Fort, Poids_Faible : Integer;
    begin
        Poids_Fort := G_Defs.Byte'Pos (Octet_Poids_Fort) * 256;
        Poids_Faible := G_Defs.Byte'Pos (Octet_Poids_Faible);
        return Poids_Fort + Poids_Faible;
    end Calcul_Longueur_Trame;

    procedure Deposer (Trame : in out Objet; Octet : G_Defs.Byte) is
    begin  
        File.Enfiler (File_Attente => Trame.Contenu_Trame, Elem => Octet);
        Trame.Nbre_Elements := Trame.Nbre_Elements + 1;
    end Deposer;

    function Taille (Trame : Objet) return Integer is
    begin
        return Trame.Nbre_Elements;
    end Taille;

    procedure Extraire_Trame_Reception (Trame_A_Lire : out G_Defs.Byte_String;
                                        Taille : out Integer) is
        I : Integer := 0;  
    begin  
        while File.Est_Vide (File_Attente => Trame_Reception.Contenu_Trame) =
                 False loop
            I := I + 1;
            Trame_A_Lire (I) :=
               File.Element_Tete (File_Attente =>
                                     Trame_Reception.Contenu_Trame);
            File.Defiler (File_Attente => Trame_Reception.Contenu_Trame);
        end loop;
        Taille := I;
        --
        -- Apres extraction l'automate est de nouveau en Attente
        Init;
    end Extraire_Trame_Reception;

    function Construire_Trame_Reception
                (Octet : G_Defs.Byte) return Etat_Trame is
    begin  
        case Etat_Recep is
            --**********************
            --    Etat Attente
            --**********************
            when Etat_Attente =>
                if G_Defs.Egaux (Octet, G_Defs.Debut_Trame
                                           (G_Defs.Debut_Trame'First)) then
                    Etat_Recep := Etat_Traitement_Debut;
                    Occurence_Debut := Occurence_Debut + 1;
                end if;
                --**************************
                --    Etat Traitement_Debut
                --**************************
            when Etat_Traitement_Debut =>
                if G_Defs.Egaux
                      (G_Defs.Debut_Trame (Occurence_Debut), Octet) then
                    if Occurence_Debut = G_Defs.Debut_Trame'Length then
                        Etat_Recep := Etat_Traitement_Taille;
                        return Debut;
                    else
                        Occurence_Debut := Occurence_Debut + 1;
                    end if;
                else
                    Init;
                end if;

                --***************************
                --    Etat traitement taille
                --***************************
            when Etat_Traitement_Taille =>  
                if Occurence_Taille = 1 then
                    Octet_Poids_Fort := Octet;
                    Occurence_Taille := Occurence_Taille + 1;
                else
                    Taille_A_Recevoir := Calcul_Longueur_Trame
                                            (Octet_Poids_Fort, Octet);
                    if (Taille_A_Recevoir > Taille_Trame) then  
                        raise Taille_Trame_Trop_Grande;
                    else
                        Etat_Recep := Etat_Recoit;
                    end if;
                end if;

                --**********************
                --    Etat recoit
                --**********************
            when Etat_Recoit =>  
                Deposer (Trame => Trame_Reception, Octet => Octet);

                if Taille (Trame => Trame_Reception) = Taille_A_Recevoir then
                    Etat_Recep := Etat_Traitement_Fin;
                    -- IMPLEMENTER PARCE QUE PAS DE DELAI VALIDE
                    -- A SUPPRIMER AVEC TIMEOUT IMPLEMENTER
                elsif G_Defs.Egaux (G_Defs.Fin_Trame (1), Octet) then  
                    raise Erreur_Sur_Trame;
                end if;




                --*************************
                --    Etat traitement_fin
                --*************************
            when Etat_Traitement_Fin =>  
                if G_Defs.Egaux (G_Defs.Fin_Trame (Occurence_Fin), Octet) =
                   True then
                    if Occurence_Fin = G_Defs.Fin_Trame'Length then
                        Etat_Recep := Etat_Trame_Dispo;
                        return Fin;
                    else
                        Occurence_Fin := Occurence_Fin + 1;
                    end if;  
                else
                    raise Erreur_Sur_Trame;
                end if;

            when Etat_Trame_Dispo =>
                return Fin;
        end case;  
        return Autre;

    exception
        when Erreur_Sur_Trame =>
            Etat_Recep := Etat_Trame_Dispo;  
            Raz (Trame => Trame_Reception);
            return Fin;
        when Taille_Trame_Trop_Grande =>  
            Etat_Recep := Etat_Trame_Dispo;  
            Raz (Trame => Trame_Reception);
            return Fin;  
        when others =>
            Etat_Recep := Etat_Trame_Dispo;  
            Raz (Trame => Trame_Reception);
            return Fin;

    end Construire_Trame_Reception;

    function Calcul_Taille_Chaine_Emission
                (Taille : Integer) return Code_Taille_Trame is
        Code_Retour : Code_Taille_Trame;  
    begin
        Code_Retour (Code_Retour'First) := G_Defs.Byte (Taille / 256);
        Code_Retour (Code_Retour'First + 1) := G_Defs.Byte (Taille mod 256);
        return Code_Retour;
    end Calcul_Taille_Chaine_Emission;


    procedure Construire_Trame_Emission (Trame_Entree : in G_Defs.Byte_String;
                                         Trame_Formattee : out Chaine_Trame;
                                         Taille : out Integer) is
        Code_Taille : Code_Taille_Trame;
    begin
        Taille := Trame_Entree'Length + G_Defs.Debut_Trame'Length +
                     G_Defs.Fin_Trame'Length + Code_Taille'Length;

        Code_Taille := Calcul_Taille_Chaine_Emission
                          (Taille => Trame_Entree'Length);

        for I in G_Defs.Debut_Trame'Range loop
            Trame_Formattee (I) := G_Defs.Debut_Trame (I);
        end loop;

        for I in Code_Taille'Range loop
            Trame_Formattee (I + G_Defs.Debut_Trame'Length) := Code_Taille (I);
        end loop;

        for I in Trame_Entree'Range loop
            Trame_Formattee (G_Defs.Debut_Trame'Length +
                             I + Code_Taille'Length) := Trame_Entree (I);
        end loop;

        for I in G_Defs.Fin_Trame'Range loop
            Trame_Formattee (G_Defs.Debut_Trame'Length +
                             Trame_Entree'Length + I + Code_Taille'Length) :=
               G_Defs.Fin_Trame (I);
        end loop;

    end Construire_Trame_Emission;

begin
    Init;

end Trame_Serie;

E3 Meta Data

    nblk1=d
    nid=6
    hdr6=12
        [0x00] rec0=1f rec1=00 rec2=01 rec3=018
        [0x01] rec0=1a rec1=00 rec2=0b rec3=06e
        [0x02] rec0=1a rec1=00 rec2=02 rec3=07a
        [0x03] rec0=17 rec1=00 rec2=03 rec3=048
        [0x04] rec0=16 rec1=00 rec2=07 rec3=06a
        [0x05] rec0=1c rec1=00 rec2=04 rec3=024
        [0x06] rec0=1c rec1=00 rec2=0d rec3=000
        [0x07] rec0=17 rec1=00 rec2=08 rec3=01e
        [0x08] rec0=0e rec1=00 rec2=05 rec3=000
        [0x09] rec0=0e rec1=00 rec2=05 rec3=000
        [0x0a] rec0=0e rec1=00 rec2=05 rec3=000
        [0x0b] rec0=e3 rec1=80 rec2=00 rec3=000
        [0x0c] rec0=24 rec1=00 rec2=15 rec3=7cc
    tail 0x21758fa34879a8bb2f8bf 0x42a00088462060003
Free Block Chain:
  0x6: 0000  00 09 03 29 80 19 72 61 6d 65 20 3d 3e 20 54 72  ┆   )  rame => Tr┆
  0x9: 0000  00 0a 03 fc 80 19 20 20 20 20 20 20 20 20 2d 2d  ┆              --┆
  0xa: 0000  00 0c 00 19 00 00 00 00 10 65 6e 64 20 54 72 61  ┆         end Tra┆
  0xc: 0000  00 00 00 0d 80 0a 70 65 20 53 6f 72 74 69 65 5f  ┆      pe Sortie_┆