DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

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 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ B T

⟦6ecb3c5f2⟧ TextFile

    Length: 5415 (0x1527)
    Types: TextFile
    Names: »B«

Derivation

└─⟦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⟧ 

TextFile

with Text_Io;
with Ensemble;

package body Memoire_2 is


    -- CONSTANTES -----------------------------------------------------------

    Taille_Bloc_Mem : constant Positive := 2048;

    -- TYPES ----------------------------------------------------------------

    type Mem is array (0 .. Adresse.Val_Max_Adresse) of Octet.T_Octet;

    type Zone_Memoire is
        record
            Ad_Depart : Adresse.T_Adresse := 0;
            Ad_Fin : Adresse.T_Adresse := 0;
            Modifiee : Boolean := False;
            Num_Msg : Message.Num_Message;
        end record;

    -- VARIABLES ------------------------------------------------------------

    La_Memoire : Mem;  
    Descr_Memoire : array (Num_Bloc) of T_Mem := (others => Rien);

    Adresse_Courante : Adresse.T_Adresse := 0;

    -- PROCEDURES ----------------------------------------------------------

    function Type_Mem (Ad : Adresse.T_Adresse) return T_Mem is
        Bloc_Log : Num_Bloc := 0;
    begin
        Bloc_Log := Ad / Taille_Bloc_Mem;  
        return Descr_Memoire (Bloc_Log);
    end Type_Mem;


    -- GESTION DES ZONES ----------------------------------------------------


    procedure Verifier_Zone (Une_Zone : in out Zone_Memoire) is
    begin
        if (Adresse_Courante >= Une_Zone.Ad_Depart) and
           (Adresse_Courante <= Une_Zone.Ad_Fin) then
            if not Une_Zone.Modifiee then
                Une_Zone.Modifiee := True;
                Message.Envoyer (Une_Zone.Num_Msg);
            end if;
        end if;
    end Verifier_Zone;

    package Gestion_Zones is new Ensemble (Item => Zone_Memoire,
                                           Modifier => Verifier_Zone);


    -------------------------------------------------------------------------
    -- INTERFACE
    -------------------------------------------------------------------------


    procedure Lecture (Ad : Adresse.T_Adresse; Donnee : out Octet.T_Octet) is

    begin
        case Type_Mem (Ad) is  
            when Ram | Rom =>
                Adresse_Courante := Ad;
                Donnee := La_Memoire (Ad);
            when Rien =>
                Donnee := 255;
                -- Lecture emplacement non declare !!!
                Message.Envoyer (Message.Lect_Mem_Vide);
        end case;
    end Lecture;

    ------------------------------------------------------------------------


    procedure Ecriture (Ad : Adresse.T_Adresse; Donnee : Octet.T_Octet) is

    begin
        case Type_Mem (Ad) is
            when Ram =>
                La_Memoire (Ad) := Donnee;
                Adresse_Courante := Ad;
                Gestion_Zones.Verifier;
            when Rom =>
                -- Ecriture en ROM !!!
                Message.Envoyer (Message.Ecrit_Rom);
            when Rien =>
                -- Ecriture a un emplacement vide !!!!
                Message.Envoyer (Message.Ecrit_Mem_Vide);
        end case;

    end Ecriture;

    -- Entrees pour le DEBUGGER ----------------------------------------

    procedure Init is
    begin  
        La_Memoire := (others => 0);
        Descr_Memoire := (others => Rien);
    end Init;

    ------------------------------------------

    procedure Config (Le_Bloc_Memoire : Num_Bloc; Avec_Le_Type : T_Mem) is

    begin
        Descr_Memoire (Le_Bloc_Memoire) := Avec_Le_Type;
    end Config;

    ------------------------------------------

    procedure Lire_Paragraphe (Ad : Adresse.T_Adresse;
                               Parag : out Paragraphe) is
    begin  
        for I in 0 .. 15 loop
            Parag (I) := La_Memoire (Ad + I);
        end loop;
    end Lire_Paragraphe;

    ------------------------------------------

    procedure Ecrire_Paragraphe (Ad : Adresse.T_Adresse; Parag : Paragraphe) is
    begin  
        for I in 0 .. 15 loop
            La_Memoire (Ad + I) := Parag (I);
        end loop;
    end Ecrire_Paragraphe;

    ------------------------------------------

    procedure Lire_Octet (Ad : Adresse.T_Adresse;
                          Un_Octet : out Octet.T_Octet) is
    begin
        Un_Octet := La_Memoire (Ad);
    end Lire_Octet;

    ------------------------------------------

    procedure Ecrire_Octet (Ad : Adresse.T_Adresse; Un_Octet : Octet.T_Octet) is
    begin
        La_Memoire (Ad) := Un_Octet;
        Adresse_Courante := Ad;
        Gestion_Zones.Verifier;
    end Ecrire_Octet;

    ------------------------------------------

    procedure Marquer_Zone (Ad_Depart : Adresse.T_Adresse;
                            Ad_Fin : Adresse.T_Adresse;
                            Signal : Message.Num_Message;
                            Zone_Id : out Num_Zone) is
        Une_Zone : Zone_Memoire;
    begin
        Une_Zone.Ad_Depart := Ad_Depart;
        Une_Zone.Ad_Fin := Ad_Fin;
        Une_Zone.Modifiee := False;
        Une_Zone.Num_Msg := Signal;

        Gestion_Zones.Ajouter (Une_Zone, Zone_Id);

    end Marquer_Zone;

    ------------------------------------------
    procedure Liberer_Zone (Zone_Id : Num_Zone) is
    begin
        Gestion_Zones.Retirer (Zone_Id);
    end Liberer_Zone;

    ------------------------------------------

    procedure Rearmer_Zone (Zone_Id : Num_Zone) is
        Une_Zone : Zone_Memoire;
    begin
        Gestion_Zones.Lire (Zone_Id, Une_Zone);
        Une_Zone.Modifiee := False;
        Gestion_Zones.Ecrire (Zone_Id, Une_Zone);
    end Rearmer_Zone;


end Memoire_2;