|
|
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 - metrics - downloadIndex: B T
Length: 7875 (0x1ec3)
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 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;