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

⟦b578fd72b⟧ Ada Source

    Length: 13312 (0x3400)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Z80, seg_027521

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 Adresse;
with Registres;
with Sequenceur;
with Point_D_Arret;
with Erreur, Text_Io, Ihm, Z80_Scr, Bus;

package body Z80 is

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

    task type T_Z80 is
        entry Reset;
        entry Signaler (Le_Signal : Z80_Defs.Signaux_Periph);
        entry Lancer;  
        entry Pas_A_Pas;
        entry Stopper;
    end T_Z80;
    type Pt_Tache_Z80 is access T_Z80;

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

    Tache_Z80 : Pt_Tache_Z80;

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

    procedure Creer (Fid : Ihm.Window_Id) is
    begin
        Main_Win := Fid;
        Tache_Z80 := new T_Z80;
    end Creer;

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

    procedure Reset is
    begin
        Tache_Z80.Reset;
    end Reset;

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

    function Signaler (Le_Signal : Z80_Defs.Signaux_Periph) return Boolean is
        Ok : Boolean := True;
    begin
        select
            Tache_Z80.Signaler (Le_Signal);
        or
            delay 1.0;
            Ok := False;
        end select;  
        return Ok;
    end Signaler;

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

    procedure Lancer is
    begin
        Tache_Z80.Lancer;
    end Lancer;

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

    procedure Pas_A_Pas is
    begin
        Tache_Z80.Pas_A_Pas;
    end Pas_A_Pas;

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

    procedure Stopper is
    begin
        Tache_Z80.Stopper;
    end Stopper;

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

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


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

    task body T_Z80 is
        Reg_Pc : Adresse.T_Adresse;
    begin
        delay (Duration'Small);
        Registres.Reset;
        Halt := False;
        Son_Mode := 0;
        Iff_1 := False;
        Iff_2 := False;  
        Z80_Scr.Afficher_Ecran;
        loop
            select
                accept Signaler (Le_Signal : Z80_Defs.Signaux_Periph) do
                    case Le_Signal is
                        when Z80_Defs.Int =>
                            Interrupt := True;
                            Z80_Scr.Afficher_Ecran_Reg (Z80_Scr.Int);
                        when others =>
                            null;
                    end case;
                end Signaler;
            or
                accept Reset do
                    Registres.Reset;
                    Halt := False;
                    Son_Mode := 0;
                    Iff_1 := False;
                    Iff_2 := False;  
                    Interrupt := False;
                    Etat_Z80 := Endormi;
                    Bus.Reset;
                    Ihm.Window.Put_Field
                       (Main_Win, "MW.BB.Message", "Reset CPU OK");
                    Z80_Scr.Afficher_Ecran;
                end Reset;
            or
                accept Lancer do
                    if Etat_Z80 = Endormi then
                        Ihm.Window.Put_Field
                           (Main_Win, "MW.BB.Message", "Running CPU");
                        Etat_Z80 := Actif;
                        Sequenceur.Lancer;
                    end if;
                end Lancer;
            or
                accept Pas_A_Pas do  
                    if Etat_Z80 = Endormi then
                        Ihm.Window.Put_Field
                           (Main_Win, "MW.BB.Message", "Step CPU");
                        Sequenceur.Lancer;
                    end if;
                end Pas_A_Pas;
            or
                accept Stopper do
                    if Etat_Z80 = Actif then
                        Ihm.Window.Put_Field
                           (Main_Win, "MW.BB.Message", "Stop CPU");
                        Etat_Z80 := Endormi;
                        Z80_Scr.Afficher_Ecran;
                    end if;
                end Stopper;
            else  
                delay (Duration'Small);
                if Erreur.Presente then
                    Ihm.Window.Put_Field
                       (Main_Win, "MW.BB.Message", Erreur.Enregistree);
                    Etat_Z80 := Endormi;
                end if;
                if Halt then
                    Ihm.Window.Put_Field
                       (Main_Win, "MW.BB.Message", "CPU is HALTED");
                    Halt := False;
                end if;
                if Etat_Z80 = Actif then  
                    Reg_Pc := Registres.Lire_Double (Z80_Defs.Pc);
                    if Point_D_Arret.Test (Reg_Pc) then
                        Ihm.Window.Put_Field (Main_Win, "MW.BB.Message",
                                              "Breakpoint, Stop CPU");
                        Etat_Z80 := Endormi;
                        Z80_Scr.Afficher_Ecran;
                    else
                        Sequenceur.Lancer;
                    end if;  
                end if;
            end select;
        end loop;
    end T_Z80;

end Z80;

E3 Meta Data

    nblk1=c
    nid=7
    hdr6=e
        [0x00] rec0=28 rec1=00 rec2=01 rec3=064
        [0x01] rec0=2d rec1=00 rec2=06 rec3=020
        [0x02] rec0=07 rec1=00 rec2=05 rec3=00e
        [0x03] rec0=1a rec1=00 rec2=0c rec3=006
        [0x04] rec0=18 rec1=00 rec2=08 rec3=034
        [0x05] rec0=16 rec1=00 rec2=03 rec3=026
        [0x06] rec0=0a rec1=00 rec2=04 rec3=000
        [0x07] rec0=0a rec1=00 rec2=07 rec3=000
        [0x08] rec0=16 rec1=00 rec2=07 rec3=04e
        [0x09] rec0=12 rec1=00 rec2=06 rec3=001
        [0x0a] rec0=b9 rec1=70 rec2=00 rec3=000
        [0x0b] rec0=00 rec1=80 rec2=00 rec3=000
    tail 0x217210aa083aa7500432d 0x42a00088462060003
Free Block Chain:
  0x7: 0000  00 0b 00 eb 80 16 38 30 5f 53 63 72 2e 41 66 66  ┆      80_Scr.Aff┆
  0xb: 0000  00 09 03 fc 80 04 74 29 29 3b 04 00 2e 20 20 20  ┆      t));  .   ┆
  0x9: 0000  00 02 03 fc 80 2c 20 20 20 20 20 20 55 6e 5f 4f  ┆     ,      Un_O┆
  0x2: 0000  00 0a 00 7e 80 41 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ┆   ~ A ---------┆
  0xa: 0000  00 00 00 11 80 0e 65 5f 44 6f 75 62 6c 65 20 28  ┆      e_Double (┆