DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 6755 (0x1a63) Types: TextFile Names: »B«
└─⟦149519bd4⟧ Bits:30000546 8mm tape, Rational 1000, !projects 93-07-13 └─ ⟦124ff5788⟧ »DATA« └─⟦this⟧ └─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11 └─ ⟦129cab021⟧ »DATA« └─⟦this⟧ └─⟦f64eaa120⟧ Bits:30000752 8mm tape, Rational 1000, !projects 93 02 16 └─ ⟦6f12a12be⟧ »DATA« └─⟦this⟧ └─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04 └─ ⟦d65440be7⟧ »DATA« └─⟦this⟧
with Erreur; with Gui_Interface; with Octet; with Text_Io; with Z_Debug; with Mot; package body Memoire is -- TYPES ---------------------------------------------------------------- type Mem is array (0 .. Adresse.Val_Max_Adresse) of Octet.T_Octet; task type T_Memoire is pragma Os_Task (0); entry Aff_Entre_2_Adresses (Ad_Debut, Ad_Fin : Adresse.T_Adresse); entry Aff_Depuis_Adresse (Ad_Debut : Adresse.T_Adresse; Taille : Mot.T_Mot); entry Acces_Octet (Operation : T_Operation; Ad : Adresse.T_Adresse; Donnee : in out Octet.T_Octet); end T_Memoire; type Pt_Tache_Memoire is access T_Memoire; -- VARIABLES ------------------------------------------------------------ La_Memoire : Mem := (others => 0); Msb, Lsb : Octet.T_Octet; Tache_Memoire : Pt_Tache_Memoire; -- PROCEDURES ---------------------------------------------------------- procedure Creer is begin Tache_Memoire := new T_Memoire; end Creer; -------------------------------------- function Traiter_Ligne_Hexa (Ligne : String) return Boolean is Defaut : Boolean := False; Ad_Deb_Chargement, Ad_Fin_Chargement, Ad_Chargement : Adresse.T_Adresse; Cpt_Octet, Type_Ligne, Checksum, Un_Octet : Octet.T_Octet := 0; I : Positive; begin if Ligne (1) /= ':' then Defaut := True; else Cpt_Octet := Octet.Convert_Ascii_Octet (Ligne (2), Ligne (3)); Ad_Deb_Chargement := Mot.Convert_Ascii_Mot (Ligne (4), Ligne (5), Ligne (6), Ligne (7)); Type_Ligne := Octet.Convert_Ascii_Octet (Ligne (8), Ligne (9)); Checksum := Octet.Add (Cpt_Octet, Mot.Poids_Fort (Ad_Deb_Chargement)); Checksum := Octet.Add (Checksum, Mot.Poids_Faible (Ad_Deb_Chargement)); Checksum := Octet.Add (Checksum, Type_Ligne); I := 10; if Type_Ligne = 0 then Ad_Fin_Chargement := Mot.Add (Ad_Deb_Chargement, Mot.Construire (0, Cpt_Octet)); -- Chargement de la ligne --------------------- Ad_Chargement := Ad_Deb_Chargement; while Ad_Chargement /= Ad_Fin_Chargement loop Un_Octet := Octet.Convert_Ascii_Octet (Ligne (I), Ligne (I + 1)); I := I + 2; Checksum := Octet.Add (Checksum, Un_Octet); Memoire.Acces_Octet (Ecrire, Ad_Chargement, Un_Octet); Ad_Chargement := Mot.Add (Ad_Chargement, Mot.Construire (0, 1)); end loop; end if; -- Verification du checksum ------------------- Un_Octet := Octet.Convert_Ascii_Octet (Ligne (I), Ligne (I + 1)); Checksum := Octet.Add (Checksum, Un_Octet); if Checksum /= 0 then Defaut := True; end if; end if; if Defaut then -- Erreur sur la lecture du fichier hexa; Erreur.Detectee (6); end if; return Defaut; end Traiter_Ligne_Hexa; -------------------------------------- procedure Charger_Fichier (Nom : String) is Fichier : Text_Io.File_Type; Ligne : String (1 .. 80) := (others => '0'); Longueur : Natural := 0; Defaut : Boolean := False; begin Text_Io.Open (Fichier, Text_Io.In_File, Nom); while not Text_Io.End_Of_File (Fichier) and then not Defaut loop if not Text_Io.End_Of_Line (Fichier) then Text_Io.Get_Line (Fichier, Ligne, Longueur); Defaut := Traiter_Ligne_Hexa (Ligne); else Text_Io.Skip_Line (Fichier); end if; end loop; Text_Io.Close (Fichier); exception when Text_Io.Name_Error => --Nom de fichier Hexa inconnu !!! Erreur.Detectee (5); end Charger_Fichier; -------------------------------------- procedure Aff_Entre_2_Adresses (Ad_Debut, Ad_Fin : Adresse.T_Adresse) is begin Tache_Memoire.Aff_Entre_2_Adresses (Ad_Debut, Ad_Fin); end Aff_Entre_2_Adresses; -------------------------------------- procedure Aff_Depuis_Adresse (Ad_Debut : Adresse.T_Adresse; Taille : Mot.T_Mot) is begin Tache_Memoire.Aff_Depuis_Adresse (Ad_Debut, Taille); end Aff_Depuis_Adresse; -------------------------------------- procedure Acces_Octet (Operation : T_Operation; Ad : Adresse.T_Adresse; Donnee : in out Octet.T_Octet) is begin Tache_Memoire.Acces_Octet (Operation, Ad, Donnee); end Acces_Octet; -------------------------------------- procedure Detruire is begin abort Tache_Memoire.all; end Detruire; -- TACHE ---------------------------------------------------------------- task body T_Memoire is begin while True loop select ------------------------------- accept Aff_Entre_2_Adresses (Ad_Debut, Ad_Fin : Adresse.T_Adresse) do for I in Ad_Debut .. Ad_Fin loop --Octet.Afficher_Octet_Hexa (La_Memoire (I)); null; end loop; end Aff_Entre_2_Adresses; --------------------------------- or accept Aff_Depuis_Adresse (Ad_Debut : Adresse.T_Adresse; Taille : Mot.T_Mot) do for I in Ad_Debut .. Ad_Debut + Taille loop -- Octet.Afficher_Octet_Hexa (La_Memoire (I)); null; end loop; end Aff_Depuis_Adresse; --------------------------------- or accept Acces_Octet (Operation : T_Operation; Ad : Adresse.T_Adresse; Donnee : in out Octet.T_Octet) do case Operation is when Lire => Donnee := La_Memoire (Ad); when Ecrire => La_Memoire (Ad) := Donnee; end case; end Acces_Octet; end select; end loop; end T_Memoire; end Memoire;