OpenCores
URL https://opencores.org/ocsvn/lattice6502/lattice6502/trunk

Subversion Repositories lattice6502

[/] [lattice6502/] [ispLeaver/] [65C02.vhd] - Diff between revs 3 and 6

Only display areas with differences | Details | Blame | View Log

Rev 3 Rev 6
------------------------------------------------------------------
------------------------------------------------------------------
--      6502 principal module.
--      6502 principal module.
--
--
--      Copyright Ian Chapman October 28 2010
--      Copyright Ian Chapman October 28 2010
--
--
--      This file is part of the Lattice 6502 project
--      This file is part of the Lattice 6502 project
--      It is used to compile with Linux ghdl and ispLeaver.
--      It is used to compile with Linux ghdl and ispLeaver.
--
--      email author@kool.kor
 
--      author  EQU     ichapman
 
--      kool    EQU     videotron
 
--      kor     EQU     ca
--
--
--      To do
--      To do
--              Detailed test of all instructions.
--              Detailed test of all instructions.
--
--
--      *************************************************************
--      *************************************************************
--      Distributed under the GNU Lesser General Public License.    *
--      Distributed under the GNU Lesser General Public License.    *
--      This can be obtained from www.gnu.org.                    *
--      This can be obtained from www.gnu.org.                      *
--      *************************************************************
--      *************************************************************
--      This program is free software: you can redistribute it and/or modify
--      This program is free software: you can redistribute it and/or modify
--      it under the terms of the GNU General Public License as published by
--      it under the terms of the GNU General Public License as published by
--      the Free Software Foundation, either version 3 of the License, or
--      the Free Software Foundation, either version 3 of the License, or
--      (at your option) any later version.
--      (at your option) any later version.
--
--
--      This program is distributed in the hope that it will be useful,
--      This program is distributed in the hope that it will be useful,
--      but WITHOUT ANY WARRANTY; without even the implied warranty of
--      but WITHOUT ANY WARRANTY; without even the implied warranty of
--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--      GNU General Public License for more details.
--      GNU General Public License for more details.
--
--
--      You should have received a copy of the GNU General Public License
--      You should have received a copy of the GNU General Public License
--      along with this program.  If not, see <http://www.gnu.org/licenses/>
--      along with this program.  If not, see <http://www.gnu.org/licenses/>
--
--
--      65C02.vhd
--      65C02.vhd
 
 
 
 
---  Purpose to test and exercise my VHLD skills
---  Purpose to test and exercise my VHLD skills
---- I've decided not to support 65C02 instructions
---- I've decided not to support 65C02 instructions
---- nor BCD arithmetic.
---- nor BCD arithmetic.
---- I will make it run as fast as I can.  Timing not per a real 6502
---- I will make it run as fast as I can.  Timing not per a real 6502
---- Lattice EBI has clocked address inputs, so as not to add a cycle
---- Lattice EBI has clocked address inputs, so as not to add a cycle
---- 6502 address outputs are not latched.  The data output of the EBI ROM and
---- 6502 address outputs are not latched.  The data output of the EBI ROM and
---- RAM is not clocked.
---- RAM is not clocked.
---- To maintain speed the 6502 address to ROM/RAM is not clocked and the data
---- To maintain speed the 6502 address to ROM/RAM is not clocked and the data
---- returned is not clocked by ROM/RAM.  Structures of form address <= address + "1";
---- returned is not clocked by ROM/RAM.  Structures of form address <= address + "1";
---- cause a race condition.  I had to store the address from the  mux for
---- cause a race condition.  I had to store the address from the  mux for
---- INC type instructions ie read then write.
---- INC type instructions ie read then write.
----
----
---- One boob I've just noticed jsr and pha in the 6502 work opposite to 
---- One boob I've just noticed jsr and pha in the 6502 work opposite to 
---- what I expected ie jsr decrements the stack and I inc it.  I guess
---- what I expected ie jsr decrements the stack and I inc it.  I guess
---- that was the way my first computer the SDS sigma 2 did it.  I'll keep
---- that was the way my first computer the SDS sigma 2 did it.  I'll keep
---- like that for now in case a bigger stack is needed.  Oh no a sigma 2
---- like that for now in case a bigger stack is needed.  Oh no a sigma 2
---- did not have a stack only L link register.
---- did not have a stack only L link register.
----
----
--      I used this to set the hold timing default "-exp parHoldLimit=999"
--      I used this to set the hold timing default "-exp parHoldLimit=999"
--      Also path based placement on
--      Also path based placement on
--      When generating a Lattice ROM/RAM untick latche outputs and use
--      When generating a Lattice ROM/RAM untick latche outputs and use
--      the *.mem file generated with my asm2rom.pl script.
--      the *.mem file generated with my asm2rom.pl script.
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
--                      TO Do
--                      TO Do
--      1       DONE Update all address modes of cmp, cpx and cpy per #mode
--      1       DONE Update all address modes of cmp, cpx and cpy per #mode
--      2       DONE Add rol, ror, asl, lsr,  per inc and dec
--      2       DONE Add rol, ror, asl, lsr,  per inc and dec
--      3       DONE Correct flags in all modes of item 2
--      3       DONE Correct flags in all modes of item 2
--      4       Update the stack instructions, I've it pushing up not down.
--      4       DONE Update the stack instructions, I've it pushing up not down.
--      5       Continue testing
--      5       Continue testing
--      6       DONE Get a kernel up to test each and every instruction
--      6       DONE Get a kernel up to test each and every instruction
--      7       Test all instructions
--      7       Test all instructions
--      7       Add the 65C02 stuff.  I think the most needed is phx, phy, plx
--      7       Add the 65C02 stuff.  I think the most needed is phx, phy, plx
--              and ply are the most useful.
--              and ply are the most useful.
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
--      Revision history
--      Revision history
 
--      Dec 3, 2010
 
--      Interrupts BRK, IRQ and NMI checked out seem okay.
 
--      Fixed stack to push down pull up.
 
--      addressing      (zero,x) corrected.
 
--      CLV error corrected.
 
--      rol, ror, asl and lsr shift instructions checked and fixed.
 
--      Nov 17, 2010
 
--      Corrected BRK, IRQ, NMI and RTI due to error in status byte.
--      Nov 4, 2010
--      Nov 4, 2010
--      Rationalized all flavours of cmp, cpy and cpx.
--      Rationalized all flavours of cmp, cpy and cpx.
--      Changed jsr to combine out_dat1 and out_dat2 into out_dat.
--      Changed jsr to combine out_dat1 and out_dat2 into out_dat.
--      Changed wr_ctr to wr_fg.
--      Changed wr_ctr to wr_fg.
--      This saved 43 slices, 69% of slices are used.
--      This saved 43 slices, 69% of slices are used.
--      Removed many redundant comment lines.
--      Removed many redundant comment lines.
--      ******************************************************************
--      ******************************************************************
--      Nov 1, 2010
--      Nov 1, 2010
--      Double quotes inside a comment line rejected by ghdl
--      Double quotes inside a comment line rejected by ghdl
--      cmp carry not set when equal
--      cmp carry not set when equal
--      php not saving flags, had to add a cycle for flags to prop in cycle 0
--      php not saving flags, had to add a cycle for flags to prop in cycle 0
--
--
--      ******************************************************************************
--      ******************************************************************************
 
 
library IEEE;                   --Use standard IEEE libs as recommended by Tristan.
library IEEE;                   --Use standard IEEE libs as recommended by Tristan.
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.all;
use IEEE.numeric_std.all;
 
 
entity P65C02 is
entity P65C02 is
 
 
Port (
Port (
        clock: in std_logic;
        clock: in std_logic;
        reset : in std_logic;
        reset : in std_logic;
        data_wr: out unsigned(7 downto 0);
        data_wr: out unsigned(7 downto 0);
        data_rd: in unsigned(7 downto 0);
        data_rd: in unsigned(7 downto 0);
        proc_write:  inout std_logic;
        proc_write:  inout std_logic;
        irq: in std_logic;              --Active 0
        irq: in std_logic;              --Active 0
        nmi: in std_logic;              --Neg transition.
        nmi: in std_logic;              --Neg transition.
        address: inout unsigned(15 downto 0)
        address: inout unsigned(15 downto 0)
    );
    );
end P65C02;
end P65C02;
 
 
architecture P65C02_architecture of P65C02 is
architecture P65C02_architecture of P65C02 is
------------------------------------------------------------------------
------------------------------------------------------------------------
-- Signal Declarations
-- Signal Declarations
------------------------------------------------------------------------
------------------------------------------------------------------------
signal reg_pc : unsigned(15 downto 0);
signal reg_pc : unsigned(15 downto 0);
signal add_hold : unsigned(15 downto 0);
signal add_hold : unsigned(15 downto 0);
signal reg_a  : unsigned(8 downto 0);
signal reg_a  : unsigned(8 downto 0);
signal reg_x, reg_y, reg_s, reg_sp : unsigned(7 downto 0);
signal reg_x, reg_y, reg_s, reg_sp : unsigned(7 downto 0);
signal Instruction_in, dat_in1, dat_in2, dat_out : unsigned(7 downto 0);
signal Instruction_in, dat_in1, dat_in2, dat_out : unsigned(7 downto 0);
signal n_fg, v_fg, b_fg, d_fg, i_fg, z_fg, v_ff, wr_fg : std_logic;
signal n_fg, v_fg, b_fg, d_fg, i_fg, z_fg, v_ff, wr_fg : std_logic;
signal cycle_ctr, add_fg : unsigned(3 downto 0);
signal cycle_ctr, add_fg : unsigned(3 downto 0);
signal flags_fg : unsigned(1 downto 0);
signal flags_fg : unsigned(1 downto 0);
 
 
 
 
signal reset_fg, irq_fg, nmi_fg, start_fg, pc_inc_fg, branch_fg: std_logic;
signal reset_fg, irq_fg, nmi_ff1, nmi_ff2, nmi_req, nmi_fg, start_fg, pc_inc_fg, branch_fg: std_logic;
signal pc_dec_fg, dat2pc_fg : std_logic;
signal pc_dec_fg, dat2pc_fg : std_logic;
--      End of signal declarations
--      End of signal declarations
 
 
begin   --architecture
begin   --architecture
--      =======================================================
--      =======================================================
read_mem:process (clock, reset)
read_mem:process (clock, reset)
begin
begin
if reset = '0' then
if reset = '0' then
        dat_in1 <= (others => '0');
        dat_in1 <= (others => '0');
        dat_in2 <= (others => '0');
        dat_in2 <= (others => '0');
        instruction_in <= (others => '0');
        instruction_in <= (others => '0');
 
 
        elsif rising_edge(clock) then
        elsif rising_edge(clock) then
                dat_in2 <= dat_in1;
                dat_in2 <= dat_in1;
                dat_in1 <= data_rd;
                dat_in1 <= data_rd;
 
 
                if cycle_ctr = x"0" then
                if cycle_ctr = x"0" then
                        if irq = '0' or nmi = '0' or (reset = '1' and reset_fg = '0') then
--                      if (i_fg = '0' and (irq = '0' or nmi_req = '0')) or (reset = '1' and reset_fg = '0') then
 
                        if (i_fg = '0' and irq = '0') or nmi_req = '0' or (reset = '1' and reset_fg = '0') then
                                Instruction_in <= x"00";
                                Instruction_in <= x"00";
                        else
                        else
                                Instruction_in <= data_rd;
                                Instruction_in <= data_rd;
                        end if;
                        end if;
                end if;
                end if;
end if;
end if;
end process read_mem;
end process read_mem;
 
 
--      =======================================================
--      =======================================================
Prog_ptr:process (clock, reset, pc_dec_fg)
Prog_ptr:process (clock, reset, pc_dec_fg)
begin
begin
if reset = '0' then
if reset = '0' then
        reg_pc <= x"FFFC";
        reg_pc <= x"FFFC";
        elsif rising_edge(clock) then
        elsif rising_edge(clock) then
                if dat2pc_fg = '1' then
                if dat2pc_fg = '1' then
                        reg_pc(15 downto 8) <= data_rd;
                        reg_pc(15 downto 8) <= data_rd;
                        reg_pc(7 downto 0) <= dat_in1;
                        reg_pc(7 downto 0) <= dat_in1;
 
 
                elsif (cycle_ctr = X"0" and not(irq = '0' or nmi = '0' )) or pc_inc_fg = '1' then
--              elsif (cycle_ctr = X"0" and not(irq = '0' or nmi = '0' )) or pc_inc_fg = '1' then
 
                elsif cycle_ctr = X"0" or pc_inc_fg = '1' then
                        reg_pc <= reg_pc + x"0001";
                        reg_pc <= reg_pc + x"0001";
 
 
                elsif pc_dec_fg = '1' then
                elsif pc_dec_fg = '1' then
                        reg_pc <= reg_pc - x"0001";
                        reg_pc <= reg_pc - x"0001";
 
 
--              elsif cycle_ctr = x"0" and irq = '0' and i_fg = '0' then
--              elsif cycle_ctr = x"0" and irq = '0' and i_fg = '0' then
--                      reg_pc <= reg_pc - x"0001";
--                      reg_pc <= reg_pc - x"0001";
 
 
                elsif branch_fg = '1' then
                elsif branch_fg = '1' then
                        reg_pc <= reg_pc + (dat_in1(7) & dat_in1(7) & dat_in1(7) & dat_in1(7) & dat_in1(7) & dat_in1(7) & dat_in1(7) & dat_in1(7) &  dat_in1);
                        reg_pc <= reg_pc + (dat_in1(7) & dat_in1(7) & dat_in1(7) & dat_in1(7) & dat_in1(7) & dat_in1(7) & dat_in1(7) & dat_in1(7) &  dat_in1);
                end if;
                end if;
end if;
end if;
end process Prog_ptr;
end process Prog_ptr;
 
 
addressing:process (clock, reset, reg_PC, add_fg)
addressing:process (reset, proc_write, data_rd, dat_in1, dat_in2, reg_x, reg_y, reg_sp, add_hold, reg_PC, add_fg)
begin
begin
 
 
if reset = '0' then
if reset = '0' then
address <= reg_pc;
address <= reg_pc;
        else
        else
                Case add_fg is
                Case add_fg is
                when x"0" =>
                when x"0" =>
                        address <= reg_pc;
                        address <= reg_pc;
                when x"1" =>                    --Zero page
                when x"1" =>                    --Zero page
                        if proc_write = '0' then
                        if proc_write = '0' then
                                address(7 downto 0) <= data_rd;
                                address(7 downto 0) <= data_rd;
                        else
                        else
                                address(7 downto 0) <= dat_in1;
                                address(7 downto 0) <= dat_in1;
                        end if;
                        end if;
                        address(15 downto 8) <= x"00";
                        address(15 downto 8) <= x"00";
                when x"2" =>                    --Zero page, x
                when x"2" =>                    --Zero page, x
                        if proc_write = '0' then
                        if proc_write = '0' then
                                address(7 downto 0) <= data_rd + reg_x;
                                address(7 downto 0) <= data_rd + reg_x;
                        else
                        else
                                address(7 downto 0) <= dat_in1 + reg_x;
                                address(7 downto 0) <= dat_in1 + reg_x;
                        end if;
                        end if;
                        address(15 downto 8) <= x"00";
                        address(15 downto 8) <= x"00";
 
 
                when x"3" =>                    --Zero page, y
                when x"3" =>                    --Zero page, y
                        if proc_write = '0' then
                        if proc_write = '0' then
                                address(7 downto 0) <= data_rd + reg_y;
                                address(7 downto 0) <= data_rd + reg_y;
                        else
                        else
                                address(7 downto 0) <= dat_in1 + reg_y;
                                address(7 downto 0) <= dat_in1 + reg_y;
                        end if;
                        end if;
                        address(15 downto 8) <= x"00";
                        address(15 downto 8) <= x"00";
                when x"4" =>                    --Absolute Return sub etc
                when x"4" =>                    --Absolute Return sub etc
                        if proc_write = '0' then
                        if proc_write = '0' then
                                address <= data_rd & dat_in1;
                                address <= data_rd & dat_in1;
                        else
                        else
                                address <= dat_in1 & dat_in2;
                                address <= dat_in1 & dat_in2;
                        end if;
                        end if;
                when x"5" =>                    --Absolute, x
                when x"5" =>                    --Absolute, x
                        if proc_write = '0' then
                        if proc_write = '0' then
                                address <= data_rd & dat_in1 + reg_x;
                                address <= data_rd & dat_in1 + reg_x;
                        else
                        else
                                address <= dat_in1 & dat_in2 + reg_x;
                                address <= dat_in1 & dat_in2 + reg_x;
                        end if;
                        end if;
                when x"6" =>                    --Absolute, y
                when x"6" =>                    --Absolute, y
                        address <= (data_rd & dat_in1) + reg_y;
