OSDN Git Service

debug update.
[motonesfpga/motonesfpga.git] / de0_cv_nes / mos6502.vhd
index 161f6dc..a2e7641 100644 (file)
@@ -11,9 +11,11 @@ entity mos6502 is
             pi_rdy         : in std_logic;\r
             pi_irq_n       : in std_logic;\r
             pi_nmi_n       : in std_logic;\r
-            po_r_nw        : out std_logic;\r
+            po_oe_n        : out std_logic;\r
+            po_we_n        : out std_logic;\r
             po_addr        : out std_logic_vector ( 15 downto 0);\r
-            pio_d_io       : inout std_logic_vector ( 7 downto 0)\r
+            pio_d_io       : inout std_logic_vector ( 7 downto 0);\r
+            po_exc_cnt     : out std_logic_vector (63 downto 0)\r
     );\r
 end mos6502;\r
 \r
@@ -89,6 +91,9 @@ type cpu_main_state is (
     --reset vector.\r
     ST_RS_T0, ST_RS_T1, ST_RS_T2, ST_RS_T3, ST_RS_T4, ST_RS_T5, ST_RS_T6, ST_RS_T7,\r
 \r
+    --nmi interrupt.\r
+              ST_NM_T1, ST_NM_T2, ST_NM_T3, ST_NM_T4, ST_NM_T5, ST_NM_T6, ST_NM_T7,\r
+\r
     --invalid state\r
     ST_INV\r
     );\r
