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

⟦0da36bf9d⟧ Ada Source

    Length: 34816 (0x8800)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Alu_8_Bit, seg_00f5b6, seg_020ed6, seg_027501, seg_027e63

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦5a81ac88f⟧ »Space Info Vol 1« 
        └─⟦this⟧ 
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Octet;
with Registres;
with Z80_Defs;


package body Alu_8_Bit is

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

    Un : constant Octet.T_Bit_Octet :=
       (True, False, False, False, False, False, False, False);

    Zero : constant Octet.T_Bit_Octet :=
       (False, False, False, False, False, False, False, False);

    Moins_Un : constant Octet.T_Bit_Octet :=
       (True, True, True, True, True, True, True, True);

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

    Operande_1, Operande_2, Flag : Octet.T_Octet := 0;

    Bit_Octet_1, Bit_Octet_2, Bit_Flag : Octet.T_Bit_Octet :=
       (False, False, False, False, False, False, False, False);

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

    procedure Inc_F (Octet_1, Flag : in out Octet.T_Octet);
    procedure Dec_F (Octet_1, Flag : in out Octet.T_Octet);
    procedure And_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet);
    procedure Or_F (Octet_1 : in out Octet.T_Octet;
                    Octet_2 : Octet.T_Octet;
                    Flag : in out Octet.T_Octet);
    procedure Xor_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet);
    procedure Neg_F (Octet_1, Flag : in out Octet.T_Octet);
    procedure Adc_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet);
    procedure Add_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet);
    procedure Sbc_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet);
    procedure Sub_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet);
    procedure Cp_F (Octet_1 : Octet.T_Octet;
                    Octet_2 : Octet.T_Octet;
                    Flag : in out Octet.T_Octet);
    procedure Rl_F (Octet_1 : in out Octet.T_Octet;
                    Flag : in out Octet.T_Octet;
                    Flag_P_Z_S_A_Modifier : Boolean);
    procedure Rlc_F (Octet_1 : in out Octet.T_Octet;
                     Flag : in out Octet.T_Octet;
                     Flag_P_Z_S_A_Modifier : Boolean);
    procedure Rr_F (Octet_1 : in out Octet.T_Octet;
                    Flag : in out Octet.T_Octet;
                    Flag_P_Z_S_A_Modifier : Boolean);
    procedure Rrc_F (Octet_1 : in out Octet.T_Octet;
                     Flag : in out Octet.T_Octet;
                     Flag_P_Z_S_A_Modifier : Boolean);

    procedure Sla_F (Octet_1 : in out Octet.T_Octet;
                     Flag : in out Octet.T_Octet);
    procedure Sra_F (Octet_1 : in out Octet.T_Octet;
                     Flag : in out Octet.T_Octet);
    procedure Srl_F (Octet_1 : in out Octet.T_Octet;
                     Flag : in out Octet.T_Octet);


    procedure Modif_Flag_Z_S (Bit_Octet : Octet.T_Bit_Octet;
                              Flag : in out Octet.T_Bit_Octet);
    procedure Modif_Flag_P_Z_S (Bit_Octet : Octet.T_Bit_Octet;
                                Flag : in out Octet.T_Bit_Octet);
    procedure Add_8_Bit_C_V_H (Bit_Octet_1 : in out Octet.T_Bit_Octet;
                               Bit_Octet_2 : Octet.T_Bit_Octet;
                               Carry : in out Boolean;
                               Over_Flow : in out Boolean;
                               Half_Carry : in out Boolean);


    --------------------------------------------------------------------------
    -- PUBLIC
    --------------------------------------------------------------------------


    procedure Fournir_Operande_1 (Op_1 : Octet.T_Octet) is
    begin
        Operande_1 := Op_1;
    end Fournir_Operande_1;

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

    procedure Fournir_Operande_2 (Op_2 : Octet.T_Octet) is
    begin
        Operande_2 := Op_2;
    end Fournir_Operande_2;


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

    function Executer (Operation : T_Operation) return Octet.T_Octet is
    begin

        Flag := Registres.Lire_Simple (Z80_Defs.F);

        case Operation is

            when Desassembleur.Inc =>
                Inc_F (Operande_1, Flag);

            when Desassembleur.Dec =>
                Dec_F (Operande_1, Flag);

            when Desassembleur.Z80_And =>
                And_F (Operande_1, Operande_2, Flag);

            when Desassembleur.Z80_Or =>
                Or_F (Operande_1, Operande_2, Flag);

            when Desassembleur.Z80_Xor =>
                Xor_F (Operande_1, Operande_2, Flag);

            when Desassembleur.Neg =>
                Neg_F (Operande_1, Flag);

            when Desassembleur.Adc =>
                Adc_F (Operande_1, Operande_2, Flag);

            when Desassembleur.Add =>
                Add_F (Operande_1, Operande_2, Flag);

            when Desassembleur.Sbc =>
                Sbc_F (Operande_1, Operande_2, Flag);

            when Desassembleur.Sub =>
                Sub_F (Operande_1, Operande_2, Flag);

            when Desassembleur.Cp =>
                Cp_F (Operande_1, Operande_2, Flag);

            when Desassembleur.Rl =>
                Rl_F (Operande_1, Flag, True);

            when Desassembleur.Rla =>
                Rl_F (Operande_1, Flag, False);

            when Desassembleur.Rlc =>
                Rlc_F (Operande_1, Flag, True);

            when Desassembleur.Rlca =>
                Rlc_F (Operande_1, Flag, False);

            when Desassembleur.Rr =>
                Rr_F (Operande_1, Flag, True);

            when Desassembleur.Rra =>
                Rr_F (Operande_1, Flag, False);

            when Desassembleur.Rrc =>
                Rrc_F (Operande_1, Flag, True);

            when Desassembleur.Rrca =>
                Rrc_F (Operande_1, Flag, False);

            when Desassembleur.Sla =>
                Sla_F (Operande_1, Flag);

            when Desassembleur.Sra =>
                Sra_F (Operande_1, Flag);

            when Desassembleur.Srl =>
                Srl_F (Operande_1, Flag);

            when others =>
                null;

        end case;

        -- sauvegarde flags + retour resultat de l'operation
        Registres.Ecrire_Simple (Z80_Defs.F, Flag);
        return Operande_1;

    end Executer;




    --------------------------------------------------------------------------
    -- PRIVE
    --------------------------------------------------------------------------

    procedure Inc_F (Octet_1, Flag : in out Octet.T_Octet) is

        Carry : Boolean := False;

    begin  
        Bit_Flag := Octet.Convert_Bit (Flag);

        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Add_8_Bit_C_V_H (Bit_Octet_1, Un, Carry, Bit_Flag (2), Bit_Flag (4));
        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  (rq: half_carry et over_flow modifiee par add_8_bit_c_v_h)
        Bit_Flag (1) := False;
        Modif_Flag_Z_S (Bit_Octet_1, Bit_Flag);
        Flag := Octet.Convert_Octet (Bit_Flag);

    end Inc_F;

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

    procedure Dec_F (Octet_1, Flag : in out Octet.T_Octet) is

        Carry : Boolean := False;

    begin  
        Bit_Flag := Octet.Convert_Bit (Flag);

        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Add_8_Bit_C_V_H (Bit_Octet_1, Moins_Un, Carry,
                         Bit_Flag (2), Bit_Flag (4));
        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  (rq: half_carry over_flow modifiee par add_8_bit_c_v_h)
        Bit_Flag (1) := True;  
        Bit_Flag (4) := not Bit_Flag (4);
        Modif_Flag_Z_S (Bit_Octet_1, Bit_Flag);
        Flag := Octet.Convert_Octet (Bit_Flag);

    end Dec_F;

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

    procedure And_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet) is
    begin
        Octet_1 := Octet."and" (Octet_1, Octet_2);
        Bit_Flag := Octet.Convert_Bit (Flag);
        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);

        -- flag
        Bit_Flag (0) := False;
        Bit_Flag (1) := False;  
        Bit_Flag (4) := True;
        Modif_Flag_P_Z_S (Bit_Octet_1, Bit_Flag);
        Flag := Octet.Convert_Octet (Bit_Flag);

    end And_F;

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

    procedure Or_F (Octet_1 : in out Octet.T_Octet;
                    Octet_2 : Octet.T_Octet;
                    Flag : in out Octet.T_Octet) is
    begin
        Octet_1 := Octet."or" (Octet_1, Octet_2);
        Bit_Flag := Octet.Convert_Bit (Flag);
        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);

        -- flag
        Bit_Flag (0) := False;
        Bit_Flag (1) := False;  
        Bit_Flag (4) := False;
        Modif_Flag_P_Z_S (Bit_Octet_1, Bit_Flag);
        Flag := Octet.Convert_Octet (Bit_Flag);
    end Or_F;

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

    procedure Xor_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet) is
    begin
        Octet_1 := Octet."xor" (Octet_1, Octet_2);
        Bit_Flag := Octet.Convert_Bit (Flag);
        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);

        -- flag
        Bit_Flag (0) := False;
        Bit_Flag (1) := False;  
        Bit_Flag (4) := False;
        Modif_Flag_P_Z_S (Bit_Octet_1, Bit_Flag);
        Flag := Octet.Convert_Octet (Bit_Flag);
    end Xor_F;

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

    procedure Neg_F (Octet_1, Flag : in out Octet.T_Octet) is

        Carry : Boolean := False;
    begin

        Octet_1 := Octet."not" (Octet_1);
        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Flag := Octet.Convert_Bit (Flag);
        Add_8_Bit_C_V_H (Bit_Octet_1, Un, Carry, Bit_Flag (2), Bit_Flag (4));
        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  rq: carry, half_cary et over_flow modifiees ds add_8_bit_c_v_h

        Bit_Flag (0) := not Carry;
        Bit_Flag (1) := True;
        Bit_Flag (4) := not Bit_Flag (4);
        Modif_Flag_Z_S (Bit_Octet_1, Bit_Flag);
        Flag := Octet.Convert_Octet (Bit_Flag);

    end Neg_F;

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

    procedure Adc_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet) is
    begin

        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Octet_2 := Octet.Convert_Bit (Octet_2);
        Bit_Flag := Octet.Convert_Bit (Flag);

        Add_8_Bit_C_V_H (Bit_Octet_1, Bit_Octet_2, Bit_Flag (0),
                         Bit_Flag (2), Bit_Flag (4));

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  rq: carry , half_cary et over_flow modifiees ds add_8_bit_c_v_h

        Bit_Flag (1) := False;
        Modif_Flag_Z_S (Bit_Octet_1, Bit_Flag);
        Flag := Octet.Convert_Octet (Bit_Flag);

    end Adc_F;

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

    procedure Add_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet) is

        Carry : Boolean := False;

    begin

        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Octet_2 := Octet.Convert_Bit (Octet_2);
        Bit_Flag := Octet.Convert_Bit (Flag);

        Add_8_Bit_C_V_H (Bit_Octet_1, Bit_Octet_2, Carry,
                         Bit_Flag (2), Bit_Flag (4));

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  rq: carry et half_cary modifiees ds add_8_bit_c_v_h

        Bit_Flag (0) := Carry;
        Bit_Flag (1) := False;
        Modif_Flag_Z_S (Bit_Octet_1, Bit_Flag);

        Flag := Octet.Convert_Octet (Bit_Flag);
    end Add_F;

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

    procedure Sub_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet) is

        Carry : Boolean := False;

    begin
        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Octet_2 := Octet.Convert_Bit (Octet_2);
        Bit_Flag := Octet.Convert_Bit (Flag);

        Bit_Octet_2 := Octet."not" (Bit_Octet_2);
        Add_8_Bit_C_V_H (Bit_Octet_2, Un, Carry, Bit_Flag (2), Bit_Flag (4));

        Carry := False;
        Add_8_Bit_C_V_H (Bit_Octet_1, Bit_Octet_2, Carry,
                         Bit_Flag (2), Bit_Flag (4));

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  rq: carry, half_cary et over_flow modifiees ds add_8_bit_c_v_h

        Bit_Flag (0) := not Carry;
        Bit_Flag (1) := True;
        Bit_Flag (4) := not Bit_Flag (4);
        Modif_Flag_Z_S (Bit_Octet_1, Bit_Flag);
        Flag := Octet.Convert_Octet (Bit_Flag);

    end Sub_F;

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


    procedure Sbc_F (Octet_1 : in out Octet.T_Octet;
                     Octet_2 : Octet.T_Octet;
                     Flag : in out Octet.T_Octet) is

        Carry : Boolean := False;
    begin

        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Octet_2 := Octet.Convert_Bit (Octet_2);
        Bit_Flag := Octet.Convert_Bit (Flag);

        if Bit_Flag (0) then
            Add_8_Bit_C_V_H (Bit_Octet_2, Zero, Bit_Flag (0),
                             Bit_Flag (2), Bit_Flag (4));
        end if;

        Bit_Octet_2 := Octet."not" (Bit_Octet_2);
        Add_8_Bit_C_V_H (Bit_Octet_2, Un, Carry, Bit_Flag (2), Bit_Flag (4));


        Bit_Flag (0) := False;
        Add_8_Bit_C_V_H (Bit_Octet_1, Bit_Octet_2, Bit_Flag (0),
                         Bit_Flag (2), Bit_Flag (4));

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  rq: carry, half_cary et over_flow modifiees ds add_8_bit_c_v_h

        Bit_Flag (0) := not Bit_Flag (0);
        Bit_Flag (1) := True;
        Bit_Flag (4) := not Bit_Flag (4);
        Modif_Flag_Z_S (Bit_Octet_1, Bit_Flag);
        Flag := Octet.Convert_Octet (Bit_Flag);


    end Sbc_F;


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

    procedure Cp_F (Octet_1 : Octet.T_Octet;
                    Octet_2 : Octet.T_Octet;
                    Flag : in out Octet.T_Octet) is

        Carry : Boolean := False;

    begin

        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Octet_2 := Octet.Convert_Bit (Octet_2);
        Bit_Flag := Octet.Convert_Bit (Flag);

        Bit_Octet_2 := Octet."not" (Bit_Octet_2);
        Add_8_Bit_C_V_H (Bit_Octet_2, Un, Carry, Bit_Flag (2), Bit_Flag (4));

        Carry := False;
        Add_8_Bit_C_V_H (Bit_Octet_1, Bit_Octet_2, Carry,
                         Bit_Flag (2), Bit_Flag (4));



        -- flag  rq: carry, half_cary et over_flow modifiees ds add_8_bit_c_v_h

        Bit_Flag (0) := Octet_1 < Octet_2;
        Bit_Flag (1) := True;
        Bit_Flag (4) := not Bit_Flag (4);
        Modif_Flag_Z_S (Bit_Octet_1, Bit_Flag);
        Flag := Octet.Convert_Octet (Bit_Flag);
    end Cp_F;




    --------------------------------------------------
    -- DECALAGES
    --------------------------------------------------


    function Modif_Flag_Decalage
                (Bit_Octet_1 : Octet.T_Bit_Octet;
                 Bit_Flag : Octet.T_Bit_Octet;
                 Flag_P_Z_S_A_Modifier : Boolean) return Octet.T_Octet is

        Le_Bit_Flag : Octet.T_Bit_Octet := Bit_Flag;

    begin

        Le_Bit_Flag (1) := False;
        Le_Bit_Flag (4) := False;
        if Flag_P_Z_S_A_Modifier then
            Modif_Flag_P_Z_S (Bit_Octet_1, Le_Bit_Flag);
        end if;
        return Octet.Convert_Octet (Le_Bit_Flag);

    end Modif_Flag_Decalage;


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

    procedure Rl_F (Octet_1 : in out Octet.T_Octet;
                    Flag : in out Octet.T_Octet;
                    Flag_P_Z_S_A_Modifier : Boolean) is

        Sauv_Carry : Boolean;

    begin

        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Flag := Octet.Convert_Bit (Flag);
        Sauv_Carry := Bit_Flag (0);

        Bit_Flag (0) := Bit_Octet_1 (7);
        for I in reverse 1 .. 7 loop
            Bit_Octet_1 (I) := Bit_Octet_1 (I - 1);
        end loop;
        Bit_Octet_1 (0) := Sauv_Carry;

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  (rq carry modifiee ds la boucle)

        Flag := Modif_Flag_Decalage
                   (Bit_Octet_1, Bit_Flag, Flag_P_Z_S_A_Modifier);
    end Rl_F;

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

    procedure Rlc_F (Octet_1 : in out Octet.T_Octet;
                     Flag : in out Octet.T_Octet;
                     Flag_P_Z_S_A_Modifier : Boolean) is

    begin

        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Flag := Octet.Convert_Bit (Flag);

        Bit_Flag (0) := Bit_Octet_1 (7);

        for I in reverse 1 .. 7 loop
            Bit_Octet_1 (I) := Bit_Octet_1 (I - 1);
        end loop;
        Bit_Octet_1 (0) := Bit_Flag (0);

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag   (rq carry modifiee ds la boucle)
        Flag := Modif_Flag_Decalage
                   (Bit_Octet_1, Bit_Flag, Flag_P_Z_S_A_Modifier);
    end Rlc_F;

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

    procedure Rr_F (Octet_1 : in out Octet.T_Octet;
                    Flag : in out Octet.T_Octet;
                    Flag_P_Z_S_A_Modifier : Boolean) is

        Sauv_Carry : Boolean;

    begin

        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Flag := Octet.Convert_Bit (Flag);
        Sauv_Carry := Bit_Flag (0);

        Bit_Flag (0) := Bit_Octet_1 (0);

        for I in 0 .. 6 loop
            Bit_Octet_1 (I) := Bit_Octet_1 (I + 1);
        end loop;
        Bit_Octet_1 (7) := Sauv_Carry;

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  (rq carry modifiee ds la boucle)

        Flag := Modif_Flag_Decalage
                   (Bit_Octet_1, Bit_Flag, Flag_P_Z_S_A_Modifier);
    end Rr_F;

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

    procedure Rrc_F (Octet_1 : in out Octet.T_Octet;
                     Flag : in out Octet.T_Octet;
                     Flag_P_Z_S_A_Modifier : Boolean) is

    begin
        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Flag := Octet.Convert_Bit (Flag);

        Bit_Flag (0) := Bit_Octet_1 (0);

        for I in 0 .. 6 loop
            Bit_Octet_1 (I) := Bit_Octet_1 (I + 1);
        end loop;
        Bit_Octet_1 (7) := Bit_Flag (0);

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag   (rq carry modifiee ds la boucle)
        Flag := Modif_Flag_Decalage
                   (Bit_Octet_1, Bit_Flag, Flag_P_Z_S_A_Modifier);

    end Rrc_F;

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

    procedure Sla_F (Octet_1 : in out Octet.T_Octet;
                     Flag : in out Octet.T_Octet) is
    begin
        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Flag := Octet.Convert_Bit (Flag);

        Bit_Flag (0) := Bit_Octet_1 (7);

        for I in reverse 1 .. 7 loop
            Bit_Octet_1 (I) := Bit_Octet_1 (I - 1);
        end loop;

        Bit_Octet_1 (0) := False;

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  (rq carry modifiee ds la boucle)
       Flag := Modif_Flag_Decalage (Bit_Octet_1, Bit_Flag, True);

    end Sla_F;

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

    procedure Sra_F (Octet_1 : in out Octet.T_Octet;
                     Flag : in out Octet.T_Octet) is

    begin
        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Flag := Octet.Convert_Bit (Flag);

        Bit_Flag (0) := Bit_Octet_1 (0);

        for I in 0 .. 6 loop
            Bit_Octet_1 (I) := Bit_Octet_1 (I + 1);
        end loop;

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  (rq carry modifiee ds la boucle)

        Flag := Modif_Flag_Decalage (Bit_Octet_1, Bit_Flag, True);

    end Sra_F;

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

    procedure Srl_F (Octet_1 : in out Octet.T_Octet;
                     Flag : in out Octet.T_Octet) is
    begin
        Bit_Octet_1 := Octet.Convert_Bit (Octet_1);
        Bit_Flag := Octet.Convert_Bit (Flag);

        Bit_Flag (0) := Bit_Octet_1 (0);

        for I in 0 .. 6 loop
            Bit_Octet_1 (I) := Bit_Octet_1 (I + 1);
        end loop;

        Bit_Octet_1 (7) := False;

        Octet_1 := Octet.Convert_Octet (Bit_Octet_1);

        -- flag  (rq carry modifiee ds la boucle)


        Flag := Modif_Flag_Decalage (Bit_Octet_1, Bit_Flag, True);

    end Srl_F;



    --------------------------------------------------
    -- PROCEDURES INTERNES (privees)
    --------------------------------------------------

    procedure Add_8_Bit_C_V_H (Bit_Octet_1 : in out Octet.T_Bit_Octet;
                               Bit_Octet_2 : Octet.T_Bit_Octet;
                               Carry : in out Boolean;
                               Over_Flow : in out Boolean;
                               Half_Carry : in out Boolean) is

        -- ajoute 2 octets entre eux en tenant compte de la carry passee
        -- en parametre et en modifiant la carry, la half_carry et l'over_flow
        -- qui on ete passe en parametre
    begin
        for I in Octet.Num_Bit loop
            Octet.Add_Bit_C (Bit_Octet_1 (I), Bit_Octet_2 (I), Carry);
            if I = 3 then
                Half_Carry := Carry;
            end if;
            if I = 6 then  
                Over_Flow := Carry;
            end if;  
        end loop;  
        Over_Flow := Over_Flow xor Carry;
    end Add_8_Bit_C_V_H;


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


    procedure Modif_Flag_Z_S (Bit_Octet : Octet.T_Bit_Octet;
                              Flag : in out Octet.T_Bit_Octet) is

    begin

        -- flag Z
        Flag (6) := True;
        for I in Octet.Num_Bit loop
            if Bit_Octet (I) then
                Flag (6) := False;
                exit;
            end if;
        end loop;

        -- flag S
        Bit_Flag (7) := Bit_Octet (7);

    end Modif_Flag_Z_S;



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

    procedure Modif_Flag_P_Z_S (Bit_Octet : Octet.T_Bit_Octet;
                                Flag : in out Octet.T_Bit_Octet) is

        Nb_Bit_A_Un : Octet.T_Octet := 0;
    begin

        -- flag P
        for I in Octet.Num_Bit loop
            if Bit_Octet (I) then
                Nb_Bit_A_Un := Nb_Bit_A_Un + 1;
            end if;
        end loop;

        if (Nb_Bit_A_Un mod 2) = 1 then
            Flag (2) := False;
        else
            Flag (2) := True;
        end if;

        -- flag Z
        Flag (6) := (Nb_Bit_A_Un = 0);

        -- flag S
        Bit_Flag (7) := Bit_Octet (7);

    end Modif_Flag_P_Z_S;

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