--                      address <= (data_rd & dat_in1) + reg_y;
 
 
                        if proc_write = '0' then
                        if proc_write = '0' then
                                address <= data_rd & dat_in1 + reg_y;
                                address <= data_rd & dat_in1 + reg_y;
                        else
                        else
                                address <= dat_in1 & dat_in2 + reg_y;
                                address <= dat_in1 & dat_in2 + reg_y;
                        end if;
                        end if;
 
 
                when x"7" =>                    --Stack pointer
                when x"7" =>                    --Stack pointer
                        address <= x"01" & reg_sp;              --msb should be hex 01
                        address <= x"01" & reg_sp;              --msb should be hex 01
                when x"8" =>                    --Reset 1st byte
                when x"8" =>                    --Reset 1st byte
                        address <= x"FFFC";
                        address <= x"FFFC";
                when x"9" =>                    --IRQ and Break 1st byte
                when x"9" =>                    --IRQ and Break 1st byte
                        address <= x"FFFE";
                        address <= x"FFFE";
                when x"A" =>                    --NMI and Break 1st byte
                when x"A" =>                    --NMI and Break 1st byte
                        address <= x"FFFA";
                        address <= x"FFFA";
                when x"B" =>                    --address + 1
                when x"B" =>                    --address + 1
                        address <= add_hold + "1";
                        address <= add_hold + "1";
                when x"C" =>                    --(zero),y
                when x"C" =>                    --(zero),y
                        address(7 downto 0) <= dat_in1 + "1";
                        address(7 downto 0) <= dat_in1 + "1";
                        address(15 downto 8) <= x"00";
                        address(15 downto 8) <= x"00";
                when x"D" =>                    --(zero,x)
                when x"D" =>                    --(zero,x)
                        address(7 downto 0) <= dat_in1 + reg_x + "1";
                        address(7 downto 0) <= dat_in1 + reg_x + "1";
                        address(15 downto 8) <= x"00";
                        address(15 downto 8) <= x"00";
                when x"F" =>                    --Hold address steady for INC etc
                when x"F" =>                    --Hold addre    nmi_ff1 <= '0';ss steady for INC etc
                        address <= add_hold;
                        address <= add_hold;
                when others =>
                when others =>
                        address <= reg_pc;
                        address <= reg_pc;
        end case;
        end case;
end if;
end if;
end process addressing;
end process addressing;
 
 
hold_address:process(clock, reset, address)
hold_address:process(clock, reset, address)
begin                   --hold address bus for inc type instructions.
begin                   --hold address bus for inc type instructions.
if reset = '0' then
if reset = '0' then
        add_hold <= (others => '0');
        add_hold <= (others => '0');
elsif rising_edge(clock) then
elsif rising_edge(clock) then
        add_hold <= address;
        add_hold <= address;
end if;
end if;
end process hold_address;
end process hold_address;
 
 
memory_proc_write:process(clock, reset, wr_fg)
memory_proc_write:process(clock, reset, wr_fg)
begin
begin
if reset = '0' then
if reset = '0' then
        data_wr <= (others => '0');
        data_wr <= (others => '0');
        proc_write <= '0';
        proc_write <= '0';
 
 
elsif rising_edge(clock) then
elsif rising_edge(clock) then
        proc_write <= wr_fg;
        proc_write <= wr_fg;
        if wr_fg = '1' then
--      if wr_fg = '1' then
                data_wr <= dat_out;
                data_wr <= dat_out;
        end if;
--      end if;
end if;
end if;
end process memory_proc_write;
end process memory_proc_write;
 
 
instruction_decode:process (clock, reset, irq, nmi)
instruction_decode:process (clock, reset, irq, nmi)
begin
begin
if reset = '0' then
if reset = '0' then
        cycle_ctr <= (others => '0');
        cycle_ctr <= (others => '0');
        pc_inc_fg <= '0';
        pc_inc_fg <= '0';
        pc_dec_fg <= '0';
        pc_dec_fg <= '0';
        dat2pc_fg <= '0';
        dat2pc_fg <= '0';
        add_fg <= (others => '0');
        add_fg <= (others => '0');
        branch_fg <= '0';
        branch_fg <= '0';
        flags_fg <= (others => '0');
        flags_fg <= (others => '0');
        wr_fg <= '0';
        wr_fg <= '0';
        reg_a <= (others => '0');
        reg_a <= (others => '0');
        reg_x <= (others => '0');
        reg_x <= (others => '0');
        reg_y <= (others => '0');
        reg_y <= (others => '0');
        reg_s <= (others => '0');
        reg_sp <= (others => '1');
        reg_sp <= (others => '0');
 
        n_fg <= '0';
        n_fg <= '0';
        v_fg <= '0';
        v_fg <= '0';
        b_fg <= '0';
        b_fg <= '0';
        d_fg <= '0';
        d_fg <= '0';
        i_fg <= '0';
        i_fg <= '1';
        z_fg <= '0';
        z_fg <= '0';
        reset_fg <= '0';
        reset_fg <= '0';
        start_fg <= '0';
        start_fg <= '0';
        v_ff <= '0';
        v_ff <= '0';
 
        nmi_ff1 <= '1';
 
        nmi_ff2 <= '1';
 
        nmi_req <= '1';
        nmi_fg <= '0';
        nmi_fg <= '0';
        irq_fg <= '0';
        irq_fg <= '0';
        dat_out <= (others => '0');
        dat_out <= (others => '0');
 
 
elsif rising_edge(clock) then
elsif rising_edge(clock) then
        reset_fg <= reset;
        reset_fg <= reset;
 
--      This is to generate a nmi_req from neg transition on nmi input
 
        nmi_ff1 <= nmi;
 
        nmi_ff2 <= nmi_ff1;
 
        if nmi_fg = '0' and nmi_ff2 = '1' and nmi = '0' then
 
                nmi_req <= '0';
 
        end if;
 
 
--      This section is to get started
--      This section is to get started
                if reset = '1' and reset_fg = '0' then
                if reset = '1' and reset_fg = '0' then
                        start_fg <= '1';
                        start_fg <= '1';
                        wr_fg <= '0';
                        wr_fg <= '0';
                        add_fg <= x"8";         --get start up vectors FFFC FFFD
                        add_fg <= x"8";         --get start up vectors FFFC FFFD
                        cycle_ctr <= x"5";      --Jump into cycle 5 add_fg <= x'8'
                        cycle_ctr <= x"7";      --Jump into cycle 7 add_fg <= x'8'
--              end if;
--              end if;
        else
        else
 
 
 
 
        case cycle_ctr is               --cycle counter case
        case cycle_ctr is               --cycle counter case
                when x"0" =>
                when x"0" =>
 
 
                        if  reset_fg = '1' and reset = '1' then
                        if  reset_fg = '1' and reset = '1' then
 
 
                                if flags_fg /= "00" then
                                if flags_fg /= "00" then
                                        n_fg <= dat_out(7);
                                        n_fg <= dat_out(7);
                                        if dat_out = x"00" then
                                        if dat_out = x"00" then
                                                z_fg <= '1';
                                                z_fg <= '1';
                                        else
                                        else
                                                z_fg <= '0';
                                                z_fg <= '0';
                                        end if;
                                        end if;
                                end if;
                                end if;
                                if flags_fg = "10" then
                                if flags_fg = "10" then
                                        start_fg <= '0';
                                        start_fg <= '0';
                                        v_fg <= reg_a(7) xnor v_ff;     --Add V_ff true overflow possible
                                        v_fg <= reg_a(7) xnor v_ff;     --Add V_ff true overflow possible
--                                                                      --Sub V_ff false underflow possible
--                                                                      --Sub V_ff false underflow possible
                                end if;
                                end if;
                        flags_fg <= "00";
                        flags_fg <= "00";
                        end if;
                        end if;
 
 
                        if irq = '0' and i_fg = '0' then
                        if irq = '0' and i_fg = '0' then
                                irq_fg <= '1';
                                irq_fg <= '1';
                                b_fg <= '0';
 
                                pc_dec_fg <= '1';
                                pc_dec_fg <= '1';
                                cycle_ctr <= cycle_ctr + x"1";
                                cycle_ctr <= cycle_ctr + x"1";
                        elsif nmi = '0' and i_fg = '0' then
                        elsif nmi_req = '0' then
                                nmi_fg <= '1';
                                nmi_fg <= '1';
                                b_fg <= '0';
 
                                pc_dec_fg <= '1';
                                pc_dec_fg <= '1';
                                cycle_ctr <= cycle_ctr + x"1";
                                cycle_ctr <= cycle_ctr + x"1";
                        else
                        else
 
 
                        case data_rd is
                        case data_rd is
 
 
--      ===========================================================================================
--      ===========================================================================================
                                when x"48" =>                   --PHA 1st part accumulator onto stack
                                when x"48" =>                   --PHA 1st part accumulator onto stack
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        pc_dec_fg <= '1';
                                        pc_dec_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"08" =>                   --PHP 1st part status onto stack
                                when x"08" =>                   --PHP 1st part status onto stack
                                        pc_dec_fg <= '1';
                                        pc_dec_fg <= '1';       --php needs extra cycle to propagate flags 
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"68" =>                   --PLA  1st part Pull Accumulator from Stack
                                when x"68" =>                   --PLA  1st part Pull Accumulator from Stack
                                        reg_sp <= reg_sp - "1";
                                        reg_sp <= reg_sp + "1";         --plus
                                        pc_dec_fg <= '1';
                                        pc_dec_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"28" =>                   --PLP 1st part pull old status from stack
                                when x"28" =>                   --PLP 1st part pull old status from stack
                                        reg_sp <= reg_sp - "1";
                                        reg_sp <= reg_sp + "1";         --plus
                                        pc_dec_fg <= '1';
                                        pc_dec_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"18" =>                   --CLC clear carry
                                when x"18" =>                   --CLC clear carry
                                        reg_a(8) <= '0';
                                        reg_a(8) <= '0';
--                                      pc_dec_fg <= '1';
 
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"38" =>                   --SEC set carry
                                when x"38" =>                   --SEC set carry
                                        reg_a(8) <= '1';
                                        reg_a(8) <= '1';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"58" =>                   --CLI  Clear interrupt Disable Bit
                                when x"58" =>                   --CLI  Clear interrupt Disable Bit
                                        i_fg <= '0';
                                        i_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"78" =>                   --SEI  Set interrupt Disable Status
                                when x"78" =>                   --SEI  Set interrupt Disable Status
                                        i_fg <= '1';
                                        i_fg <= '1';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"88" =>                   --DEY Decrement y reg
                                when x"88" =>                   --DEY Decrement y reg
                                        reg_y <= reg_y - "1";
                                        reg_y <= reg_y - "1";
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_y - "1";
                                        dat_out <= reg_y - "1";
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"98" =>                   --TYA transfer Y to A
                                when x"98" =>                   --TYA transfer Y to A
                                        reg_a(7 downto 0) <= reg_y;
                                        reg_a(7 downto 0) <= reg_y;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_y;
                                        dat_out <= reg_y;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"A8" =>                   --TAY transfer A to Y
                                when x"A8" =>                   --TAY transfer A to Y
                                        reg_y <= reg_a(7 downto 0);
                                        reg_y <= reg_a(7 downto 0);
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"B8" =>                   --CLV clear overflow flag
                                when x"B8" =>                   --CLV clear overflow flag
                                        v_fg <= '0';
                                        v_fg <= '0';
                                        pc_dec_fg <= '1';
 
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"C8" =>                   --INY increment Y reg
                                when x"C8" =>                   --INY increment Y reg
                                        reg_y <= reg_y + x"1";
                                        reg_y <= reg_y + x"1";
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_y + x"1";
                                        dat_out <= reg_y + x"1";
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"D8" =>                   --CLD Clear decimnal flag
                                when x"D8" =>                   --CLD Clear decimnal flag
                                        d_fg <= '0';
                                        d_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"E8" =>                   --INX increment X reg
                                when x"E8" =>                   --INX increment X reg
                                        reg_x <= reg_x + x"1";
                                        reg_x <= reg_x + x"1";
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_x + x"1";
                                        dat_out <= reg_x + x"1";
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"F8" =>                   --SLD Set decimnal flag
                                when x"F8" =>                   --SLD Set decimnal flag
                                        d_fg <= '1';
                                        d_fg <= '1';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"2A" =>                   --ROL A Rotate Left one bit 1st part.
                                when x"2A" =>                   --ROL A Rotate Left one bit 1st part.
                                        reg_a(8 downto 1) <= reg_a(7 downto 0);
                                        reg_a(8 downto 1) <= reg_a(7 downto 0);
                                        reg_a(0) <= reg_a(8);
                                        reg_a(0) <= reg_a(8);
                                        dat_out(7 downto 1) <= reg_a(6 downto 0);
                                        dat_out(7 downto 1) <= reg_a(6 downto 0);
                                        dat_out(0) <= reg_a(8);
                                        dat_out(0) <= reg_a(8);
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <=  x"0";
                                        cycle_ctr <=  x"0";
                                when x"6A" =>                   --ROR A Rotateft right one bit 1st part.
                                when x"6A" =>                   --ROR A Rotateft right one bit 1st part.
                                        reg_a(7 downto 0) <= reg_a(8 downto 1);
                                        reg_a(7 downto 0) <= reg_a(8 downto 1);
                                        reg_a(8) <= reg_a(0);
                                        reg_a(8) <= reg_a(0);
                                        dat_out <= reg_a(8 downto 1);
                                        dat_out <= reg_a(8 downto 1);
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <=  x"0";
                                        cycle_ctr <=  x"0";
                                when x"0A" =>                   --ASL A Shift Left one bit 1st part.
                                when x"0A" =>                   --ASL A Shift Left one bit 1st part.
                                        reg_a <= reg_a(7 downto 0) & '0';
                                        reg_a <= reg_a(7 downto 0) & '0';
                                        dat_out <= reg_a(6 downto 0) & '0';
                                        dat_out <= reg_a(6 downto 0) & '0';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <=  x"0";
                                        cycle_ctr <=  x"0";
                                when x"4A" =>                   --LSR A Logical Shift Right one bit 1st part.
                                when x"4A" =>                   --LSR A Logical Shift Right one bit 1st part.
                                        reg_a(7 downto 0) <= '0' & reg_a(7 downto 1);
                                        reg_a(7 downto 0) <= '0' & reg_a(7 downto 1);
                                        reg_a(8) <= reg_a(0);
                                        reg_a(8) <= reg_a(0);
                                        dat_out <= '0' & reg_a(7 downto 1);
                                        dat_out <= '0' & reg_a(7 downto 1);
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <=  x"0";
                                        cycle_ctr <=  x"0";
                                when x"9A" =>                   --TXS
                                when x"9A" =>                   --TXS
                                        reg_sp <= reg_x;
                                        reg_sp <= reg_x;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"AA" =>                   --TAX
                                when x"AA" =>                   --TAX
                                        reg_x <= reg_a(7 downto 0);
                                        reg_x <= reg_a(7 downto 0);
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"8A" =>                   --TXA
                                when x"8A" =>                   --TXA
                                        reg_a(7 downto 0) <= reg_x;
                                        reg_a(7 downto 0) <= reg_x;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"BA" =>                   --TSX
                                when x"BA" =>                   --TSX
                                        reg_x <= reg_sp;
                                        reg_x <= reg_sp;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_sp;
                                        dat_out <= reg_sp;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"CA" =>                   --DEX
                                when x"CA" =>                   --DEX
                                        reg_x <= reg_X - X"01";
                                        reg_x <= reg_X - X"01";
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_x - X"01";
                                        dat_out <= reg_x - X"01";
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
--      =============================================================================================
--      =============================================================================================
                                when x"F0" =>                   --BEQ branch true 1st part.
                                when x"F0" =>                   --BEQ branch true 1st part.
                                                cycle_ctr <= cycle_ctr + "1";
                                                cycle_ctr <= cycle_ctr + "1";
                                when x"D0" =>                   --BNE branch true 1st part.
                                when x"D0" =>                   --BNE branch true 1st part.
                                                cycle_ctr <= cycle_ctr + "1";
                                                cycle_ctr <= cycle_ctr + "1";
                                when x"10" =>                   --BPL plus true 1st part.
                                when x"10" =>                   --BPL plus true 1st part.
                                                cycle_ctr <= cycle_ctr + "1";
                                                cycle_ctr <= cycle_ctr + "1";
                                when x"30" =>                   --BM1 negative true 1st part.
                                when x"30" =>                   --BM1 negative true 1st part.
                                                cycle_ctr <= cycle_ctr + "1";
                                                cycle_ctr <= cycle_ctr + "1";
                                when x"50" =>                   --BVC overflow false 1st part.
                                when x"50" =>                   --BVC overflow false 1st part.
                                                cycle_ctr <= cycle_ctr + "1";
                                                cycle_ctr <= cycle_ctr + "1";
                                when x"70" =>                   --BVS overflow true 1st part.
                                when x"70" =>                   --BVS overflow true 1st part.
                                                cycle_ctr <= cycle_ctr + "1";
                                                cycle_ctr <= cycle_ctr + "1";
                                when x"90" =>                   --BCC carry false 1st part.
                                when x"90" =>                   --BCC carry false 1st part.
                                                cycle_ctr <= cycle_ctr + "1";
                                                cycle_ctr <= cycle_ctr + "1";
                                when x"B0" =>                   --BCS carry true 1st part.
                                when x"B0" =>                   --BCS carry true 1st part.
                                                cycle_ctr <= cycle_ctr + "1";
                                                cycle_ctr <= cycle_ctr + "1";
 
 