@@ -130,7 +135,7 @@ constant inst_decode_rom : cpu_state_array := (
   --48          49          4a          4b          4c          4d          4e          4f\r
     ST_A51_T1,  ST_A21_T1,  ST_A1_T1,   ST_INV,     ST_A561_T1, ST_A23_T1,  ST_A42_T1,  ST_INV,\r
   --50          51          52          53          54          55          56          57\r
-    ST_A58_T1,  ST_A27_T1,  ST_INV,     ST_INV,     ST_A26_T1,  ST_INV,     ST_A43_T1,  ST_INV,\r
+    ST_A58_T1,  ST_A27_T1,  ST_INV,     ST_INV,     ST_A26_T1,  ST_A26_T1,  ST_A43_T1,  ST_INV,\r
   --58          59          5a          5b          5c          5d          5e          5f\r
     ST_A1_T1,   ST_A25_T1,  ST_INV,     ST_INV,     ST_INV,     ST_A25_T1,  ST_A44_T1,  ST_INV,\r
   --60          61          62          63          64          65          66          67\r
@@ -138,7 +143,7 @@ constant inst_decode_rom : cpu_state_array := (
   --68          69          6a          6b          6c          6d          6e          6f\r
     ST_A52_T1,  ST_A21_T1,  ST_A1_T1,   ST_INV,     ST_A562_T1, ST_A23_T1,  ST_A42_T1,  ST_INV,\r
   --70          71          72          73          74          75          76          77\r
-    ST_A58_T1,  ST_A27_T1,  ST_INV,     ST_INV,     ST_A26_T1,  ST_INV,     ST_A43_T1,  ST_INV,\r
+    ST_A58_T1,  ST_A27_T1,  ST_INV,     ST_INV,     ST_A26_T1,  ST_A26_T1,  ST_A43_T1,  ST_INV,\r
   --78          79          7a          7b          7c          7d          7e          7f\r
     ST_A1_T1,   ST_A25_T1,  ST_INV,     ST_INV,     ST_INV,     ST_A25_T1,  ST_A44_T1,  ST_INV,\r
   --80          81          82          83          84          85          86          87\r
@@ -154,15 +159,15 @@ constant inst_decode_rom : cpu_state_array := (
   --a8          a9          aa          ab          ac          ad          ae          af\r
     ST_A1_T1,   ST_A21_T1,  ST_A1_T1,   ST_INV,     ST_A23_T1,  ST_A23_T1,  ST_A23_T1,  ST_INV,\r
   --b0          b1          b2          b3          b4          b5          b6          b7\r
-    ST_A58_T1,  ST_A27_T1,  ST_INV,     ST_A26_T1,  ST_A26_T1,  ST_A26_T1,  ST_INV,     ST_INV,\r
+    ST_A58_T1,  ST_A27_T1,  ST_INV,     ST_A26_T1,  ST_A26_T1,  ST_A26_T1,  ST_A26_T1,  ST_INV,\r
   --b8          b9          ba          bb          bc          bd          be          bf\r
     ST_A1_T1,   ST_A25_T1,  ST_A1_T1,   ST_INV,     ST_A25_T1,  ST_A25_T1,  ST_A25_T1,  ST_INV,\r
   --c0          c1          c2          c3          c4          c5          c6          c7\r
-    ST_A21_T1,  ST_A24_T1,  ST_INV,     ST_INV,     ST_INV,     ST_A22_T1,  ST_A41_T1,  ST_INV,\r
+    ST_A21_T1,  ST_A24_T1,  ST_INV,     ST_INV,     ST_A22_T1,  ST_A22_T1,  ST_A41_T1,  ST_INV,\r
   --c8          c9          ca          cb          cc          cd          ce          cf\r
     ST_A1_T1,   ST_A21_T1,  ST_A1_T1,   ST_INV,     ST_A23_T1,  ST_A23_T1,  ST_A42_T1,  ST_INV,\r
   --d0          d1          d2          d3          d4          d5          d6          d7\r
-    ST_A58_T1,  ST_A27_T1,  ST_INV,     ST_INV,     ST_A26_T1,  ST_INV,     ST_A43_T1,  ST_INV,\r
+    ST_A58_T1,  ST_A27_T1,  ST_INV,     ST_INV,     ST_A26_T1,  ST_A26_T1,  ST_A43_T1,  ST_INV,\r
   --d8          d9          da          db          dc          dd          de          df\r
     ST_A1_T1,   ST_A25_T1,  ST_INV,     ST_INV,     ST_INV,     ST_A25_T1,  ST_A44_T1,  ST_INV,\r
   --e0          e1          e2          e3          e4          e5          e6          e7\r
@@ -175,6 +180,21 @@ constant inst_decode_rom : cpu_state_array := (
     ST_A1_T1,   ST_A25_T1,  ST_INV,     ST_INV,     ST_INV,     ST_A25_T1,  ST_A44_T1,  ST_INV\r
 );\r
 \r
+--        Flags (bit 7 to bit 0):\r
+--        N   ....    Negative\r
+--        V   ....    Overflow\r
+--        -   ....    ignored   -- always 1 for NES 6502\r
+--        B   ....    Break\r
+--        D   ....    Decimal (use BCD for arithmetics)     -- not supported. always 0.\r
+--        I   ....    Interrupt (IRQ disable)\r
+--        Z   ....    Zero\r
+--        C   ....    Carry\r
+constant FL_N   : integer := 7;\r
+constant FL_V   : integer := 6;\r
+constant FL_I   : integer := 2;\r
+constant FL_Z   : integer := 1;\r
+constant FL_C   : integer := 0;\r
+\r
 signal reg_main_state           : cpu_main_state;\r
 signal reg_main_next_state      : cpu_main_state;\r
 signal reg_sub_state            : cpu_sub_state;\r
@@ -192,19 +212,62 @@ signal reg_status   : std_logic_vector (7 downto 0);
 signal reg_pc_l     : std_logic_vector (7 downto 0);\r
 signal reg_pc_h     : std_logic_vector (7 downto 0);\r
 \r
+--tmp flag reg.\r
+signal reg_tmp_carry    : std_logic;\r
+signal reg_tmp_ovf      : std_logic;\r
+signal reg_tmp_condition    : std_logic;\r
+signal reg_tmp_pg_crossed   : std_logic;\r
+\r
+--tmp address reg.\r
+signal reg_tmp_l    : std_logic_vector (7 downto 0);\r
+signal reg_tmp_h    : std_logic_vector (7 downto 0);\r
+\r
+--tmp data reg.\r
+signal reg_tmp_data : std_logic_vector (7 downto 0);\r
+\r
 --bus i/o reg.\r
-signal reg_r_nw     : std_logic;\r
+signal reg_oe_n     : std_logic;\r
+signal reg_we_n     : std_logic;\r
 signal reg_addr     : std_logic_vector (15 downto 0);\r
 signal reg_d_in     : std_logic_vector (7 downto 0);\r
 signal reg_d_out    : std_logic_vector (7 downto 0);\r
 \r
+signal reg_nmi_handled  : integer range 0 to 1;\r
+signal reg_dma_set      : integer range 0 to 1;\r
+\r
+--debug purpose...\r
+signal reg_exc_cnt          : std_logic_vector (63 downto 0);\r
+\r
+--constant INIT_ACC       : std_logic_vector (7 downto 0) := "00000000";\r
+--constant INIT_X         : std_logic_vector (7 downto 0) := "00000000";\r
+--constant INIT_Y         : std_logic_vector (7 downto 0) := "00000000";\r
+--constant INIT_SP        : std_logic_vector (7 downto 0) := "00000000";\r
+--constant INIT_STATUS    : std_logic_vector (7 downto 0) := "00100000";\r
+--constant INIT_PCL       : std_logic_vector (7 downto 0) := "00000000";\r
+--constant INIT_PCH       : std_logic_vector (7 downto 0) := "00000000";\r
+\r
+constant INIT_ACC       : std_logic_vector (7 downto 0) := conv_std_logic_vector(16#95#, 8);\r
+constant INIT_X         : std_logic_vector (7 downto 0) := conv_std_logic_vector(16#0d#, 8);\r
+constant INIT_Y         : std_logic_vector (7 downto 0) := conv_std_logic_vector(16#1d#, 8);\r
+constant INIT_SP        : std_logic_vector (7 downto 0) := conv_std_logic_vector(16#fc#, 8);\r
+constant INIT_STATUS    : std_logic_vector (7 downto 0) := conv_std_logic_vector(16#a5#, 8);\r
+constant INIT_PCL       : std_logic_vector (7 downto 0) := conv_std_logic_vector(16#82#, 8);\r
+constant INIT_PCH       : std_logic_vector (7 downto 0) := conv_std_logic_vector(16#80#, 8);\r
+constant INIT_EXC_CNT   : std_logic_vector (63 downto 0) := conv_std_logic_vector(16#02bd#, 16) & conv_std_logic_vector(0, 48);\r
+\r
+constant DEBUG_SW       : integer := 0;\r
 \r
 begin\r
     --state transition process...\r
     set_stat_p : process (pi_rst_n, pi_base_clk)\r
     begin\r
         if (pi_rst_n = '0') then\r
-            reg_main_state <= ST_IDLE;\r
+            if (DEBUG_SW = 0) then\r
+                reg_main_state <= ST_RS_T0;\r
+            else\r
+                --for test....\r
+                reg_main_state <= ST_CM_T0;\r
+            end if;\r
             reg_sub_state <= ST_SUB00;\r
         elsif (rising_edge(pi_base_clk)) then\r
             reg_main_state <= reg_main_next_state;\r
@@ -212,7 +275,7 @@ begin
         end if;--if (pi_rst_n = '0') then\r
     end process;\r
 \r
-    --state change to next.\r
+    --fixed length sub status change (0 - 31 because cpu clock is 1/32 of base clock).\r
     tx_next_sub_stat_p : process (reg_sub_state, pi_cpu_en)\r
     begin\r
         case reg_sub_state is\r
@@ -288,21 +351,36 @@ begin
     end process;\r
 \r
     --state change to next.\r
-    tx_next_main_stat_p : process (reg_main_state, reg_sub_state, pi_rst_n)\r
+    tx_next_main_stat_p : process (pi_rst_n, reg_main_state, reg_sub_state,\r
+                                   reg_inst, reg_tmp_condition, reg_tmp_pg_crossed,\r
+                                   pi_nmi_n, reg_nmi_handled, reg_dma_set, pi_rdy)\r
 \r
     begin\r
         case reg_main_state is\r
             -----idle...\r
             when ST_IDLE =>\r
                 if (pi_rst_n = '0') then\r
-                    reg_main_next_state <= reg_main_state;\r
+                    if (DEBUG_SW = 0) then\r
+                        reg_main_next_state <= ST_RS_T0;\r
+                    else\r
+                        --for test....\r
+                        reg_main_next_state <= ST_CM_T0;\r
+                    end if;\r
+                elsif (reg_sub_state = ST_SUB73 and reg_dma_set = 1 and pi_rdy = '1') then\r
+                    --ST_CM_T0 is canceled when dma initiated.\r
+                    --redo ST_CM_T0.\r
+                    reg_main_next_state <= ST_CM_T0;\r
                 else\r
-                    reg_main_next_state <= ST_RS_T0;\r
+                    reg_main_next_state <= reg_main_state;\r
                 end if;\r
             -----reset...\r
             when ST_RS_T0 =>\r
                 if (reg_sub_state = ST_SUB73) then\r
-                    reg_main_next_state <= ST_RS_T1;\r
+                    if (pi_rst_n = '0') then\r
+                        reg_main_next_state <= reg_main_state;\r
+                    else\r
+                        reg_main_next_state <= ST_RS_T1;\r
+                    end if;\r
                 else\r
                     reg_main_next_state <= reg_main_state;\r
                 end if;\r
@@ -352,8 +430,17 @@ begin
             --instruction fetch\r
             when ST_CM_T0 =>\r
                 if (reg_sub_state = ST_SUB73) then\r
-                    ---instruction decode next state.\r
-                    reg_main_next_state <= inst_decode_rom(conv_integer(reg_inst));\r
+                    if (pi_nmi_n = '0' and reg_nmi_handled = 0) then\r
+                        --nmi raised. transit to nmi state.\r
+                        reg_main_next_state <= ST_NM_T1;\r
+                    elsif (pi_rdy = '0') then\r
+                        --dma started.\r
+                        reg_main_next_state <= ST_IDLE;\r
+                    else\r
+                        ---instruction decode next state.\r
+                        ---pc inc is executed at the end of the cycle (ST_SUB73).\r
+                        reg_main_next_state <= inst_decode_rom(conv_integer(reg_inst));\r
+                    end if;\r
                 else\r
                     reg_main_next_state <= reg_main_state;\r
                 end if;\r
@@ -447,7 +534,12 @@ begin
                 end if;\r
             when ST_A25_T3 =>\r
                 if (reg_sub_state = ST_SUB73) then\r
-                    reg_main_next_state <= ST_A25_T4;\r
+                    --abs xy move to next only when page crossed.\r
+                    if (reg_tmp_pg_crossed = '1') then\r
+                        reg_main_next_state <= ST_A25_T4;\r
+                    else\r
+                        reg_main_next_state <= ST_CM_T0;\r
+                    end if;\r
                 else\r
                     reg_main_next_state <= reg_main_state;\r
                 end if;\r
@@ -495,7 +587,12 @@ begin
                 end if;\r
             when ST_A27_T4 =>\r
                 if (reg_sub_state = ST_SUB73) then\r
-                    reg_main_next_state <= ST_A27_T5;\r
+                    --indir, y move to next only when page crossed.\r
+                    if (reg_tmp_pg_crossed = '1') then\r
+                        reg_main_next_state <= ST_A27_T5;\r
+                    else\r
+                        reg_main_next_state <= ST_CM_T0;\r
+                    end if;\r
                 else\r
                     reg_main_next_state <= reg_main_state;\r
                 end if;\r
@@ -704,7 +801,7 @@ begin
                 end if;\r
             when ST_A43_T2 =>\r
                 if (reg_sub_state = ST_SUB73) then\r
-                    reg_main_next_state <= ST_CM_T0;\r
+                    reg_main_next_state <= ST_A43_T3;\r
                 else\r
                     reg_main_next_state <= reg_main_state;\r
                 end if;\r
@@ -923,13 +1020,25 @@ begin
                 end if;\r
             when ST_A58_T1 =>\r
                 if (reg_sub_state = ST_SUB73) then\r
-                    reg_main_next_state <= ST_A58_T2;\r
+                    if (reg_tmp_condition = '1') then\r
+                        --condition met. move to branch state.\r
+                        reg_main_next_state <= ST_A58_T2;\r
+                    else\r
+                        --condition not met. goto next inst fetch.\r
+                        reg_main_next_state <= ST_CM_T0;\r
+                    end if;\r
                 else\r
                     reg_main_next_state <= reg_main_state;\r
                 end if;\r
             when ST_A58_T2 =>\r
                 if (reg_sub_state = ST_SUB73) then\r
-                    reg_main_next_state <= ST_A58_T3;\r
+                    if (reg_tmp_pg_crossed = '1') then\r
+                        --page crossed. move to next.\r
+                        reg_main_next_state <= ST_A58_T3;\r
+                    else\r
+                        --page not crossed. move to next inst fetch.\r
+                        reg_main_next_state <= ST_CM_T0;\r
+                    end if;\r
                 else\r
                     reg_main_next_state <= reg_main_state;\r
                 end if;\r
@@ -940,19 +1049,73 @@ begin
                     reg_main_next_state <= reg_main_state;\r
                 end if;\r
 \r
+            -----nmi...\r
+            when ST_NM_T1 =>\r
+                if (reg_sub_state = ST_SUB73) then\r
+                    reg_main_next_state <= ST_NM_T2;\r
+                else\r
+                    reg_main_next_state <= reg_main_state;\r
+                end if;\r
+            when ST_NM_T2 =>\r
+                if (reg_sub_state = ST_SUB73) then\r
+                    reg_main_next_state <= ST_NM_T3;\r
+                else\r
+                    reg_main_next_state <= reg_main_state;\r
+                end if;\r
+            when ST_NM_T3 =>\r
+                if (reg_sub_state = ST_SUB73) then\r
+                    reg_main_next_state <= ST_NM_T4;\r
+                else\r
+                    reg_main_next_state <= reg_main_state;\r
+                end if;\r
+            when ST_NM_T4 =>\r
+                if (reg_sub_state = ST_SUB73) then\r
+                    reg_main_next_state <= ST_NM_T5;\r
+                else\r
+                    reg_main_next_state <= reg_main_state;\r
+                end if;\r
+            when ST_NM_T5 =>\r
+                if (reg_sub_state = ST_SUB73) then\r
+                    reg_main_next_state <= ST_NM_T6;\r
+                else\r
+                    reg_main_next_state <= reg_main_state;\r
+                end if;\r
+            when ST_NM_T6 =>\r
+                if (reg_sub_state = ST_SUB73) then\r
+                    reg_main_next_state <= ST_NM_T7;\r
+                else\r
+                    reg_main_next_state <= reg_main_state;\r
+                end if;\r
+            when ST_NM_T7 =>\r
+                if (reg_sub_state = ST_SUB73) then\r
+                    reg_main_next_state <= ST_CM_T0;\r
+                else\r
+                    reg_main_next_state <= reg_main_state;\r
+                end if;\r
+\r
+            --invalid state\r
             when ST_INV =>\r
                 ---failed to decode next...\r
                     reg_main_next_state <= reg_main_state;\r
---            ---not ready yet...\r
+\r
 --            when others =>\r
 --                reg_main_next_state <= reg_main_state;\r
         end case;\r
     end process;\r
 \r
+\r
+    po_oe_n     <= reg_oe_n;\r
+    po_we_n     <= reg_we_n;\r
+    po_addr     <= reg_addr;\r
+    pio_d_io    <= reg_d_out;\r
+\r
     --addressing general process...\r
     --pc, io bus, r/w, instruction regs...\r
     ad_general_p : process (pi_rst_n, pi_base_clk)\r
 \r
+    --address calcuratin w/ carry.\r
+    variable calc_adl   : std_logic_vector(8 downto 0);\r
+\r
 procedure pc_inc is\r
 begin\r
     if (reg_pc_l = "11111111") then\r
@@ -964,62 +1127,106 @@ begin
     end if;\r
 end;\r
 \r
+procedure write_enable is\r
+begin\r
+    reg_oe_n    <= '1';\r
+    if (reg_sub_state = ST_SUB32 or\r
+        reg_sub_state = ST_SUB33 or\r
+        reg_sub_state = ST_SUB40 or\r
+        reg_sub_state = ST_SUB41\r
+        ) then\r
+        reg_we_n    <= '0';\r
+    else\r
+        reg_we_n    <= '1';\r
+    end if;\r
+end;\r
+\r
     begin\r
         if (pi_rst_n = '0') then\r
-            reg_pc_l    <= (others => '0');\r
-            reg_pc_h    <= (others => '0');\r
+            reg_pc_l    <= INIT_PCL;\r
+            reg_pc_h    <= INIT_PCH;\r
             reg_inst    <= (others => '0');\r
             reg_addr    <= (others => 'Z');\r
             reg_d_out   <= (others => 'Z');\r
-            reg_r_nw    <= 'Z';\r
+            reg_d_in    <= (others => '0');\r
+            reg_oe_n    <= 'Z';\r
+            reg_we_n    <= 'Z';\r
+            reg_tmp_pg_crossed  <= '0';\r
+            calc_adl    := (others => '0');\r
         elsif (rising_edge(pi_base_clk)) then\r
+\r
+            --general input data register.\r
+            reg_d_in    <= pio_d_io;\r
+            \r
+            --reset vector\r
             if (reg_main_state = ST_RS_T0) then\r
                 reg_pc_l    <= (others => '0');\r
                 reg_pc_h    <= (others => '0');\r
                 reg_inst    <= (others => '0');\r
                 reg_addr    <= (others => '0');\r
                 reg_d_out   <= (others => 'Z');\r
-                reg_r_nw    <= '1';\r
+                reg_oe_n    <= '1';\r
+                reg_we_n    <= '1';\r
             elsif (reg_main_state = ST_RS_T3) then\r
                 --dummy sp out 1.\r
-                reg_addr    <= "11111111" & reg_sp;\r
-                reg_d_out   <= (others => 'Z');\r
-                reg_r_nw    <= '0';\r
+                reg_addr    <= "00000001" & reg_sp;\r
+                reg_d_out   <= (others => '0');\r
+                write_enable;\r
             elsif (reg_main_state = ST_RS_T4) then\r
                 --dummy sp out 2.\r
-                reg_addr    <= "11111111" & (reg_sp - 1);\r
-                reg_d_out   <= (others => 'Z');\r
-                reg_r_nw    <= '0';\r
+                reg_addr    <= "00000001" & (reg_sp - 1);\r
+                reg_d_out   <= (others => '0');\r
+                write_enable;\r
             elsif (reg_main_state = ST_RS_T5) then\r
                 --dummy sp out 3.\r
-                reg_addr    <= "11111111" & (reg_sp - 2);\r
-                reg_d_out   <= (others => 'Z');\r
-                reg_r_nw    <= '0';\r
+                reg_addr    <= "00000001" & (reg_sp - 2);\r
+                reg_d_out   <= (others => '0');\r
+                write_enable;\r
             elsif (reg_main_state = ST_RS_T6) then\r
                 --reset vector low...\r
                 reg_addr    <= "1111111111111100";\r
                 reg_d_out   <= (others => 'Z');\r
-                reg_r_nw    <= '1';\r
+                reg_oe_n    <= '0';\r
+                reg_we_n    <= '1';\r
                 reg_pc_l    <= reg_d_in;\r
             elsif (reg_main_state = ST_RS_T7) then\r
                 --reset vector high...\r
                 reg_addr    <= "1111111111111101";\r
-                reg_d_out   <= (others => 'Z');\r
-                reg_r_nw    <= '1';\r
                 reg_pc_h    <= reg_d_in;\r
+\r
+            --common entry cycle.\r
             elsif (reg_main_state = ST_CM_T0) then\r
-                if (reg_sub_state = ST_SUB00) then\r
-                    --fetch next.\r
-                    reg_addr    <= reg_pc_h & reg_pc_l;\r
-                    reg_d_out   <= (others => 'Z');\r
-                    reg_r_nw    <= '1';\r
-                elsif (reg_sub_state = ST_SUB30) then\r
-                    --update instruction register.\r
-                    reg_inst    <= reg_d_in;\r
-                elsif (reg_sub_state = ST_SUB70) then\r
-                    --pc move next.\r
-                    pc_inc;\r
+                --init flags.\r
+                reg_tmp_pg_crossed <= '0';\r
+                calc_adl    := (others => '0');\r
+                reg_d_out   <= (others => 'Z');\r
+\r
+                if (pi_nmi_n = '0' and reg_nmi_handled = 0) then\r
+                    --nmi raised cycle.\r
+                    reg_oe_n    <= '1';\r
+                    reg_we_n    <= '1';\r
+                    reg_addr    <= (others => 'Z');\r
+                elsif (pi_rdy = '0') then\r
+                    --dma started cycle.\r
+                    reg_oe_n    <= 'Z';\r
+                    reg_we_n    <= 'Z';\r
+                    reg_addr    <= (others => 'Z');\r
+                else\r
+                    --normal cycle.\r
+                    reg_oe_n    <= '0';\r
+                    reg_we_n    <= '1';\r
+                    if (reg_sub_state = ST_SUB00) then\r
+                        --fetch next.\r
+                        reg_addr    <= reg_pc_h & reg_pc_l;\r
+                    elsif (reg_sub_state = ST_SUB30) then\r
+                        --update instruction register.\r
+                        reg_inst    <= reg_d_in;\r
+                    elsif (reg_sub_state = ST_SUB73) then\r
+                        --pc move next.\r
+                        pc_inc;\r
+                    end if;\r
                 end if;\r
+\r
             --fetch and move next case.\r
             elsif (reg_main_state = ST_A21_T1 or\r
                 reg_main_state = ST_A22_T1 or\r
@@ -1045,6 +1252,7 @@ end;
                 reg_main_state = ST_A44_T1 or\r
                 reg_main_state = ST_A44_T2 or\r
                 reg_main_state = ST_A53_T1 or\r
+                reg_main_state = ST_A55_T1 or\r
                 reg_main_state = ST_A561_T1 or\r
                 reg_main_state = ST_A562_T1 or\r
                 reg_main_state = ST_A562_T2 or\r
@@ -1053,95 +1261,487 @@ end;
                 if (reg_sub_state = ST_SUB00) then\r
                     --fetch next.\r
                     reg_addr    <= reg_pc_h & reg_pc_l;\r
-                    reg_d_out   <= (others => 'Z');\r
-                    reg_r_nw    <= '1';\r
                 elsif (reg_sub_state = ST_SUB70) then\r
                     --pc move next.\r
                     pc_inc;\r
                 end if;\r
 \r
-           --jsr.\r
-            elsif (reg_main_state = ST_A53_T2) then\r
-                --sp out (discarded.)\r
+            --intermediate cycles..\r
+            elsif (reg_main_state = ST_A24_T2 or\r
+                reg_main_state = ST_A26_T2 or\r
+                reg_main_state = ST_A33_T2 or\r
+                reg_main_state = ST_A35_T2 or\r
+                reg_main_state = ST_A27_T2 or\r
+                reg_main_state = ST_A36_T2 or\r
+                reg_main_state = ST_A43_T2\r
+                ) then\r
+                --zp xy\r
+                --ind, x\r
+                -->>discarded cycle.\r
+                --ind, y\r
+                --ial cycle.\r
+                reg_addr    <= "00000000" & reg_idl_l;\r
+            elsif (reg_main_state = ST_A24_T3 or\r
+                reg_main_state = ST_A33_T3\r
+                ) then\r
+                --ind, x\r
+                --bal + x cycle.\r
+                reg_addr    <= "00000000" & (reg_idl_l + reg_x);\r
+            elsif (reg_main_state = ST_A24_T4 or\r
+                reg_main_state = ST_A33_T4) then\r
+                --ind, x\r
+                --bal + x + 1 cycle.\r
+                reg_addr    <= "00000000" & (reg_idl_l + reg_x + 1);\r
+            elsif (reg_main_state = ST_A25_T3 or\r
+                reg_main_state = ST_A34_T3 or\r
+                reg_main_state = ST_A44_T3\r
+                ) then\r
+                --abs xy\r
+                --(discarded cycle for store inst..)\r
+                if (reg_inst = conv_std_logic_vector(16#be#, 8)) then\r
+                    --abs y\r
+                    --ldx\r
+                    reg_addr    <= reg_idl_h & (reg_idl_l + reg_y);\r
+                    calc_adl    := ("0" & reg_idl_l) + ("0" & reg_y);\r
+                elsif (reg_inst = conv_std_logic_vector(16#bc#, 8)) then\r
+                    --abs x\r
+                    --ldy\r
+                    reg_addr    <= reg_idl_h & (reg_idl_l + reg_x);\r
+                    calc_adl    := ("0" & reg_idl_l) + ("0" & reg_x);\r
+                elsif (reg_inst = conv_std_logic_vector(16#9d#, 8)) then\r
+                    --sta, x\r
+                    reg_addr    <= reg_idl_h & (reg_idl_l + reg_x);\r
+                    calc_adl    := ("0" & reg_idl_l) + ("0" & reg_x);\r
+                elsif (reg_inst = conv_std_logic_vector(16#99#, 8)) then\r
+                    --sta, y\r
+                    reg_addr    <= reg_idl_h & (reg_idl_l + reg_y);\r
+                    calc_adl    := ("0" & reg_idl_l) + ("0" & reg_y);\r
+                elsif (reg_inst(1 downto 0) = "10") then\r
+                    --a4 inst.\r
+                    if (reg_inst(4 downto 2) = "111") then\r
+                        --abs x\r
+                        reg_addr    <= reg_idl_h & (reg_idl_l + reg_x);\r
+                        calc_adl    := ("0" & reg_idl_l) + ("0" & reg_x);\r
+                    end if; \r
+                elsif (reg_inst(1 downto 0) = "01") then\r
+                    --a2 inst\r
+                    if (reg_inst(4 downto 2) = "110") then\r
+                        --abs y\r
+                        reg_addr    <= reg_idl_h & (reg_idl_l + reg_y);\r
+                        calc_adl    := ("0" & reg_idl_l) + ("0" & reg_y);\r
+                    elsif (reg_inst(4 downto 2) = "111") then\r
+                        --abs x\r
+                        reg_addr    <= reg_idl_h & (reg_idl_l + reg_x);\r
+                        calc_adl    := ("0" & reg_idl_l) + ("0" & reg_x);\r
+                    end if; \r
+                end if;\r
+\r
+                reg_tmp_pg_crossed <= calc_adl(8);\r
+            elsif (reg_main_state = ST_A27_T3 or\r
+                reg_main_state = ST_A36_T3) then\r
+                --ind, y\r
+                --ial + 1 cycle.\r
+                reg_addr    <= "00000000" & (reg_idl_l + 1);\r
+            elsif (reg_main_state = ST_A27_T4 or\r
+                reg_main_state = ST_A36_T4) then\r
+                --ind, y\r
+                --bal + y cycle.\r
+                reg_addr    <= reg_tmp_h & (reg_tmp_l + reg_y);\r
+                calc_adl    := ("0" & reg_tmp_l) + ("0" & reg_y);\r
+                reg_tmp_pg_crossed <= calc_adl(8);\r
+            elsif (reg_main_state = ST_A51_T1 or\r
+                reg_main_state = ST_A52_T1) then\r
+                --push/pull\r
+                --discard pc cycle.\r
+                reg_addr    <= reg_pc_h & (reg_pc_l + 1);\r
+            elsif (reg_main_state = ST_A52_T2 or\r
+                reg_main_state = ST_A53_T2\r
+                ) then\r
+                --pull, jsr\r
+                --discard sp cycle.\r
                 reg_addr    <= "00000001" & reg_sp;\r
-                reg_d_out   <= (others => 'Z');\r
-                reg_r_nw    <= '1';\r
+\r
+\r
+           --a2 instructions.\r
+            elsif (reg_main_state = ST_A22_T2 or\r
+                reg_main_state = ST_A23_T3 or\r
+                reg_main_state = ST_A24_T5 or\r
+                reg_main_state = ST_A25_T4 or\r
+                reg_main_state = ST_A26_T3 or\r
+                reg_main_state = ST_A27_T5\r
+            ) then\r
+                --execute cycle.\r
+\r
+                --address bus out.\r
+                if (reg_main_state = ST_A22_T2) then\r
+                    --zp\r
+                    reg_addr    <= "00000000" & reg_idl_l;\r
+\r
+                elsif (reg_main_state = ST_A23_T3) then\r
+                    --abs\r
+                    reg_addr    <= reg_idl_h & reg_idl_l;\r
+\r
+                elsif (reg_main_state = ST_A24_T5) then\r
+                    --ind, x\r
+                    reg_addr    <= reg_tmp_h & reg_tmp_l;\r
+\r
+                elsif (reg_main_state = ST_A25_T4) then\r
+                    --abs xy\r
+                    if (reg_inst(1 downto 0) = "01") then\r
+                        if (reg_inst(4 downto 2) = "110") then\r
+                            --abs y\r
+                            reg_addr    <= (reg_idl_h + reg_tmp_pg_crossed) & (reg_idl_l + reg_y);\r
+                        elsif (reg_inst(4 downto 2) = "111") then\r
+                            --abs x\r
+                            reg_addr    <= (reg_idl_h + reg_tmp_pg_crossed) & (reg_idl_l + reg_x);\r
+                        end if; \r
+                    elsif (reg_inst = conv_std_logic_vector(16#be#, 8)) then\r
+                        --abs y\r
+                        --ldx\r
+                        reg_addr    <= (reg_idl_h + reg_tmp_pg_crossed) & (reg_idl_l + reg_y);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#bc#, 8)) then\r
+                        --abs x\r
+                        --ldy\r
+                        reg_addr    <= (reg_idl_h + reg_tmp_pg_crossed) & (reg_idl_l + reg_x);\r
+                    end if; \r
+\r
+                elsif (reg_main_state = ST_A26_T3) then\r
+                    --zp xy\r
+                    if (reg_inst(1 downto 0) = "01") then\r
+                        if (reg_inst(4 downto 2) = "101") then\r
+                            --zp x\r
+                            reg_addr    <= "00000000" & (reg_idl_l + reg_x);\r
+                        end if; \r
+                    elsif (reg_inst = conv_std_logic_vector(16#b6#, 8)) then\r
+                        --zp y\r
+                        --ldx\r
+                        reg_addr    <= "00000000" & (reg_idl_l + reg_y);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#b4#, 8)) then\r
+                        --zp y\r
+                        --ldy\r
+                        reg_addr    <= "00000000" & (reg_idl_l + reg_x);\r
+                    end if; \r
+\r
+                elsif (reg_main_state = ST_A27_T5) then\r
+                    --ind y\r
+                    reg_addr    <= (reg_tmp_h + reg_tmp_pg_crossed) & (reg_tmp_l + reg_y);\r
+                end if;\r
+\r
+           --a3 instructions.\r
+           --sta, stx, sty\r
+            elsif (reg_main_state = ST_A31_T2 or\r
+                reg_main_state = ST_A32_T3 or\r
+                reg_main_state = ST_A33_T5 or\r
+                reg_main_state = ST_A34_T4 or\r
+                reg_main_state = ST_A35_T3 or\r
+                reg_main_state = ST_A36_T5\r
+            ) then\r
+                --store cycle.\r
+                --data out\r
+                if (reg_inst(1 downto 0) = "01" and reg_inst(7 downto 5) = "100") then\r
+                    --sta\r
+                    reg_d_out   <= reg_acc;\r
+                elsif (reg_inst(1 downto 0) = "10" and reg_inst(7 downto 5) = "100") then\r
+                    --stx\r
+                    reg_d_out   <= reg_x;\r
+                elsif (reg_inst(1 downto 0) = "00" and reg_inst(7 downto 5) = "100") then\r
+                    --sty\r
+                    reg_d_out   <= reg_y;\r
+                end if;\r
+\r
+                --rw ctrl\r
+                write_enable;\r
+\r
+                --address bus out.\r
+                if (reg_main_state = ST_A31_T2) then\r
+                    --zp\r
+                    reg_addr    <= "00000000" & reg_idl_l;\r
+\r
+                elsif (reg_main_state = ST_A32_T3) then\r
+                    --abs\r
+                    reg_addr    <= reg_idl_h & reg_idl_l;\r
+\r
+                elsif (reg_main_state = ST_A33_T5) then\r
+                    --ind, x\r
+                    reg_addr    <= reg_tmp_h & reg_tmp_l;\r
+\r
+                elsif (reg_main_state = ST_A34_T4) then\r
+                    --abs xy\r
+                    if (reg_inst = conv_std_logic_vector(16#9d#, 8)) then\r
+                        --sta, x\r
+                        reg_addr    <= (reg_idl_h + reg_tmp_pg_crossed) & (reg_idl_l + reg_x);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#99#, 8)) then\r
+                        --sta, y\r
+                        reg_addr    <= (reg_idl_h + reg_tmp_pg_crossed) & (reg_idl_l + reg_y);\r
+                    end if;\r
+\r
+                elsif (reg_main_state = ST_A35_T3) then\r
+                    --zp xy\r
+                    --sta and sty has index x access,\r
+                    --stx has index y access.\r
+                    if (reg_inst = conv_std_logic_vector(16#95#, 8) or --sta\r
+                        reg_inst = conv_std_logic_vector(16#94#, 8) --sty\r
+                    ) then\r
+                        reg_addr    <= "00000000" & (reg_idl_l + reg_x);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#96#, 8)) then\r
+                        --stx\r
+                        reg_addr    <= "00000000" & (reg_idl_l + reg_y);\r
+                    end if;\r
+\r
+                elsif (reg_main_state = ST_A36_T5) then\r
+                    --ind y\r
+                    reg_addr    <= (reg_tmp_h + reg_tmp_pg_crossed) & (reg_tmp_l + reg_y);\r
+                end if;\r
+\r
+           --a4 instructions.\r
+           --asl    lsr\r
+           --dec    rol\r
+           --inc    ror\r
+            elsif (reg_main_state = ST_A41_T2 or\r
+                reg_main_state = ST_A42_T3 or\r
+                reg_main_state = ST_A43_T3 or\r
+                reg_main_state = ST_A44_T4\r
+            ) then\r
+                --data fetch cycle.\r
+\r
+                --address bus out.\r
+                if (reg_main_state = ST_A41_T2) then\r
+                    --zp\r
+                    reg_addr    <= "00000000" & reg_idl_l;\r
+\r
+                elsif (reg_main_state = ST_A42_T3) then\r
+                    --abs\r
+                    reg_addr    <= reg_idl_h & reg_idl_l;\r
+\r
+                elsif (reg_main_state = ST_A43_T3) then\r
+                    --zp x\r
+                    reg_addr    <= "00000000" & (reg_idl_l + reg_x);\r
+\r
+                elsif (reg_main_state = ST_A44_T4) then\r
+                    --abs x\r
+                    reg_addr    <= (reg_idl_h + reg_tmp_pg_crossed) & (reg_idl_l + reg_x);\r
+                end if;\r
+\r
+            elsif (reg_main_state = ST_A41_T3 or\r
+                reg_main_state = ST_A41_T4 or\r
+                reg_main_state = ST_A42_T4 or\r
+                reg_main_state = ST_A42_T5 or\r
+                reg_main_state = ST_A43_T4 or\r
+                reg_main_state = ST_A43_T5 or\r
+                reg_main_state = ST_A44_T5 or\r
+                reg_main_state = ST_A44_T6\r
+            ) then\r
+                --data store cycle.\r
+                --data out\r
+                reg_d_out   <= reg_tmp_data;\r
+                write_enable;\r
+\r
+                --address bus out.\r
+                if (reg_main_state = ST_A41_T3 or\r
+                    reg_main_state = ST_A41_T4\r
+                    ) then\r
+                    --zp\r
+                    reg_addr    <= "00000000" & reg_idl_l;\r
+\r
+                elsif (reg_main_state = ST_A42_T4 or\r
+                    reg_main_state = ST_A42_T5\r
+                    ) then\r
+                    --abs\r
+                    reg_addr    <= reg_idl_h & reg_idl_l;\r
+\r
+                elsif (reg_main_state = ST_A43_T4 or\r
+                    reg_main_state = ST_A43_T5\r
+                    ) then\r
+                    --zp x\r
+                    reg_addr    <= "00000000" & (reg_idl_l + reg_x);\r
+\r
+                elsif (reg_main_state = ST_A44_T5 or\r
+                    reg_main_state = ST_A44_T6\r
+                    ) then\r
+                    --abs x\r
+                    reg_addr    <= (reg_idl_h + reg_tmp_pg_crossed) & (reg_idl_l + reg_x);\r
+                end if;\r
+\r
+            --a5 instruction...\r
+            --push\r
+            elsif (reg_main_state = ST_A51_T2) then\r
+                reg_addr    <= "00000001" & reg_sp;\r
+                if (reg_inst = conv_std_logic_vector(16#48#, 8)) then\r
+                    --pha\r
+                    reg_d_out   <= reg_acc;\r
+                elsif (reg_inst = conv_std_logic_vector(16#08#, 8)) then\r
+                    --php\r
+                    reg_d_out   <= reg_status;\r
+                end if;\r
+                write_enable;\r
+\r
+            --pull\r
+            elsif (reg_main_state = ST_A52_T3) then\r
+                reg_addr    <= "00000001" & reg_sp;\r
+\r
+            --jsr.\r
             elsif (reg_main_state = ST_A53_T3) then\r
                 --push pch\r
                 reg_addr    <= "00000001" & reg_sp;\r
                 reg_d_out   <= reg_pc_h;\r
-                if (reg_sub_state = ST_SUB32 or\r
-                    reg_sub_state = ST_SUB33 or\r
-                    reg_sub_state = ST_SUB40 or\r
-                    reg_sub_state = ST_SUB41\r
-                    ) then\r
-                    reg_r_nw    <= '0';\r
-                else\r
-                    reg_r_nw    <= 'Z';\r
-                end if;\r
+                write_enable;\r
             elsif (reg_main_state = ST_A53_T4) then\r
                 --push pcl\r
                 reg_addr    <= "00000001" & reg_sp;\r
                 reg_d_out   <= reg_pc_l;\r
-                if (reg_sub_state = ST_SUB32 or\r
-                    reg_sub_state = ST_SUB33 or\r
-                    reg_sub_state = ST_SUB40 or\r
-                    reg_sub_state = ST_SUB41\r
-                    ) then\r
-                    reg_r_nw    <= '0';\r
-                else\r
-                    reg_r_nw    <= 'Z';\r
-                end if;\r
+                write_enable;\r
             elsif (reg_main_state = ST_A53_T5) then\r
                 if (reg_sub_state = ST_SUB00) then\r
                     --fetch next.\r
                     reg_addr    <= reg_pc_h & reg_pc_l;\r
                     reg_d_out   <= (others => 'Z');\r
-                    reg_r_nw    <= '1';\r
+                    reg_oe_n    <= '0';\r
                 elsif (reg_sub_state = ST_SUB70) then\r
                     --go to sub-routine addr.\r
                     reg_pc_l    <= reg_idl_l;\r
                     reg_pc_h    <= reg_idl_h;\r
                 end if;\r
 \r
+           --jmp abs.\r
+            elsif (reg_main_state = ST_A561_T2) then\r
+                if (reg_sub_state = ST_SUB00) then\r
+                    --fetch next.\r
+                    reg_addr    <= reg_pc_h & reg_pc_l;\r
+                elsif (reg_sub_state = ST_SUB70) then\r
+                    reg_pc_l    <= reg_idl_l;\r
+                    reg_pc_h    <= reg_idl_h;\r
+                end if;\r
+\r
+           --jmp (indir).\r
+            elsif (reg_main_state = ST_A562_T3) then\r
+                if (reg_sub_state = ST_SUB00) then\r
+                    reg_addr    <= (reg_idl_h & reg_idl_l);\r
+                elsif (reg_sub_state = ST_SUB70) then\r
+                    reg_pc_l    <= reg_d_in;\r
+                end if;\r
+            elsif (reg_main_state = ST_A562_T4) then\r
+                if (reg_sub_state = ST_SUB00) then\r
+                    reg_addr    <= (reg_idl_h & reg_idl_l) + 1;\r
+                elsif (reg_sub_state = ST_SUB70) then\r
+                    reg_pc_h    <= reg_d_in;\r
+                end if;\r
+\r
            --rts.\r
             elsif (reg_main_state = ST_A57_T2) then\r
                 --sp out (discarded.)\r
                 reg_addr    <= "00000001" & reg_sp;\r
-                reg_d_out   <= (others => 'Z');\r
-                reg_r_nw    <= '1';\r
             elsif (reg_main_state = ST_A57_T3) then\r
                 --pull pcl\r
                 if (reg_sub_state = ST_SUB00) then\r
-                    reg_addr    <= "00000001" & reg_sp + 1;\r
-                    reg_d_out   <= (others => 'Z');\r
-                    reg_r_nw    <= '1';\r
+                    reg_addr    <= "00000001" & reg_sp;\r
                 elsif (reg_sub_state = ST_SUB70) then\r
                     reg_pc_l    <= reg_d_in;\r
                 end if;\r
             elsif (reg_main_state = ST_A57_T4) then\r
                 --pull pch\r
                 if (reg_sub_state = ST_SUB00) then\r
-                    reg_addr    <= "00000001" & reg_sp + 2;\r
-                    reg_d_out   <= (others => 'Z');\r
-                    reg_r_nw    <= '1';\r
+                    reg_addr    <= "00000001" & reg_sp;\r
                 elsif (reg_sub_state = ST_SUB70) then\r
                     reg_pc_h    <= reg_d_in;\r
                 end if;\r
             elsif (reg_main_state = ST_A57_T5) then\r
                 --pc out (discarded.)\r
-                reg_addr    <= reg_pc_h & reg_pc_l;\r
+                if (reg_sub_state = ST_SUB00) then\r
+                    reg_addr    <= reg_pc_h & reg_pc_l;\r
+                elsif (reg_sub_state = ST_SUB70) then\r
+                    pc_inc;\r
+                end if;\r
+\r
+            --conditional branch.\r
+            elsif (reg_main_state = ST_A58_T2) then\r
+                if (reg_sub_state = ST_SUB10) then\r
+                    calc_adl    := ("0" & reg_pc_l) + ("0" & reg_idl_l);\r
+                    --conditional branch is signed add.\r
+                    if ((reg_idl_l(7) xor calc_adl(8)) = '1') then\r
+                        reg_tmp_pg_crossed <= '1';\r
+                    else\r
+                        reg_tmp_pg_crossed <= '0';\r
+                    end if;\r
+\r
+                    reg_pc_l    <= calc_adl(7 downto 0);\r
+                    reg_addr    <= reg_pc_h & calc_adl(7 downto 0);\r
+                end if;\r
+\r
+            --page crossed.\r
+            elsif (reg_main_state = ST_A58_T3) then\r
+                if (reg_sub_state = ST_SUB10) then\r
+                    if (reg_idl_l(7) = '0') then\r
+                        --page crossig forward branch.\r
+                        reg_pc_h    <= reg_pc_h + "1";\r
+                        reg_addr    <= (reg_pc_h + "1") & reg_pc_l;\r
+                    else\r
+                        --page crossig backward branch.\r
+                        reg_pc_h    <= reg_pc_h - "1";\r
+                        reg_addr    <= (reg_pc_h - "1") & reg_pc_l;\r
+                    end if;\r
+                end if;\r
+\r
+            --nmi\r
+            elsif (reg_main_state = ST_NM_T1) then\r
+                reg_inst    <= (others => '0');\r
+                reg_addr    <= (others => '0');\r
                 reg_d_out   <= (others => 'Z');\r
-                reg_r_nw    <= '1';\r
+                reg_oe_n    <= '1';\r
+                reg_we_n    <= '1';\r
+            elsif (reg_main_state = ST_NM_T3) then\r
+                --push pch.\r
+                reg_addr    <= "00000001" & reg_sp;\r
+                reg_d_out   <= reg_pc_h;\r
+                write_enable;\r
+            elsif (reg_main_state = ST_NM_T4) then\r
+                --push pcl.\r
+                reg_addr    <= "00000001" & reg_sp;\r
+                reg_d_out   <= reg_pc_l;\r
+                write_enable;\r
+            elsif (reg_main_state = ST_NM_T5) then\r
+                --push status.\r
+                reg_addr    <= "00000001" & reg_sp;\r
+                reg_d_out   <= reg_status;\r
+                write_enable;\r
+            elsif (reg_main_state = ST_NM_T6) then\r
+                --vector low...\r
+                reg_addr    <= "1111111111111010";\r
+                reg_d_out   <= (others => 'Z');\r
+                reg_oe_n    <= '0';\r
+                reg_we_n    <= '1';\r
+                reg_pc_l    <= reg_d_in;\r
+            elsif (reg_main_state = ST_NM_T7) then\r
+                --vector high...\r
+                reg_addr    <= "1111111111111011";\r
+                reg_pc_h    <= reg_d_in;\r
+\r
+           --rti.\r
+            elsif (reg_main_state = ST_A55_T2) then\r
+                --sp out (discarded.)\r
+                reg_addr    <= "00000001" & reg_sp;\r
+            elsif (reg_main_state = ST_A55_T3) then\r
+                --pull status\r
+                reg_addr    <= "00000001" & reg_sp;\r
+            elsif (reg_main_state = ST_A55_T4) then\r
+                --pull pcl\r
+                if (reg_sub_state = ST_SUB00) then\r
+                    reg_addr    <= "00000001" & reg_sp;\r
+                elsif (reg_sub_state = ST_SUB70) then\r
+                    reg_pc_l    <= reg_d_in;\r
+                end if;\r
+            elsif (reg_main_state = ST_A55_T5) then\r
+                --pull pch\r
+                if (reg_sub_state = ST_SUB00) then\r
+                    reg_addr    <= "00000001" & reg_sp;\r
+                elsif (reg_sub_state = ST_SUB70) then\r
+                    reg_pc_h    <= reg_d_in;\r
+                end if;\r
+\r
+\r
             end if;--if (reg_main_state = ST_RS_T0) then\r
         end if;--if (pi_rst_n = '0') then\r
     end process;\r
 \r
-    po_r_nw     <= reg_r_nw;\r
-    po_addr     <= reg_addr;\r
-    pio_d_io    <= reg_d_out;\r
-    reg_d_in    <= pio_d_io;\r
-\r
     --internal data latch...\r
     --fetch first and second operand.\r
     idl_p : process (pi_rst_n, pi_base_clk)\r
@@ -1149,6 +1749,8 @@ end;
         if (pi_rst_n = '0') then\r
             reg_idl_l <= (others => '0');\r
             reg_idl_h <= (others => '0');\r
+            reg_tmp_l <= (others => '0');\r
+            reg_tmp_h <= (others => '0');\r
         elsif (rising_edge(pi_base_clk)) then\r
             if (reg_main_state = ST_A21_T1 or\r
                 reg_main_state = ST_A22_T1 or\r
@@ -1182,11 +1784,36 @@ end;
                 reg_main_state = ST_A42_T2 or\r
                 reg_main_state = ST_A44_T2 or\r
                 reg_main_state = ST_A53_T5 or\r
+                reg_main_state = ST_A561_T2 or\r
                 reg_main_state = ST_A562_T2) then\r
                 if (reg_sub_state = ST_SUB30) then\r
                     --get high data from rom.\r
                     reg_idl_h <= reg_d_in;\r
                 end if;\r
+            elsif (reg_main_state = ST_A24_T3 or\r
+                reg_main_state = ST_A27_T2 or\r
+                reg_main_state = ST_A33_T3 or\r
+                reg_main_state = ST_A36_T2\r
+                ) then\r
+                --a24 indr, x\r
+                --a27 indr, y\r
+                --a33 indr, x\r
+                --a36 indr, y\r
+                if (reg_sub_state = ST_SUB30) then\r
+                    reg_tmp_l <= reg_d_in;\r
+                end if;\r
+            elsif (reg_main_state = ST_A24_T4 or\r
+                reg_main_state = ST_A27_T3 or\r
+                reg_main_state = ST_A33_T4 or\r
+                reg_main_state = ST_A36_T3\r
+                ) then\r
+                --a24 indr, x\r
+                --a27 indr, y\r
+                --a33 indr, x\r
+                --a36 indr, y\r
+                if (reg_sub_state = ST_SUB30) then\r
+                    reg_tmp_h <= reg_d_in;\r
+                end if;\r
             end if;--if (reg_main_state = ST_RS_T0)\r
         end if;--if (pi_rst_n = '0') then\r
     end process;\r
@@ -1195,28 +1822,623 @@ end;
     sp_p : process (pi_rst_n, pi_base_clk)\r
     begin\r
         if (pi_rst_n = '0') then\r
-            reg_sp <= (others => '0');\r
+            reg_sp <= INIT_SP;\r
         elsif (rising_edge(pi_base_clk)) then\r
             if (reg_main_state = ST_A1_T1) then\r
                 --txs inst.\r
                 if (reg_inst = conv_std_logic_vector(16#9a#, 8)) then\r
-                    reg_sp <= reg_idl_l;\r
-                end if;\r
-            elsif (reg_main_state = ST_A53_T3 or\r
-                reg_main_state = ST_A53_T4) then\r
-                --jsr. push pch/pcl.\r
+                    reg_sp <= reg_x;\r
+                end if;\r
+            elsif (reg_main_state = ST_A51_T2 or\r
+                reg_main_state = ST_A53_T3 or\r
+                reg_main_state = ST_A53_T4 or\r
+                reg_main_state = ST_NM_T3 or\r
+                reg_main_state = ST_NM_T4 or\r
+                reg_main_state = ST_NM_T5\r
+                ) then\r
+                --push, jsr, nmi.\r
                 if (reg_sub_state = ST_SUB70) then\r
                     reg_sp <= reg_sp - 1;\r
                 end if;\r
---            elsif (reg_main_state = ST_A23_T2 or\r
---                reg_main_state = ST_A562_T2) then\r
---                --pull\r
---                if (reg_sub_state = ST_SUB30) then\r
---                    reg_sp <= (others => '0');\r
---                end if;\r
+            elsif (reg_main_state = ST_A52_T2 or\r
+                reg_main_state = ST_A55_T2 or\r
+                reg_main_state = ST_A55_T3 or\r
+                reg_main_state = ST_A55_T4 or\r
+                reg_main_state = ST_A57_T2 or\r
+                reg_main_state = ST_A57_T3) then\r
+                --pull, rts, rti.\r
+                if (reg_sub_state = ST_SUB70) then\r
+                    reg_sp <= reg_sp + 1;\r
+                end if;\r
             end if;--if (reg_main_state = ST_RS_T0)\r
         end if;--if (pi_rst_n = '0') then\r
     end process;\r
 \r
+    --calcuration process...\r
+    --update acc, x, y, status registers.\r
+    calc_p : process (pi_rst_n, pi_base_clk)\r
+\r
+    variable calc_res : std_logic_vector (8 downto 0);\r
+procedure update_status (\r
+    d       : in std_logic_vector(7 downto 0);\r
+    set_n   : in integer range 0 to 1;\r
+    set_z   : in integer range 0 to 1;\r
+    set_c   : in integer range 0 to 1\r
+) is\r
+begin\r
+    if (set_n = 1) then\r
+        if (d(7) = '1') then\r
+            reg_status(FL_N) <= '1';\r
+        else\r
+            reg_status(FL_N) <= '0';\r
+        end if;\r
+    end if;\r
+    if (set_z = 1) then\r
+        if (d = "00000000") then\r
+            reg_status(FL_Z) <= '1';\r
+        else\r
+            reg_status(FL_Z) <= '0';\r
+        end if;\r
+    end if;\r
+    if (set_c = 1) then\r
+        reg_status(FL_C) <= reg_tmp_carry;\r
+    end if;\r
+end;\r
+\r
+procedure set_condition_result (\r
+    flg   : in integer range 0 to 7;\r
+    chk_val : in std_logic\r
+) is\r
+begin\r
+    if (reg_status(flg) = chk_val) then\r
+        reg_tmp_condition <= '1';\r
+    else\r
+        reg_tmp_condition <= '0';\r
+    end if;\r
+end;\r
+\r
+    begin\r
+        --Most instructions that explicitly reference memory locations have bit patterns of the form aaabbbcc.\r
+        if (pi_rst_n = '0') then\r
+            reg_acc <= INIT_ACC;\r
+            reg_x <= INIT_X;\r
+            reg_y <= INIT_Y;\r
+            reg_status <= INIT_STATUS;\r
+            reg_tmp_carry <= '0';\r
+            reg_tmp_ovf <= '0';\r
+            reg_tmp_condition <= '0';\r
+        elsif (rising_edge(pi_base_clk)) then\r
+            --not used status pin initialize (to avoid latches).\r
+            reg_status(5 downto 3) <= "100";\r
+\r
+            --a1 instructions...\r
+            --asl   dex     nop     tax     tya\r
+            --clc   dey     rol     tay\r
+            --cld   inx     sec     tsx\r
+            --cli   iny     sed     txa\r
+            --clv   lsr     sei     txs\r
+            if (reg_main_state = ST_CM_T0) then\r
+                --init flag regs..\r
+                reg_tmp_carry <= '0';\r
+                reg_tmp_ovf <= '0';\r
+                reg_tmp_condition <= '0';\r
+            elsif (reg_main_state = ST_A1_T1) then\r
+                --update reg\r
+                if (reg_sub_state = ST_SUB30) then\r
+                    if (reg_inst = conv_std_logic_vector(16#88#, 8)) then\r
+                        --dey\r
+                        reg_y <= reg_y - 1;\r
+                    elsif (reg_inst = conv_std_logic_vector(16#a8#, 8)) then\r
+                        --tay\r
+                        reg_y <= reg_acc;\r
+                    elsif (reg_inst = conv_std_logic_vector(16#c8#, 8)) then\r
+                        --iny\r
+                        reg_y <= reg_y + 1;\r
+                    elsif (reg_inst = conv_std_logic_vector(16#e8#, 8)) then\r
+                        --inx\r
+                        reg_x <= reg_x + 1;\r
+                    elsif (reg_inst = conv_std_logic_vector(16#18#, 8)) then\r
+                        --clc\r
+                        reg_status(FL_C) <= '0';\r
+                    elsif (reg_inst = conv_std_logic_vector(16#38#, 8)) then\r
+                        --sec\r
+                        reg_status(FL_C) <= '1';\r
+                    elsif (reg_inst = conv_std_logic_vector(16#58#, 8)) then\r
+                        --cli\r
+                        reg_status(FL_I) <= '0';\r
+                    elsif (reg_inst = conv_std_logic_vector(16#78#, 8)) then\r
+                        --sei\r
+                        reg_status(FL_I) <= '1';\r
+                    elsif (reg_inst = conv_std_logic_vector(16#98#, 8)) then\r
+                        --tya\r
+                        reg_acc <= reg_y;\r
+                    elsif (reg_inst = conv_std_logic_vector(16#b8#, 8)) then\r
+                        --clv\r
+                        reg_status(FL_V) <= '0';\r
+                    elsif (reg_inst = conv_std_logic_vector(16#8a#, 8)) then\r
+                        --txa\r
+                        reg_acc <= reg_x;\r
+                    elsif (reg_inst = conv_std_logic_vector(16#aa#, 8)) then\r
+                        --tax\r
+                        reg_x <= reg_acc;\r
+                    elsif (reg_inst = conv_std_logic_vector(16#ba#, 8)) then\r
+                        --tsx\r
+                        reg_x <= reg_sp;\r
+                    elsif (reg_inst = conv_std_logic_vector(16#ca#, 8)) then\r
+                        --dex\r
+                        reg_x <= reg_x - 1;\r
+                    elsif (reg_inst = conv_std_logic_vector(16#ea#, 8)) then\r
+                        --nop\r
+                        --do nothing...\r
+                    --case cc=10\r
+                    elsif (reg_inst(1 downto 0) = "10") then\r
+                        if (reg_inst(7 downto 5) = "000") then\r
+                            --asl\r
+                            reg_acc <= reg_acc(6 downto 0) & "0";\r
+                            reg_tmp_carry <= reg_acc(7);\r
+                        elsif (reg_inst(7 downto 5) = "001") then\r
+                            --rol\r
+                            reg_acc <= reg_acc(6 downto 0) & reg_status(FL_C);\r
+                            reg_tmp_carry <= reg_acc(7);\r
+                        elsif (reg_inst(7 downto 5) = "010") then\r
+                            --lsr\r
+                            reg_acc <= "0" & reg_acc(7 downto 1);\r
+                            reg_tmp_carry <= reg_acc(0);\r
+                        elsif (reg_inst(7 downto 5) = "011") then\r
+                            --ror\r
+                            reg_acc <= reg_status(FL_C) & reg_acc(7 downto 1);\r
+                            reg_tmp_carry <= reg_acc(0);\r
+                        elsif (reg_inst(7 downto 5) = "110") then\r
+                            --dec\r
+                            reg_acc <= reg_acc - 1;\r
+                        elsif (reg_inst(7 downto 5) = "111") then\r
+                            --inc\r
+                            reg_acc <= reg_acc + 1;\r
+                        end if;\r
+                    end if;\r
+\r
+                --update status reg\r
+                elsif (reg_sub_state = ST_SUB31) then\r
+                    if (reg_inst = conv_std_logic_vector(16#88#, 8)) then\r
+                        --dey\r
+                        update_status(reg_y, 1, 1, 0);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#a8#, 8)) then\r
+                        --tay\r
+                        update_status(reg_y, 1, 1, 0);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#c8#, 8)) then\r
+                        --iny\r
+                        update_status(reg_y, 1, 1, 0);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#e8#, 8)) then\r
+                        --inx\r
+                        update_status(reg_x, 1, 1, 0);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#98#, 8)) then\r
+                        --tya\r
+                        update_status(reg_acc, 1, 1, 0);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#8a#, 8)) then\r
+                        --txa\r
+                        update_status(reg_acc, 1, 1, 0);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#9a#, 8)) then\r
+                        --txs\r
+                        update_status(reg_sp, 1, 1, 0);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#aa#, 8)) then\r
+                        --tax\r
+                        update_status(reg_x, 1, 1, 0);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#ba#, 8)) then\r
+                        --tsx\r
+                        update_status(reg_x, 1, 1, 0);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#ca#, 8)) then\r
+                        --dex\r
+                        update_status(reg_x, 1, 1, 0);\r
+                    elsif (reg_inst = conv_std_logic_vector(16#ea#, 8)) then\r
+                        --nop\r
+                        --do nothing...\r
+                    --case cc=10\r
+                    elsif (reg_inst(1 downto 0) = "10") then\r
+                        if (reg_inst(7 downto 5) = "000") then\r
+                            --asl\r
+                            update_status(reg_acc, 1, 1, 1);\r
+                        elsif (reg_inst(7 downto 5) = "001") then\r
+                            --rol\r
+                            update_status(reg_acc, 1, 1, 1);\r
+                        elsif (reg_inst(7 downto 5) = "010") then\r
+                            --lsr\r
+                            update_status(reg_acc, 0, 1, 1);\r
+                        elsif (reg_inst(7 downto 5) = "011") then\r
+                            --ror\r
+                            update_status(reg_acc, 1, 1, 1);\r
+                        elsif (reg_inst(7 downto 5) = "110") then\r
+                            --dec\r
+                            update_status(reg_acc, 1, 1, 0);\r
+                        elsif (reg_inst(7 downto 5) = "111") then\r
+                            --inc\r
+                            update_status(reg_acc, 1, 1, 0);\r
+                        end if;\r
+                    end if;\r
+                end if;--if (reg_sub_state = ST_SUB30) then\r
+\r
+            --a2 instructions...\r
+            --adc   cmp     eor     ldy\r
+            --and   cpx     lda     ora\r
+            --bit   cpy     ldx     sbc\r
+            elsif (reg_main_state = ST_A21_T1 or\r
+                reg_main_state = ST_A22_T2 or\r
+                reg_main_state = ST_A23_T3 or\r
+                reg_main_state = ST_A24_T5 or\r
+                reg_main_state = ST_A25_T3 or\r
+                reg_main_state = ST_A25_T4 or\r
+                reg_main_state = ST_A26_T3 or\r
+                reg_main_state = ST_A27_T4 or\r
+                reg_main_state = ST_A27_T5) then\r
+                \r
+                --update reg\r
+                if (reg_sub_state = ST_SUB30) then\r
+                    --case cc=01\r
+                    if (reg_inst(1 downto 0) = "01") then\r
+                        if (reg_inst(7 downto 5) = "000") then\r
+                            --ora\r
+                            reg_acc <= (reg_acc or reg_d_in);\r
+                        elsif (reg_inst(7 downto 5) = "001") then\r
+                            --and\r
+                            reg_acc <= (reg_acc and reg_d_in);\r
+                        elsif (reg_inst(7 downto 5) = "010") then\r
+                            --eor\r
+                            reg_acc <= (reg_acc xor reg_d_in);\r
+                        elsif (reg_inst(7 downto 5) = "011") then\r
+                            --adc\r
+                            calc_res := ("0" & reg_acc) + ("0" & reg_d_in) + reg_status(FL_C);\r
+                            reg_tmp_carry <= calc_res(8);\r
+                            if ((reg_acc(7) = reg_d_in(7)) and (reg_acc(7) /= calc_res(7))) then\r
+                                reg_tmp_ovf <= '1';\r
+                            else\r
+                                reg_tmp_ovf <= '0';\r
+                            end if;\r
+                            reg_acc <= calc_res(7 downto 0);\r
+                        elsif (reg_inst(7 downto 5) = "101") then\r
+                            --lda\r
+                            reg_acc <= reg_d_in;\r
+                        elsif (reg_inst(7 downto 5) = "110") then\r
+                            --cmp\r
+                            --do nothing.\r
+                        elsif (reg_inst(7 downto 5) = "111") then\r
+                            --sbc\r
+                            ---A - M - ~C -> A\r
+                            calc_res := ("0" & reg_acc) - ("0" & reg_d_in) - not reg_status(FL_C);\r
+\r
+                            --c Set if unsigned borrow not required; cleared if unsigned borrow.\r
+                            reg_tmp_carry <= not calc_res(8);\r
+                            --v Set if signed borrow required; cleared if no signed borrow.\r
+                            if ((reg_acc(7) /= reg_d_in(7)) and (reg_acc(7) /= calc_res(7))) then\r
+                                reg_tmp_ovf <= '1';\r
+                            else\r
+                                reg_tmp_ovf <= '0';\r
+                            end if;\r
+                            reg_acc <= calc_res(7 downto 0);\r
+                        end if;\r
+                    --case cc=10\r
+                    elsif (reg_inst(1 downto 0) = "10") then\r
+                        if (reg_inst(7 downto 5) = "101") then\r
+                            --ldx\r
+                            reg_x <= reg_d_in;\r
+                        end if;\r
+                    --case cc=00\r
+                    elsif (reg_inst(1 downto 0) = "00") then\r
+                        if (reg_inst(7 downto 5) = "001") then\r
+                            --bit\r
+                            --do nothing.\r
+                        elsif (reg_inst(7 downto 5) = "101") then\r
+                            --ldy\r
+                            reg_y <= reg_d_in;\r
+                        elsif (reg_inst(7 downto 5) = "110") then\r
+                            --cpy\r
+                            --do nothing.\r
+                        elsif (reg_inst(7 downto 5) = "111") then\r
+                            --cpx\r
+                            --do nothing.\r
+                        end if;\r
+                    end if;\r
+\r
+                --update status reg\r
+                elsif (reg_sub_state = ST_SUB31) then\r
+                    --case cc=01\r
+                    if (reg_inst(1 downto 0) = "01") then\r
+                        if (reg_inst(7 downto 5) = "000") then\r
+                            --ora\r
+                            update_status(reg_acc, 1, 1, 0);\r
+                        elsif (reg_inst(7 downto 5) = "001") then\r
+                            --and\r
+                            update_status(reg_acc, 1, 1, 0);\r
+                        elsif (reg_inst(7 downto 5) = "010") then\r
+                            --eor\r
+                            update_status(reg_acc, 1, 1, 0);\r
+                        elsif (reg_inst(7 downto 5) = "011") then\r
+                            --adc\r
+                            update_status(reg_acc, 1, 1, 1);\r
+                            reg_status(FL_V) <= reg_tmp_ovf;\r
+                        elsif (reg_inst(7 downto 5) = "101") then\r
+                            --lda\r
+                            update_status(reg_acc, 1, 1, 0);\r
+                        elsif (reg_inst(7 downto 5) = "110") then\r
+                            --cmp\r
+                            calc_res := (("0" & reg_acc) - ("0" & reg_d_in));\r
+                            if (reg_acc >= reg_d_in) then\r
+                                reg_status(FL_C) <= '1';\r
+                            else\r
+                                reg_status(FL_C) <= '0';\r
+                            end if;\r
+                            if (calc_res(7) = '1') then\r
+                                reg_status(FL_N) <= '1';\r
+                            else\r
+                                reg_status(FL_N) <= '0';\r
+                            end if;\r
+                            if (calc_res = "000000000") then\r
+                                reg_status(FL_Z) <= '1';\r
+                            else\r
+                                reg_status(FL_Z) <= '0';\r
+                            end if;\r
+                        elsif (reg_inst(7 downto 5) = "111") then\r
+                            --sbc\r
+                            update_status(reg_acc, 1, 1, 1);\r
+                            reg_status(FL_V) <= reg_tmp_ovf;\r
+                        end if;\r
+                    --case cc=10\r
+                    elsif (reg_inst(1 downto 0) = "10") then\r
+                        if (reg_inst(7 downto 5) = "101") then\r
+                            --ldx\r
+                            update_status(reg_x, 1, 1, 0);\r
+                        end if;\r
+                    --case cc=00\r
+                    elsif (reg_inst(1 downto 0) = "00") then\r
+                        if (reg_inst(7 downto 5) = "001") then\r
+                            --bit\r
+                            calc_res(7 downto 0) := (reg_acc and reg_d_in);\r
+                            reg_status(FL_N) <= reg_d_in(7);\r
+                            reg_status(FL_V) <= reg_d_in(6);\r
+                            if (calc_res(7 downto 0) = "00000000") then\r
+                                reg_status(FL_Z) <= '1';\r
+                            else\r
+                                reg_status(FL_Z) <= '0';\r
+                            end if;\r
+                        elsif (reg_inst(7 downto 5) = "101") then\r
+                            --ldy\r
+                            update_status(reg_y, 1, 1, 0);\r
+                        elsif (reg_inst(7 downto 5) = "110") then\r
+                            --cpy\r
+                            calc_res := (("0" & reg_y) - ("0" & reg_d_in));\r
+                            if (reg_y >= reg_d_in) then\r
+                                reg_status(FL_C) <= '1';\r
+                            else\r
+                                reg_status(FL_C) <= '0';\r
+                            end if;\r
+                            if (calc_res(7) = '1') then\r
+                                reg_status(FL_N) <= '1';\r
+                            else\r
+                                reg_status(FL_N) <= '0';\r
+                            end if;\r
+                            if (calc_res = "000000000") then\r
+                                reg_status(FL_Z) <= '1';\r
+                            else\r
+                                reg_status(FL_Z) <= '0';\r
+                            end if;\r
+                        elsif (reg_inst(7 downto 5) = "111") then\r
+                            --cpx\r
+                            calc_res := (("0" & reg_x) - ("0" & reg_d_in));\r
+                            if (reg_x >= reg_d_in) then\r
+                                reg_status(FL_C) <= '1';\r
+                            else\r
+                                reg_status(FL_C) <= '0';\r
+                            end if;\r
+                            if (calc_res(7) = '1') then\r
+                                reg_status(FL_N) <= '1';\r
+                            else\r
+                                reg_status(FL_N) <= '0';\r
+                            end if;\r
+                            if (calc_res = "000000000") then\r
+                                reg_status(FL_Z) <= '1';\r
+                            else\r
+                                reg_status(FL_Z) <= '0';\r
+                            end if;\r
+                        end if;\r
+                    end if;\r
+                end if;--if (reg_sub_state = ST_SUB30) then\r
+\r
+           --a4 instructions.\r
+           --asl    lsr\r
+           --dec    rol\r
+           --inc    ror\r
+            elsif (reg_main_state = ST_A41_T2 or\r
+                reg_main_state = ST_A42_T3 or\r
+                reg_main_state = ST_A43_T3 or\r
+                reg_main_state = ST_A44_T4\r
+                ) then\r
+                --data fetch cycle.\r
+                reg_tmp_data <= reg_d_in;\r
+\r
+            elsif (reg_main_state = ST_A41_T4 or\r
+                reg_main_state = ST_A42_T5 or\r
+                reg_main_state = ST_A43_T5 or\r
+                reg_main_state = ST_A44_T6\r
+                ) then\r
+                --data modify cycle.\r
+\r
+                --update reg\r
+                if (reg_sub_state = ST_SUB10) then\r
+                    --case cc=10\r
+                    if (reg_inst(1 downto 0) = "10") then\r
+                        if (reg_inst(7 downto 5) = "000") then\r
+                            --asl\r
+                            reg_tmp_data <= reg_tmp_data(6 downto 0) & "0";\r
+                            reg_tmp_carry <= reg_tmp_data(7);\r
+                        elsif (reg_inst(7 downto 5) = "001") then\r
+                            --rol\r
+                            reg_tmp_data <= reg_tmp_data(6 downto 0) & reg_status(FL_C);\r
+                            reg_tmp_carry <= reg_tmp_data(7);\r
+                        elsif (reg_inst(7 downto 5) = "010") then\r
+                            --lsr\r
+                            reg_tmp_data <= "0" & reg_tmp_data(7 downto 1);\r
+                            reg_tmp_carry <= reg_tmp_data(0);\r
+                        elsif (reg_inst(7 downto 5) = "011") then\r
+                            --ror\r
+                            reg_tmp_data <= reg_status(FL_C) & reg_tmp_data(7 downto 1);\r
+                            reg_tmp_carry <= reg_tmp_data(0);\r
+                        elsif (reg_inst(7 downto 5) = "110") then\r
+                            --dec\r
+                            reg_tmp_data <= reg_tmp_data - 1;\r
+                        elsif (reg_inst(7 downto 5) = "111") then\r
+                            --inc\r
+                            reg_tmp_data <= reg_tmp_data + 1;\r
+                        end if;\r
+                    end if;\r
+\r
+                --update status reg\r
+                elsif (reg_sub_state = ST_SUB20) then\r
+                    --case cc=10\r
+                    if (reg_inst(1 downto 0) = "10") then\r
+                        if (reg_inst(7 downto 5) = "000") then\r
+                            --asl\r
+                            update_status(reg_tmp_data, 1, 1, 1);\r
+                        elsif (reg_inst(7 downto 5) = "001") then\r
+                            --rol\r
+                            update_status(reg_tmp_data, 1, 1, 1);\r
+                        elsif (reg_inst(7 downto 5) = "010") then\r
+                            --lsr\r
+                            update_status(reg_tmp_data, 0, 1, 1);\r
+                        elsif (reg_inst(7 downto 5) = "011") then\r
+                            --ror\r
+                            update_status(reg_tmp_data, 1, 1, 1);\r
+                        elsif (reg_inst(7 downto 5) = "110") then\r
+                            --dec\r
+                            update_status(reg_tmp_data, 1, 1, 0);\r
+                        elsif (reg_inst(7 downto 5) = "111") then\r
+                            --inc\r
+                            update_status(reg_tmp_data, 1, 1, 0);\r
+                        end if;\r
+                    end if;\r
+                end if;\r
+\r
+            --a5 instructions...\r
+            --plp, pla\r
+            elsif (reg_main_state = ST_A52_T3) then\r
+                --update reg\r
+                if (reg_sub_state = ST_SUB30) then\r
+                    if (reg_inst = conv_std_logic_vector(16#28#, 8)) then\r
+                        --plp\r
+                        reg_status <= reg_d_in;\r
+                    elsif (reg_inst = conv_std_logic_vector(16#68#, 8)) then\r
+                        --pla\r
+                        reg_acc <= reg_d_in;\r
+                    end if;\r
+\r
+                --update status reg\r
+                elsif (reg_sub_state = ST_SUB31) then\r
+                    if (reg_inst = conv_std_logic_vector(16#68#, 8)) then\r
+                        --pla\r
+                        update_status(reg_acc, 1, 1, 0);\r
+                    end if;\r
+                end if;--if (reg_sub_state = ST_SUB30) then\r
+\r
+            --a58 branch inst.\r
+            --bcc   bne\r
+            --bcs   bpl\r
+            --beq   bvc\r
+            --bmi   bvs\r
+            elsif (reg_main_state = ST_A58_T1) then\r
+                if (reg_sub_state = ST_SUB30) then\r
+                    if (reg_inst = conv_std_logic_vector(16#90#, 8)) then\r
+                        --bcc\r
+                        set_condition_result(FL_C, '0');\r
+\r
+                    elsif (reg_inst = conv_std_logic_vector(16#b0#, 8)) then\r
+                        --bcs\r
+                        set_condition_result(FL_C, '1');\r
+\r
+                    elsif (reg_inst = conv_std_logic_vector(16#f0#, 8)) then\r
+                        --beq\r
+                        set_condition_result(FL_Z, '1');\r
+\r
+                    elsif (reg_inst = conv_std_logic_vector(16#30#, 8)) then\r
+                        --bmi\r
+                        set_condition_result(FL_N, '1');\r
+\r
+                    elsif (reg_inst = conv_std_logic_vector(16#d0#, 8)) then\r
+                        --bne\r
+                        set_condition_result(FL_Z, '0');\r
+\r
+                    elsif (reg_inst = conv_std_logic_vector(16#10#, 8)) then\r
+                        --bpl\r
+                        set_condition_result(FL_N, '0');\r
+\r
+                    elsif (reg_inst = conv_std_logic_vector(16#50#, 8)) then\r
+                        --bvc\r
+                        set_condition_result(FL_V, '0');\r
+\r
+                    elsif (reg_inst = conv_std_logic_vector(16#70#, 8)) then\r
+                        --bvs\r
+                        set_condition_result(FL_V, '1');\r
+                    end if;\r
+                end if;\r
+\r
+            elsif (reg_main_state = ST_A55_T3) then\r
+                --rti, pull status reg.\r
+                if (reg_sub_state = ST_SUB30) then\r
+                    reg_status <= reg_d_in;\r
+                end if;--if (reg_sub_state = ST_SUB30) then\r
+\r
+\r
+            end if;--if (reg_main_state = ST_A21_T1 or...\r
+        end if;--if (pi_rst_n = '0') then\r
+    end process;\r
+\r
+    --nmi handled flag process...\r
+    nmi_handle_p : process (pi_rst_n, pi_base_clk)\r
+    begin\r
+        if (pi_rst_n = '0') then\r
+            reg_nmi_handled <= 0;\r
+        elsif (rising_edge(pi_base_clk)) then\r
+            if (pi_nmi_n = '1') then\r
+                reg_nmi_handled <= 0;\r
+            elsif (reg_main_state = ST_NM_T7 and reg_sub_state = ST_SUB73) then\r
+                reg_nmi_handled <= 1;\r
+            end if;\r
+        end if;--if (pi_rst_n = '0') then\r
+    end process;\r
+\r
+    --dma flag process...\r
+    dma_set_p : process (pi_rst_n, pi_base_clk)\r
+    begin\r
+        if (pi_rst_n = '0') then\r
+            reg_dma_set <= 0;\r
+        elsif (rising_edge(pi_base_clk)) then\r
+            if (pi_rdy = '0') then\r
+                reg_dma_set <= 1;\r
+            elsif (reg_main_state = ST_CM_T0) then\r
+                reg_dma_set <= 0;\r
+            end if;\r
+        end if;--if (pi_rst_n = '0') then\r
+    end process;\r
+\r
+    --debug cnt...\r
+    po_exc_cnt <= reg_exc_cnt;\r
+    exc_cnt_p : process (pi_rst_n, pi_base_clk)\r
+    begin\r
+        if (pi_rst_n = '0') then\r
+            if (DEBUG_SW = 0) then\r
+                reg_exc_cnt <= (others => '0');\r
+            else\r
+                --for test....\r
+                reg_exc_cnt <= INIT_EXC_CNT;\r
+            end if;\r
+        else\r
+            if (rising_edge(pi_base_clk)) then\r
+                if (reg_main_state = ST_CM_T0 and reg_sub_state = ST_SUB73) then\r
+                    reg_exc_cnt <= reg_exc_cnt + 1;\r
+                elsif (reg_main_state = ST_NM_T7 and reg_sub_state = ST_SUB73) then\r
+                    --reg_exc_cnt upper 16 bit is nmi count.\r
+                    --lower 48 bit is cpu exec count from nmi initiated.\r
+                    reg_exc_cnt(47 downto 0) <= (others => '0');\r
+                    reg_exc_cnt(63 downto 48) <= reg_exc_cnt(63 downto 48) + 1;\r
+                end if;\r
+            end if;\r
+        end if;\r
+    end process;\r
 end rtl;\r
 \r