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

Subversion Repositories lattice6502

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

Show entire file | Details | Blame | View Log

Rev 3 Rev 6
Line 3... Line 3...
--
--
--      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.
--
--
--      *************************************************************
--      *************************************************************
Line 55... Line 58...
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
--                      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.
Line 109... Line 120...
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
--      =======================================================
--      =======================================================
Line 127... Line 138...
        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;
Line 146... Line 158...
        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";
 
 
Line 161... Line 174...
                        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" =>
Line 204... Line 218...
                                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;
Line 228... Line 242...
                        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;
Line 250... Line 264...
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
Line 272... Line 287...
        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
Line 323... Line 346...
                        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
Line 343... Line 364...
                                        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";
Line 388... Line 408...
                                        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";
Line 630... Line 649...
                                        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
Line 804... Line 823...
                                        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
Line 1230... Line 1244...
                                        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.
Line 1388... Line 1405...
                                        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
Line 1417... Line 1432...
--      ====================================================================================
--      ====================================================================================
 
 
                                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";
Line 1700... Line 1715...
                                        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";
 
 
Line 2020... Line 2034...
                                        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
Line 2033... Line 2047...
                                        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
Line 2089... Line 2109...
 
 
 
 
                                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";
Line 2104... Line 2124...
                                        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';
Line 2396... Line 2416...
                                        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';
Line 2535... Line 2557...
                                        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";
Line 2929... Line 2949...
                                        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;
Line 3053... Line 3067...
                                        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
Line 3125... Line 3138...
                                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';
 
 
Line 3147... Line 3165...
 
 
                                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';
 
 

powered by: WebSVN 2.1.0

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