--      =============================================================================================
--      =============================================================================================
                                when x"A2" =>                   --LDX #.  1st partProto imediate instruction
                                when x"A2" =>                   --LDX #.  1st partProto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"A9" =>                   --LDA #.  1st part Proto imediate instruction
                                when x"A9" =>                   --LDA #.  1st part Proto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"09" =>                   --ORA #.  1st part Proto imediate instruction
                                when x"09" =>                   --ORA #.  1st part Proto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"29" =>                   --AND #.  1st part Proto imediate instruction
                                when x"29" =>                   --AND #.  1st part Proto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"49" =>                   --EOR #.  1st part Proto imediate instruction
                                when x"49" =>                   --EOR #.  1st part Proto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"69" =>                   --ADC #.  1st part Proto imediate instruction
                                when x"69" =>                   --ADC #.  1st part Proto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"A0" =>                   --LDY #.  1st part Proto imediate instruction
                                when x"A0" =>                   --LDY #.  1st part Proto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"C0" =>                   --CPY #.  1st part Proto imediate instruction
                                when x"C0" =>                   --CPY #.  1st part Proto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"C9" =>                   --CMP #.  1st part Proto imediate instruction
                                when x"C9" =>                   --CMP #.  1st part Proto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"E0" =>                   --CPX #.  1st part Proto imediate instruction
                                when x"E0" =>                   --CPX #.  1st part Proto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"E9" =>                   --SBC #.  1st part Proto imediate instruction
                                when x"E9" =>                   --SBC #.  1st part Proto imediate instruction
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
--      =============================================================================================
--      =============================================================================================
                                when x"84" =>                   --STY zero 1st part proto
                                when x"84" =>                   --STY zero 1st part proto
                                        dat_out <= reg_y;
                                        dat_out <= reg_y;
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"85" =>                   --STA zero 1st part proto
                                when x"85" =>                   --STA zero 1st part proto
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"86" =>                   --STX zero 1st part proto
                                when x"86" =>                   --STX zero 1st part proto
                                        dat_out <= reg_x;
                                        dat_out <= reg_x;
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"94" =>                   --STY zero, X 1st part proto
                                when x"94" =>                   --STY zero, X 1st part proto
                                        dat_out <= reg_y;
                                        dat_out <= reg_y;
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"95" =>                   --STA zero, X 1st part proto
                                when x"95" =>                   --STA zero, X 1st part proto
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"96" =>                   --STX zero, Y 1st part proto
                                when x"96" =>                   --STX zero, Y 1st part proto
                                        dat_out <= reg_x;
                                        dat_out <= reg_x;
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
--      ===============================================================================================
--      ===============================================================================================
 
 
                                when x"A1" =>                   --LDA (zero,x) 1st part proto
                                when x"A1" =>                   --LDA (zero,x) 1st part proto
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"B1" =>                   --LDA (zero),y 1st part proto
                                when x"B1" =>                   --LDA (zero),y 1st part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"21" =>                   --AND (zero,x) 1st part proto
                                when x"21" =>                   --AND (zero,x) 1st part proto
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"31" =>                   --AND (zero),y 1st part proto
                                when x"31" =>                   --AND (zero),y 1st part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"41" =>                   --EOR (zero,x) 1st part proto
                                when x"41" =>                   --EOR (zero,x) 1st part proto
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"51" =>                   --EOR (zero),y 1st part proto
                                when x"51" =>                   --EOR (zero),y 1st part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"01" =>                   --OR (zero,x) 1st part proto
                                when x"01" =>                   --OR (zero,x) 1st part proto
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"11" =>                   --OR (zero),y 1st part proto
                                when x"11" =>                   --OR (zero),y 1st part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"61" =>                   --ADC (zero,x) 1st part proto
                                when x"61" =>                   --ADC (zero,x) 1st part proto
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"71" =>                   --ADC (zero),y 1st part proto
                                when x"71" =>                   --ADC (zero),y 1st part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"E1" =>                   --SBC (zero,x) 1st part proto
                                when x"E1" =>                   --SBC (zero,x) 1st part proto
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"F1" =>                   --SBC (zero),y 1st part proto
                                when x"F1" =>                   --SBC (zero),y 1st part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"C1" =>                   --CMP (zero,x) 1st part proto
                                when x"C1" =>                   --CMP (zero,x) 1st part proto
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"D1" =>                   --CMP (zero),y 1st part proto
                                when x"D1" =>                   --CMP (zero),y 1st part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"81" =>                   --STA (zero,x) 1st part proto
                                when x"81" =>                   --STA (zero,x) 1st part proto
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"91" =>                   --STA (zero),y 1st part proto
                                when x"91" =>                   --STA (zero),y 1st part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
 
 
--      ==============================================================================================
--      ==============================================================================================
                                when x"A5" =>                   --LDA zero 1st part proto
                                when x"A5" =>                   --LDA zero 1st part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"A4" =>                   --LDY zero 1st part
                                when x"A4" =>                   --LDY zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"A6" =>                   --LDX zero 1st part
                                when x"A6" =>                   --LDX zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"B5" =>                   --LDA zero,x 1st part
                                when x"B5" =>                   --LDA zero,x 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"B4" =>                   --LDY zero,x 1st part
                                when x"B4" =>                   --LDY zero,x 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"B6" =>                   --LDX zero,y 1st part
                                when x"B6" =>                   --LDX zero,y 1st part
                                        add_fg <= x"3";
                                        add_fg <= x"3";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"05" =>                   --ORA zero 1st part
                                when x"05" =>                   --ORA zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"15" =>                   --ORA zero,X 1st part
                                when x"15" =>                   --ORA zero,X 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"24" =>                   --BIT zero 1st part
                                when x"24" =>                   --BIT zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"25" =>                   --AND zero 1st part
                                when x"25" =>                   --AND zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"26" =>                   --ROL zero 1st part
                                when x"26" =>                   --ROL zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"35" =>                   --AND zero,X 1st part
                                when x"35" =>                   --AND zero,X 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"36" =>                   --ROL zero,X 1st part
                                when x"36" =>                   --ROL zero,X 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"45" =>                   --EOR zero 1st part
                                when x"45" =>                   --EOR zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"46" =>                   --LSR zero 1st part
                                when x"46" =>                   --LSR zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"55" =>                   --EOR zero,X 1st part
                                when x"55" =>                   --EOR zero,X 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      =========================================================================================
--      =========================================================================================
                                when x"E6" =>                   --INC zero 1st part
                                when x"E6" =>                   --INC zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"56" =>                   --LSR zero,X 1st part
                                when x"56" =>                   --LSR zero,X 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"65" =>                   --ADC zero 1st part
                                when x"65" =>                   --ADC zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"66" =>                   --ROR zero 1st part
                                when x"66" =>                   --ROR zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"75" =>                   --ADC zero,X 1st part
                                when x"75" =>                   --ADC zero,X 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"76" =>                   --ROR zero,X 1st part
                                when x"76" =>                   --ROR zero,X 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"C4" =>                   --CPY zero 1st part
                                when x"C4" =>                   --CPY zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"C5" =>                   --CMP zero 1st part
                                when x"C5" =>                   --CMP zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"C6" =>                   --DEC zero 1st part
                                when x"C6" =>                   --DEC zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"D5" =>                   --CMP zero,X 1st part
                                when x"D5" =>                   --CMP zero,X 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"D6" =>                   --DEC zero,X 1st part
                                when x"D6" =>                   --DEC zero,X 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"E4" =>                   --CPX zero 1st part
                                when x"E4" =>                   --CPX zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"E5" =>                   --SBC zero 1st part
                                when x"E5" =>                   --SBC zero 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"F5" =>                   --SBC zero,X 1st part
                                when x"F5" =>                   --SBC zero,X 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"F6" =>                   --INC zero,X 1st part
                                when x"F6" =>                   --INC zero,X 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"06" =>                   --ASL zero, 1st part
                                when x"06" =>                   --ASL zero, 1st part
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"16" =>                   --ASL zero, x 1st part
                                when x"16" =>                   --ASL zero, x 1st part
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      ==============================================================================
--      ==============================================================================
                                when x"AD" =>                   --LDA abs 1st part.
                                when x"AD" =>                   --LDA abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"BD" =>                   --LDA, x abs 1st part.
                                when x"BD" =>                   --LDA, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"B9" =>                   --LDA, Y abs 1st part
                                when x"B9" =>                   --LDA, Y abs 1st part
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"2D" =>                   --AND abs 1st part.
                                when x"2D" =>                   --AND abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"3D" =>                   --AND, x abs 1st part.
                                when x"3D" =>                   --AND, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"39" =>                   --AND, Y abs 1st part.
                                when x"39" =>                   --AND, Y abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"0D" =>                   --ORA abs 1st part.
                                when x"0D" =>                   --ORA abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"1D" =>                   --ORA, x abs 1st part.
                                when x"1D" =>                   --ORA, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"19" =>                   --ORA, Y abs 1st part.
                                when x"19" =>                   --ORA, Y abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"4D" =>                   --EOR abs 1st part.
                                when x"4D" =>                   --EOR abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"5D" =>                   --EOR, x abs 1st part.
                                when x"5D" =>                   --EOR, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"59" =>                   --EOR, Y abs 1st part.
                                when x"59" =>                   --EOR, Y abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"6D" =>                   --ADC abs 1st part.
                                when x"6D" =>                   --ADC abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"7D" =>                   --ADC, x abs 1st part.
                                when x"7D" =>                   --ADC, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"79" =>                   --ADC, Y abs 1st part.
                                when x"79" =>                   --ADC, Y abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"ED" =>                   --SBC abs 1st part.
                                when x"ED" =>                   --SBC abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"FD" =>                   --SBC, x abs 1st part.
                                when x"FD" =>                   --SBC, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"F9" =>                   --SBC, Y abs 1st part.
                                when x"F9" =>                   --SBC, Y abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"AE" =>                   --LDX abs 1st part.
                                when x"AE" =>                   --LDX abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"BE" =>                   --LDX, y abs 1st part.
                                when x"BE" =>                   --LDX, y abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"AC" =>                   --LDY abs 1st part.
                                when x"AC" =>                   --LDY abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"BC" =>                   --LDY, x abs 1st part.
                                when x"BC" =>                   --LDY, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"2C" =>                   --BIT abs 1st part.
                                when x"2C" =>                   --BIT abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"CD" =>                   --CMP abs 1st part.
                                when x"CD" =>                   --CMP abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"DD" =>                   --CMP, x abs 1st part.
                                when x"DD" =>                   --CMP, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"D9" =>                   --CMP, Y abs 1st part.
                                when x"D9" =>                   --CMP, Y abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"EC" =>                   --CPX abs 1st part.
                                when x"EC" =>                   --CPX abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"CC" =>                   --CPY abs 1st part.
                                when x"CC" =>                   --CPY abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--.........................................................................................
--.........................................................................................
                                when x"8D" =>                   --STA abs 1st part.
                                when x"8D" =>                   --STA abs 1st part.
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"9D" =>                   --STA,x abs 1st part.
                                when x"9D" =>                   --STA,x abs 1st part.
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"99" =>                   --STA, y abs 1st part.
                                when x"99" =>                   --STA, y abs 1st part.
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"8E" =>                   --STX abs 1st part.
                                when x"8E" =>                   --STX abs 1st part.
                                        dat_out <= reg_x;
                                        dat_out <= reg_x;
                                        cycle_ctr <= cycle_ctr + x"1";--
                                        cycle_ctr <= cycle_ctr + x"1";--
                                when x"8C" =>                   --STY abs 1st part.
                                when x"8C" =>                   --STY abs 1st part.
                                        dat_out <= reg_y;
                                        dat_out <= reg_y;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--.........................................................................................
--.........................................................................................
 
 
                                when x"EE" =>                   --INC abs 1st part.
                                when x"EE" =>                   --INC abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"FE" =>                   --INC, x abs 1st part.
                                when x"FE" =>                   --INC, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"CE" =>                   --DEC abs 1st part.
                                when x"CE" =>                   --DEC abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"DE" =>                   --DEC, x abs 1st part.
                                when x"DE" =>                   --DEC, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"2E" =>                   --ROL abs 1st part.
                                when x"2E" =>                   --ROL abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"3E" =>                   --ROL, x abs 1st part.
                                when x"3E" =>                   --ROL, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"6E" =>                   --ROR abs 1st part.
                                when x"6E" =>                   --ROR abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"7E" =>                   --ROR, x abs 1st part.
                                when x"7E" =>                   --ROR, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"4E" =>                   --LSR abs 1st part.
                                when x"4E" =>                   --LSR abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"5E" =>                   --LSR, x abs 1st part.
                                when x"5E" =>                   --LSR, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"0E" =>                   --ASL abs 1st part.
                                when x"0E" =>                   --ASL abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"1E" =>                   --ASL, x abs 1st part.
                                when x"1E" =>                   --ASL, x abs 1st part.
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      ............................................................................
--      ............................................................................
--      ==============================================================================
--      ==============================================================================
 
 
 
 
                                when x"4C" =>                   --JMP abs first part
                                when x"4C" =>                   --JMP abs 1st part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"6C" =>                   --JMP indirect first part
                                when x"6C" =>                   --JMP indirect 1st part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"20" =>                   --JSR abs first part
                                when x"20" =>                   --JSR abs 1st part
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"60" =>                   --RTS first part
                                when x"60" =>                   --RTS 1st part
                                        reg_sp <= reg_sp - "1";
                                        reg_sp <= reg_sp + "1";         --plus
                                        add_fg <= x"7";
                                        add_fg <= x"7";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"40" =>                   --RTI 1st part pull old status from stack
                                when x"40" =>                   --RTI 1st part pull old status from stack
                                        reg_sp <= reg_sp - "1";
                                        reg_sp <= reg_sp + "1";         --plus
                                        add_fg <= x"7";
                                        add_fg <= x"7";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"00" =>                   --Break first part cyc 0
                                when x"00" =>                           --Break 1st part cyc 0
                                        if irq_fg = '0' then     --Start up, irq and nmi also use
                                        pc_dec_fg <= '1';               --Start up, irq and nmi also use.
                                                b_fg <= '1';    --this set of logic.
                                        cycle_ctr <= cycle_ctr + x"1";  --this set of logic.
                                        else
 
                                                b_fg <= '0';
 
                                        end if;
 
                                        pc_dec_fg <= '1';
 
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
 
                                when others =>
                                when others =>
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                        end case;       --Cycle 0
                        end case;       --Cycle 0
                        end if; --Initiated by nmi irq detection.
                        end if; --Initiated by nmi irq detection.
 
 
 
 
--      End cycle 0     =========================================================
--      End cycle 0     =========================================================
 
 
 
 
                when x"1" =>
                when x"1" =>
                                case Instruction_in is
                                case Instruction_in is
