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

⟦72c6dd8a7⟧ Ada Source

    Length: 8192 (0x2000)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Memoire_2, seg_00f4e6

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 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;


E3 Meta Data

    nblk1=7
    nid=2
    hdr6=c
        [0x00] rec0=21 rec1=00 rec2=01 rec3=044
        [0x01] rec0=1f rec1=00 rec2=06 rec3=006
        [0x02] rec0=1d rec1=00 rec2=03 rec3=052
        [0x03] rec0=23 rec1=00 rec2=04 rec3=00a
        [0x04] rec0=1f rec1=00 rec2=05 rec3=026
        [0x05] rec0=1c rec1=00 rec2=07 rec3=000
        [0x06] rec0=00 rec1=3b rec2=41 rec3=055
    tail 0x2150b5680822b4ffe9e52 0x42a00088462060003
Free Block Chain:
  0x2: 0000  00 00 00 86 80 09 72 61 70 68 65 29 20 69 73 09  ┆      raphe) is ┆