|
|
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: 23249 (0x5ad1)
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 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;