--      ================================================================================================
--      ================================================================================================
 
 
                                when x"48" =>                   --PHA 2nd part accumulator onto stack
                                when x"48" =>                   --PHA 2nd part accumulator onto stack
                                        pc_dec_fg <= '0';
                                        pc_dec_fg <= '0';
                                        add_fg <= x"7";
                                        add_fg <= x"7";
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"08" =>                   --PHP 2nd part Status reg onto stack
                                when x"08" =>                   --PHP 2nd part Status reg onto stack
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        pc_dec_fg <= '0';
                                        pc_dec_fg <= '0';
                                        dat_out <= n_fg & v_fg & '1' & b_fg & d_fg & i_fg & z_fg & reg_a(8);
                                        dat_out <= n_fg & v_fg & '1' & b_fg & d_fg & i_fg & z_fg & reg_a(8);
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"68" =>                   --PLA 2nd part  Pull Accumulator from Stack
                                when x"68" =>                   --PLA 2nd part  Pull Accumulator from Stack
                                        add_fg <= x"7";
                                        add_fg <= x"7";
                                        pc_dec_fg <= '0';
                                        pc_dec_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"28" =>                   --PLP 2nd part  Pull Status from Stack
                                when x"28" =>                   --PLP 2nd part  Pull Status from Stack
                                        add_fg <= x"7";
                                        add_fg <= x"7";
                                        pc_dec_fg <= '0';
                                        pc_dec_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"F0" =>                   --BEQ branch true 2nd part.
                                when x"F0" =>                   --BEQ branch true 2nd part.
                                        if z_fg = '1' then      --Should work like a nop
                                        if z_fg = '1' then      --Should work like a nop
                                                branch_fg <= '1';       --branch true 1st part.
                                                branch_fg <= '1';       --branch true 1st part.
                                        else
                                        else
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                        end if;
                                        end if;
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"D0" =>                   --BNE branch true 2nd part.
                                when x"D0" =>                   --BNE branch true 2nd part.
                                        if z_fg = '0' then       --Should work like a nop
                                        if z_fg = '0' then       --Should work like a nop
                                                branch_fg <= '1';       --branch true 1st part.
                                                branch_fg <= '1';       --branch true 1st part.
                                        else
                                        else
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                        end if;
                                        end if;
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"10" =>                   --BPL plus true 2nd part.
                                when x"10" =>                   --BPL plus true 2nd part.
                                        if n_fg = '0' then       --Should work like a nop
                                        if n_fg = '0' then       --Should work like a nop
                                                branch_fg <= '1';       --branch true 1st part.
                                                branch_fg <= '1';       --branch true 1st part.
                                        else
                                        else
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                        end if;
                                        end if;
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"30" =>                   --BM1 negative true 2nd part.
                                when x"30" =>                   --BM1 negative true 2nd part.
                                        if n_fg = '1' then      --Should work like a nop
                                        if n_fg = '1' then      --Should work like a nop
                                                branch_fg <= '1';       --branch true 1st part.
                                                branch_fg <= '1';       --branch true 1st part.
                                        else
                                        else
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                        end if;
                                        end if;
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"50" =>                   --BVC overflow false 2nd part.
                                when x"50" =>                   --BVC overflow false 2nd part.
                                        if v_fg = '0' then       --Should work like a nop
                                        if v_fg = '0' then       --Should work like a nop
                                                branch_fg <= '1';       --branch true 1st part.
                                                branch_fg <= '1';       --branch true 1st part.
                                        else
                                        else
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                        end if;
                                        end if;
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"70" =>                   --BVS overflow true 2nd part.
                                when x"70" =>                   --BVS overflow true 2nd part.
                                        if v_fg = '1' then      --Should work like a nop
                                        if v_fg = '1' then      --Should work like a nop
                                                branch_fg <= '1';       --branch true 1st part.
                                                branch_fg <= '1';       --branch true 1st part.
                                        else
                                        else
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                        end if;
                                        end if;
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"90" =>                   --BCC carry false 2nd part.
                                when x"90" =>                   --BCC carry false 2nd part.
                                        if reg_a(8) = '0' then   --Should work like a nop
                                        if reg_a(8) = '0' then   --Should work like a nop
                                                branch_fg <= '1';       --branch true 1st part.
                                                branch_fg <= '1';       --branch true 1st part.
                                        else
                                        else
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                        end if;
                                        end if;
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"B0" =>                   --BCS carry true 2nd part.
                                when x"B0" =>                   --BCS carry true 2nd part.
                                        if reg_a(8) = '1' then  --Should work like a nop
                                        if reg_a(8) = '1' then  --Should work like a nop
                                                branch_fg <= '1';       --branch true 1st part.
                                                branch_fg <= '1';       --branch true 1st part.
                                        else
                                        else
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                        end if;
                                        end if;
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
--      ================================================================================================
--      ================================================================================================
 
 
                                when x"A2" =>                   --LDX #.  2nd part Proto imediate instruction
                                when x"A2" =>                   --LDX #.  2nd part Proto imediate instruction
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_x <= data_rd;
                                        reg_x <= data_rd;
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"A9" =>                   --LDA #.  2nd part Proto imediate instruction
                                when x"A9" =>                   --LDA #.  2nd part Proto imediate instruction
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        reg_a(7 downto 0) <= data_rd;
                                        reg_a(7 downto 0) <= data_rd;
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"A0" =>                   --LDY #
                                when x"A0" =>                   --LDY #
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        reg_y <= data_rd;
                                        reg_y <= data_rd;
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"09" =>                   --ORA #
                                when x"09" =>                   --ORA #
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"29" =>                   --AND # 2nd part
                                when x"29" =>                   --AND # 2nd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"49" =>                   --EOR #
                                when x"49" =>                   --EOR #
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"69" =>                   --ADC #
                                when x"69" =>                   --ADC #
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        v_ff <= not reg_a(7) and not data_rd(7);        --Pos+Pos=Overflow possible
                                        v_ff <= not reg_a(7) and not data_rd(7);        --Pos+Pos=Overflow possible
                                        flags_fg <= "10";
                                        flags_fg <= "10";
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"E9" =>                   --SBC # 2nd part
                                when x"E9" =>                   --SBC # 2nd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        v_ff <= reg_a(7) and data_rd(7);                --Neg-Neg=Underflow possible
                                        v_ff <= reg_a(7) and data_rd(7);                --Neg-Neg=Underflow possible
                                        flags_fg <= "10";
                                        flags_fg <= "10";
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"C9" =>                   --CMP # 2nd part.
                                when x"C9" =>                   --CMP # 2nd part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        if reg_a(7 downto 0) >= data_rd then
                                        if reg_a(7 downto 0) >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"E0" =>                   --CPX #.
                                when x"E0" =>                   --CPX #.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_x - data_rd;
                                        dat_out <= reg_x - data_rd;
                                        if reg_x >= data_rd then
                                        if reg_x >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"C0" =>                   --CPY #.
                                when x"C0" =>                   --CPY #.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_y - data_rd;
                                        dat_out <= reg_y - data_rd;
                                        if reg_y >= data_rd then
                                        if reg_y >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
--      ===================================================================================================
--      ===================================================================================================
                                when x"84" =>                   --STY zero 2nd part proto
                                when x"84" =>                   --STY zero 2nd part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"85" =>                   --STA zero 2nd part proto
                                when x"85" =>                   --STA zero 2nd part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"86" =>                   --STX zero 2nd part proto
                                when x"86" =>                   --STX zero 2nd part proto
                                        add_fg <= x"1";
                                        add_fg <= x"1";
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"94" =>                   --STY zero, X 2nd part proto
                                when x"94" =>                   --STY zero, X 2nd part proto
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"95" =>                   --STA zero, X 2nd part proto
                                when x"95" =>                   --STA zero, X 2nd part proto
                                        add_fg <= x"2";
                                        add_fg <= x"2";
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"96" =>                   --STX zero, Y 2nd part proto
                                when x"96" =>                   --STX zero, Y 2nd part proto
                                        add_fg <= x"3";
                                        add_fg <= x"3";
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
--      =================================================================================
--      =================================================================================
                                when x"A5" =>                   --LDA zero 2nd part proto
                                when x"A5" =>                   --LDA zero 2nd part proto
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"A4" =>                   --LDY zero 2nd part
                                when x"A4" =>                   --LDY zero 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"A6" =>                   --LDX zero 2nd part
                                when x"A6" =>                   --LDX zero 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"B5" =>                   --LDA zero,X 2nd part
                                when x"B5" =>                   --LDA zero,X 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"B4" =>                   --LDY zero,X 2nd part
                                when x"B4" =>                   --LDY zero,X 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"B6" =>                   --LDX zero,Y 2nd part
                                when x"B6" =>                   --LDX zero,Y 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"05" =>                   --ORA zero 2nd part
                                when x"05" =>                   --ORA zero 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"15" =>                   --ORA zero,X 2nd part
                                when x"15" =>                   --ORA zero,X 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"24" =>                   --BIT zero 2nd part
                                when x"24" =>                   --BIT zero 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"25" =>                   --AND zero 2nd part
                                when x"25" =>                   --AND zero 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"35" =>                   --AND zero,X 2nd part
                                when x"35" =>                   --AND zero,X 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"45" =>                   --EOR zero,Y 2nd part
                                when x"45" =>                   --EOR zero,Y 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"55" =>                   --EOR zero,X 2nd part
                                when x"55" =>                   --EOR zero,X 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"65" =>                   --ADC zero 2nd part
                                when x"65" =>                   --ADC zero 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"75" =>                   --ADC zero,X 2nd part
                                when x"75" =>                   --ADC zero,X 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"C4" =>                   --CPY zero 2nd part
                                when x"C4" =>                   --CPY zero 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"C5" =>                   --CMP zero 2nd part
                                when x"C5" =>                   --CMP zero 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"C6" =>                   --DEC zero 2nd part
                                when x"C6" =>                   --DEC zero 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"D5" =>                   --CMP zero,X 2nd part
                                when x"D5" =>                   --CMP zero,X 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"D6" =>                   --DEC zero,X 2nd part
                                when x"D6" =>                   --DEC zero,X 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"E4" =>                   --CPX zero 2nd part
                                when x"E4" =>                   --CPX zero 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"E5" =>                   --SBC zero 2nd part
                                when x"E5" =>                   --SBC zero 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"F5" =>                   --SBC zero,X 2nd part
                                when x"F5" =>                   --SBC zero,X 2nd part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
--      ===================================================================================
--      ===================================================================================
                                when x"E6" =>                   --INC zero 2nd part
                                when x"E6" =>                   --INC zero 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"F6" =>                   --INC zero,X 2nd part
                                when x"F6" =>                   --INC zero,X 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"46" =>                   --LSR zero 2nd part
                                when x"46" =>                   --LSR zero 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"56" =>                   --LSR zero,X 2nd part
                                when x"56" =>                   --LSR zero,X 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"66" =>                   --ROR zero 2nd part
                                when x"66" =>                   --ROR zero 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"76" =>                   --ROR zero,X 2nd part
                                when x"76" =>                   --ROR zero,X 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"26" =>                   --ROL zero 2nd part
                                when x"26" =>                   --ROL zero 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"36" =>                   --ROL zero,X 2nd part
                                when x"36" =>                   --ROL zero,X 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"06" =>                   --ASL zero 2nd part
                                when x"06" =>                   --ASL zero 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"16" =>                   --ASL zero,X 2nd part
                                when x"16" =>                   --ASL zero,X 2nd part
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
 
 
--      ==============================================================================
--      ==============================================================================
                                when x"A1" =>                   --LDA (zero,x) 2nd part proto
                                when x"A1" =>                   --LDA (zero,x) 2nd part proto
                                        add_fg <= x"D";
                                        add_fg <= x"D";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"B1" =>                   --LDA (zero),y 2nd part proto
                                when x"B1" =>                   --LDA (zero),y 2nd part proto
                                        add_fg <= x"C";
                                        add_fg <= x"C";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"21" =>                   --AND (zero,x) 2nd part proto
                                when x"21" =>                   --AND (zero,x) 2nd part proto
                                        add_fg <= x"D";
                                        add_fg <= x"D";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"31" =>                   --AND (zero),y 2nd part proto
                                when x"31" =>                   --AND (zero),y 2nd part proto
                                        add_fg <= x"C";
                                        add_fg <= x"C";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"41" =>                   --EOR (zero,x) 2nd part proto
                                when x"41" =>                   --EOR (zero,x) 2nd part proto
                                        add_fg <= x"D";
                                        add_fg <= x"D";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"51" =>                   --EOR (zero),y 2nd part proto
                                when x"51" =>                   --EOR (zero),y 2nd part proto
                                        add_fg <= x"C";
                                        add_fg <= x"C";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"01" =>                   --OR (zero,x) 2nd part proto
                                when x"01" =>                   --OR (zero,x) 2nd part proto
                                        add_fg <= x"D";
                                        add_fg <= x"D";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"11" =>                   --OR (zero),y 2nd part proto
                                when x"11" =>                   --OR (zero),y 2nd part proto
                                        add_fg <= x"C";
                                        add_fg <= x"C";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"61" =>                   --ADC (zero,x) 2nd part proto
                                when x"61" =>                   --ADC (zero,x) 2nd part proto
                                        add_fg <= x"D";
                                        add_fg <= x"D";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"71" =>                   --ADC (zero),y 2nd part proto
                                when x"71" =>                   --ADC (zero),y 2nd part proto
                                        add_fg <= x"C";
                                        add_fg <= x"C";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"E1" =>                   --SBC (zero,x) 2nd part proto
                                when x"E1" =>                   --SBC (zero,x) 2nd part proto
                                        add_fg <= x"D";
                                        add_fg <= x"D";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"F1" =>                   --SBC (zero),y 2nd part proto
                                when x"F1" =>                   --SBC (zero),y 2nd part proto
                                        add_fg <= x"C";
                                        add_fg <= x"C";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"C1" =>                   --CMP (zero,x) 2nd part proto
                                when x"C1" =>                   --CMP (zero,x) 2nd part proto
                                        add_fg <= x"D";
                                        add_fg <= x"D";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"D1" =>                   --CMP (zero),y 2nd part proto
                                when x"D1" =>                   --CMP (zero),y 2nd part proto
                                        add_fg <= x"C";
                                        add_fg <= x"C";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"81" =>                   --STA (zero,x) 2nd part proto
                                when x"81" =>                   --STA (zero,x) 2nd part proto
                                        add_fg <= x"D";
                                        add_fg <= x"D";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"91" =>                   --STA (zero),y 2nd part proto
                                when x"91" =>                   --STA (zero),y 2nd part proto
                                        add_fg <= x"C";
                                        add_fg <= x"C";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
--      ==============================================================================
--      ==============================================================================
                                when x"AD" =>                   --LDA abs 2nd part.
                                when x"AD" =>                   --LDA abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"BD" =>                   --LDA, x abs 2nd part.
                                when x"BD" =>                   --LDA, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"B9" =>                   --LDA, Y abs 2nd part.
                                when x"B9" =>                   --LDA, Y abs 2nd part.
 
 
 
 
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
 
 
                                when x"2D" =>                   --AND abs 2nd part.
                                when x"2D" =>                   --AND abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"3D" =>                   --AND, x abs 2nd part.
                                when x"3D" =>                   --AND, x abs 2nd part.
 
 
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"39" =>                   --AND, Y abs 2nd part.
                                when x"39" =>                   --AND, Y abs 2nd part.
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"0D" =>                   --ORA abs 2nd part.
                                when x"0D" =>                   --ORA abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"1D" =>                   --ORA, x abs 2nd part.
                                when x"1D" =>                   --ORA, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"19" =>                   --ORA, Y abs 2nd part.
                                when x"19" =>                   --ORA, Y abs 2nd part.
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"4D" =>                   --EOR abs 2nd part.
                                when x"4D" =>                   --EOR abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"5D" =>                   --EOR, x abs 2nd part.
                                when x"5D" =>                   --EOR, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"59" =>                   --EOR, Y abs 2nd part.
                                when x"59" =>                   --EOR, Y abs 2nd part.
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"6D" =>                   --ADC abs 2nd part.
                                when x"6D" =>                   --ADC abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"7D" =>                   --ADC, x abs 2nd part.
                                when x"7D" =>                   --ADC, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"79" =>                   --ADC, Y abs 2nd part.
                                when x"79" =>                   --ADC, Y abs 2nd part.
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"ED" =>                   --SBC abs 2nd part.
                                when x"ED" =>                   --SBC abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"FD" =>                   --SBC, x abs 2nd part.
                                when x"FD" =>                   --SBC, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"F9" =>                   --SBC, Y abs 2nd part.
                                when x"F9" =>                   --SBC, Y abs 2nd part.
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"AE" =>                   --LDX abs 2nd part.
                                when x"AE" =>                   --LDX abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"BE" =>                   --LDX, y abs 2nd part.
                                when x"BE" =>                   --LDX, y abs 2nd part.
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"AC" =>                   --LDY abs 2nd part.
                                when x"AC" =>                   --LDY abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"BC" =>                   --LDY, x abs 2nd part.
                                when x"BC" =>                   --LDY, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"2C" =>                   --BIT abs 2nd part.
                                when x"2C" =>                   --BIT abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"CD" =>                   --CMP abs 2nd part.
                                when x"CD" =>                   --CMP abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"DD" =>                   --CMP, x abs 2nd part.
                                when x"DD" =>                   --CMP, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"D9" =>                   --CMP, Y abs 2nd part.
                                when x"D9" =>                   --CMP, Y abs 2nd part.
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"EC" =>                   --CPX abs 2nd part.
                                when x"EC" =>                   --CPX abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"CC" =>                   --CPY abs 2nd part.
                                when x"CC" =>                   --CPY abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      ...............................................................................
