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

⟦c717af232⟧ TextFile

    Length: 7875 (0x1ec3)
    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 Z80_Defs;
with Z80;
with Memoire;
with Text_Io;
with Adresse;
with Mot;
with Octet;
with Z_Debug;
with Erreur;

use Z_Debug;


package body Bus is

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

    Taille_Bloc_Mem : constant Positive := 256;

    Nb_De_Blocs : constant Natural := 256;

    Nb_Periph_Max : constant Integer := 20;


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


    type T_It_Connectee is (Int, Nmi, Busrq, Rien);

    type T_Descripteur_Periph is
        record
            Ad_Debut : Adresse.T_Adresse;
            Ad_Fin : Adresse.T_Adresse;
            Id_Periph : Integer;
            It_Connectee : T_It_Connectee;
            It_Demandee : Boolean;
        end record;



    type T_Mem is (Rien, Ram, Rom);

    subtype Num_Bloc is Natural range 0 .. (Nb_De_Blocs - 1);

    type T_Descripteur_Memoire is
        record
            Bloc_Physique : Num_Bloc := 0;  
            Type_De_Mem : T_Mem := Rien;
        end record;

    task type T_Bus is  
        pragma Os_Task (0);
        entry Afficher;
        entry Acces_Octet (Quelle_Operation : Z80.T_Operation;
                           Ad : Adresse.T_Adresse;
                           Donnee : in out Octet.T_Octet);
        entry Signal_Periph (Periph_Id : Integer;
                             Signal : Z80_Defs.Signaux_Periph);
        entry Signal_Z80 (Signal : Z80_Defs.Signaux_Z80);
        entry Deposer_Vecteur_It (Vecteur : Octet.T_Octet);
        entry Lire_Vecteur_It (Vecteur : in out Octet.T_Octet);
    end T_Bus;


    type Pt_Tache_Bus is access T_Bus;



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

    Adresse_Donnee : Adresse.T_Adresse;
    Donnee : Octet.T_Octet;
    Operation : Z80.T_Operation;

    Descr_Memoire : array (Num_Bloc) of T_Descripteur_Memoire;
    Descr_Periph : array (1 .. Nb_Periph_Max) of T_Descripteur_Periph;

    Tache_Bus : Pt_Tache_Bus;

    -- PAQUETAGES ------------------------------------------------------------

    package Init is
        procedure Initialisation (Nom_De_Fichier : String);
    end Init;

    package body Init is separate;

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

    procedure Creer is
    begin
        Tache_Bus := new T_Bus;
    end Creer;

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

    procedure Initialisation (Nom_Fichier : String) is
    begin
        Init.Initialisation (Nom_Fichier);
    end Initialisation;

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

    procedure Afficher is
    begin
        Tache_Bus.Afficher;
    end Afficher;

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

    procedure Acces_Octet (Quelle_Operation : Z80.T_Operation;
                           Ad : Adresse.T_Adresse;
                           Donnee : in out Octet.T_Octet) is
    begin
        Tache_Bus.Acces_Octet (Quelle_Operation, Ad, Donnee);
    end Acces_Octet;

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

    procedure Signal_Periph (Periph_Id : Integer;
                             Signal : Z80_Defs.Signaux_Periph) is
    begin
        Tache_Bus.Signal_Periph (Periph_Id, Signal);
    end Signal_Periph;

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

    procedure Signal_Z80 (Signal : Z80_Defs.Signaux_Z80) is
    begin
        Tache_Bus.Signal_Z80 (Signal);
    end Signal_Z80;

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

    procedure Deposer_Vecteur_It (Vecteur : Octet.T_Octet) is
    begin
        Tache_Bus.Deposer_Vecteur_It (Vecteur);
    end Deposer_Vecteur_It;

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

    procedure Lire_Vecteur_It (Vecteur : in out Octet.T_Octet) is
    begin
        Tache_Bus.Lire_Vecteur_It (Vecteur);
    end Lire_Vecteur_It;

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

    procedure Detruire is
    begin
        abort Tache_Bus.all;
    end Detruire;



    -- PROCEDURES POUR LECTURE ECRITURE MEMOIRE ---------------

    procedure Decode_Adresse (Ad : in out Adresse.T_Adresse; Mem : out T_Mem) is

        Bloc_Log, Bloc_Phy : Num_Bloc := 0;
        Offset : Adresse.T_Adresse := 0;
    begin

        Bloc_Log := Ad / Taille_Bloc_Mem;
        Bloc_Phy := Descr_Memoire (Bloc_Log).Bloc_Physique;

        Mem := Descr_Memoire (Bloc_Phy).Type_De_Mem;

        Offset := Ad mod Taille_Bloc_Mem;
        Ad := Bloc_Phy * Taille_Bloc_Mem + Offset;

    end Decode_Adresse;

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

    procedure Lecture_Donnee (Ad : Adresse.T_Adresse;
                              Un_Octet : in out Octet.T_Octet) is

        Ad_Donnee : Adresse.T_Adresse := Ad;
        Mem : T_Mem := Rien;
    begin

        Decode_Adresse (Ad_Donnee, Mem);
        case Mem is  
            when Ram | Rom =>
                Memoire.Acces_Octet (Memoire.Lire, Ad_Donnee, Un_Octet);
            when Rien =>
                --Erreur: Lecture a un emplacement memoire non defini !!!
                Erreur.Detectee (3);
                Memoire.Acces_Octet (Memoire.Lire, Ad_Donnee, Un_Octet);


        end case;

    end Lecture_Donnee;

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

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

        Un_Octet : Octet.T_Octet := Donnee;
        Ad_Donnee : Adresse.T_Adresse := Ad;
        Mem : T_Mem := Rien;
    begin

        Decode_Adresse (Ad_Donnee, Mem);

        case Mem is  
            when Ram =>
                Memoire.Acces_Octet (Memoire.Ecrire, Ad_Donnee, Un_Octet);
            when Rom =>
                --Erreur: Ecriture en ROM !!!
                Erreur.Detectee (1);
            when Rien =>
                --Erreur: Ecriture a un emplacement memoire non defini !!!
                Erreur.Detectee (2);


        end case;  
    end Ecriture_Donnee;


    -- TACHES ----------------------------------------------------------------

    task body T_Bus is

        use Z80;

    begin
        while True loop
            select

                accept Afficher do
                    null;
                end Afficher;

                ---------------------------------
            or
                accept Acces_Octet (Quelle_Operation : T_Operation;
                                    Ad : Adresse.T_Adresse;
                                    Donnee : in out Octet.T_Octet) do

                    Operation := Quelle_Operation;
                    case Quelle_Operation is

                        when Fetch | Memory_Read =>
                            Lecture_Donnee (Ad, Donnee); -- MY
                        when Memory_Write =>
                            Ecriture_Donnee (Ad, Donnee); -- MY
                        when Io_Read =>
                            null;
                        when Io_Write =>
                            null;
                    end case;
                end Acces_Octet;

                ---------------------------------
            or
                accept Signal_Periph (Periph_Id : Integer;
                                      Signal : Z80_Defs.Signaux_Periph) do
                    null;
                end Signal_Periph;

                ---------------------------------
            or
                accept Signal_Z80 (Signal : Z80_Defs.Signaux_Z80) do
                    null;
                end Signal_Z80;

                ---------------------------------
            or
                accept

                   Deposer_Vecteur_It (Vecteur : Octet.T_Octet) do
                    null;
                end Deposer_Vecteur_It;

                ---------------------------------
            or
                accept Lire_Vecteur_It (Vecteur : in out Octet.T_Octet) do
                    null;
                end Lire_Vecteur_It;

            end select;
        end loop;
    end T_Bus;


end Bus;