end Alu_8_Bit;

E3 Meta Data

    nblk1=21
    nid=21
    hdr6=3e
        [0x00] rec0=1f rec1=00 rec2=01 rec3=034
        [0x01] rec0=00 rec1=00 rec2=14 rec3=012
        [0x02] rec0=14 rec1=00 rec2=03 rec3=004
        [0x03] rec0=14 rec1=00 rec2=06 rec3=016
        [0x04] rec0=06 rec1=00 rec2=1e rec3=022
        [0x05] rec0=17 rec1=00 rec2=17 rec3=054
        [0x06] rec0=0b rec1=00 rec2=08 rec3=034
        [0x07] rec0=20 rec1=00 rec2=0a rec3=064
        [0x08] rec0=21 rec1=00 rec2=0b rec3=050
        [0x09] rec0=24 rec1=00 rec2=04 rec3=010
        [0x0a] rec0=00 rec1=00 rec2=1b rec3=020
        [0x0b] rec0=1f rec1=00 rec2=05 rec3=02c
        [0x0c] rec0=1e rec1=00 rec2=07 rec3=020
        [0x0d] rec0=1f rec1=00 rec2=12 rec3=016
        [0x0e] rec0=1b rec1=00 rec2=0c rec3=064
        [0x0f] rec0=00 rec1=00 rec2=0d rec3=006
        [0x10] rec0=21 rec1=00 rec2=0e rec3=028
        [0x11] rec0=1e rec1=00 rec2=0f rec3=02c
        [0x12] rec0=1f rec1=00 rec2=1a rec3=07a
        [0x13] rec0=22 rec1=00 rec2=09 rec3=004
        [0x14] rec0=22 rec1=00 rec2=1c rec3=046
        [0x15] rec0=22 rec1=00 rec2=13 rec3=006
        [0x16] rec0=1f rec1=00 rec2=20 rec3=056
        [0x17] rec0=23 rec1=00 rec2=11 rec3=032
        [0x18] rec0=23 rec1=00 rec2=10 rec3=002
        [0x19] rec0=21 rec1=00 rec2=15 rec3=050
        [0x1a] rec0=19 rec1=00 rec2=16 rec3=040
        [0x1b] rec0=1a rec1=00 rec2=18 rec3=076
        [0x1c] rec0=01 rec1=00 rec2=1d rec3=002
        [0x1d] rec0=29 rec1=00 rec2=02 rec3=020
        [0x1e] rec0=0c rec1=00 rec2=19 rec3=000
        [0x1f] rec0=0c rec1=00 rec2=19 rec3=000
        [0x20] rec0=0c rec1=00 rec2=19 rec3=000
    tail 0x2150b5a16822b54618667 0x42a00088462060003
Free Block Chain:
  0x21: 0000  00 1f 00 75 80 01 3b 01 00 00 00 00 25 20 20 20  ┆   u  ;     %   ┆
  0x1f: 0000  00 00 00 5f 00 36 20 20 20 20 2d 2d 2d 2d 2d 2d  ┆   _ 6    ------┆