--      ...............................................................................
                                when x"8D" =>                   --STA abs 2nd part.
                                when x"8D" =>                   --STA abs 2nd part.
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"9D" =>                   --STA,x abs 2nd part.
                                when x"9D" =>                   --STA,x abs 2nd part.
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"99" =>                   --STA, y abs 2nd part.
                                when x"99" =>                   --STA, y abs 2nd part.
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"8E" =>                   --STX abs 2nd part.
                                when x"8E" =>                   --STX abs 2nd part.
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"8C" =>                   --STY abs 2nd part.
                                when x"8C" =>                   --STY abs 2nd part.
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      ........................................................................
--      ........................................................................
 
 
                                when x"EE" =>                   --INC abs 2nd part.
                                when x"EE" =>                   --INC abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"FE" =>                   --INC, x abs 2nd part.
                                when x"FE" =>                   --INC, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"CE" =>                   --DEC abs 2nd part.
                                when x"CE" =>                   --DEC abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"DE" =>                   --DEC, x abs 2nd part.
                                when x"DE" =>                   --DEC, x abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"2E" =>                   --ROL abs 2nd part.
                                when x"2E" =>                   --ROL abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"3E" =>                   --ROL, x abs 2nd part.
                                when x"3E" =>                   --ROL, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"6E" =>                   --ROR abs 2nd part.
                                when x"6E" =>                   --ROR abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"7E" =>                   --ROR, x abs 2nd part.
                                when x"7E" =>                   --ROR, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"4E" =>                   --LSR abs 2nd part.
                                when x"4E" =>                   --LSR abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"5E" =>                   --LSR, x abs 2nd part.
                                when x"5E" =>                   --LSR, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"0E" =>                   --ASL abs 2nd part.
                                when x"0E" =>                   --ASL abs 2nd part.
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"1E" =>                   --ASL, x abs 2nd part.
                                when x"1E" =>                   --ASL, x abs 2nd part.
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      ............................................................................
--      ............................................................................
--      ==============================================================================
--      ==============================================================================
                                when x"4C" =>                   --JMP abs 2nd part
                                when x"4C" =>                   --JMP abs 2nd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        dat2pc_fg <= '1';
                                        dat2pc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"6C" =>                   --JMP indirect 2nd part
                                when x"6C" =>                   --JMP indirect 2nd part
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"20" =>                   --JSR abs 2nd part
                                when x"20" =>                   --JSR abs 2nd part
                                        dat2pc_fg <= '1';
                                        dat2pc_fg <= '1';
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        dat_out <= reg_pc(15 downto 8);
                                        dat_out <= reg_pc(15 downto 8);
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"60" =>                   --RTS second part
                                when x"60" =>                   --RTS second part
                                        reg_sp <= reg_sp - "1";
                                        reg_sp <= reg_sp + "1";         --plus
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"40" =>                   --RTI second part pull old status from stack
                                when x"40" =>                   --RTI second part pull old status from stack
                                        reg_sp <= reg_sp - "1";
                                        reg_sp <= reg_sp + "1";         --plus
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"00" =>                   --Break second part  cyc 1
                                when x"00" =>                                   --Break 2nd part cyc 1
                                        dat2pc_fg <= '0';
                                        if irq_fg = '0' and nmi_fg = '0' then     --Start up, irq and nmi also use
                                        wr_fg <= '1';                   --put dat_out onto stack
                                                pc_dec_fg <= '0';                --this set of logic.
                                        dat_out <= reg_pc(15 downto 8);
                                        end if;
                                        add_fg <= x"7";
 
                                        pc_dec_fg <= '0';
 
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when others =>
                                when others =>
                                cycle_ctr <= cycle_ctr + x"1";
                                cycle_ctr <= cycle_ctr + x"1";
                        end case;       --Cycle 1
                        end case;       --Cycle 1
 
 
 
 
--      End cycle 1     =========================================================
--      End cycle 1     =========================================================
 
 
                when x"2" =>
                when x"2" =>
 
 
                        case instruction_in(7 downto 0) is
                        case instruction_in(7 downto 0) is
--      ====================================================================================
--      ====================================================================================
 
 
                                when x"48" =>                   --PHA 3rd part accumulator onto stack
                                when x"48" =>                   --PHA 3rd part accumulator onto stack
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        reg_sp <= reg_sp + "1";
                                        reg_sp <= reg_sp - "1";         --neg
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"08" =>                   --PHP 3rd part Status reg onto stack
                                when x"08" =>                   --PHP 3rd part Status reg onto stack
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        add_fg <= x"7";
                                        add_fg <= x"7";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"68" =>                   --PLA 3rd part  Pull Accumulator from Stack
                                when x"68" =>                   --PLA 3rd part  Pull Accumulator from Stack
--                                      pc_dec_fg <= '0';
--                                      pc_dec_fg <= '0';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"28" =>                   --PLP 3rd part  Pull Status from Stack
                                when x"28" =>                   --PLP 3rd part  Pull Status from Stack
--                                      pc_dec_fg <= '0';
--                                      pc_dec_fg <= '0';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"F0" =>                   --BEQ branch true 3rd part.
                                when x"F0" =>                   --BEQ branch true 3rd part.
                                        if branch_fg = '1' then
                                        if branch_fg = '1' then
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                        else
                                        else
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                        end if;
                                        end if;
                                when x"D0" =>                   --BNE branch true 3rd part.
                                when x"D0" =>                   --BNE branch true 3rd part.
                                        if branch_fg = '1' then
                                        if branch_fg = '1' then
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                        else
                                        else
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                        end if;
                                        end if;
                                when x"10" =>                   --BPL plus true 3rd part.
                                when x"10" =>                   --BPL plus true 3rd part.
                                        if branch_fg = '1' then
                                        if branch_fg = '1' then
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                        else
                                        else
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                        end if;
                                        end if;
                                when x"30" =>                   --BM1 negative true 3rd part.
                                when x"30" =>                   --BM1 negative true 3rd part.
                                        if branch_fg = '1' then
                                        if branch_fg = '1' then
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                        else
                                        else
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                        end if;
                                        end if;
                                when x"50" =>                   --BVC overflow false 3rd part.
                                when x"50" =>                   --BVC overflow false 3rd part.
                                        if branch_fg = '1' then
                                        if branch_fg = '1' then
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                        else
                                        else
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                        end if;
                                        end if;
                                when x"70" =>                   --BVS overflow true 3rd part.
                                when x"70" =>                   --BVS overflow true 3rd part.
                                        if branch_fg = '1' then
                                        if branch_fg = '1' then
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                        else
                                        else
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                        end if;
                                        end if;
                                when x"90" =>                   --BCC carry false 3rd part.
                                when x"90" =>                   --BCC carry false 3rd part.
                                        if branch_fg = '1' then
                                        if branch_fg = '1' then
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                        else
                                        else
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                        end if;
                                        end if;
                                when x"B0" =>                   --BCS carry true 3rd part.
                                when x"B0" =>                   --BCS carry true 3rd part.
                                        if branch_fg = '1' then
                                        if branch_fg = '1' then
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                        else
                                        else
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                        end if;
                                        end if;
 
 
--      ====================================================================================
--      ====================================================================================
                                when x"84" =>                   --STY zero 3rd part proto
                                when x"84" =>                   --STY zero 3rd part proto
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"85" =>                   --STA zero 3rd part proto
                                when x"85" =>                   --STA zero 3rd part proto
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"86" =>                   --STX zero 3rd part proto
                                when x"86" =>                   --STX zero 3rd part proto
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"94" =>                   --STY zero, X 3rd part proto
                                when x"94" =>                   --STY zero, X 3rd part proto
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"95" =>                   --STA zero, X 3rd part proto
                                when x"95" =>                   --STA zero, X 3rd part proto
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"96" =>                   --STX zero, Y 3rd part proto
                                when x"96" =>                   --STX zero, Y 3rd part proto
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
--      ========================================================================================
--      ========================================================================================
                                when x"A5" =>                   --LDA zero 3rd part proto
                                when x"A5" =>                   --LDA zero 3rd part proto
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a(7 downto 0) <= data_rd;
                                        reg_a(7 downto 0) <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"A4" =>                   --LDY zero 3rd part
                                when x"A4" =>                   --LDY zero 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_y <= data_rd;
                                        reg_y <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"A6" =>                   --LDX zero 3rd part
                                when x"A6" =>                   --LDX zero 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_x <= data_rd;
                                        reg_x <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"B5" =>                   --LDA zero,X 3rd part
                                when x"B5" =>                   --LDA zero,X 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a(7 downto 0) <= data_rd;
                                        reg_a(7 downto 0) <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"B4" =>                   --LDY zero,X 3rd part
                                when x"B4" =>                   --LDY zero,X 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_y <= data_rd;
                                        reg_y <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"B6" =>                   --LDX zero,Y 3rd part
                                when x"B6" =>                   --LDX zero,Y 3rd part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_x <= data_rd;
                                        reg_x <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"05" =>                   --ORA zero 3rd part
                                when x"05" =>                   --ORA zero 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"15" =>                   --ORA zero,X 3rd part
                                when x"15" =>                   --ORA zero,X 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"24" =>                   --BIT zero 3rd part
                                when x"24" =>                   --BIT zero 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        n_fg <= data_rd(7);
                                        n_fg <= data_rd(7);
                                        v_fg <= data_rd(6);
                                        v_fg <= data_rd(6);
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"25" =>                   --AND zero 3rd part
                                when x"25" =>                   --AND zero 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"35" =>                   --AND zero,X 3rd part
                                when x"35" =>                   --AND zero,X 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"45" =>                   --EOR zero 3rd part
                                when x"45" =>                   --EOR zero 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"55" =>                   --EOR zero,X 3rd part
                                when x"55" =>                   --EOR zero,X 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"65" =>                   --ADC zero 3rd part
                                when x"65" =>                   --ADC zero 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"75" =>                   --ADC zero,X 3rd part
                                when x"75" =>                   --ADC zero,X 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"C4" =>                   --CPY zero 3rd part
                                when x"C4" =>                   --CPY zero 3rd part
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_y - data_rd;
                                        dat_out <= reg_y - data_rd;
                                        if reg_y >= data_rd then
                                        if reg_y >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"C5" =>                   --CMP zero 3rd part
                                when x"C5" =>                   --CMP zero 3rd part
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        if reg_a(7 downto 0) >= data_rd then
                                        if reg_a(7 downto 0) >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"C6" =>                   --DEC zero 3rd part
                                when x"C6" =>                   --DEC zero 3rd part
                                        dat_out <= data_rd - x"01";
                                        dat_out <= data_rd - x"01";
                                        dat_out <= data_rd - x"01";
                                        dat_out <= data_rd - x"01";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"D5" =>                   --CMP zero,X 3rd part
                                when x"D5" =>                   --CMP zero,X 3rd part
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        if reg_a(7 downto 0) >= data_rd then
                                        if reg_a(7 downto 0) >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"D6" =>                   --DEC zero,X 3rd part
                                when x"D6" =>                   --DEC zero,X 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        reg_a(7 downto 0) <= data_rd;
                                        reg_a(7 downto 0) <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"E4" =>                   --CPX zero 3rd part
                                when x"E4" =>                   --CPX zero 3rd part
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_x - data_rd;
                                        dat_out <= reg_x - data_rd;
                                        if reg_X >= data_rd then
                                        if reg_X >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"E5" =>                   --SBC zero 3rd part
                                when x"E5" =>                   --SBC zero 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
 
 
                                when x"F5" =>                   --SBC zero,X 3rd part
                                when x"F5" =>                   --SBC zero,X 3rd part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        reg_a <= reg_a - ('0' & data_rd) - ("00000000" & reg_a(8));
                                        reg_a <= reg_a - ('0' & data_rd) - ("00000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"E6" =>                   --INC zero 3rd part
                                when x"E6" =>                   --INC zero 3rd part
                                        dat_out <= data_rd + x"01";
                                        dat_out <= data_rd + x"01";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"F6" =>                   --INC zero,X 3rd part
                                when x"F6" =>                   --INC zero,X 3rd part
                                        dat_out <= data_rd + x"01";
                                        dat_out <= data_rd + x"01";
 
 
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"66" =>                   --ROR zero 3rd part
                                when x"66" =>                   --ROR zero 3rd part
 
                                        dat_out(6 downto 0) <= data_rd(7 downto 1);
 
                                        dat_out(7) <= reg_a(8);
                                        reg_a(8) <= data_rd(0);
                                        reg_a(8) <= data_rd(0);
                                        dat_out <= reg_a(8) & data_rd(7 downto 1);
 
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
 
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"76" =>                   --ROR zero,X 3rd part
                                when x"76" =>                   --ROR zero,X 3rd part
 
                                        dat_out(6 downto 0) <= data_rd(7 downto 1);
 
                                        dat_out(7) <= reg_a(8);
                                        reg_a(8) <= data_rd(0);
                                        reg_a(8) <= data_rd(0);
                                        dat_out <= reg_a(8) & data_rd(7 downto 1);
 
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
 
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"26" =>                   --ROL zero 3rd part
                                when x"26" =>                   --ROL zero 3rd part
                                        dat_out(7 downto 1) <= data_rd(6 downto 0);
                                        dat_out(7 downto 0) <= data_rd(6 downto 0) & reg_a(8);
                                        dat_out(0) <= reg_a(8);
                                        reg_a(8) <= data_rd(7);
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"36" =>                   --ROL zero,X 3rd part
                                when x"36" =>                   --ROL zero,X 3rd part
                                        dat_out(7 downto 1) <= data_rd(6 downto 0);
                                        dat_out(7 downto 0) <= data_rd(6 downto 0) & reg_a(8);
                                        dat_out(0) <= reg_a(8);
                                        reg_a(8) <= data_rd(7);
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"46" =>                   --LSR zero 3rd part
                                when x"46" =>                   --LSR zero 3rd part
                                        dat_out <= '0' & reg_a(7 downto 1);
                                        dat_out <= '0' & data_rd(7 downto 1);
                                        reg_a(8) <= data_rd(0);
                                        reg_a(8) <= data_rd(0);
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
 
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"56" =>                   --LSR zero,X 3rd part
                                when x"56" =>                   --LSR zero,X 3rd part
                                        dat_out <= '0' & reg_a(7 downto 1);
                                        dat_out <= '0' & data_rd(7 downto 1);
                                        reg_a(8) <= data_rd(0);
                                        reg_a(8) <= data_rd(0);
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
 
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"06" =>                   --ASL zero 3rd part
                                when x"06" =>                   --ASL zero 3rd part
                                        reg_a(8) <= data_rd(7);
                                        reg_a(8) <= data_rd(7);
                                        dat_out <= data_rd(6 downto 0) & '0';
                                        dat_out <= data_rd(6 downto 0) & '0';
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
 
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"16" =>                   --ASL zero,X 3rd part
                                when x"16" =>                   --ASL zero,X 3rd part
                                        reg_a(8) <= data_rd(7);
                                        reg_a(8) <= data_rd(7);
                                        dat_out <= data_rd(6 downto 0) & data_rd(0);
                                        dat_out <= data_rd(6 downto 0) & '0';
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
 
                                        wr_fg <= '1';                                   wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
--      =============================================================================================
--      =============================================================================================
                                when x"A1" =>                   --LDA (zero,x) 3rd part proto
                                when x"A1" =>                   --LDA (zero,x) 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"B1" =>                   --LDA (zero),y 3rd part proto
                                when x"B1" =>                   --LDA (zero),y 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"21" =>                   --AMD (zero,x) 3rd part proto
                                when x"21" =>                   --AMD (zero,x) 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"31" =>                   --AND (zero),y 3rd part proto
                                when x"31" =>                   --AND (zero),y 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"41" =>                   --EOR (zero,x) 3rd part proto
                                when x"41" =>                   --EOR (zero,x) 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"51" =>                   --EOR (zero),y 3rd part proto
                                when x"51" =>                   --EOR (zero),y 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"01" =>                   --OR (zero,x) 3rd part proto
                                when x"01" =>                   --OR (zero,x) 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"11" =>                   --OR (zero),y 3rd part proto
                                when x"11" =>                   --OR (zero),y 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"61" =>                   --ADC (zero,x) 3rd part proto
                                when x"61" =>                   --ADC (zero,x) 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"71" =>                   --ADC (zero),y 3rd part proto
                                when x"71" =>                   --ADC (zero),y 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"E1" =>                   --SBC (zero,x) 3rd part proto
                                when x"E1" =>                   --SBC (zero,x) 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"F1" =>                   --SBC (zero),y 3rd part proto
                                when x"F1" =>                   --SBC (zero),y 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"C1" =>                   --CMP (zero,x) 3rd part proto
                                when x"C1" =>                   --CMP (zero,x) 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"4";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"D1" =>                   --CMP (zero),y 3rd part proto
                                when x"D1" =>                   --CMP (zero),y 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"81" =>                   --STA (zero,x) 3rd part proto
                                when x"81" =>                   --STA (zero,x) 3rd part proto
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"91" =>                   --STA (zero),y 3rd part proto
                                when x"91" =>                   --STA (zero),y 3rd part proto
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        dat_out <= reg_a(7 downto 0);
                                        dat_out <= reg_a(7 downto 0);
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
--      ==============================================================================
--      ==============================================================================
                                when x"AD" =>                   --LDA abs 3rd part.
                                when x"AD" =>                   --LDA abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"BD" =>                   --LDA, x abs 3rd part.
                                when x"BD" =>                   --LDA, x abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"B9" =>                   --LDA, Y abs 3rd part
                                when x"B9" =>                   --LDA, Y abs 3rd part
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
 
 
                                when x"2D" =>                   --AND abs 3rd part.
                                when x"2D" =>                   --AND abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"3D" =>                   --AND, x abs 3rd part.
                                when x"3D" =>                   --AND, x abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"39" =>                   --AND, Y abs 3rd part.
                                when x"39" =>                   --AND, Y abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"0D" =>                   --ORA abs 3rd part.
                                when x"0D" =>                   --ORA abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"1D" =>                   --ORA, x abs 3rd part.
                                when x"1D" =>                   --ORA, x abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"19" =>                   --ORA, Y abs 3rd part.
                                when x"19" =>                   --ORA, Y abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"4D" =>                   --EOR abs 3rd part.
                                when x"4D" =>                   --EOR abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"5D" =>                   --EOR, x abs 3rd part.
                                when x"5D" =>                   --EOR, x abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"59" =>                   --EOR, Y abs 3rd part.
                                when x"59" =>                   --EOR, Y abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"6D" =>                   --ADC abs 3rd part.
                                when x"6D" =>                   --ADC abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"7D" =>                   --ADC, x abs 3rd part.
                                when x"7D" =>                   --ADC, x abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"79" =>                   --ADC, Y abs 3rd part.
                                when x"79" =>                   --ADC, Y abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"ED" =>                   --SBC abs 3rd part.
                                when x"ED" =>                   --SBC abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"FD" =>                   --SBC, x abs 3rd part.
                                when x"FD" =>                   --SBC, x abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"F9" =>                   --SBC, Y abs 3rd part.
                                when x"F9" =>                   --SBC, Y abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"AE" =>                   --LDX abs 3rd part.
                                when x"AE" =>                   --LDX abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"BE" =>                   --LDX, y abs 3rd part.
                                when x"BE" =>                   --LDX, y abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"AC" =>                   --LDY abs 3rd part.
                                when x"AC" =>                   --LDY abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"BC" =>                   --LDY, x abs 3rd part.
                                when x"BC" =>                   --LDY, x abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"2C" =>                   --BIT abs 3rd part.
                                when x"2C" =>                   --BIT abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"CD" =>                   --CMP abs 3rd part.
                                when x"CD" =>                   --CMP abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"DD" =>                   --CMP, x abs 3rd part.
                                when x"DD" =>                   --CMP, x abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"D9" =>                   --CMP, Y abs 3rd part.
                                when x"D9" =>                   --CMP, Y abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"EC" =>                   --CPX abs 3rd part.
                                when x"EC" =>                   --CPX abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"CC" =>                   --CPY abs 3rd part.
                                when x"CC" =>                   --CPY abs 3rd part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
--      ................................................................................
--      ................................................................................
                                when x"8D" =>                   --STA abs 3rd part.
                                when x"8D" =>                   --STA abs 3rd part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"9D" =>                   --STA,x abs 3rd part.
                                when x"9D" =>                   --STA,x abs 3rd part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        add_fg <= x"5";
                                        add_fg <= x"5";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"99" =>                   --STA, y abs 3rd part.
                                when x"99" =>                   --STA, y abs 3rd part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        add_fg <= x"6";
                                        add_fg <= x"6";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"8E" =>                   --STX abs 3rd part.
                                when x"8E" =>                   --STX abs 3rd part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"8C" =>                   --STY abs 3rd part.
                                when x"8C" =>                   --STY abs 3rd part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        add_fg <= x"4";
                                        add_fg <= x"4";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
--      ................................................................................
--      ................................................................................
 
 
                                when x"EE" =>                   --INC abs 3rd part.
                                when x"EE" =>                   --INC abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"FE" =>                   --INC, x abs 3rd part.
                                when x"FE" =>                   --INC, x abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"CE" =>                   --DEC abs 3rd part.
                                when x"CE" =>                   --DEC abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"DE" =>                   --DEC, x abs 3rd part.
                                when x"DE" =>                   --DEC, x abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"2E" =>                   --ROL abs 3rd part.
                                when x"2E" =>                   --ROL abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"3E" =>                   --ROL, x abs 3rd part.
                                when x"3E" =>                   --ROL, x abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"6E" =>                   --ROR abs 3rd part.
                                when x"6E" =>                   --ROR abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"7E" =>                   --ROR, x abs 3rd part.
                                when x"7E" =>                   --ROR, x abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"4E" =>                   --LSR abs 3rd part.
                                when x"4E" =>                   --LSR abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"5E" =>                   --LSR, x abs 3rd part.
                                when x"5E" =>                   --LSR, x abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"0E" =>                   --ASL abs 3rd part.
                                when x"0E" =>                   --ASL abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"1E" =>                   --ASL, x abs 3rd part.
                                when x"1E" =>                   --ASL, x abs 3rd part.
                                        add_fg <= x"f";
                                        add_fg <= x"f";
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
--      ............................................................................
--      ............................................................................
--      ==============================================================================
--      ==============================================================================
                                when x"4C"  =>                  --JMP abs 3rd part
                                when x"4C"  =>                  --JMP abs 3rd part
                                        dat2pc_fg <= '0';
                                        dat2pc_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"6C" =>                   --JMP indirect 3rd part
                                when x"6C" =>                   --JMP indirect 3rd part
                                        add_fg <= x"B";
                                        add_fg <= x"B";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"20" =>                   --JSR abs 3rd part
                                when x"20" =>                   --JSR abs 3rd part
                                        dat2pc_fg <= '0';
                                        dat2pc_fg <= '0';
                                        add_fg <= x"7";
                                        add_fg <= x"7";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        dat_out <= reg_pc(7 downto 0);
                                        dat_out <= reg_pc(7 downto 0);
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"60" =>                   --RTS third part
                                when x"60" =>                   --RTS 3rd part
                                        dat2pc_fg <= '1';
                                        dat2pc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"40" =>           --RTI 3rd part pull old status from stack
                                when x"40" =>           --RTI 3rd part pull old status from stack
                                        pc_dec_fg <= '0';        --Get 1st PC byte
                                        pc_dec_fg <= '0';        --Get 1st PC byte
                                        n_fg <= data_rd(7);     --cyc 6
                                        n_fg <= data_rd(7);     --cyc 6
                                        v_fg <= data_rd(6);
                                        v_fg <= data_rd(6);
                                        b_fg <= data_rd(4);
                                        b_fg <= data_rd(4);
                                        d_fg <= data_rd(3);
                                        d_fg <= data_rd(3);
                                        i_fg <= data_rd(2);
                                        i_fg <= data_rd(2);
                                        z_fg <= data_rd(1);
                                        z_fg <= data_rd(1);
                                        reg_a(8) <= data_rd(0);
                                        reg_a(8) <= data_rd(0);
                                        reg_sp <= reg_sp - "1";
                                        reg_sp <= reg_sp + "1";         --plus
                                        dat2pc_fg <= '1';
 
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"00" =>                   --Break third part cyc 2
                                when x"00" =>                                   --Break 3rd part  cyc 2
                                        dat_out <= reg_pc(7 downto 0);   --put dat_out onto stack set up dat_out
                                        if irq_fg = '0' and nmi_fg = '0' then     --Start up, irq and nmi also use
                                        reg_sp <= reg_sp + "1";
                                                b_fg <= '1';                    --this set of logic.
 
                                        else
 
                                                b_fg <= '0';
 
                                        end if;
 
                                        wr_fg <= '1';                   --put dat_out onto stack
 
                                        dat_out <= reg_pc(15 downto 8);
 
                                        add_fg <= x"7";
 
                                        pc_dec_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when others =>
                                when others =>
                                cycle_ctr <= cycle_ctr + x"1";
                                cycle_ctr <= cycle_ctr + x"1";
                        end case;       --Cycle 2
                        end case;       --Cycle 2
 
 
------------------------------------------------------------------------
------------------------------------------------------------------------
--      Cycle 3 is for single byte instructions ie TAY
--      Cycle 3 is for single byte instructions ie TAY
                when x"3" =>
                when x"3" =>
 
 
 
 
 
 
                        if      instruction_in(7 downto 0) /= x"A2" and
                        if      instruction_in(7 downto 0) /= x"A2" and
                                (
                                (
                                instruction_in(3 downto 0) = x"3" or
                                instruction_in(3 downto 0) = x"3" or
                                instruction_in(3 downto 0) = x"7" or
                                instruction_in(3 downto 0) = x"7" or
                                instruction_in(3 downto 0) = x"B" or
                                instruction_in(3 downto 0) = x"B" or
                                instruction_in(3 downto 0) = x"F"
                                instruction_in(3 downto 0) = x"F"
                                                                ) then          --NOPs
                                                                ) then          --NOPs
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                        pc_dec_fg <= '1';
                                        pc_dec_fg <= '1';
                        else
                        else
 
 
                        case instruction_in(7 downto 0) is
                        case instruction_in(7 downto 0) is
--      ======================================================================================
--      ======================================================================================
                                when x"84" =>                   --STY zero 4th part proto
                                when x"84" =>                   --STY zero 4th part proto
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"85" =>                   --STA zero 4th part proto
                                when x"85" =>                   --STA zero 4th part proto
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"86" =>                   --STX zero 4th part proto
                                when x"86" =>                   --STX zero 4th part proto
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"94" =>                   --STY zero, X 4th part proto
                                when x"94" =>                   --STY zero, X 4th part proto
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"95" =>                   --STA zero, X 4th part proto
                                when x"95" =>                   --STA zero, X 4th part proto
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"96" =>                   --STX zero, Y 4th part proto
                                when x"96" =>                   --STX zero, Y 4th part proto
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
--      =======================================================================================
--      =======================================================================================
 
 
 
 
                                when x"08" =>                   --PHP 4th part accumulator onto stack
                                when x"08" =>                   --PHP 4th part accumulator onto stack
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        reg_sp <= reg_sp + "1";
                                        reg_sp <= reg_sp - "1";         --neg
                                        cycle_ctr <=  cycle_ctr + x"1";
                                        cycle_ctr <=  cycle_ctr + x"1";
 
 
                                when x"48" =>                   --PHA 4th part accumulator onto stack
                                when x"48" =>                   --PHA 4th part accumulator onto stack
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <=  x"0";
                                        cycle_ctr <=  x"0";
 
 
 
 
                                when x"68" =>                   --PLA 4th part  Pull Accumulator from Stack
                                when x"68" =>                   --PLA 4th part  Pull Accumulator from Stack
                                        reg_a(7 downto 0) <= data_rd;
                                        reg_a(7 downto 0) <= data_rd;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"28" =>                   --PLP 4th part  Pull Status from Stack
                                when x"28" =>                   --PLP 4th part  Pull Status from Stack
                                        n_fg <= data_rd(7);
                                        n_fg <= data_rd(7);
                                        v_fg <= data_rd(6);
                                        v_fg <= data_rd(6);
--                                      b_fg <= data_rd(4);
                                        b_fg <= data_rd(4);
                                        d_fg <= data_rd(3);
                                        d_fg <= data_rd(3);
                                        i_fg <= data_rd(2);
                                        i_fg <= data_rd(2);
                                        z_fg <= data_rd(1);
                                        z_fg <= data_rd(1);
                                        reg_a(8) <= data_rd(0);
                                        reg_a(8) <= data_rd(0);
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"F0" =>                   --BEQ branch true 4th part.
                                when x"F0" =>                   --BEQ branch true 4th part.
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"D0" =>                   --BNE branch true 4th part.
                                when x"D0" =>                   --BNE branch true 4th part.
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"10" =>                   --BPL plus true 4th part.
                                when x"10" =>                   --BPL plus true 4th part.
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"30" =>                   --BM1 negative true 4th part.
                                when x"30" =>                   --BM1 negative true 4th part.
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"50" =>                   --BVC overflow false 4th part.
                                when x"50" =>                   --BVC overflow false 4th part.
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"70" =>                   --BVS overflow true 4th part.
                                when x"70" =>                   --BVS overflow true 4th part.
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"90" =>                   --BCC carry false 4th part.
                                when x"90" =>                   --BCC carry false 4th part.
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
                                when x"B0" =>                   --BCS carry true 4th part.
                                when x"B0" =>                   --BCS carry true 4th part.
                                                branch_fg <= '0';
                                                branch_fg <= '0';
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                                cycle_ctr <= cycle_ctr + x"1";
                                                cycle_ctr <= cycle_ctr + x"1";
 
 
--      ======================================================================================
--      ======================================================================================
 
 
                                when x"E6" =>                   --INC zero fourth part
                                when x"E6" =>                   --INC zero fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"F6" =>                   --INC zero,X fourth part
                                when x"F6" =>                   --INC zero,X fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"C6" =>                   --DEC zero fourth part
                                when x"C6" =>                   --DEC zero fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"D6" =>                   --DEC zero,X fourth part
                                when x"D6" =>                   --DEC zero,X fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"26" =>                   --ROL zero fourth part
                                when x"26" =>                   --ROL zero fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"36" =>                   --ROL zero,X fourth part
                                when x"36" =>                   --ROL zero,X fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"66" =>                   --ROR zero fourth part
                                when x"66" =>                   --ROR zero fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"76" =>                   --ROR zero,X fourth part
                                when x"76" =>                   --ROR zero,X fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"06" =>                   --ASL zero fourth part
                                when x"06" =>                   --ASL zero fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"16" =>                   --ASL zero,X fourth part
                                when x"16" =>                   --ASL zero,X fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"46" =>                   --LSR zero fourth part
                                when x"46" =>                   --LSR zero fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"56" =>                   --LSR zero,X fourth part
                                when x"56" =>                   --LSR zero,X fourth part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--
--
--      ==============================================================================
--      ==============================================================================
                                when x"AD" =>                   --LDA abs 4th part.
                                when x"AD" =>                   --LDA abs 4th part.
                                        reg_a(7 downto 0) <= data_rd;
                                        reg_a(7 downto 0) <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"BD" =>                   --LDA, x abs 4th part.
                                when x"BD" =>                   --LDA, x abs 4th part.
                                        reg_a(7 downto 0) <= data_rd;
                                        reg_a(7 downto 0) <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"B9" =>                   --LDA, Y abs 4th part
                                when x"B9" =>                   --LDA, Y abs 4th part
                                        reg_a(7 downto 0) <= data_rd;
                                        reg_a(7 downto 0) <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"2D" =>                   --AND abs 4th part.
                                when x"2D" =>                   --AND abs 4th part.
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"3D" =>                   --AND, x abs 4th part.
                                when x"3D" =>                   --AND, x abs 4th part.
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"39" =>                   --AND, Y abs 4th part.
                                when x"39" =>                   --AND, Y abs 4th part.
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"0D" =>                   --ORA abs 4th part.
                                when x"0D" =>                   --ORA abs 4th part.
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"1D" =>                   --ORA, x abs 4th part.
                                when x"1D" =>                   --ORA, x abs 4th part.
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"19" =>                   --ORA, Y abs 4th part.
                                when x"19" =>                   --ORA, Y abs 4th part.
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"4D" =>                   --EOR abs 4th part.
                                when x"4D" =>                   --EOR abs 4th part.
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"5D" =>                   --EOR, x abs 4th part.
                                when x"5D" =>                   --EOR, x abs 4th part.
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"59" =>                   --EOR, Y abs 4th part.
                                when x"59" =>                   --EOR, Y abs 4th part.
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"6D" =>                   --ADC abs 4th part.
                                when x"6D" =>                   --ADC abs 4th part.
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"7D" =>                   --ADC, x abs 4th part.
                                when x"7D" =>                   --ADC, x abs 4th part.
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"79" =>                   --ADC, Y abs 4th part.
                                when x"79" =>                   --ADC, Y abs 4th part.
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"ED" =>                   --SBC abs 4th part.
                                when x"ED" =>                   --SBC abs 4th part.
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"FD" =>                   --SBC, x abs 4th part.
                                when x"FD" =>                   --SBC, x abs 4th part.
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"F9" =>                   --SBC, Y abs 4th part.
                                when x"F9" =>                   --SBC, Y abs 4th part.
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"AE" =>                   --LDX abs 4th part.
                                when x"AE" =>                   --LDX abs 4th part.
                                        reg_x <= data_rd;
                                        reg_x <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"BE" =>                   --LDX, y abs 4th part.
                                when x"BE" =>                   --LDX, y abs 4th part.
                                        reg_x <= data_rd;
                                        reg_x <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"AC" =>                   --LDY abs 4th part.
                                when x"AC" =>                   --LDY abs 4th part.
                                        reg_y <= data_rd;
                                        reg_y <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"BC" =>                   --LDY, x abs 4th part.
                                when x"BC" =>                   --LDY, x abs 4th part.
                                        reg_y <= data_rd;
                                        reg_y <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"2C" =>                   --BIT abs 4th part.
                                when x"2C" =>                   --BIT abs 4th part.
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"CD" =>                   --CMP abs 4th part.
                                when x"CD" =>                   --CMP abs 4th part.
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        if reg_a(7 downto 0) >= data_rd then
                                        if reg_a(7 downto 0) >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"DD" =>                   --CMP, x abs 4th part.
                                when x"DD" =>                   --CMP, x abs 4th part.
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        if reg_a(7 downto 0) >= data_rd then
                                        if reg_a(7 downto 0) >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"D9" =>                   --CMP, Y abs 4th part.
                                when x"D9" =>                   --CMP, Y abs 4th part.
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        if reg_a(7 downto 0) >= data_rd then
                                        if reg_a(7 downto 0) >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"EC" =>                   --CPX abs 4th part.
                                when x"EC" =>                   --CPX abs 4th part.
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_x - data_rd;
                                        dat_out <= reg_x - data_rd;
                                        if reg_x >= data_rd then
                                        if reg_x >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"CC" =>                   --CPY abs 4th part.
                                when x"CC" =>                   --CPY abs 4th part.
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_y - data_rd;
                                        dat_out <= reg_y - data_rd;
                                        if reg_y >= data_rd then
                                        if reg_y >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      .................................................................................
--      .................................................................................
                                when x"8D" =>                   --STA abs 4th part.
                                when x"8D" =>                   --STA abs 4th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"9D" =>                   --STA,x abs 4th part.
                                when x"9D" =>                   --STA,x abs 4th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"99" =>                   --STA, y abs 4th part.
                                when x"99" =>                   --STA, y abs 4th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"8E" =>                   --STX abs 4th part.
                                when x"8E" =>                   --STX abs 4th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"8C" =>                   --STY abs 4th part.
                                when x"8C" =>                   --STY abs 4th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      ........................................................................
--      ........................................................................
 
 
                                when x"EE" =>                   --INC abs 4th part.
                                when x"EE" =>                   --INC abs 4th part.
                                        dat_out <= data_rd + x"01";
                                        dat_out <= data_rd + x"01";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"FE" =>                   --INC, x abs 4th part.
                                when x"FE" =>                   --INC, x abs 4th part.
                                        dat_out <= data_rd + x"01";
                                        dat_out <= data_rd + x"01";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"CE" =>                   --DEC abs 4th part.
                                when x"CE" =>                   --DEC abs 4th part.
                                        dat_out <= data_rd - x"01";
                                        dat_out <= data_rd - x"01";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"DE" =>                   --DEC, x abs 4th part.
                                when x"DE" =>                   --DEC, x abs 4th part.
                                        dat_out <= data_rd - x"01";
                                        dat_out <= data_rd - x"01";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"2E" =>                   --ROL abs 4th part.
                                when x"2E" =>                   --ROL abs 4th part.
                                        dat_out(7 downto 1) <= data_rd(6 downto 0);
                                        dat_out(7 downto 0) <= data_rd(6 downto 0) & reg_a(8);
                                        dat_out(0) <= reg_a(8);
                                        reg_a(8) <= data_rd(7);
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"3E" =>                   --ROL, x abs 4th part.
                                when x"3E" =>                   --ROL, x abs 4th part.
                                        dat_out(7 downto 1) <= data_rd(6 downto 0);
                                        dat_out(7 downto 0) <= data_rd(6 downto 0) & reg_a(8);
                                        dat_out(0) <= reg_a(8);
                                        reg_a(8) <= data_rd(7);
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        wr_fg <= '1';
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"6E" =>                   --ROR abs 4th part.
                                when x"6E" =>                   --ROR abs 4th part.
 
                                        dat_out(6 downto 0) <= data_rd(7 downto 1);
 
                                        dat_out(7) <= reg_a(8);
                                        reg_a(8) <= data_rd(0);
                                        reg_a(8) <= data_rd(0);
                                        dat_out <= reg_a(8) & data_rd(7 downto 1);
 
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
 
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"7E" =>                   --ROR, x abs 4th part.
                                when x"7E" =>                   --ROR, x abs 4th part.
 
                                        dat_out(6 downto 0) <= data_rd(7 downto 1);
 
                                        dat_out(7) <= reg_a(8);
                                        reg_a(8) <= data_rd(0);
                                        reg_a(8) <= data_rd(0);
                                        dat_out <= reg_a(8) & data_rd(7 downto 1);
 
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
 
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"4E" =>                   --LSR abs 4th part.
                                when x"4E" =>                   --LSR abs 4th part.
                                        dat_out <= '0' & reg_a(7 downto 1);
                                        dat_out <= '0' & data_rd(7 downto 1);
                                        reg_a(8) <= data_rd(0);
                                        reg_a(8) <= data_rd(0);
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
 
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"5E" =>                   --LSR, x abs 4th part.
                                when x"5E" =>                   --LSR, x abs 4th part.
                                        dat_out <= '0' & reg_a(7 downto 1);
                                        dat_out <= '0' & data_rd(7 downto 1);
                                        reg_a(8) <= data_rd(0);
                                        reg_a(8) <= data_rd(0);
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
 
                                        wr_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"0E" =>                   --ASL abs 4th part.
                                when x"0E" =>                   --ASL abs 4th part.
                                        reg_a(8) <= data_rd(7);
                                        reg_a(8) <= data_rd(7);
                                        dat_out <= data_rd(6 downto 0) & data_rd(0);
                                        dat_out <= data_rd(6 downto 0) & '0';
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        wr_fg <= '1';
 
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"1E" =>                   --ASL, x abs 4th part.
                                when x"1E" =>                   --ASL, x abs 4th part.
                                        reg_a(8) <= data_rd(7);
                                        reg_a(8) <= data_rd(7);
                                        dat_out <= data_rd(6 downto 0) & data_rd(0);
                                        dat_out <= data_rd(6 downto 0) & '0';
                                        wr_fg <= '1';
 
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        wr_fg <= '1';
 
                                        cycle_ctr <= cycle_ctr + "1";
--      ............................................................................
--      ............................................................................
--      ==============================================================================
--      ==============================================================================
                                when x"A1" =>                   --LDA (zero,x) 4th part proto
                                when x"A1" =>                   --LDA (zero,x) 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"B1" =>                   --LDA (zero),y 4th part proto
                                when x"B1" =>                   --LDA (zero),y 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"21" =>                   --AND (zero,x) 4th part proto
                                when x"21" =>                   --AND (zero,x) 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"31" =>                   --AND (zero),y 4th part proto
                                when x"31" =>                   --AND (zero),y 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"41" =>                   --EOR (zero,x) 4th part proto
                                when x"41" =>                   --EOR (zero,x) 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"51" =>                   --EOR (zero),y 4th part proto
                                when x"51" =>                   --EOR (zero),y 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"01" =>                   --OR (zero,x) 4th part proto
                                when x"01" =>                   --OR (zero,x) 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"11" =>                   --OR (zero),y 4th part proto
                                when x"11" =>                   --OR (zero),y 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
 
 
                                when x"61" =>                   --ADC (zero,x) 4th part proto
                                when x"61" =>                   --ADC (zero,x) 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"71" =>                   --ADC (zero),y 4th part proto
                                when x"71" =>                   --ADC (zero),y 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"E1" =>                   --SBC (zero,x) 4th part proto
                                when x"E1" =>                   --SBC (zero,x) 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"F1" =>                   --SBC (zero),y 4th part proto
                                when x"F1" =>                   --SBC (zero),y 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"C1" =>                   --CMP (zero,x) 4th part proto
                                when x"C1" =>                   --CMP (zero,x) 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when x"D1" =>                   --CMP (zero),y 4th part proto
                                when x"D1" =>                   --CMP (zero),y 4th part proto
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
 
 
                                when x"81" =>                   --STA (zero,x) 4th part proto
                                when x"81" =>                   --STA (zero,x) 4th part proto
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                when x"91" =>                   --STA (zero),y 4th part proto
                                when x"91" =>                   --STA (zero),y 4th part proto
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
--      ==================================================================================
--      ==================================================================================
 
 
                                when x"4C"  =>                  --JMP abs 4th part
                                when x"4C"  =>                  --JMP abs 4th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"6C" =>                   --JMP abs 4th part
                                when x"6C" =>                   --JMP abs 4th part
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        dat2pc_fg <= '1';
                                        dat2pc_fg <= '1';
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"20" =>                   --JSR indirect 4th part
                                when x"20" =>                   --JSR indirect 4th part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        reg_sp <= reg_sp + "1";
                                        reg_sp <= reg_sp - "1";         --neg
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"60" =>                   --RTS fourth part
                                when x"60" =>                   --RTS fourth part
                                        dat2pc_fg <= '0';
                                        dat2pc_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"40" =>                   --RTI forth part
                                when x"40" =>                   --RTI forth part
--                                      reg_sp <= reg_sp - "1";
 
                                        add_fg <= x"7";         --Get 2nd PC byte
                                        add_fg <= x"7";         --Get 2nd PC byte
                                        dat2pc_fg <= '0';
                                        dat2pc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"00" =>                   --Break forth extra part cyc 3
                                when x"00" =>                           --Break 4th part cyc 3
                                        dat_out <= n_fg & v_fg & '1' & b_fg & d_fg & i_fg & z_fg & reg_a(8);
                                        dat_out <= reg_pc(7 downto 0);   --put dat_out onto stack set up dat_out
                                        reg_sp <= reg_sp + "1";
 
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
                                when others =>
                                when others =>
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                end case;       --Cycle 3
                end case;       --Cycle 3
                end if;                                         --End single byte stuff
                end if;                                         --End single byte stuff
 
 
--      End of cycle 3
--      End of cycle 3
--      Cycle 4 is for 2 byte/cycle instructions ie LDA #
--      Cycle 4 is for 2 byte/cycle instructions ie LDA #
--
--
                when x"4" =>
                when x"4" =>
                        case Instruction_in is
                        case Instruction_in is
--      ======================================================================================
--      ======================================================================================
                                when x"08" =>                   --PHP 5th part accumulator onto stack
                                when x"08" =>                   --PHP 5th part accumulator onto stack
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <=  x"0";
                                        cycle_ctr <=  x"0";
 
 
                                when x"F0" =>                   --BEQ branch true 5th part.
                                when x"F0" =>                   --BEQ branch true 5th part.
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                when x"D0" =>                   --BNE branch true 5th part.
                                when x"D0" =>                   --BNE branch true 5th part.
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                when x"10" =>                   --BPL plus true 5th part.
                                when x"10" =>                   --BPL plus true 5th part.
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                when x"30" =>                   --BM1 negative true 5th part.
                                when x"30" =>                   --BM1 negative true 5th part.
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                when x"50" =>                   --BVC overflow false 5th part.
                                when x"50" =>                   --BVC overflow false 5th part.
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                when x"70" =>                   --BVS overflow true 5th part.
                                when x"70" =>                   --BVS overflow true 5th part.
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                when x"90" =>                   --BCC carry false 5th part.
                                when x"90" =>                   --BCC carry false 5th part.
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
                                when x"B0" =>                   --BCS carry true 5th part.
                                when x"B0" =>                   --BCS carry true 5th part.
                                                pc_inc_fg <= '0';
                                                pc_inc_fg <= '0';
                                                cycle_ctr <= x"0";
                                                cycle_ctr <= x"0";
--      ======================================================================================
--      ======================================================================================
 
 
                                when x"E6" =>                   --INC zero 5th part
                                when x"E6" =>                   --INC zero 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"F6" =>                   --INC zero,X 5th part
                                when x"F6" =>                   --INC zero,X 5th part
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"c6" =>                   --DEC zero 5th part
                                when x"c6" =>                   --DEC zero 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"46" =>                   --LSR zero 5th part
                                when x"46" =>                   --LSR zero 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"56" =>                   --LSR zero,X 5th part
                                when x"56" =>                   --LSR zero,X 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"66" =>                   --ROR zero 5th part
                                when x"66" =>                   --ROR zero 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"76" =>                   --ROR zero,X 5th part
                                when x"76" =>                   --ROR zero,X 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"26" =>                   --ROL zero 5th part
                                when x"26" =>                   --ROL zero 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"36" =>                   --ROL zero,X 5th part
                                when x"36" =>                   --ROL zero,X 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"06" =>                   --ASL zero 5th part
                                when x"06" =>                   --ASL zero 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"16" =>                   --ASL zero,X 5th part
                                when x"16" =>                   --ASL zero,X 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
 
 
--
--
--      ======================================================================================
--      ======================================================================================
                                when x"AD" =>                   --LDA 5th part.
                                when x"AD" =>                   --LDA 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"BD" =>                   --LDA, x 5th part.
                                when x"BD" =>                   --LDA, x 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"B9" =>                   --LDA, Y 5th part
                                when x"B9" =>                   --LDA, Y 5th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"2D" =>                   --AND 5th part.
                                when x"2D" =>                   --AND 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"3D" =>                   --AND, x 5th part.
                                when x"3D" =>                   --AND, x 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"39" =>                   --AND, Y 5th part.
                                when x"39" =>                   --AND, Y 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"0D" =>                   --ORA 5th part.
                                when x"0D" =>                   --ORA 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"1D" =>                   --ORA, x 5th part.
                                when x"1D" =>                   --ORA, x 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"19" =>                   --ORA, Y 5th part.
                                when x"19" =>                   --ORA, Y 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"4D" =>                   --EOR 5th part.
                                when x"4D" =>                   --EOR 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"5D" =>                   --EOR, x 5th part.
                                when x"5D" =>                   --EOR, x 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"59" =>                   --EOR, Y 5th part.
                                when x"59" =>                   --EOR, Y 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"6D" =>                   --ADC 5th part.
                                when x"6D" =>                   --ADC 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"7D" =>                   --ADC, x 5th part.
                                when x"7D" =>                   --ADC, x 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"79" =>                   --ADC, Y 5th part.
                                when x"79" =>                   --ADC, Y 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"ED" =>                   --SBC 5th part.
                                when x"ED" =>                   --SBC 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"FD" =>                   --SBC, x 5th part.
                                when x"FD" =>                   --SBC, x 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"F9" =>                   --SBC, Y 5th part.
                                when x"F9" =>                   --SBC, Y 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"AE" =>                   --LDX 5th part.
                                when x"AE" =>                   --LDX 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"BE" =>                   --LDX, y 5th part.
                                when x"BE" =>                   --LDX, y 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"AC" =>                   --LDY 5th part.
                                when x"AC" =>                   --LDY 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"BC" =>                   --LDY, x 5th part.
                                when x"BC" =>                   --LDY, x 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"2C" =>                   --BIT 5th part.
                                when x"2C" =>                   --BIT 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"CD" =>                   --CMP 5th part.
                                when x"CD" =>                   --CMP 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"DD" =>                   --CMP, x 5th part.
                                when x"DD" =>                   --CMP, x 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"D9" =>                   --CMP, Y 5th part.
                                when x"D9" =>                   --CMP, Y 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"EC" =>                   --CPX 5th part.
                                when x"EC" =>                   --CPX 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"CC" =>                   --CPY 5th part.
                                when x"CC" =>                   --CPY 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
--      ............................................................................
--      ............................................................................
                                when x"8D" =>                   --STA 5th part.
                                when x"8D" =>                   --STA 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"9D" =>                   --STA,x 5th part.
                                when x"9D" =>                   --STA,x 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"99" =>                   --STA, y 5th part.
                                when x"99" =>                   --STA, y 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"8E" =>                   --STX 5th part.
                                when x"8E" =>                   --STX 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"8C" =>                   --STY 5th part.
                                when x"8C" =>                   --STY 5th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
--      ............................................................................
--      ............................................................................
 
 
                                when x"EE" =>                   --INC abs 5th part.
                                when x"EE" =>                   --INC abs 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"FE" =>                   --INC, x 5th part.
                                when x"FE" =>                   --INC, x 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"CE" =>                   --DEC 5th part.
                                when x"CE" =>                   --DEC 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"DE" =>                   --DEC, x 5th part.
                                when x"DE" =>                   --DEC, x 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"2E" =>                   --ROL 5th part.
                                when x"2E" =>                   --ROL 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"3E" =>                   --ROL, x 5th part.
                                when x"3E" =>                   --ROL, x 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"6E" =>                   --ROR 5th part.
                                when x"6E" =>                   --ROR 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"7E" =>                   --ROR, x 5th part.
                                when x"7E" =>                   --ROR, x 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"4E" =>                   --LSR 5th part.
                                when x"4E" =>                   --LSR 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"5E" =>                   --LSR, x 5th part.
                                when x"5E" =>                   --LSR, x 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"0E" =>                   --ASL 5th part.
                                when x"0E" =>                   --ASL 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"1E" =>                   --ASL, x 5th part.
                                when x"1E" =>                   --ASL, x 5th part.
                                        wr_fg <= '0';
                                        wr_fg <= '0';
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      ............................................................................
--      ............................................................................
--      ==============================================================================
--      ==============================================================================
                                when x"A1" =>                   --LDA (zero,x) 5th part proto
                                when x"A1" =>                   --LDA (zero,x) 5th part proto
                                        reg_a(7 downto 0) <= data_rd;
                                        reg_a(7 downto 0) <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"B1" =>                   --LDA (zero),y 5th part proto
                                when x"B1" =>                   --LDA (zero),y 5th part proto
                                        reg_a(7 downto 0) <= data_rd;
                                        reg_a(7 downto 0) <= data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= data_rd;
                                        dat_out <= data_rd;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"21" =>                   --AND (zero,x) 5th part proto
                                when x"21" =>                   --AND (zero,x) 5th part proto
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"31" =>                   --AND (zero),y 5th part proto
                                when x"31" =>                   --AND (zero),y 5th part proto
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        dat_out <= reg_a(7 downto 0) and data_rd;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"42" =>                   --EOR (zero,x) 5th part proto
                                when x"42" =>                   --EOR (zero,x) 5th part proto
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"51" =>                   --EOR (zero),y 5th part proto
                                when x"51" =>                   --EOR (zero),y 5th part proto
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"01" =>                   --OR (zero,x) 5th part proto
                                when x"01" =>                   --OR (zero,x) 5th part proto
                                        reg_a(7 downto 0) <= reg_a(7 downto 0)    or data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0)    or data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"11" =>                   --OR (zero),y 5th part proto
                                when x"11" =>                   --OR (zero),y 5th part proto
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        dat_out <= reg_a(7 downto 0) or data_rd;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"61" =>                   --ADC (zero,x) 5th part proto
                                when x"61" =>                   --ADC (zero,x) 5th part proto
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"71" =>                   --ADC (zero),y 5th part proto
                                when x"71" =>                   --ADC (zero),y 5th part proto
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"E1" =>                   --SBC (zero,x) 5th part proto
                                when x"E1" =>                   --SBC (zero,x) 5th part proto
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"F1" =>                   --SBC (zero),y 5th part proto
                                when x"F1" =>                   --SBC (zero),y 5th part proto
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"C1" =>                   --CMP (zero,x) 5th part proto
                                when x"C1" =>                   --CMP (zero,x) 5th part proto
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        if reg_a(7 downto 0) >= data_rd then
                                        if reg_a(7 downto 0) >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"D1" =>                   --CMP (zero),y 5th part proto
                                when x"D1" =>                   --CMP (zero),y 5th part proto
                                        flags_fg <= "01";
                                        flags_fg <= "01";
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        dat_out <= reg_a(7 downto 0) - data_rd;
                                        if reg_a(7 downto 0) >= data_rd then
                                        if reg_a(7 downto 0) >= data_rd then
                                                reg_a(8) <= '1';
                                                reg_a(8) <= '1';
                                        else
                                        else
                                                reg_a(8) <= '0';
                                                reg_a(8) <= '0';
                                        end if;
                                        end if;
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"81" =>                   --STA (zero,x) 5th part proto
                                when x"81" =>                   --STA (zero,x) 5th part proto
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"91" =>                   --STA (zero),y 5th part proto
                                when x"91" =>                   --STA (zero),y 5th part proto
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      ==============================================================================
--      ==============================================================================
                                when x"4C"  =>                  --JMP abs 5th part
                                when x"4C"  =>                  --JMP abs 5th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"6C" =>                   --JMP indirect 5th part
                                when x"6C" =>                   --JMP indirect 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        dat2pc_fg <= '0';
                                        dat2pc_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"20" =>                   --JSR 5th part
                                when x"20" =>                   --JSR 5th part
                                        pc_inc_fg <= '1';
                                        pc_inc_fg <= '1';
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        reg_sp <= reg_sp + "1";
                                        reg_sp <= reg_sp - "1";         --neg
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"60" =>                   --RTS fifth part
                                when x"60" =>                   --RTS fifth part
                                        dat2pc_fg <= '0';
                                        dat2pc_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"40" =>                   --RTI fifth part
                                when x"40" =>                   --RTI fifth part
--                                      reg_sp <= reg_sp + "1";
--                                      reg_sp <= reg_sp + "1";
                                        add_fg <= x"0";
                                        add_fg <= x"0";
--                                      dat2pc_fg <= '0';
                                        dat2pc_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"00" =>                   --Break fifth part cyc 4
                                when x"00" =>                   --Break 5th extra part cyc 4
                                        wr_fg <= '0';
                                        dat_out <= n_fg & v_fg & '1' & b_fg & d_fg & i_fg & z_fg & reg_a(8);
                                        reg_sp <= reg_sp + "1";
                                        reg_sp <= reg_sp - "1";         --neg
                                        if nmi_fg = '0' then
 
                                                add_fg <= x"9";         --Complete stacking start getting vector
 
                                        else
 
                                                add_fg <= x"A";
 
                                        end if;
 
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
 
 
                                when others =>
                                when others =>
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                        end case;       --Cycle 4
                        end case;       --Cycle 4
--                      end if;
--                      end if;
------------------------------------------------------------------------
------------------------------------------------------------------------
--      End of cycle 4
--      End of cycle 4
--      Cycle 5 is for 3 byte instructions ie LDA abs
--      Cycle 5 is for 3 byte instructions ie LDA abs
 
 
                when x"5" =>
                when x"5" =>
                        case Instruction_in is
                        case Instruction_in is
--      =========================================================================
--      =========================================================================
                                when x"81" =>                   --STA (zero,x) 6th part proto
                                when x"81" =>                   --STA (zero,x) 6th part proto
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"91" =>                   --STA (zero),y 6th part proto
                                when x"91" =>                   --STA (zero),y 6th part proto
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
 
 
--      ........................................................................................
--      ........................................................................................
                                when x"E6" =>                   --INC zero 6th part
                                when x"E6" =>                   --INC zero 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"c6" =>                   --dec zero 6th part
                                when x"c6" =>                   --dec zero 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"26" =>                   --ROL zero 6th part
                                when x"26" =>                   --ROL zero 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"F6" =>                   --INC zero,X 6th part
                                when x"F6" =>                   --INC zero,X 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"46" =>                   --LSR zero 6th part
                                when x"46" =>                   --LSR zero 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"56" =>                   --LSR zero,X 6th part
                                when x"56" =>                   --LSR zero,X 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"66" =>                   --ROR zero 6th part
                                when x"66" =>                   --ROR zero 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"76" =>                   --ROR zero,X 6th part
                                when x"76" =>                   --ROR zero,X 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"36" =>                   --ROL zero,X 6th part
                                when x"36" =>                   --ROL zero,X 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"06" =>                   --ASL zero 6th part
                                when x"06" =>                   --ASL zero 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"16" =>                   --ASL zero,X 6th part
                                when x"16" =>                   --ASL zero,X 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
 
 
--==================================================
--==================================================
 
 
 
 
                                when x"EE" =>                   --INC abs 6th part.
                                when x"EE" =>                   --INC abs 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"FE" =>                   --INC, x 6th part.
                                when x"FE" =>                   --INC, x 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"CE" =>                   --DEC 6th part.
                                when x"CE" =>                   --DEC 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"DE" =>                   --DEC, x 6th part.
                                when x"DE" =>                   --DEC, x 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"2E" =>                   --ROL 6th part.
                                when x"2E" =>                   --ROL 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"3E" =>                   --ROL, x 6th part.
                                when x"3E" =>                   --ROL, x 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"6E" =>                   --ROR 6th part.
                                when x"6E" =>                   --ROR 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"7E" =>                   --ROR, x 6th part.
                                when x"7E" =>                   --ROR, x 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"4E" =>                   --LSR 6th part.
                                when x"4E" =>                   --LSR 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"5E" =>                   --LSR, x 6th part.
                                when x"5E" =>                   --LSR, x 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"0E" =>                   --ASL 6th part.
                                when x"0E" =>                   --ASL 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                                when x"1E" =>                   --ASL, x 6th part.
                                when x"1E" =>                   --ASL, x 6th part.
                                        add_fg <= x"0";
                                        add_fg <= x"0";
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
--      ........................................................................................
--      ........................................................................................
 
 
                                when x"6C" =>                   --JMP indirect 6th part
                                when x"6C" =>                   --JMP indirect 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"60" =>                   --RTS 6th part
                                when x"60" =>                   --RTS 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"40" =>                   --RTI sixth part
                                when x"40" =>                   --RTI sixth part
                                        cycle_ctr <= cycle_ctr + x"1";
 
                                                pc_inc_fg <= '1';
                                                pc_inc_fg <= '1';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                                when x"20" =>                   --JSR 6th part
                                when x"20" =>                   --JSR 6th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"00" =>                   --Break 6th part cyc 5
                                when x"00" =>                   --Break 6th part cyc 5
                                        add_fg <= x"B";
                                        wr_fg <= '0';
                                        irq_fg <= '0';
                                        reg_sp <= reg_sp - "1";         --neg
                                        nmi_fg <= '0';
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
 
                                when others =>
                                when others =>
 
 
                                        cycle_ctr <= cycle_ctr + x"1";
                                        cycle_ctr <= cycle_ctr + x"1";
                        end  case;      --Cycle 5
                        end  case;      --Cycle 5
 
 
------------------------------------------------------------------------
------------------------------------------------------------------------
--      End of cycle 5
--      End of cycle 5
--      Cycle 6 is for 3 byte instructions ie LDA abs
--      Cycle 6 is for 3 byte instructions ie LDA abs
 
 
                when x"6" =>
                when x"6" =>
                        case Instruction_in is
                        case Instruction_in is
 
 
                                when x"EE" =>                   --INC abs 7th part.
                                when x"EE" =>                   --INC abs 7th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"cE" =>                   --DEC abs 7th part.
                                when x"cE" =>                   --DEC abs 7th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"2E" =>                   --ROL abs 7th part.
                                when x"2E" =>                   --ROL abs 7th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"3E" =>                   --ROL, x abs 7th part.
                                when x"3E" =>                   --ROL, x abs 7th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"6E" =>                   --ROR abs 7th part.
                                when x"6E" =>                   --ROR abs 7th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"7E" =>                   --ROR, x abs 7th part.
                                when x"7E" =>                   --ROR, x abs 7th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"4E" =>                   --LSR abs 7th part.
                                when x"4E" =>                   --LSR abs 7th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"5E" =>                   --LSR, x abs 7th part.
                                when x"5E" =>                   --LSR, x abs 7th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"0E" =>                   --ASL abs 7th part.
                                when x"0E" =>                   --ASL abs 7th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
                                when x"1E" =>                   --ASL, x abs 7th part.
                                when x"1E" =>                   --ASL, x abs 7th part.
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
--=============================================================================
--=============================================================================
 
 
                                when x"40" =>                   --RTI 7th part
                                when x"40" =>                   --RTI 7th part
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"00" =>                   --Break 7th part cyc 6
                                when x"00" =>                   --Break 7th part cyc 6
                                        dat2pc_fg <= '1';
                                        wr_fg <= '0';
                                        add_fg <= x"0";
                                        reg_sp <= reg_sp - "1";         --neg
                                        cycle_ctr <= cycle_ctr + "1";
                                        if nmi_fg = '0' then
 
                                                add_fg <= x"9";         --Complete stacking start getting vector
 
                                        else
 
                                                add_fg <= x"A";
 
                                        end if;
 
                                        cycle_ctr <= cycle_ctr + x"1";
 
 
                        when others =>
                        when others =>
                                cycle_ctr <=  x"0";
                                cycle_ctr <=  x"0";
                                --get_inst_fg <= '0';
                                --get_inst_fg <= '0';
 
 
 
 
                        end  case;      --Cycle 6
                        end  case;      --Cycle 6
--      End of cycle 6
--      End of cycle 6
 
 
 
 
--      Cycle 8 is for 3 byte instructions ie LDA abs
--      Cycle 8 is for 3 byte instructions ie LDA abs
 
 
                when x"7" =>
                when x"7" =>
                        case Instruction_in is
                        case Instruction_in is
 
 
                                when x"40" =>                   --RTI 8th cyc
                                when x"40" =>                   --RTI 8th cyc
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                                when x"00" =>                   --Break 8th part cyc 7
                                when x"00" =>                   --Break 8th part cyc 7
                                        if start_fg = '0' then   --When starting don't mess with this
                                        add_fg <= x"B";
                                                i_fg <= '1';    --Break irq and start use this logic.
                                        irq_fg <= '0';
 
                                        nmi_fg <= '0';
 
                                        nmi_req <= '1';
 
                                        if irq_fg = '1' then
 
                                                i_fg <= '1';
                                        end if;
                                        end if;
                                        pc_inc_fg <= '1';
 
                                        start_fg <= '0';
 
                                        dat2pc_fg <= '0';
 
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
 
 
                                when others =>
                                when others =>
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= x"0";
 
 
                        end  case;      --Cycle 7
                        end  case;      --Cycle 7
--      Cycle 7
--      Cycle 7
                when x"8" =>
                when x"8" =>
                        case Instruction_in is
                        case Instruction_in is
 
                                when x"00" =>                   --Break 9th part cyc 8
                                when x"00" =>                   --Break 10th part cyc 8
                                        dat2pc_fg <= '1';
                                        pc_inc_fg <= '0';
                                        add_fg <= x"0";
                                        cycle_ctr <= x"0";
                                        cycle_ctr <= cycle_ctr + "1";
 
 
                                when others =>
                                when others =>
                                cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= x"0";
                                pc_inc_fg <= '0';
 
 
 
                        end  case;      --Cycle 8
                        end  case;      --Cycle 8
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--      Cycle 9
--      Cycle 9
                when x"9" =>
                when x"9" =>
                        case Instruction_in is
                        case Instruction_in is
 
                                when x"00" =>                   --Break 10th part cyc 9
                                when others =>
                                        pc_inc_fg <= '1';
 
                                        start_fg <= '0';
 
                                        dat2pc_fg <= '0';
                                cycle_ctr <= cycle_ctr + "1";
                                cycle_ctr <= cycle_ctr + "1";
                                pc_inc_fg <= '0';
 
 
 
 
                                when others =>
 
                                        cycle_ctr <= x"0";
                        end  case;      --Cycle 9
                        end  case;      --Cycle 9
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--      Cycle A
--      Cycle A
 
 
                when x"A" =>
                when x"A" =>
                        case Instruction_in is
                        case Instruction_in is
 
                                when x"00" =>                   --Break 11th part cyc 10
 
                                        pc_inc_fg <= '0';
 
                                        cycle_ctr <= x"0";
 
 
                                when others =>
                                when others =>
                                cycle_ctr <= cycle_ctr + "1";
                                cycle_ctr <= cycle_ctr + "1";
                                pc_inc_fg <= '0';
                                pc_inc_fg <= '0';
 
 
                        end  case;      --Cycle A
                        end  case;      --Cycle A
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--      Cycle B
--      Cycle B
 
 
                when x"B" =>
                when x"B" =>
                        case Instruction_in is
                        case Instruction_in is
 
 
                                when others =>
                                when others =>
                                        cycle_ctr <= cycle_ctr + "1";
                                        cycle_ctr <= cycle_ctr + "1";
                                        pc_inc_fg <= '0';
                                        pc_inc_fg <= '0';
 
 
                        end  case;      --Cycle B
                        end  case;      --Cycle B
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--      Cycle C
--      Cycle C
 
 
                when x"C" =>
                when x"C" =>
                        case Instruction_in is
                        case Instruction_in is
 
 
 
 
                                when others =>
                                when others =>
                                cycle_ctr <=  x"0";
                                cycle_ctr <=  x"0";
 
 
                        end  case;      --Cycle C
                        end  case;      --Cycle C
 
 
--      ==========================================================================
--      ==========================================================================
 
 
 
 
                when others =>
                when others =>
                        cycle_ctr<= x"0";
                        cycle_ctr<= x"0";
        end case;       --cycle_ctr
        end case;       --cycle_ctr
end if; --Reset stuff
end if; --Reset stuff
 
 
end if; --rising edge
end if; --rising edge
 
 
end process instruction_decode;
end process instruction_decode;
 
 
end P65C02_architecture;
end P65C02_architecture;
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.