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

Subversion Repositories lattice6502

[/] [lattice6502/] [ispLeaver/] [65C02.vhd] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 stanley82
------------------------------------------------------------------
2
--      6502 principal module.
3
--
4
--      Copyright Ian Chapman October 28 2010
5
--
6
--      This file is part of the Lattice 6502 project
7
--      It is used to compile with Linux ghdl and ispLeaver.
8
--
9
--
10
--      To do
11
--              Detailed test of all instructions.
12
--
13
--      *************************************************************
14
--      Distributed under the GNU Lesser General Public License.    *
15 3 stanley82
--      This can be obtained from www.gnu.org.                    *
16 2 stanley82
--      *************************************************************
17
--      This program is free software: you can redistribute it and/or modify
18
--      it under the terms of the GNU General Public License as published by
19
--      the Free Software Foundation, either version 3 of the License, or
20
--      (at your option) any later version.
21
--
22
--      This program is distributed in the hope that it will be useful,
23
--      but WITHOUT ANY WARRANTY; without even the implied warranty of
24
--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25
--      GNU General Public License for more details.
26
--
27
--      You should have received a copy of the GNU General Public License
28
--      along with this program.  If not, see <http://www.gnu.org/licenses/>
29
--
30
--      65C02.vhd
31
 
32
 
33
---  Purpose to test and exercise my VHLD skills
34
---- I've decided not to support 65C02 instructions
35
---- nor BCD arithmetic.
36
---- I will make it run as fast as I can.  Timing not per a real 6502
37
---- Lattice EBI has clocked address inputs, so as not to add a cycle
38
---- 6502 address outputs are not latched.  The data output of the EBI ROM and
39
---- RAM is not clocked.
40
---- To maintain speed the 6502 address to ROM/RAM is not clocked and the data
41
---- returned is not clocked by ROM/RAM.  Structures of form address <= address + "1";
42
---- cause a race condition.  I had to store the address from the  mux for
43
---- INC type instructions ie read then write.
44
----
45
---- One boob I've just noticed jsr and pha in the 6502 work opposite to 
46
---- what I expected ie jsr decrements the stack and I inc it.  I guess
47
---- that was the way my first computer the SDS sigma 2 did it.  I'll keep
48
---- like that for now in case a bigger stack is needed.  Oh no a sigma 2
49
---- did not have a stack only L link register.
50
----
51
--      I used this to set the hold timing default "-exp parHoldLimit=999"
52
--      Also path based placement on
53
--      When generating a Lattice ROM/RAM untick latche outputs and use
54
--      the *.mem file generated with my asm2rom.pl script.
55
------------------------------------------------------------------------------------
56
--                      TO Do
57
--      1       DONE Update all address modes of cmp, cpx and cpy per #mode
58
--      2       DONE Add rol, ror, asl, lsr,  per inc and dec
59
--      3       DONE Correct flags in all modes of item 2
60
--      4       Update the stack instructions, I've it pushing up not down.
61
--      5       Continue testing
62
--      6       DONE Get a kernel up to test each and every instruction
63
--      7       Test all instructions
64
--      7       Add the 65C02 stuff.  I think the most needed is phx, phy, plx
65
--              and ply are the most useful.
66
------------------------------------------------------------------------------------
67 3 stanley82
--      Revision history
68
--      Nov 4, 2010
69
--      Rationalized all flavours of cmp, cpy and cpx.
70
--      Changed jsr to combine out_dat1 and out_dat2 into out_dat.
71
--      Changed wr_ctr to wr_fg.
72
--      This saved 43 slices, 69% of slices are used.
73
--      Removed many redundant comment lines.
74
--      ******************************************************************
75
--      Nov 1, 2010
76
--      Double quotes inside a comment line rejected by ghdl
77
--      cmp carry not set when equal
78
--      php not saving flags, had to add a cycle for flags to prop in cycle 0
79
--
80
--      ******************************************************************************
81 2 stanley82
 
82
library IEEE;                   --Use standard IEEE libs as recommended by Tristan.
83
use IEEE.STD_LOGIC_1164.ALL;
84
use IEEE.numeric_std.all;
85
 
86
entity P65C02 is
87
 
88
Port (
89
        clock: in std_logic;
90
        reset : in std_logic;
91
        data_wr: out unsigned(7 downto 0);
92
        data_rd: in unsigned(7 downto 0);
93
        proc_write:  inout std_logic;
94
        irq: in std_logic;              --Active 0
95
        nmi: in std_logic;              --Neg transition.
96
        address: inout unsigned(15 downto 0)
97
    );
98
end P65C02;
99
 
100
architecture P65C02_architecture of P65C02 is
101
------------------------------------------------------------------------
102
-- Signal Declarations
103
------------------------------------------------------------------------
104
signal reg_pc : unsigned(15 downto 0);
105
signal add_hold : unsigned(15 downto 0);
106
signal reg_a  : unsigned(8 downto 0);
107
signal reg_x, reg_y, reg_s, reg_sp : unsigned(7 downto 0);
108 3 stanley82
signal Instruction_in, dat_in1, dat_in2, dat_out : unsigned(7 downto 0);
109
signal n_fg, v_fg, b_fg, d_fg, i_fg, z_fg, v_ff, wr_fg : std_logic;
110 2 stanley82
signal cycle_ctr, add_fg : unsigned(3 downto 0);
111 3 stanley82
signal flags_fg : unsigned(1 downto 0);
112 2 stanley82
 
113
 
114
signal reset_fg, irq_fg, nmi_fg, start_fg, pc_inc_fg, branch_fg: std_logic;
115
signal pc_dec_fg, dat2pc_fg : std_logic;
116
--      End of signal declarations
117
 
118
begin   --architecture
119
--      =======================================================
120
read_mem:process (clock, reset)
121
begin
122
if reset = '0' then
123
        dat_in1 <= (others => '0');
124
        dat_in2 <= (others => '0');
125
        instruction_in <= (others => '0');
126
 
127
        elsif rising_edge(clock) then
128
                dat_in2 <= dat_in1;
129
                dat_in1 <= data_rd;
130
 
131
                if cycle_ctr = x"0" then
132
                        if irq = '0' or nmi = '0' or (reset = '1' and reset_fg = '0') then
133
                                Instruction_in <= x"00";
134
                        else
135
                                Instruction_in <= data_rd;
136
                        end if;
137
                end if;
138
end if;
139
end process read_mem;
140
 
141
--      =======================================================
142
Prog_ptr:process (clock, reset, pc_dec_fg)
143
begin
144
if reset = '0' then
145
        reg_pc <= x"FFFC";
146
        elsif rising_edge(clock) then
147
                if dat2pc_fg = '1' then
148
                        reg_pc(15 downto 8) <= data_rd;
149
                        reg_pc(7 downto 0) <= dat_in1;
150
 
151
                elsif (cycle_ctr = X"0" and not(irq = '0' or nmi = '0' )) or pc_inc_fg = '1' then
152
                        reg_pc <= reg_pc + x"0001";
153
 
154
                elsif pc_dec_fg = '1' then
155
                        reg_pc <= reg_pc - x"0001";
156
 
157
--              elsif cycle_ctr = x"0" and irq = '0' and i_fg = '0' then
158
--                      reg_pc <= reg_pc - x"0001";
159
 
160
                elsif branch_fg = '1' then
161
                        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);
162
                end if;
163
end if;
164
end process Prog_ptr;
165
 
166
addressing:process (clock, reset, reg_PC, add_fg)
167
begin
168
if reset = '0' then
169
address <= reg_pc;
170
        else
171
                Case add_fg is
172
                when x"0" =>
173
                        address <= reg_pc;
174
                when x"1" =>                    --Zero page
175
                        if proc_write = '0' then
176
                                address(7 downto 0) <= data_rd;
177
                        else
178
                                address(7 downto 0) <= dat_in1;
179
                        end if;
180
                        address(15 downto 8) <= x"00";
181
                when x"2" =>                    --Zero page, x
182
                        if proc_write = '0' then
183
                                address(7 downto 0) <= data_rd + reg_x;
184
                        else
185
                                address(7 downto 0) <= dat_in1 + reg_x;
186
                        end if;
187
                        address(15 downto 8) <= x"00";
188
 
189
                when x"3" =>                    --Zero page, y
190
                        if proc_write = '0' then
191
                                address(7 downto 0) <= data_rd + reg_y;
192
                        else
193
                                address(7 downto 0) <= dat_in1 + reg_y;
194
                        end if;
195
                        address(15 downto 8) <= x"00";
196
                when x"4" =>                    --Absolute Return sub etc
197
                        if proc_write = '0' then
198
                                address <= data_rd & dat_in1;
199
                        else
200
                                address <= dat_in1 & dat_in2;
201
                        end if;
202
                when x"5" =>                    --Absolute, x
203
                        if proc_write = '0' then
204
                                address <= data_rd & dat_in1 + reg_x;
205
                        else
206
                                address <= dat_in1 & dat_in2 + reg_x;
207
                        end if;
208
                when x"6" =>                    --Absolute, y
209
                        address <= (data_rd & dat_in1) + reg_y;
210
 
211
                        if proc_write = '0' then
212
                                address <= data_rd & dat_in1 + reg_y;
213
                        else
214
                                address <= dat_in1 & dat_in2 + reg_y;
215
                        end if;
216
 
217
                when x"7" =>                    --Stack pointer
218
                        address <= x"01" & reg_sp;              --msb should be hex 01
219
                when x"8" =>                    --Reset 1st byte
220
                        address <= x"FFFC";
221
                when x"9" =>                    --IRQ and Break 1st byte
222
                        address <= x"FFFE";
223
                when x"A" =>                    --NMI and Break 1st byte
224
                        address <= x"FFFA";
225
                when x"B" =>                    --address + 1
226
                        address <= add_hold + "1";
227
                when x"C" =>                    --(zero),y
228
                        address(7 downto 0) <= dat_in1 + "1";
229
                        address(15 downto 8) <= x"00";
230
                when x"D" =>                    --(zero,x)
231
                        address(7 downto 0) <= dat_in1 + reg_x + "1";
232
                        address(15 downto 8) <= x"00";
233
                when x"F" =>                    --Hold address steady for INC etc
234
                        address <= add_hold;
235
                when others =>
236
                        address <= reg_pc;
237
        end case;
238
end if;
239
end process addressing;
240
 
241
hold_address:process(clock, reset, address)
242
begin                   --hold address bus for inc type instructions.
243
if reset = '0' then
244
        add_hold <= (others => '0');
245
elsif rising_edge(clock) then
246
        add_hold <= address;
247
end if;
248
end process hold_address;
249
 
250 3 stanley82
memory_proc_write:process(clock, reset, wr_fg)
251 2 stanley82
begin
252
if reset = '0' then
253
        data_wr <= (others => '0');
254
        proc_write <= '0';
255
elsif rising_edge(clock) then
256 3 stanley82
        proc_write <= wr_fg;
257
        if wr_fg = '1' then
258
                data_wr <= dat_out;
259 2 stanley82
        end if;
260
end if;
261
end process memory_proc_write;
262
 
263
instruction_decode:process (clock, reset, irq, nmi)
264
begin
265
if reset = '0' then
266
        cycle_ctr <= (others => '0');
267
        pc_inc_fg <= '0';
268
        pc_dec_fg <= '0';
269
        dat2pc_fg <= '0';
270
        add_fg <= (others => '0');
271
        branch_fg <= '0';
272
        flags_fg <= (others => '0');
273 3 stanley82
        wr_fg <= '0';
274 2 stanley82
        reg_a <= (others => '0');
275
        reg_x <= (others => '0');
276
        reg_y <= (others => '0');
277
        reg_s <= (others => '0');
278
        reg_sp <= (others => '0');
279
        n_fg <= '0';
280
        v_fg <= '0';
281
        b_fg <= '0';
282
        d_fg <= '0';
283
        i_fg <= '0';
284
        z_fg <= '0';
285
        reset_fg <= '0';
286
        start_fg <= '0';
287
        v_ff <= '0';
288
        nmi_fg <= '0';
289
        irq_fg <= '0';
290 3 stanley82
        dat_out <= (others => '0');
291 2 stanley82
 
292
elsif rising_edge(clock) then
293
        reset_fg <= reset;
294
 
295
--      This section is to get started
296
                if reset = '1' and reset_fg = '0' then
297
                        start_fg <= '1';
298 3 stanley82
                        wr_fg <= '0';
299 2 stanley82
                        add_fg <= x"8";         --get start up vectors FFFC FFFD
300
                        cycle_ctr <= x"5";      --Jump into cycle 5 add_fg <= x'8'
301
--              end if;
302
        else
303
 
304
 
305
        case cycle_ctr is               --cycle counter case
306
                when x"0" =>
307
 
308
                        if  reset_fg = '1' and reset = '1' then
309
 
310
                                if flags_fg /= "00" then
311 3 stanley82
                                        n_fg <= dat_out(7);
312
                                        if dat_out = x"00" then
313 2 stanley82
                                                z_fg <= '1';
314
                                        else
315
                                                z_fg <= '0';
316
                                        end if;
317
                                end if;
318
                                if flags_fg = "10" then
319
                                        start_fg <= '0';
320
                                        v_fg <= reg_a(7) xnor v_ff;     --Add V_ff true overflow possible
321
--                                                                      --Sub V_ff false underflow possible
322
                                end if;
323
                        flags_fg <= "00";
324
                        end if;
325
 
326
                        if irq = '0' and i_fg = '0' then
327
                                irq_fg <= '1';
328
                                b_fg <= '0';
329
                                pc_dec_fg <= '1';
330
                                cycle_ctr <= cycle_ctr + x"1";
331
                        elsif nmi = '0' and i_fg = '0' then
332
                                nmi_fg <= '1';
333
                                b_fg <= '0';
334
                                pc_dec_fg <= '1';
335
                                cycle_ctr <= cycle_ctr + x"1";
336
                        else
337
 
338
                        case data_rd is
339
 
340
--      ===========================================================================================
341
                                when x"48" =>                   --PHA 1st part accumulator onto stack
342 3 stanley82
                                        wr_fg <= '1';
343
                                        dat_out <= reg_a(7 downto 0);
344 2 stanley82
                                        pc_dec_fg <= '1';
345
                                        cycle_ctr <= cycle_ctr + x"1";
346
 
347
                                when x"08" =>                   --PHP 1st part status onto stack
348
                                        pc_dec_fg <= '1';
349
                                        cycle_ctr <= cycle_ctr + x"1";
350
 
351
                                when x"68" =>                   --PLA  1st part Pull Accumulator from Stack
352
                                        reg_sp <= reg_sp - "1";
353
                                        pc_dec_fg <= '1';
354
                                        cycle_ctr <= cycle_ctr + x"1";
355
 
356
                                when x"28" =>                   --PLP 1st part pull old status from stack
357
                                        reg_sp <= reg_sp - "1";
358
                                        pc_dec_fg <= '1';
359
                                        cycle_ctr <= cycle_ctr + x"1";
360
 
361
                                when x"18" =>                   --CLC clear carry
362
                                        reg_a(8) <= '0';
363
--                                      pc_dec_fg <= '1';
364
                                        cycle_ctr <= x"0";
365
 
366
                                when x"38" =>                   --SEC set carry
367
                                        reg_a(8) <= '1';
368
                                        cycle_ctr <= x"0";
369
                                when x"58" =>                   --CLI  Clear interrupt Disable Bit
370
                                        i_fg <= '0';
371
                                        cycle_ctr <= x"0";
372
 
373
                                when x"78" =>                   --SEI  Set interrupt Disable Status
374
                                        i_fg <= '1';
375
                                        cycle_ctr <= x"0";
376
                                when x"88" =>                   --DEY Decrement y reg
377
                                        reg_y <= reg_y - "1";
378
                                        flags_fg <= "01";
379 3 stanley82
                                        dat_out <= reg_y - "1";
380 2 stanley82
                                        cycle_ctr <= x"0";
381
                                when x"98" =>                   --TYA transfer Y to A
382
                                        reg_a(7 downto 0) <= reg_y;
383
                                        flags_fg <= "01";
384 3 stanley82
                                        dat_out <= reg_y;
385 2 stanley82
                                        cycle_ctr <= x"0";
386
                                when x"A8" =>                   --TAY transfer A to Y
387
                                        reg_y <= reg_a(7 downto 0);
388
                                        flags_fg <= "01";
389 3 stanley82
                                        dat_out <= reg_a(7 downto 0);
390 2 stanley82
                                        cycle_ctr <= x"0";
391
                                when x"B8" =>                   --CLV clear overflow flag
392
                                        v_fg <= '0';
393
                                        pc_dec_fg <= '1';
394
                                        cycle_ctr <= x"0";
395
                                when x"C8" =>                   --INY increment Y reg
396
                                        reg_y <= reg_y + x"1";
397
                                        flags_fg <= "01";
398 3 stanley82
                                        dat_out <= reg_y + x"1";
399 2 stanley82
                                        cycle_ctr <= x"0";
400
                                when x"D8" =>                   --CLD Clear decimnal flag
401
                                        d_fg <= '0';
402
                                        cycle_ctr <= x"0";
403
                                when x"E8" =>                   --INX increment X reg
404
                                        reg_x <= reg_x + x"1";
405
                                        flags_fg <= "01";
406 3 stanley82
                                        dat_out <= reg_x + x"1";
407 2 stanley82
                                        cycle_ctr <= x"0";
408
                                when x"F8" =>                   --SLD Set decimnal flag
409
                                        d_fg <= '1';
410
                                        cycle_ctr <= x"0";
411
                                when x"2A" =>                   --ROL A Rotate Left one bit 1st part.
412
                                        reg_a(8 downto 1) <= reg_a(7 downto 0);
413
                                        reg_a(0) <= reg_a(8);
414 3 stanley82
                                        dat_out(7 downto 1) <= reg_a(6 downto 0);
415
                                        dat_out(0) <= reg_a(8);
416 2 stanley82
                                        flags_fg <= "01";
417
                                        cycle_ctr <=  x"0";
418
                                when x"6A" =>                   --ROR A Rotateft right one bit 1st part.
419
                                        reg_a(7 downto 0) <= reg_a(8 downto 1);
420
                                        reg_a(8) <= reg_a(0);
421 3 stanley82
                                        dat_out <= reg_a(8 downto 1);
422 2 stanley82
                                        flags_fg <= "01";
423
                                        cycle_ctr <=  x"0";
424
                                when x"0A" =>                   --ASL A Shift Left one bit 1st part.
425
                                        reg_a <= reg_a(7 downto 0) & '0';
426 3 stanley82
                                        dat_out <= reg_a(6 downto 0) & '0';
427 2 stanley82
                                        flags_fg <= "01";
428
                                        cycle_ctr <=  x"0";
429
                                when x"4A" =>                   --LSR A Logical Shift Right one bit 1st part.
430
                                        reg_a(7 downto 0) <= '0' & reg_a(7 downto 1);
431
                                        reg_a(8) <= reg_a(0);
432 3 stanley82
                                        dat_out <= '0' & reg_a(7 downto 1);
433 2 stanley82
                                        flags_fg <= "01";
434
                                        cycle_ctr <=  x"0";
435
                                when x"9A" =>                   --TXS
436
                                        reg_sp <= reg_x;
437
                                        cycle_ctr <= x"0";
438
                                when x"AA" =>                   --TAX
439
                                        reg_x <= reg_a(7 downto 0);
440
                                        flags_fg <= "01";
441 3 stanley82
                                        dat_out <= reg_a(7 downto 0);
442 2 stanley82
                                        cycle_ctr <= x"0";
443
                                when x"8A" =>                   --TXA
444
                                        reg_a(7 downto 0) <= reg_x;
445
                                        flags_fg <= "01";
446 3 stanley82
                                        dat_out <= reg_a(7 downto 0);
447 2 stanley82
                                        cycle_ctr <= x"0";
448
                                when x"BA" =>                   --TSX
449
                                        reg_x <= reg_sp;
450
                                        flags_fg <= "01";
451 3 stanley82
                                        dat_out <= reg_sp;
452 2 stanley82
                                        cycle_ctr <= x"0";
453
                                when x"CA" =>                   --DEX
454
                                        reg_x <= reg_X - X"01";
455
                                        flags_fg <= "01";
456 3 stanley82
                                        dat_out <= reg_x - X"01";
457 2 stanley82
                                        cycle_ctr <= x"0";
458
--      =============================================================================================
459
                                when x"F0" =>                   --BEQ branch true 1st part.
460
                                                cycle_ctr <= cycle_ctr + "1";
461
                                when x"D0" =>                   --BNE branch true 1st part.
462
                                                cycle_ctr <= cycle_ctr + "1";
463
                                when x"10" =>                   --BPL plus true 1st part.
464
                                                cycle_ctr <= cycle_ctr + "1";
465
                                when x"30" =>                   --BM1 negative true 1st part.
466
                                                cycle_ctr <= cycle_ctr + "1";
467
                                when x"50" =>                   --BVC overflow false 1st part.
468
                                                cycle_ctr <= cycle_ctr + "1";
469
                                when x"70" =>                   --BVS overflow true 1st part.
470
                                                cycle_ctr <= cycle_ctr + "1";
471
                                when x"90" =>                   --BCC carry false 1st part.
472
                                                cycle_ctr <= cycle_ctr + "1";
473
                                when x"B0" =>                   --BCS carry true 1st part.
474
                                                cycle_ctr <= cycle_ctr + "1";
475
 
476
--      =============================================================================================
477
                                when x"A2" =>                   --LDX #.  1st partProto imediate instruction
478
                                        pc_inc_fg <= '1';
479
                                        cycle_ctr <= cycle_ctr + "1";
480
                                when x"A9" =>                   --LDA #.  1st part Proto imediate instruction
481
                                        pc_inc_fg <= '1';
482
                                        cycle_ctr <= cycle_ctr + "1";
483
                                when x"09" =>                   --ORA #.  1st part Proto imediate instruction
484
                                        pc_inc_fg <= '1';
485
                                        cycle_ctr <= cycle_ctr + "1";
486
                                when x"29" =>                   --AND #.  1st part Proto imediate instruction
487
                                        pc_inc_fg <= '1';
488
                                        cycle_ctr <= cycle_ctr + "1";
489
                                when x"49" =>                   --EOR #.  1st part Proto imediate instruction
490
                                        pc_inc_fg <= '1';
491
                                        cycle_ctr <= cycle_ctr + "1";
492
                                when x"69" =>                   --ADC #.  1st part Proto imediate instruction
493
                                        pc_inc_fg <= '1';
494
                                        cycle_ctr <= cycle_ctr + "1";
495
                                when x"A0" =>                   --LDY #.  1st part Proto imediate instruction
496
                                        pc_inc_fg <= '1';
497
                                        cycle_ctr <= cycle_ctr + "1";
498
                                when x"C0" =>                   --CPY #.  1st part Proto imediate instruction
499
                                        pc_inc_fg <= '1';
500
                                        cycle_ctr <= cycle_ctr + "1";
501
                                when x"C9" =>                   --CMP #.  1st part Proto imediate instruction
502
                                        pc_inc_fg <= '1';
503
                                        cycle_ctr <= cycle_ctr + "1";
504
                                when x"E0" =>                   --CPX #.  1st part Proto imediate instruction
505
                                        pc_inc_fg <= '1';
506
                                        cycle_ctr <= cycle_ctr + "1";
507
                                when x"E9" =>                   --SBC #.  1st part Proto imediate instruction
508
                                        pc_inc_fg <= '1';
509
                                        cycle_ctr <= cycle_ctr + "1";
510
 
511
--      =============================================================================================
512
                                when x"84" =>                   --STY zero 1st part proto
513 3 stanley82
                                        dat_out <= reg_y;
514
                                        wr_fg <= '1';
515 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
516
                                when x"85" =>                   --STA zero 1st part proto
517 3 stanley82
                                        dat_out <= reg_a(7 downto 0);
518
                                        wr_fg <= '1';
519 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
520
                                when x"86" =>                   --STX zero 1st part proto
521 3 stanley82
                                        dat_out <= reg_x;
522
                                        wr_fg <= '1';
523 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
524
                                when x"94" =>                   --STY zero, X 1st part proto
525 3 stanley82
                                        dat_out <= reg_y;
526 2 stanley82
                                        add_fg <= x"2";
527 3 stanley82
                                        wr_fg <= '1';
528 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
529
                                when x"95" =>                   --STA zero, X 1st part proto
530 3 stanley82
                                        dat_out <= reg_a(7 downto 0);
531
                                        wr_fg <= '1';
532 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
533
                                when x"96" =>                   --STX zero, Y 1st part proto
534 3 stanley82
                                        dat_out <= reg_x;
535
                                        wr_fg <= '1';
536 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
537
 
538
--      ===============================================================================================
539
 
540
                                when x"A1" =>                   --LDA (zero,x) 1st part proto
541
                                        add_fg <= x"2";
542
                                        cycle_ctr <= cycle_ctr + "1";
543
                                when x"B1" =>                   --LDA (zero),y 1st part proto
544
                                        add_fg <= x"1";
545
                                        cycle_ctr <= cycle_ctr + "1";
546
 
547
                                when x"21" =>                   --AND (zero,x) 1st part proto
548
                                        add_fg <= x"2";
549
                                        cycle_ctr <= cycle_ctr + "1";
550
                                when x"31" =>                   --AND (zero),y 1st part proto
551
                                        add_fg <= x"1";
552
                                        cycle_ctr <= cycle_ctr + "1";
553
 
554
                                when x"41" =>                   --EOR (zero,x) 1st part proto
555
                                        add_fg <= x"2";
556
                                        cycle_ctr <= cycle_ctr + "1";
557
                                when x"51" =>                   --EOR (zero),y 1st part proto
558
                                        add_fg <= x"1";
559
                                        cycle_ctr <= cycle_ctr + "1";
560
 
561
                                when x"01" =>                   --OR (zero,x) 1st part proto
562
                                        add_fg <= x"2";
563
                                        cycle_ctr <= cycle_ctr + "1";
564
                                when x"11" =>                   --OR (zero),y 1st part proto
565
                                        add_fg <= x"1";
566
                                        cycle_ctr <= cycle_ctr + "1";
567
 
568
                                when x"61" =>                   --ADC (zero,x) 1st part proto
569
                                        add_fg <= x"2";
570
                                        cycle_ctr <= cycle_ctr + "1";
571
                                when x"71" =>                   --ADC (zero),y 1st part proto
572
                                        add_fg <= x"1";
573
                                        cycle_ctr <= cycle_ctr + "1";
574
 
575
                                when x"E1" =>                   --SBC (zero,x) 1st part proto
576
                                        add_fg <= x"2";
577
                                        cycle_ctr <= cycle_ctr + "1";
578
                                when x"F1" =>                   --SBC (zero),y 1st part proto
579
                                        add_fg <= x"1";
580
                                        cycle_ctr <= cycle_ctr + "1";
581
 
582
                                when x"C1" =>                   --CMP (zero,x) 1st part proto
583
                                        add_fg <= x"2";
584
                                        cycle_ctr <= cycle_ctr + "1";
585
                                when x"D1" =>                   --CMP (zero),y 1st part proto
586
                                        add_fg <= x"1";
587
                                        cycle_ctr <= cycle_ctr + "1";
588
 
589
                                when x"81" =>                   --STA (zero,x) 1st part proto
590
                                        add_fg <= x"2";
591
                                        cycle_ctr <= cycle_ctr + "1";
592
                                when x"91" =>                   --STA (zero),y 1st part proto
593
                                        add_fg <= x"1";
594
                                        cycle_ctr <= cycle_ctr + "1";
595
 
596
 
597
--      ==============================================================================================
598
                                when x"A5" =>                   --LDA zero 1st part proto
599
                                        add_fg <= x"1";
600
                                        cycle_ctr <= cycle_ctr + x"1";
601
                                when x"A4" =>                   --LDY zero 1st part
602
                                        add_fg <= x"1";
603
                                        cycle_ctr <= cycle_ctr + x"1";
604
                                when x"A6" =>                   --LDX zero 1st part
605
                                        add_fg <= x"1";
606
                                        cycle_ctr <= cycle_ctr + x"1";
607
                                when x"B5" =>                   --LDA zero,x 1st part
608
                                        add_fg <= x"2";
609
                                        cycle_ctr <= cycle_ctr + x"1";
610
                                when x"B4" =>                   --LDY zero,x 1st part
611
                                        add_fg <= x"2";
612
                                        cycle_ctr <= cycle_ctr + x"1";
613
                                when x"B6" =>                   --LDX zero,y 1st part
614
                                        add_fg <= x"3";
615
                                        cycle_ctr <= cycle_ctr + x"1";
616
                                when x"05" =>                   --ORA zero 1st part
617
                                        add_fg <= x"1";
618
                                        cycle_ctr <= cycle_ctr + x"1";
619
                                when x"15" =>                   --ORA zero,X 1st part
620
                                        add_fg <= x"2";
621
                                        cycle_ctr <= cycle_ctr + x"1";
622
                                when x"24" =>                   --BIT zero 1st part
623
                                        add_fg <= x"1";
624
                                        cycle_ctr <= cycle_ctr + x"1";
625
                                when x"25" =>                   --AND zero 1st part
626
                                        add_fg <= x"1";
627
                                        cycle_ctr <= cycle_ctr + x"1";
628
                                when x"26" =>                   --ROL zero 1st part
629
                                        add_fg <= x"1";
630
                                        cycle_ctr <= cycle_ctr + x"1";
631
                                when x"35" =>                   --AND zero,X 1st part
632
                                        add_fg <= x"2";
633
                                        cycle_ctr <= cycle_ctr + x"1";
634
                                when x"36" =>                   --ROL zero,X 1st part
635
                                        add_fg <= x"1";
636
                                        cycle_ctr <= cycle_ctr + x"1";
637
                                when x"45" =>                   --EOR zero 1st part
638
                                        add_fg <= x"1";
639
                                        cycle_ctr <= cycle_ctr + x"1";
640
                                when x"46" =>                   --LSR zero 1st part
641
                                        add_fg <= x"1";
642
                                        cycle_ctr <= cycle_ctr + x"1";
643
                                when x"55" =>                   --EOR zero,X 1st part
644
                                        add_fg <= x"2";
645
                                        cycle_ctr <= cycle_ctr + x"1";
646
--      =========================================================================================
647
                                when x"E6" =>                   --INC zero 1st part
648
                                        add_fg <= x"1";
649
                                        cycle_ctr <= cycle_ctr + x"1";
650
                                when x"56" =>                   --LSR zero,X 1st part
651
                                        add_fg <= x"2";
652
                                        cycle_ctr <= cycle_ctr + x"1";
653
                                when x"65" =>                   --ADC zero 1st part
654
                                        add_fg <= x"1";
655
                                        cycle_ctr <= cycle_ctr + x"1";
656
                                when x"66" =>                   --ROR zero 1st part
657
                                        add_fg <= x"1";
658
                                        cycle_ctr <= cycle_ctr + x"1";
659
                                when x"75" =>                   --ADC zero,X 1st part
660
                                        add_fg <= x"2";
661
                                        cycle_ctr <= cycle_ctr + x"1";
662
                                when x"76" =>                   --ROR zero,X 1st part
663
                                        add_fg <= x"2";
664
                                        cycle_ctr <= cycle_ctr + x"1";
665
                                when x"C4" =>                   --CPY zero 1st part
666
                                        add_fg <= x"1";
667
                                        cycle_ctr <= cycle_ctr + x"1";
668
                                when x"C5" =>                   --CMP zero 1st part
669
                                        add_fg <= x"1";
670
                                        cycle_ctr <= cycle_ctr + x"1";
671
                                when x"C6" =>                   --DEC zero 1st part
672
                                        add_fg <= x"1";
673
                                        cycle_ctr <= cycle_ctr + x"1";
674
                                when x"D5" =>                   --CMP zero,X 1st part
675
                                        add_fg <= x"2";
676
                                        cycle_ctr <= cycle_ctr + x"1";
677
                                when x"D6" =>                   --DEC zero,X 1st part
678
                                        add_fg <= x"2";
679
                                        cycle_ctr <= cycle_ctr + x"1";
680
                                when x"E4" =>                   --CPX zero 1st part
681
                                        add_fg <= x"1";
682
                                        cycle_ctr <= cycle_ctr + x"1";
683
                                when x"E5" =>                   --SBC zero 1st part
684
                                        add_fg <= x"1";
685
                                        cycle_ctr <= cycle_ctr + x"1";
686
                                when x"F5" =>                   --SBC zero,X 1st part
687
                                        add_fg <= x"2";
688
                                        cycle_ctr <= cycle_ctr + x"1";
689
                                when x"F6" =>                   --INC zero,X 1st part
690
                                        add_fg <= x"2";
691
                                        cycle_ctr <= cycle_ctr + x"1";
692
                                when x"06" =>                   --ASL zero, 1st part
693
                                        add_fg <= x"1";
694
                                        cycle_ctr <= cycle_ctr + x"1";
695
                                when x"16" =>                   --ASL zero, x 1st part
696
                                        add_fg <= x"2";
697
                                        cycle_ctr <= cycle_ctr + x"1";
698
--      ==============================================================================
699
                                when x"AD" =>                   --LDA abs 1st part.
700
                                        cycle_ctr <= cycle_ctr + x"1";
701
                                when x"BD" =>                   --LDA, x abs 1st part.
702
                                        cycle_ctr <= cycle_ctr + x"1";
703
                                when x"B9" =>                   --LDA, Y abs 1st part
704
                                        cycle_ctr <= cycle_ctr + x"1";
705
 
706
                                when x"2D" =>                   --AND abs 1st part.
707
                                        cycle_ctr <= cycle_ctr + x"1";
708
                                when x"3D" =>                   --AND, x abs 1st part.
709
                                        cycle_ctr <= cycle_ctr + x"1";
710
                                when x"39" =>                   --AND, Y abs 1st part.
711
                                        cycle_ctr <= cycle_ctr + x"1";
712
 
713
                                when x"0D" =>                   --ORA abs 1st part.
714
                                        cycle_ctr <= cycle_ctr + x"1";
715
                                when x"1D" =>                   --ORA, x abs 1st part.
716
                                        cycle_ctr <= cycle_ctr + x"1";
717
 
718
                                when x"19" =>                   --ORA, Y abs 1st part.
719
                                        cycle_ctr <= cycle_ctr + x"1";
720
 
721
                                when x"4D" =>                   --EOR abs 1st part.
722
                                        cycle_ctr <= cycle_ctr + x"1";
723
                                when x"5D" =>                   --EOR, x abs 1st part.
724
                                        cycle_ctr <= cycle_ctr + x"1";
725
                                when x"59" =>                   --EOR, Y abs 1st part.
726
                                        cycle_ctr <= cycle_ctr + x"1";
727
 
728
                                when x"6D" =>                   --ADC abs 1st part.
729
                                        cycle_ctr <= cycle_ctr + x"1";
730
                                when x"7D" =>                   --ADC, x abs 1st part.
731
                                        cycle_ctr <= cycle_ctr + x"1";
732
                                when x"79" =>                   --ADC, Y abs 1st part.
733
                                        cycle_ctr <= cycle_ctr + x"1";
734
 
735
                                when x"ED" =>                   --SBC abs 1st part.
736
                                        cycle_ctr <= cycle_ctr + x"1";
737
                                when x"FD" =>                   --SBC, x abs 1st part.
738
                                        cycle_ctr <= cycle_ctr + x"1";
739
                                when x"F9" =>                   --SBC, Y abs 1st part.
740
                                        cycle_ctr <= cycle_ctr + x"1";
741
 
742
                                when x"AE" =>                   --LDX abs 1st part.
743
                                        cycle_ctr <= cycle_ctr + x"1";
744
                                when x"BE" =>                   --LDX, y abs 1st part.
745
                                        cycle_ctr <= cycle_ctr + x"1";
746
                                when x"AC" =>                   --LDY abs 1st part.
747
                                        cycle_ctr <= cycle_ctr + x"1";
748
                                when x"BC" =>                   --LDY, x abs 1st part.
749
                                        cycle_ctr <= cycle_ctr + x"1";
750
                                when x"2C" =>                   --BIT abs 1st part.
751
                                        cycle_ctr <= cycle_ctr + x"1";
752
 
753
                                when x"CD" =>                   --CMP abs 1st part.
754
                                        cycle_ctr <= cycle_ctr + x"1";
755
                                when x"DD" =>                   --CMP, x abs 1st part.
756
                                        cycle_ctr <= cycle_ctr + x"1";
757
                                when x"D9" =>                   --CMP, Y abs 1st part.
758
                                        cycle_ctr <= cycle_ctr + x"1";
759
                                when x"EC" =>                   --CPX abs 1st part.
760
                                        cycle_ctr <= cycle_ctr + x"1";
761
                                when x"CC" =>                   --CPY abs 1st part.
762
                                        cycle_ctr <= cycle_ctr + x"1";
763
--.........................................................................................
764
                                when x"8D" =>                   --STA abs 1st part.
765 3 stanley82
                                        dat_out <= reg_a(7 downto 0);
766 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
767
                                when x"9D" =>                   --STA,x abs 1st part.
768 3 stanley82
                                        dat_out <= reg_a(7 downto 0);
769 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
770
                                when x"99" =>                   --STA, y abs 1st part.
771 3 stanley82
                                        dat_out <= reg_a(7 downto 0);
772 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
773
                                when x"8E" =>                   --STX abs 1st part.
774 3 stanley82
                                        dat_out <= reg_x;
775 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";--
776
                                when x"8C" =>                   --STY abs 1st part.
777 3 stanley82
                                        dat_out <= reg_y;
778 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
779
--.........................................................................................
780
 
781
                                when x"EE" =>                   --INC abs 1st part.
782
                                        cycle_ctr <= cycle_ctr + x"1";
783
                                when x"FE" =>                   --INC, x abs 1st part.
784
                                        cycle_ctr <= cycle_ctr + x"1";
785
                                when x"CE" =>                   --DEC abs 1st part.
786
                                        cycle_ctr <= cycle_ctr + x"1";
787
                                when x"DE" =>                   --DEC, x abs 1st part.
788
                                        cycle_ctr <= cycle_ctr + x"1";
789
                                when x"2E" =>                   --ROL abs 1st part.
790
                                        cycle_ctr <= cycle_ctr + x"1";
791
                                when x"3E" =>                   --ROL, x abs 1st part.
792
                                        cycle_ctr <= cycle_ctr + x"1";
793
                                when x"6E" =>                   --ROR abs 1st part.
794
                                        cycle_ctr <= cycle_ctr + x"1";
795
                                when x"7E" =>                   --ROR, x abs 1st part.
796
                                        cycle_ctr <= cycle_ctr + x"1";
797
                                when x"4E" =>                   --LSR abs 1st part.
798
                                        cycle_ctr <= cycle_ctr + x"1";
799
                                when x"5E" =>                   --LSR, x abs 1st part.
800
                                        cycle_ctr <= cycle_ctr + x"1";
801
                                when x"0E" =>                   --ASL abs 1st part.
802
                                        cycle_ctr <= cycle_ctr + x"1";
803
                                when x"1E" =>                   --ASL, x abs 1st part.
804
                                        cycle_ctr <= cycle_ctr + x"1";
805
--      ............................................................................
806
--      ==============================================================================
807
 
808
 
809
                                when x"4C" =>                   --JMP abs first part
810
                                        pc_inc_fg <= '1';
811
                                        cycle_ctr <= cycle_ctr + x"1";
812
                                when x"6C" =>                   --JMP indirect first part
813
                                        pc_inc_fg <= '1';
814
                                        cycle_ctr <= cycle_ctr + x"1";
815
                                when x"20" =>                   --JSR abs first part
816
                                        cycle_ctr <= cycle_ctr + x"1";
817
                                when x"60" =>                   --RTS first part
818
                                        reg_sp <= reg_sp - "1";
819
                                        add_fg <= x"7";
820
                                        cycle_ctr <= cycle_ctr + x"1";
821
                                when x"40" =>                   --RTI 1st part pull old status from stack
822
                                        reg_sp <= reg_sp - "1";
823
                                        add_fg <= x"7";
824
                                        cycle_ctr <= cycle_ctr + x"1";
825
 
826
                                when x"00" =>                   --Break first part cyc 0
827
                                        if irq_fg = '0' then     --Start up, irq and nmi also use
828
                                                b_fg <= '1';    --this set of logic.
829
                                        else
830
                                                b_fg <= '0';
831
                                        end if;
832
                                        pc_dec_fg <= '1';
833
                                        cycle_ctr <= cycle_ctr + x"1";
834
 
835
                                when others =>
836
                                        cycle_ctr <= x"0";
837
 
838
                        end case;       --Cycle 0
839
                        end if; --Initiated by nmi irq detection.
840
 
841
 
842
--      End cycle 0     =========================================================
843
 
844
 
845
                when x"1" =>
846
                                case Instruction_in is
847
--      ================================================================================================
848
 
849
                                when x"48" =>                   --PHA 2nd part accumulator onto stack
850
                                        pc_dec_fg <= '0';
851
                                        add_fg <= x"7";
852 3 stanley82
                                        wr_fg <= '0';
853 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
854
                                when x"08" =>                   --PHP 2nd part Status reg onto stack
855 3 stanley82
                                        wr_fg <= '1';
856 2 stanley82
                                        pc_dec_fg <= '0';
857 3 stanley82
                                        dat_out <= n_fg & v_fg & '1' & b_fg & d_fg & i_fg & z_fg & reg_a(8);
858 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
859
 
860
                                when x"68" =>                   --PLA 2nd part  Pull Accumulator from Stack
861
                                        add_fg <= x"7";
862
                                        pc_dec_fg <= '0';
863
                                        cycle_ctr <= cycle_ctr + x"1";
864
                                when x"28" =>                   --PLP 2nd part  Pull Status from Stack
865
                                        add_fg <= x"7";
866
                                        pc_dec_fg <= '0';
867
                                        cycle_ctr <= cycle_ctr + x"1";
868
 
869
                                when x"F0" =>                   --BEQ branch true 2nd part.
870
                                        if z_fg = '1' then      --Should work like a nop
871
                                                branch_fg <= '1';       --branch true 1st part.
872
                                        else
873
                                                pc_inc_fg <= '1';
874
                                        end if;
875
                                                cycle_ctr <= cycle_ctr + x"1";
876
                                when x"D0" =>                   --BNE branch true 2nd part.
877
                                        if z_fg = '0' then       --Should work like a nop
878
                                                branch_fg <= '1';       --branch true 1st part.
879
                                        else
880
                                                pc_inc_fg <= '1';
881
                                        end if;
882
                                                cycle_ctr <= cycle_ctr + x"1";
883
                                when x"10" =>                   --BPL plus true 2nd part.
884
                                        if n_fg = '0' then       --Should work like a nop
885
                                                branch_fg <= '1';       --branch true 1st part.
886
                                        else
887
                                                pc_inc_fg <= '1';
888
                                        end if;
889
                                                cycle_ctr <= cycle_ctr + x"1";
890
                                when x"30" =>                   --BM1 negative true 2nd part.
891
                                        if n_fg = '1' then      --Should work like a nop
892
                                                branch_fg <= '1';       --branch true 1st part.
893
                                        else
894
                                                pc_inc_fg <= '1';
895
                                        end if;
896
                                                cycle_ctr <= cycle_ctr + x"1";
897
                                when x"50" =>                   --BVC overflow false 2nd part.
898
                                        if v_fg = '0' then       --Should work like a nop
899
                                                branch_fg <= '1';       --branch true 1st part.
900
                                        else
901
                                                pc_inc_fg <= '1';
902
                                        end if;
903
                                                cycle_ctr <= cycle_ctr + x"1";
904
                                when x"70" =>                   --BVS overflow true 2nd part.
905
                                        if v_fg = '1' then      --Should work like a nop
906
                                                branch_fg <= '1';       --branch true 1st part.
907
                                        else
908
                                                pc_inc_fg <= '1';
909
                                        end if;
910
                                                cycle_ctr <= cycle_ctr + x"1";
911
                                when x"90" =>                   --BCC carry false 2nd part.
912
                                        if reg_a(8) = '0' then   --Should work like a nop
913
                                                branch_fg <= '1';       --branch true 1st part.
914
                                        else
915
                                                pc_inc_fg <= '1';
916
                                        end if;
917
                                                cycle_ctr <= cycle_ctr + x"1";
918
                                when x"B0" =>                   --BCS carry true 2nd part.
919
                                        if reg_a(8) = '1' then  --Should work like a nop
920
                                                branch_fg <= '1';       --branch true 1st part.
921
                                        else
922
                                                pc_inc_fg <= '1';
923
                                        end if;
924
                                                cycle_ctr <= cycle_ctr + x"1";
925
--      ================================================================================================
926
 
927
                                when x"A2" =>                   --LDX #.  2nd part Proto imediate instruction
928
                                        pc_inc_fg <= '0';
929
                                        reg_x <= data_rd;
930 3 stanley82
                                        dat_out <= data_rd;
931 2 stanley82
                                        cycle_ctr <= x"0";
932
                                when x"A9" =>                   --LDA #.  2nd part Proto imediate instruction
933
                                        pc_inc_fg <= '0';
934
                                        flags_fg <= "01";
935
                                        reg_a(7 downto 0) <= data_rd;
936 3 stanley82
                                        dat_out <= data_rd;
937 2 stanley82
                                        cycle_ctr <= x"0";
938
                                when x"A0" =>                   --LDY #
939
                                        pc_inc_fg <= '0';
940
                                        flags_fg <= "01";
941
                                        reg_y <= data_rd;
942 3 stanley82
                                        dat_out <= data_rd;
943 2 stanley82
                                        cycle_ctr <= x"0";
944
                                when x"09" =>                   --ORA #
945
                                        pc_inc_fg <= '0';
946
                                        add_fg <= x"0";
947
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
948 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
949 2 stanley82
                                        cycle_ctr <= x"0";
950
                                when x"29" =>                   --AND # 2nd part
951
                                        pc_inc_fg <= '0';
952
                                        flags_fg <= "01";
953
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
954 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
955 2 stanley82
                                        cycle_ctr <= x"0";
956
                                when x"49" =>                   --EOR #
957
                                        pc_inc_fg <= '0';
958
                                        flags_fg <= "01";
959
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
960 3 stanley82
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
961 2 stanley82
                                        cycle_ctr <= x"0";
962
                                when x"69" =>                   --ADC #
963
                                        pc_inc_fg <= '0';
964
                                        v_ff <= not reg_a(7) and not data_rd(7);        --Pos+Pos=Overflow possible
965
                                        flags_fg <= "10";
966
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
967 3 stanley82
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
968 2 stanley82
                                        cycle_ctr <= x"0";
969
                                when x"E9" =>                   --SBC # 2nd part
970
                                        pc_inc_fg <= '0';
971
                                        v_ff <= reg_a(7) and data_rd(7);                --Neg-Neg=Underflow possible
972
                                        flags_fg <= "10";
973
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
974 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
975 2 stanley82
                                        cycle_ctr <= x"0";
976
 
977
                                when x"C9" =>                   --CMP # 2nd part.
978
                                        pc_inc_fg <= '0';
979
                                        flags_fg <= "01";
980 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd;
981
                                        if reg_a(7 downto 0) >= data_rd then
982 2 stanley82
                                                reg_a(8) <= '1';
983
                                        else
984
                                                reg_a(8) <= '0';
985
                                        end if;
986
                                        cycle_ctr <= x"0";
987
                                when x"E0" =>                   --CPX #.
988
                                        pc_inc_fg <= '0';
989
                                        flags_fg <= "01";
990 3 stanley82
                                        dat_out <= reg_x - data_rd;
991
                                        if reg_x >= data_rd then
992 2 stanley82
                                                reg_a(8) <= '1';
993
                                        else
994
                                                reg_a(8) <= '0';
995
                                        end if;
996
                                        cycle_ctr <= x"0";
997
                                when x"C0" =>                   --CPY #.
998
                                        pc_inc_fg <= '0';
999
                                        flags_fg <= "01";
1000 3 stanley82
                                        dat_out <= reg_y - data_rd;
1001
                                        if reg_y >= data_rd then
1002 2 stanley82
                                                reg_a(8) <= '1';
1003
                                        else
1004
                                                reg_a(8) <= '0';
1005
                                        end if;
1006
                                        cycle_ctr <= x"0";
1007
 
1008
--      ===================================================================================================
1009
                                when x"84" =>                   --STY zero 2nd part proto
1010
                                        add_fg <= x"1";
1011 3 stanley82
                                        wr_fg <= '0';
1012 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1013
                                when x"85" =>                   --STA zero 2nd part proto
1014
                                        add_fg <= x"1";
1015 3 stanley82
                                        wr_fg <= '0';
1016 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1017
                                when x"86" =>                   --STX zero 2nd part proto
1018
                                        add_fg <= x"1";
1019 3 stanley82
                                        wr_fg <= '0';
1020 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1021
                                when x"94" =>                   --STY zero, X 2nd part proto
1022
                                        add_fg <= x"2";
1023 3 stanley82
                                        wr_fg <= '0';
1024 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1025
                                when x"95" =>                   --STA zero, X 2nd part proto
1026
                                        add_fg <= x"2";
1027 3 stanley82
                                        wr_fg <= '0';
1028 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1029
                                when x"96" =>                   --STX zero, Y 2nd part proto
1030
                                        add_fg <= x"3";
1031 3 stanley82
                                        wr_fg <= '0';
1032 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1033
 
1034
--      =================================================================================
1035
                                when x"A5" =>                   --LDA zero 2nd part proto
1036
                                        pc_inc_fg <= '1';
1037
                                        add_fg <= x"0";
1038
                                        cycle_ctr <= cycle_ctr + "1";
1039
                                when x"A4" =>                   --LDY zero 2nd part
1040
                                        pc_inc_fg <= '1';
1041
                                        add_fg <= x"0";
1042
                                        cycle_ctr <= cycle_ctr + "1";
1043
                                when x"A6" =>                   --LDX zero 2nd part
1044
                                        pc_inc_fg <= '1';
1045
                                        add_fg <= x"0";
1046
                                        cycle_ctr <= cycle_ctr + "1";
1047
                                when x"B5" =>                   --LDA zero,X 2nd part
1048
                                        pc_inc_fg <= '1';
1049
                                        add_fg <= x"0";
1050
                                        cycle_ctr <= cycle_ctr + "1";
1051
                                when x"B4" =>                   --LDY zero,X 2nd part
1052
                                        pc_inc_fg <= '1';
1053
                                        add_fg <= x"0";
1054
                                        cycle_ctr <= cycle_ctr + "1";
1055
 
1056
                                when x"B6" =>                   --LDX zero,Y 2nd part
1057
                                        pc_inc_fg <= '1';
1058
                                        add_fg <= x"0";
1059
                                        cycle_ctr <= cycle_ctr + "1";
1060
                                when x"05" =>                   --ORA zero 2nd part
1061
                                        pc_inc_fg <= '1';
1062
                                        add_fg <= x"0";
1063
                                        cycle_ctr <= cycle_ctr + "1";
1064
 
1065
                                when x"15" =>                   --ORA zero,X 2nd part
1066
                                        pc_inc_fg <= '1';
1067
                                        add_fg <= x"0";
1068
                                        cycle_ctr <= cycle_ctr + "1";
1069
                                when x"24" =>                   --BIT zero 2nd part
1070
                                        pc_inc_fg <= '1';
1071
                                        add_fg <= x"0";
1072
                                        cycle_ctr <= cycle_ctr + "1";
1073
 
1074
                                when x"25" =>                   --AND zero 2nd part
1075
                                        pc_inc_fg <= '1';
1076
                                        add_fg <= x"0";
1077
                                        cycle_ctr <= cycle_ctr + "1";
1078
 
1079
                                when x"35" =>                   --AND zero,X 2nd part
1080
                                        pc_inc_fg <= '1';
1081
                                        add_fg <= x"0";
1082
                                        cycle_ctr <= cycle_ctr + "1";
1083
 
1084
                                when x"45" =>                   --EOR zero,Y 2nd part
1085
                                        pc_inc_fg <= '1';
1086
                                        add_fg <= x"0";
1087
                                        cycle_ctr <= cycle_ctr + "1";
1088
 
1089
                                when x"55" =>                   --EOR zero,X 2nd part
1090
                                        pc_inc_fg <= '1';
1091
                                        add_fg <= x"0";
1092
                                        cycle_ctr <= cycle_ctr + "1";
1093
 
1094
                                when x"65" =>                   --ADC zero 2nd part
1095
                                        pc_inc_fg <= '1';
1096
                                        add_fg <= x"0";
1097
                                        cycle_ctr <= cycle_ctr + "1";
1098
 
1099
                                when x"75" =>                   --ADC zero,X 2nd part
1100
                                        pc_inc_fg <= '1';
1101
                                        add_fg <= x"0";
1102
                                        cycle_ctr <= cycle_ctr + "1";
1103
 
1104
                                when x"C4" =>                   --CPY zero 2nd part
1105
                                        pc_inc_fg <= '1';
1106
                                        add_fg <= x"0";
1107
                                        cycle_ctr <= cycle_ctr + "1";
1108
 
1109
                                when x"C5" =>                   --CMP zero 2nd part
1110
                                        pc_inc_fg <= '1';
1111 3 stanley82
                                        add_fg <= x"0";
1112 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1113
                                when x"C6" =>                   --DEC zero 2nd part
1114
                                        add_fg <= x"f";
1115
                                        cycle_ctr <= cycle_ctr + "1";
1116
                                when x"D5" =>                   --CMP zero,X 2nd part
1117
                                        pc_inc_fg <= '1';
1118
                                        add_fg <= x"0";
1119
                                        cycle_ctr <= cycle_ctr + "1";
1120
                                when x"D6" =>                   --DEC zero,X 2nd part
1121
                                        pc_inc_fg <= '1';
1122
                                        add_fg <= x"0";
1123
                                        cycle_ctr <= cycle_ctr + "1";
1124
 
1125
                                when x"E4" =>                   --CPX zero 2nd part
1126
                                        pc_inc_fg <= '1';
1127
                                        add_fg <= x"0";
1128
                                        cycle_ctr <= cycle_ctr + "1";
1129
                                when x"E5" =>                   --SBC zero 2nd part
1130
                                        pc_inc_fg <= '1';
1131
                                        add_fg <= x"0";
1132
                                        cycle_ctr <= cycle_ctr + "1";
1133
                                when x"F5" =>                   --SBC zero,X 2nd part
1134
                                        pc_inc_fg <= '1';
1135
                                        add_fg <= x"0";
1136
                                        cycle_ctr <= cycle_ctr + "1";
1137
--      ===================================================================================
1138
                                when x"E6" =>                   --INC zero 2nd part
1139
                                        add_fg <= x"f";
1140
                                        cycle_ctr <= cycle_ctr + "1";
1141
                                when x"F6" =>                   --INC zero,X 2nd part
1142
                                        add_fg <= x"f";
1143
                                        cycle_ctr <= cycle_ctr + "1";
1144
                                when x"46" =>                   --LSR zero 2nd part
1145
                                        add_fg <= x"f";
1146
                                        cycle_ctr <= cycle_ctr + "1";
1147
                                when x"56" =>                   --LSR zero,X 2nd part
1148
                                        add_fg <= x"f";
1149
                                        cycle_ctr <= cycle_ctr + "1";
1150
 
1151
                                when x"66" =>                   --ROR zero 2nd part
1152
                                        add_fg <= x"f";
1153
                                        cycle_ctr <= cycle_ctr + "1";
1154
                                when x"76" =>                   --ROR zero,X 2nd part
1155
                                        add_fg <= x"f";
1156
                                        cycle_ctr <= cycle_ctr + "1";
1157
                                when x"26" =>                   --ROL zero 2nd part
1158
                                        add_fg <= x"f";
1159
                                        cycle_ctr <= cycle_ctr + "1";
1160
                                when x"36" =>                   --ROL zero,X 2nd part
1161
                                        add_fg <= x"f";
1162
                                        cycle_ctr <= cycle_ctr + "1";
1163
                                when x"06" =>                   --ASL zero 2nd part
1164
                                        add_fg <= x"f";
1165
                                        cycle_ctr <= cycle_ctr + "1";
1166
                                when x"16" =>                   --ASL zero,X 2nd part
1167
                                        add_fg <= x"f";
1168
                                        cycle_ctr <= cycle_ctr + "1";
1169
 
1170
 
1171
--      ==============================================================================
1172
                                when x"A1" =>                   --LDA (zero,x) 2nd part proto
1173
                                        add_fg <= x"D";
1174
                                        cycle_ctr <= cycle_ctr + "1";
1175
                                when x"B1" =>                   --LDA (zero),y 2nd part proto
1176
                                        add_fg <= x"C";
1177
                                        cycle_ctr <= cycle_ctr + "1";
1178
 
1179
                                when x"21" =>                   --AND (zero,x) 2nd part proto
1180
                                        add_fg <= x"D";
1181
                                        cycle_ctr <= cycle_ctr + "1";
1182
                                when x"31" =>                   --AND (zero),y 2nd part proto
1183
                                        add_fg <= x"C";
1184
                                        cycle_ctr <= cycle_ctr + "1";
1185
 
1186
                                when x"41" =>                   --EOR (zero,x) 2nd part proto
1187
                                        add_fg <= x"D";
1188
                                        cycle_ctr <= cycle_ctr + "1";
1189
                                when x"51" =>                   --EOR (zero),y 2nd part proto
1190
                                        add_fg <= x"C";
1191
                                        cycle_ctr <= cycle_ctr + "1";
1192
 
1193
                                when x"01" =>                   --OR (zero,x) 2nd part proto
1194
                                        add_fg <= x"D";
1195
                                        cycle_ctr <= cycle_ctr + "1";
1196
                                when x"11" =>                   --OR (zero),y 2nd part proto
1197
                                        add_fg <= x"C";
1198
                                        cycle_ctr <= cycle_ctr + "1";
1199
 
1200
                                when x"61" =>                   --ADC (zero,x) 2nd part proto
1201
                                        add_fg <= x"D";
1202
                                        cycle_ctr <= cycle_ctr + "1";
1203
                                when x"71" =>                   --ADC (zero),y 2nd part proto
1204
                                        add_fg <= x"C";
1205
                                        cycle_ctr <= cycle_ctr + "1";
1206
 
1207
                                when x"E1" =>                   --SBC (zero,x) 2nd part proto
1208
                                        add_fg <= x"D";
1209
                                        cycle_ctr <= cycle_ctr + "1";
1210
                                when x"F1" =>                   --SBC (zero),y 2nd part proto
1211
                                        add_fg <= x"C";
1212
                                        cycle_ctr <= cycle_ctr + "1";
1213
 
1214
                                when x"C1" =>                   --CMP (zero,x) 2nd part proto
1215
                                        add_fg <= x"D";
1216
                                        cycle_ctr <= cycle_ctr + "1";
1217
                                when x"D1" =>                   --CMP (zero),y 2nd part proto
1218
                                        add_fg <= x"C";
1219
                                        cycle_ctr <= cycle_ctr + "1";
1220
 
1221
                                when x"81" =>                   --STA (zero,x) 2nd part proto
1222
                                        add_fg <= x"D";
1223
                                        cycle_ctr <= cycle_ctr + "1";
1224
                                when x"91" =>                   --STA (zero),y 2nd part proto
1225
                                        add_fg <= x"C";
1226
                                        cycle_ctr <= cycle_ctr + "1";
1227
--      ==============================================================================
1228
                                when x"AD" =>                   --LDA abs 2nd part.
1229
                                        add_fg <= x"4";
1230
                                        cycle_ctr <= cycle_ctr + x"1";
1231
                                when x"BD" =>                   --LDA, x abs 2nd part.
1232
                                        add_fg <= x"5";
1233
                                        cycle_ctr <= cycle_ctr + x"1";
1234
                                when x"B9" =>                   --LDA, Y abs 2nd part.
1235
                                        add_fg <= x"6";
1236
                                        cycle_ctr <= cycle_ctr + x"1";
1237
 
1238
                                when x"2D" =>                   --AND abs 2nd part.
1239
                                        add_fg <= x"4";
1240
                                        cycle_ctr <= cycle_ctr + x"1";
1241
 
1242
                                when x"3D" =>                   --AND, x abs 2nd part.
1243 3 stanley82
 
1244 2 stanley82
                                        add_fg <= x"5";
1245
                                        cycle_ctr <= cycle_ctr + x"1";
1246
                                when x"39" =>                   --AND, Y abs 2nd part.
1247
                                        add_fg <= x"6";
1248
                                        cycle_ctr <= cycle_ctr + x"1";
1249
 
1250
                                when x"0D" =>                   --ORA abs 2nd part.
1251
                                        add_fg <= x"4";
1252
                                        cycle_ctr <= cycle_ctr + x"1";
1253
                                when x"1D" =>                   --ORA, x abs 2nd part.
1254
                                        add_fg <= x"5";
1255
                                        cycle_ctr <= cycle_ctr + x"1";
1256
                                when x"19" =>                   --ORA, Y abs 2nd part.
1257
                                        add_fg <= x"6";
1258
                                        cycle_ctr <= cycle_ctr + x"1";
1259
 
1260
                                when x"4D" =>                   --EOR abs 2nd part.
1261
                                        add_fg <= x"4";
1262
                                        cycle_ctr <= cycle_ctr + x"1";
1263
                                when x"5D" =>                   --EOR, x abs 2nd part.
1264
                                        add_fg <= x"5";
1265
                                        cycle_ctr <= cycle_ctr + x"1";
1266
                                when x"59" =>                   --EOR, Y abs 2nd part.
1267
                                        add_fg <= x"6";
1268
                                        cycle_ctr <= cycle_ctr + x"1";
1269
 
1270
                                when x"6D" =>                   --ADC abs 2nd part.
1271
                                        add_fg <= x"4";
1272
                                        cycle_ctr <= cycle_ctr + x"1";
1273
                                when x"7D" =>                   --ADC, x abs 2nd part.
1274
                                        add_fg <= x"5";
1275
                                        cycle_ctr <= cycle_ctr + x"1";
1276
                                when x"79" =>                   --ADC, Y abs 2nd part.
1277
                                        add_fg <= x"6";
1278
                                        cycle_ctr <= cycle_ctr + x"1";
1279
 
1280
                                when x"ED" =>                   --SBC abs 2nd part.
1281
                                        add_fg <= x"4";
1282
                                        cycle_ctr <= cycle_ctr + x"1";
1283
                                when x"FD" =>                   --SBC, x abs 2nd part.
1284
                                        add_fg <= x"5";
1285
                                        cycle_ctr <= cycle_ctr + x"1";
1286
                                when x"F9" =>                   --SBC, Y abs 2nd part.
1287
                                        add_fg <= x"6";
1288
                                        cycle_ctr <= cycle_ctr + x"1";
1289
 
1290
                                when x"AE" =>                   --LDX abs 2nd part.
1291
                                        add_fg <= x"4";
1292
                                        cycle_ctr <= cycle_ctr + x"1";
1293
                                when x"BE" =>                   --LDX, y abs 2nd part.
1294
                                        add_fg <= x"6";
1295
                                        cycle_ctr <= cycle_ctr + x"1";
1296
                                when x"AC" =>                   --LDY abs 2nd part.
1297
                                        add_fg <= x"4";
1298
                                        cycle_ctr <= cycle_ctr + x"1";
1299
                                when x"BC" =>                   --LDY, x abs 2nd part.
1300
                                        add_fg <= x"5";
1301
                                        cycle_ctr <= cycle_ctr + x"1";
1302
 
1303
                                when x"2C" =>                   --BIT abs 2nd part.
1304
                                        add_fg <= x"4";
1305
                                        cycle_ctr <= cycle_ctr + x"1";
1306
 
1307
                                when x"CD" =>                   --CMP abs 2nd part.
1308
                                        add_fg <= x"4";
1309
                                        cycle_ctr <= cycle_ctr + x"1";
1310
                                when x"DD" =>                   --CMP, x abs 2nd part.
1311
                                        add_fg <= x"5";
1312
                                        cycle_ctr <= cycle_ctr + x"1";
1313
                                when x"D9" =>                   --CMP, Y abs 2nd part.
1314
                                        add_fg <= x"6";
1315
                                        cycle_ctr <= cycle_ctr + x"1";
1316
                                when x"EC" =>                   --CPX abs 2nd part.
1317
                                        add_fg <= x"4";
1318
                                        cycle_ctr <= cycle_ctr + x"1";
1319
                                when x"CC" =>                   --CPY abs 2nd part.
1320
                                        add_fg <= x"4";
1321
                                        cycle_ctr <= cycle_ctr + x"1";
1322
--      ...............................................................................
1323
                                when x"8D" =>                   --STA abs 2nd part.
1324 3 stanley82
                                        wr_fg <= '1';
1325 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
1326
                                when x"9D" =>                   --STA,x abs 2nd part.
1327 3 stanley82
                                        wr_fg <= '1';
1328 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
1329
                                when x"99" =>                   --STA, y abs 2nd part.
1330 3 stanley82
                                        wr_fg <= '1';
1331 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
1332
                                when x"8E" =>                   --STX abs 2nd part.
1333 3 stanley82
                                        wr_fg <= '1';
1334 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
1335
                                when x"8C" =>                   --STY abs 2nd part.
1336 3 stanley82
                                        wr_fg <= '1';
1337 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
1338
--      ........................................................................
1339
 
1340
                                when x"EE" =>                   --INC abs 2nd part.
1341
                                        add_fg <= x"4";
1342
                                        cycle_ctr <= cycle_ctr + x"1";
1343
                                when x"FE" =>                   --INC, x abs 2nd part.
1344
                                        add_fg <= x"5";
1345
                                        cycle_ctr <= cycle_ctr + x"1";
1346
                                when x"CE" =>                   --DEC abs 2nd part.
1347
                                        add_fg <= x"4";
1348
                                        cycle_ctr <= cycle_ctr + x"1";
1349
                                when x"DE" =>                   --DEC, x abs 2nd part.
1350
                                        add_fg <= x"4";
1351
                                        cycle_ctr <= cycle_ctr + x"1";
1352
                                when x"2E" =>                   --ROL abs 2nd part.
1353
                                        add_fg <= x"4";
1354
                                        cycle_ctr <= cycle_ctr + x"1";
1355
                                when x"3E" =>                   --ROL, x abs 2nd part.
1356
                                        add_fg <= x"5";
1357
                                        cycle_ctr <= cycle_ctr + x"1";
1358
                                when x"6E" =>                   --ROR abs 2nd part.
1359
                                        add_fg <= x"4";
1360
                                        cycle_ctr <= cycle_ctr + x"1";
1361
                                when x"7E" =>                   --ROR, x abs 2nd part.
1362
                                        add_fg <= x"5";
1363
                                        cycle_ctr <= cycle_ctr + x"1";
1364
                                when x"4E" =>                   --LSR abs 2nd part.
1365
                                        add_fg <= x"4";
1366
                                        cycle_ctr <= cycle_ctr + x"1";
1367
                                when x"5E" =>                   --LSR, x abs 2nd part.
1368
                                        add_fg <= x"5";
1369
                                        cycle_ctr <= cycle_ctr + x"1";
1370
                                when x"0E" =>                   --ASL abs 2nd part.
1371
                                        add_fg <= x"4";
1372
                                        cycle_ctr <= cycle_ctr + x"1";
1373
                                when x"1E" =>                   --ASL, x abs 2nd part.
1374
                                        add_fg <= x"5";
1375
                                        cycle_ctr <= cycle_ctr + x"1";
1376
--      ............................................................................
1377
--      ==============================================================================
1378
                                when x"4C" =>                   --JMP abs 2nd part
1379
                                        pc_inc_fg <= '0';
1380
                                        dat2pc_fg <= '1';
1381
                                        cycle_ctr <= cycle_ctr + "1";
1382
                                when x"6C" =>                   --JMP indirect 2nd part
1383
                                        add_fg <= x"4";
1384
                                        pc_inc_fg <= '0';
1385
                                        cycle_ctr <= cycle_ctr + "1";
1386
                                when x"20" =>                   --JSR abs 2nd part
1387
                                        dat2pc_fg <= '1';
1388 3 stanley82
                                        wr_fg <= '1';
1389
                                        dat_out <= reg_pc(15 downto 8);
1390 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
1391
 
1392
                                when x"60" =>                   --RTS second part
1393
                                        reg_sp <= reg_sp - "1";
1394
                                        cycle_ctr <= cycle_ctr + x"1";
1395
                                when x"40" =>                   --RTI second part pull old status from stack
1396
                                        reg_sp <= reg_sp - "1";
1397
                                        cycle_ctr <= cycle_ctr + x"1";
1398
 
1399
                                when x"00" =>                   --Break second part  cyc 1
1400 3 stanley82
                                        dat2pc_fg <= '0';
1401
                                        wr_fg <= '1';                   --put dat_out onto stack
1402
                                        dat_out <= reg_pc(15 downto 8);
1403 2 stanley82
                                        add_fg <= x"7";
1404
                                        pc_dec_fg <= '0';
1405
                                        cycle_ctr <= cycle_ctr + x"1";
1406
 
1407
                                when others =>
1408
                                cycle_ctr <= cycle_ctr + x"1";
1409
                        end case;       --Cycle 1
1410
 
1411
 
1412
--      End cycle 1     =========================================================
1413
 
1414
                when x"2" =>
1415
 
1416
                        case instruction_in(7 downto 0) is
1417
--      ====================================================================================
1418
 
1419
                                when x"48" =>                   --PHA 3rd part accumulator onto stack
1420
                                        pc_inc_fg <= '1';
1421
                                        add_fg <= x"0";
1422
                                        reg_sp <= reg_sp + "1";
1423
                                        cycle_ctr <= cycle_ctr + x"1";
1424
                                when x"08" =>                   --PHP 3rd part Status reg onto stack
1425 3 stanley82
                                        wr_fg <= '0';
1426
                                        add_fg <= x"7";
1427 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
1428
 
1429
                                when x"68" =>                   --PLA 3rd part  Pull Accumulator from Stack
1430 3 stanley82
--                                      pc_dec_fg <= '0';
1431 2 stanley82
                                        add_fg <= x"0";
1432
                                        pc_inc_fg <= '1';
1433
                                        cycle_ctr <= cycle_ctr + x"1";
1434
                                when x"28" =>                   --PLP 3rd part  Pull Status from Stack
1435 3 stanley82
--                                      pc_dec_fg <= '0';
1436 2 stanley82
                                        add_fg <= x"0";
1437
                                        pc_inc_fg <= '1';
1438
                                        cycle_ctr <= cycle_ctr + x"1";
1439
 
1440
                                when x"F0" =>                   --BEQ branch true 3rd part.
1441
                                        if branch_fg = '1' then
1442
                                                branch_fg <= '0';
1443
                                                cycle_ctr <= cycle_ctr + x"1";
1444
                                        else
1445
                                                pc_inc_fg <= '0';
1446
                                                cycle_ctr <= x"0";
1447
                                        end if;
1448
                                when x"D0" =>                   --BNE branch true 3rd part.
1449
                                        if branch_fg = '1' then
1450
                                                branch_fg <= '0';
1451
                                                cycle_ctr <= cycle_ctr + x"1";
1452
                                        else
1453
                                                pc_inc_fg <= '0';
1454
                                                cycle_ctr <= x"0";
1455
                                        end if;
1456
                                when x"10" =>                   --BPL plus true 3rd part.
1457
                                        if branch_fg = '1' then
1458
                                                branch_fg <= '0';
1459
                                                cycle_ctr <= cycle_ctr + x"1";
1460
                                        else
1461
                                                pc_inc_fg <= '0';
1462
                                                cycle_ctr <= x"0";
1463
                                        end if;
1464
                                when x"30" =>                   --BM1 negative true 3rd part.
1465
                                        if branch_fg = '1' then
1466
                                                branch_fg <= '0';
1467
                                                cycle_ctr <= cycle_ctr + x"1";
1468
                                        else
1469
                                                pc_inc_fg <= '0';
1470
                                                cycle_ctr <= x"0";
1471
                                        end if;
1472
                                when x"50" =>                   --BVC overflow false 3rd part.
1473
                                        if branch_fg = '1' then
1474
                                                branch_fg <= '0';
1475
                                                cycle_ctr <= cycle_ctr + x"1";
1476
                                        else
1477
                                                pc_inc_fg <= '0';
1478
                                                cycle_ctr <= x"0";
1479
                                        end if;
1480
                                when x"70" =>                   --BVS overflow true 3rd part.
1481
                                        if branch_fg = '1' then
1482
                                                branch_fg <= '0';
1483
                                                cycle_ctr <= cycle_ctr + x"1";
1484
                                        else
1485
                                                pc_inc_fg <= '0';
1486
                                                cycle_ctr <= x"0";
1487
                                        end if;
1488
                                when x"90" =>                   --BCC carry false 3rd part.
1489
                                        if branch_fg = '1' then
1490
                                                branch_fg <= '0';
1491
                                                cycle_ctr <= cycle_ctr + x"1";
1492
                                        else
1493
                                                pc_inc_fg <= '0';
1494
                                                cycle_ctr <= x"0";
1495
                                        end if;
1496
                                when x"B0" =>                   --BCS carry true 3rd part.
1497
                                        if branch_fg = '1' then
1498
                                                branch_fg <= '0';
1499
                                                cycle_ctr <= cycle_ctr + x"1";
1500
                                        else
1501
                                                pc_inc_fg <= '0';
1502
                                                cycle_ctr <= x"0";
1503
                                        end if;
1504 3 stanley82
 
1505 2 stanley82
--      ====================================================================================
1506
                                when x"84" =>                   --STY zero 3rd part proto
1507
                                        pc_inc_fg <= '1';
1508
                                        add_fg <= x"0";
1509
                                        cycle_ctr <= cycle_ctr + x"1";
1510
                                when x"85" =>                   --STA zero 3rd part proto
1511
                                        pc_inc_fg <= '1';
1512
                                        add_fg <= x"0";
1513
                                        cycle_ctr <= cycle_ctr + x"1";
1514
                                when x"86" =>                   --STX zero 3rd part proto
1515
                                        pc_inc_fg <= '1';
1516
                                        add_fg <= x"0";
1517
                                        cycle_ctr <= cycle_ctr + x"1";
1518
                                when x"94" =>                   --STY zero, X 3rd part proto
1519
                                        pc_inc_fg <= '1';
1520
                                        add_fg <= x"0";
1521
                                        cycle_ctr <= cycle_ctr + x"1";
1522
                                when x"95" =>                   --STA zero, X 3rd part proto
1523
                                        pc_inc_fg <= '1';
1524
                                        add_fg <= x"0";
1525
                                        cycle_ctr <= cycle_ctr + x"1";
1526
                                when x"96" =>                   --STX zero, Y 3rd part proto
1527
                                        pc_inc_fg <= '1';
1528
                                        add_fg <= x"0";
1529
                                        cycle_ctr <= cycle_ctr + x"1";
1530
 
1531
--      ========================================================================================
1532
                                when x"A5" =>                   --LDA zero 3rd part proto
1533
                                        pc_inc_fg <= '0';
1534
                                        reg_a(7 downto 0) <= data_rd;
1535
                                        flags_fg <= "01";
1536 3 stanley82
                                        dat_out <= data_rd;
1537 2 stanley82
                                        cycle_ctr <= x"0";
1538
                                when x"A4" =>                   --LDY zero 3rd part
1539
                                        pc_inc_fg <= '0';
1540
                                        reg_y <= data_rd;
1541
                                        flags_fg <= "01";
1542 3 stanley82
                                        dat_out <= data_rd;
1543 2 stanley82
                                        cycle_ctr <= x"0";
1544
                                when x"A6" =>                   --LDX zero 3rd part
1545
                                        pc_inc_fg <= '0';
1546
                                        reg_x <= data_rd;
1547
                                        flags_fg <= "01";
1548 3 stanley82
                                        dat_out <= data_rd;
1549 2 stanley82
                                        cycle_ctr <= x"0";
1550
                                when x"B5" =>                   --LDA zero,X 3rd part
1551
                                        pc_inc_fg <= '0';
1552
                                        reg_a(7 downto 0) <= data_rd;
1553
                                        flags_fg <= "01";
1554 3 stanley82
                                        dat_out <= data_rd;
1555 2 stanley82
                                        cycle_ctr <= x"0";
1556
                                when x"B4" =>                   --LDY zero,X 3rd part
1557
                                        pc_inc_fg <= '0';
1558
                                        reg_y <= data_rd;
1559
                                        flags_fg <= "01";
1560 3 stanley82
                                        dat_out <= data_rd;
1561 2 stanley82
                                        cycle_ctr <= x"0";
1562
                                when x"B6" =>                   --LDX zero,Y 3rd part
1563 3 stanley82
                                        wr_fg <= '0';
1564 2 stanley82
                                        pc_inc_fg <= '0';
1565
                                        reg_x <= data_rd;
1566
                                        flags_fg <= "01";
1567 3 stanley82
                                        dat_out <= data_rd;
1568 2 stanley82
                                        cycle_ctr <= x"0";
1569
                                when x"05" =>                   --ORA zero 3rd part
1570
                                        pc_inc_fg <= '0';
1571
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
1572
                                        flags_fg <= "01";
1573 3 stanley82
                                        dat_out <= reg_a(7 downto 0) or data_rd;
1574 2 stanley82
                                        cycle_ctr <= x"0";
1575
                                when x"15" =>                   --ORA zero,X 3rd part
1576
                                        pc_inc_fg <= '0';
1577
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
1578
                                        flags_fg <= "01";
1579 3 stanley82
                                        dat_out <= reg_a(7 downto 0) or data_rd;
1580 2 stanley82
                                        cycle_ctr <= x"0";
1581
                                when x"24" =>                   --BIT zero 3rd part
1582
                                        pc_inc_fg <= '0';
1583
                                        n_fg <= data_rd(7);
1584
                                        v_fg <= data_rd(6);
1585 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
1586 2 stanley82
                                        flags_fg <= "01";
1587
                                        cycle_ctr <= x"0";
1588
                                when x"25" =>                   --AND zero 3rd part
1589
                                        pc_inc_fg <= '0';
1590
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
1591
                                        flags_fg <= "01";
1592 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
1593 2 stanley82
                                        cycle_ctr <= x"0";
1594
 
1595
                                when x"35" =>                   --AND zero,X 3rd part
1596
                                        pc_inc_fg <= '0';
1597
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
1598
                                        flags_fg <= "01";
1599 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
1600 2 stanley82
                                        cycle_ctr <= x"0";
1601
 
1602
                                when x"45" =>                   --EOR zero 3rd part
1603
                                        pc_inc_fg <= '0';
1604
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
1605
                                        flags_fg <= "01";
1606 3 stanley82
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
1607 2 stanley82
                                        cycle_ctr <= x"0";
1608
 
1609
                                when x"55" =>                   --EOR zero,X 3rd part
1610
                                        pc_inc_fg <= '0';
1611
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
1612
                                        flags_fg <= "01";
1613 3 stanley82
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
1614 2 stanley82
                                        cycle_ctr <= x"0";
1615
 
1616
                                when x"65" =>                   --ADC zero 3rd part
1617
                                        pc_inc_fg <= '0';
1618
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
1619
                                        flags_fg <= "01";
1620 3 stanley82
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
1621 2 stanley82
                                        cycle_ctr <= x"0";
1622
 
1623
                                when x"75" =>                   --ADC zero,X 3rd part
1624
                                        pc_inc_fg <= '0';
1625
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
1626
                                        flags_fg <= "01";
1627 3 stanley82
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
1628 2 stanley82
                                        cycle_ctr <= x"0";
1629
 
1630
                                when x"C4" =>                   --CPY zero 3rd part
1631 3 stanley82
                                        flags_fg <= "01";
1632
                                        dat_out <= reg_y - data_rd;
1633
                                        if reg_y >= data_rd then
1634
                                                reg_a(8) <= '1';
1635
                                        else
1636
                                                reg_a(8) <= '0';
1637
                                        end if;
1638 2 stanley82
                                        pc_inc_fg <= '0';
1639
                                        cycle_ctr <= x"0";
1640
                                when x"C5" =>                   --CMP zero 3rd part
1641
                                        flags_fg <= "01";
1642 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd;
1643
                                        if reg_a(7 downto 0) >= data_rd then
1644 2 stanley82
                                                reg_a(8) <= '1';
1645
                                        else
1646
                                                reg_a(8) <= '0';
1647
                                        end if;
1648
                                        pc_inc_fg <= '0';
1649
                                        cycle_ctr <= x"0";
1650
                                when x"C6" =>                   --DEC zero 3rd part
1651 3 stanley82
                                        dat_out <= data_rd - x"01";
1652
                                        dat_out <= data_rd - x"01";
1653
                                        wr_fg <= '1';
1654 2 stanley82
                                        flags_fg <= "01";
1655
                                        cycle_ctr <= cycle_ctr + "1";
1656
                                when x"D5" =>                   --CMP zero,X 3rd part
1657
                                        flags_fg <= "01";
1658 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd;
1659
                                        if reg_a(7 downto 0) >= data_rd then
1660 2 stanley82
                                                reg_a(8) <= '1';
1661
                                        else
1662
                                                reg_a(8) <= '0';
1663
                                        end if;
1664
                                        pc_inc_fg <= '0';
1665
                                        cycle_ctr <= x"0";
1666
                                when x"D6" =>                   --DEC zero,X 3rd part
1667
                                        pc_inc_fg <= '0';
1668
                                        add_fg <= x"0";
1669
                                        reg_a(7 downto 0) <= data_rd;
1670
                                        flags_fg <= "01";
1671 3 stanley82
                                        dat_out <= data_rd;
1672 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1673
                                when x"E4" =>                   --CPX zero 3rd part
1674 3 stanley82
                                        flags_fg <= "01";
1675
                                        dat_out <= reg_x - data_rd;
1676
                                        if reg_X >= data_rd then
1677
                                                reg_a(8) <= '1';
1678
                                        else
1679
                                                reg_a(8) <= '0';
1680
                                        end if;
1681 2 stanley82
                                        pc_inc_fg <= '0';
1682
                                        cycle_ctr <= x"0";
1683
                                when x"E5" =>                   --SBC zero 3rd part
1684
                                        pc_inc_fg <= '0';
1685
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
1686 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
1687 2 stanley82
                                        flags_fg <= "01";
1688
                                        cycle_ctr <= x"0";
1689
 
1690
 
1691
                                when x"F5" =>                   --SBC zero,X 3rd part
1692
                                        pc_inc_fg <= '0';
1693
                                        reg_a <= reg_a - ('0' & data_rd) - ("00000000" & reg_a(8));
1694 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
1695 2 stanley82
                                        flags_fg <= "01";
1696
                                        cycle_ctr <= x"0";
1697
 
1698
                                when x"E6" =>                   --INC zero 3rd part
1699 3 stanley82
                                        dat_out <= data_rd + x"01";
1700
                                        wr_fg <= '1';
1701 2 stanley82
                                        flags_fg <= "01";
1702
                                        cycle_ctr <= cycle_ctr + "1";
1703
                                when x"F6" =>                   --INC zero,X 3rd part
1704 3 stanley82
                                        dat_out <= data_rd + x"01";
1705
 
1706
                                        wr_fg <= '1';
1707 2 stanley82
                                        flags_fg <= "01";
1708
                                        cycle_ctr <= cycle_ctr + "1";
1709
 
1710
                                when x"66" =>                   --ROR zero 3rd part
1711
                                        reg_a(8) <= data_rd(0);
1712 3 stanley82
                                        dat_out <= reg_a(8) & data_rd(7 downto 1);
1713
                                        wr_fg <= '1';
1714 2 stanley82
                                        flags_fg <= "01";
1715
                                        cycle_ctr <= cycle_ctr + "1";
1716
 
1717
                                when x"76" =>                   --ROR zero,X 3rd part
1718
                                        reg_a(8) <= data_rd(0);
1719 3 stanley82
                                        dat_out <= reg_a(8) & data_rd(7 downto 1);
1720
                                        wr_fg <= '1';
1721 2 stanley82
                                        flags_fg <= "01";
1722
                                        cycle_ctr <= cycle_ctr + "1";
1723
 
1724
                                when x"26" =>                   --ROL zero 3rd part
1725 3 stanley82
                                        dat_out(7 downto 1) <= data_rd(6 downto 0);
1726
                                        dat_out(0) <= reg_a(8);
1727 2 stanley82
                                        flags_fg <= "01";
1728 3 stanley82
                                        wr_fg <= '1';
1729 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1730
                                when x"36" =>                   --ROL zero,X 3rd part
1731 3 stanley82
                                        dat_out(7 downto 1) <= data_rd(6 downto 0);
1732
                                        dat_out(0) <= reg_a(8);
1733 2 stanley82
                                        flags_fg <= "01";
1734 3 stanley82
                                        wr_fg <= '1';
1735 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1736
                                when x"46" =>                   --LSR zero 3rd part
1737 3 stanley82
                                        dat_out <= '0' & reg_a(7 downto 1);
1738 2 stanley82
                                        reg_a(8) <= data_rd(0);
1739 3 stanley82
                                        wr_fg <= '1';
1740 2 stanley82
                                        flags_fg <= "01";
1741
                                        cycle_ctr <= cycle_ctr + "1";
1742
                                when x"56" =>                   --LSR zero,X 3rd part
1743 3 stanley82
                                        dat_out <= '0' & reg_a(7 downto 1);
1744 2 stanley82
                                        reg_a(8) <= data_rd(0);
1745 3 stanley82
                                        wr_fg <= '1';
1746 2 stanley82
                                        flags_fg <= "01";
1747
                                        cycle_ctr <= cycle_ctr + "1";
1748
                                when x"06" =>                   --ASL zero 3rd part
1749
                                        reg_a(8) <= data_rd(7);
1750 3 stanley82
                                        dat_out <= data_rd(6 downto 0) & '0';
1751
                                        wr_fg <= '1';
1752 2 stanley82
                                        flags_fg <= "01";
1753
                                        cycle_ctr <= cycle_ctr + "1";
1754
                                when x"16" =>                   --ASL zero,X 3rd part
1755
                                        reg_a(8) <= data_rd(7);
1756 3 stanley82
                                        dat_out <= data_rd(6 downto 0) & data_rd(0);
1757
                                        wr_fg <= '1';
1758 2 stanley82
                                        flags_fg <= "01";
1759
                                        cycle_ctr <= cycle_ctr + "1";
1760
 
1761
--      =============================================================================================
1762
                                when x"A1" =>                   --LDA (zero,x) 3rd part proto
1763
                                        add_fg <= x"6";
1764
                                        cycle_ctr <= cycle_ctr + "1";
1765
                                when x"B1" =>                   --LDA (zero),y 3rd part proto
1766
                                        add_fg <= x"6";
1767
                                        cycle_ctr <= cycle_ctr + "1";
1768
 
1769
                                when x"21" =>                   --AMD (zero,x) 3rd part proto
1770
                                        add_fg <= x"6";
1771
                                        cycle_ctr <= cycle_ctr + "1";
1772
                                when x"31" =>                   --AND (zero),y 3rd part proto
1773
                                        add_fg <= x"6";
1774
                                        cycle_ctr <= cycle_ctr + "1";
1775
 
1776
                                when x"41" =>                   --EOR (zero,x) 3rd part proto
1777
                                        add_fg <= x"6";
1778
                                        cycle_ctr <= cycle_ctr + "1";
1779
                                when x"51" =>                   --EOR (zero),y 3rd part proto
1780
                                        add_fg <= x"6";
1781
                                        cycle_ctr <= cycle_ctr + "1";
1782
 
1783
                                when x"01" =>                   --OR (zero,x) 3rd part proto
1784
                                        add_fg <= x"6";
1785
                                        cycle_ctr <= cycle_ctr + "1";
1786
                                when x"11" =>                   --OR (zero),y 3rd part proto
1787
                                        add_fg <= x"6";
1788
                                        cycle_ctr <= cycle_ctr + "1";
1789
 
1790
                                when x"61" =>                   --ADC (zero,x) 3rd part proto
1791
                                        add_fg <= x"6";
1792
                                        cycle_ctr <= cycle_ctr + "1";
1793
                                when x"71" =>                   --ADC (zero),y 3rd part proto
1794
                                        add_fg <= x"6";
1795
                                        cycle_ctr <= cycle_ctr + "1";
1796
 
1797
                                when x"E1" =>                   --SBC (zero,x) 3rd part proto
1798
                                        add_fg <= x"6";
1799
                                        cycle_ctr <= cycle_ctr + "1";
1800
                                when x"F1" =>                   --SBC (zero),y 3rd part proto
1801
                                        add_fg <= x"6";
1802
                                        cycle_ctr <= cycle_ctr + "1";
1803
 
1804
                                when x"C1" =>                   --CMP (zero,x) 3rd part proto
1805
                                        add_fg <= x"6";
1806
                                        cycle_ctr <= cycle_ctr + "1";
1807
                                when x"D1" =>                   --CMP (zero),y 3rd part proto
1808
                                        add_fg <= x"6";
1809
                                        cycle_ctr <= cycle_ctr + "1";
1810
 
1811
                                when x"81" =>                   --STA (zero,x) 3rd part proto
1812
                                        add_fg <= x"4";
1813 3 stanley82
                                        wr_fg <= '1';
1814
                                        dat_out <= reg_a(7 downto 0);
1815 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1816
                                when x"91" =>                   --STA (zero),y 3rd part proto
1817
                                        add_fg <= x"6";
1818 3 stanley82
                                        wr_fg <= '1';
1819
                                        dat_out <= reg_a(7 downto 0);
1820 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
1821
--      ==============================================================================
1822
                                when x"AD" =>                   --LDA abs 3rd part.
1823
                                        add_fg <= x"0";
1824
                                        pc_inc_fg <= '1';
1825
                                        cycle_ctr <= cycle_ctr + "1";
1826
 
1827
                                when x"BD" =>                   --LDA, x abs 3rd part.
1828
                                        add_fg <= x"0";
1829
                                        pc_inc_fg <= '1';
1830
                                        cycle_ctr <= cycle_ctr + "1";
1831
 
1832
                                when x"B9" =>                   --LDA, Y abs 3rd part
1833
                                        add_fg <= x"0";
1834
                                        pc_inc_fg <= '1';
1835
                                        cycle_ctr <= cycle_ctr + "1";
1836
 
1837
 
1838
                                when x"2D" =>                   --AND abs 3rd part.
1839
                                        add_fg <= x"0";
1840
                                        pc_inc_fg <= '1';
1841
                                        cycle_ctr <= cycle_ctr + "1";
1842
 
1843
                                when x"3D" =>                   --AND, x abs 3rd part.
1844
                                        add_fg <= x"0";
1845
                                        pc_inc_fg <= '1';
1846
                                        cycle_ctr <= cycle_ctr + "1";
1847
                                when x"39" =>                   --AND, Y abs 3rd part.
1848
                                        add_fg <= x"0";
1849
                                        pc_inc_fg <= '1';
1850
                                        cycle_ctr <= cycle_ctr + "1";
1851
 
1852
                                when x"0D" =>                   --ORA abs 3rd part.
1853
                                        add_fg <= x"0";
1854
                                        pc_inc_fg <= '1';
1855
                                        cycle_ctr <= cycle_ctr + "1";
1856
                                when x"1D" =>                   --ORA, x abs 3rd part.
1857
                                        add_fg <= x"0";
1858
                                        pc_inc_fg <= '1';
1859
                                        cycle_ctr <= cycle_ctr + "1";
1860
                                when x"19" =>                   --ORA, Y abs 3rd part.
1861
                                        add_fg <= x"0";
1862
                                        pc_inc_fg <= '1';
1863
                                        cycle_ctr <= cycle_ctr + "1";
1864
 
1865
                                when x"4D" =>                   --EOR abs 3rd part.
1866
                                        add_fg <= x"0";
1867
                                        pc_inc_fg <= '1';
1868
                                        cycle_ctr <= cycle_ctr + "1";
1869
                                when x"5D" =>                   --EOR, x abs 3rd part.
1870
                                        add_fg <= x"0";
1871
                                        pc_inc_fg <= '1';
1872
                                        cycle_ctr <= cycle_ctr + "1";
1873
                                when x"59" =>                   --EOR, Y abs 3rd part.
1874
                                        add_fg <= x"0";
1875
                                        pc_inc_fg <= '1';
1876
                                        cycle_ctr <= cycle_ctr + "1";
1877
 
1878
                                when x"6D" =>                   --ADC abs 3rd part.
1879
                                        add_fg <= x"0";
1880
                                        pc_inc_fg <= '1';
1881
                                        cycle_ctr <= cycle_ctr + "1";
1882
                                when x"7D" =>                   --ADC, x abs 3rd part.
1883
                                        add_fg <= x"0";
1884
                                        pc_inc_fg <= '1';
1885
                                        cycle_ctr <= cycle_ctr + "1";
1886
                                when x"79" =>                   --ADC, Y abs 3rd part.
1887
                                        add_fg <= x"0";
1888
                                        pc_inc_fg <= '1';
1889
                                        cycle_ctr <= cycle_ctr + "1";
1890
 
1891
                                when x"ED" =>                   --SBC abs 3rd part.
1892
                                        add_fg <= x"0";
1893
                                        pc_inc_fg <= '1';
1894
                                        cycle_ctr <= cycle_ctr + "1";
1895
                                when x"FD" =>                   --SBC, x abs 3rd part.
1896
                                        add_fg <= x"0";
1897
                                        pc_inc_fg <= '1';
1898
                                        cycle_ctr <= cycle_ctr + "1";
1899
                                when x"F9" =>                   --SBC, Y abs 3rd part.
1900
                                        add_fg <= x"0";
1901
                                        pc_inc_fg <= '1';
1902
                                        cycle_ctr <= cycle_ctr + "1";
1903
 
1904
                                when x"AE" =>                   --LDX abs 3rd part.
1905
                                        add_fg <= x"0";
1906
                                        pc_inc_fg <= '1';
1907
                                        cycle_ctr <= cycle_ctr + "1";
1908
                                when x"BE" =>                   --LDX, y abs 3rd part.
1909
                                        add_fg <= x"0";
1910
                                        pc_inc_fg <= '1';
1911
                                        cycle_ctr <= cycle_ctr + "1";
1912
                                when x"AC" =>                   --LDY abs 3rd part.
1913
                                        add_fg <= x"0";
1914
                                        pc_inc_fg <= '1';
1915
                                        cycle_ctr <= cycle_ctr + "1";
1916
                                when x"BC" =>                   --LDY, x abs 3rd part.
1917
                                        add_fg <= x"0";
1918
                                        pc_inc_fg <= '1';
1919
                                        cycle_ctr <= cycle_ctr + "1";
1920
 
1921
                                when x"2C" =>                   --BIT abs 3rd part.
1922
                                        add_fg <= x"0";
1923
                                        pc_inc_fg <= '1';
1924
                                        cycle_ctr <= cycle_ctr + "1";
1925
 
1926
                                when x"CD" =>                   --CMP abs 3rd part.
1927
                                        add_fg <= x"0";
1928
                                        pc_inc_fg <= '1';
1929
                                        cycle_ctr <= cycle_ctr + "1";
1930
                                when x"DD" =>                   --CMP, x abs 3rd part.
1931
                                        add_fg <= x"0";
1932
                                        pc_inc_fg <= '1';
1933
                                        cycle_ctr <= cycle_ctr + "1";
1934
                                when x"D9" =>                   --CMP, Y abs 3rd part.
1935
                                        add_fg <= x"0";
1936
                                        pc_inc_fg <= '1';
1937
                                        cycle_ctr <= cycle_ctr + "1";
1938
                                when x"EC" =>                   --CPX abs 3rd part.
1939
                                        add_fg <= x"0";
1940
                                        pc_inc_fg <= '1';
1941
                                        cycle_ctr <= cycle_ctr + "1";
1942
                                when x"CC" =>                   --CPY abs 3rd part.
1943
                                        add_fg <= x"0";
1944
                                        pc_inc_fg <= '1';
1945
                                        cycle_ctr <= cycle_ctr + "1";
1946
 
1947
--      ................................................................................
1948
                                when x"8D" =>                   --STA abs 3rd part.
1949 3 stanley82
                                        wr_fg <= '0';
1950 2 stanley82
                                        add_fg <= x"4";
1951
                                        pc_inc_fg <= '1';
1952
                                        cycle_ctr <= cycle_ctr + "1";
1953
                                when x"9D" =>                   --STA,x abs 3rd part.
1954 3 stanley82
                                        wr_fg <= '0';
1955 2 stanley82
                                        add_fg <= x"5";
1956
                                        pc_inc_fg <= '1';
1957
                                        cycle_ctr <= cycle_ctr + "1";
1958
                                when x"99" =>                   --STA, y abs 3rd part.
1959 3 stanley82
                                        wr_fg <= '0';
1960 2 stanley82
                                        add_fg <= x"6";
1961
                                        pc_inc_fg <= '1';
1962
                                        cycle_ctr <= cycle_ctr + "1";
1963
                                when x"8E" =>                   --STX abs 3rd part.
1964 3 stanley82
                                        wr_fg <= '0';
1965 2 stanley82
                                        add_fg <= x"4";
1966
                                        pc_inc_fg <= '1';
1967
                                        cycle_ctr <= cycle_ctr + "1";
1968
                                when x"8C" =>                   --STY abs 3rd part.
1969 3 stanley82
                                        wr_fg <= '0';
1970 2 stanley82
                                        add_fg <= x"4";
1971
                                        pc_inc_fg <= '1';
1972
                                        cycle_ctr <= cycle_ctr + "1";
1973
--      ................................................................................
1974
 
1975
                                when x"EE" =>                   --INC abs 3rd part.
1976
                                        add_fg <= x"f";
1977
                                        cycle_ctr <= cycle_ctr + "1";
1978
                                when x"FE" =>                   --INC, x abs 3rd part.
1979
                                        add_fg <= x"f";
1980
                                        cycle_ctr <= cycle_ctr + "1";
1981
                                when x"CE" =>                   --DEC abs 3rd part.
1982
                                        add_fg <= x"f";
1983
                                        cycle_ctr <= cycle_ctr + "1";
1984
                                when x"DE" =>                   --DEC, x abs 3rd part.
1985
                                        add_fg <= x"f";
1986
                                        cycle_ctr <= cycle_ctr + "1";
1987
                                when x"2E" =>                   --ROL abs 3rd part.
1988
                                        add_fg <= x"f";
1989
                                        cycle_ctr <= cycle_ctr + "1";
1990
                                when x"3E" =>                   --ROL, x abs 3rd part.
1991
                                        add_fg <= x"f";
1992
                                        cycle_ctr <= cycle_ctr + "1";
1993
                                when x"6E" =>                   --ROR abs 3rd part.
1994
                                        add_fg <= x"f";
1995
                                        cycle_ctr <= cycle_ctr + "1";
1996
                                when x"7E" =>                   --ROR, x abs 3rd part.
1997
                                        add_fg <= x"f";
1998
                                        cycle_ctr <= cycle_ctr + "1";
1999
                                when x"4E" =>                   --LSR abs 3rd part.
2000
                                        add_fg <= x"f";
2001
                                        cycle_ctr <= cycle_ctr + "1";
2002
                                when x"5E" =>                   --LSR, x abs 3rd part.
2003
                                        add_fg <= x"f";
2004
                                        cycle_ctr <= cycle_ctr + "1";
2005
                                when x"0E" =>                   --ASL abs 3rd part.
2006
                                        add_fg <= x"f";
2007
                                        cycle_ctr <= cycle_ctr + "1";
2008
                                when x"1E" =>                   --ASL, x abs 3rd part.
2009
                                        add_fg <= x"f";
2010
                                        cycle_ctr <= cycle_ctr + "1";
2011
--      ............................................................................
2012
--      ==============================================================================
2013
                                when x"4C"  =>                  --JMP abs 3rd part
2014
                                        dat2pc_fg <= '0';
2015
                                        cycle_ctr <= cycle_ctr + x"1";
2016
                                when x"6C" =>                   --JMP indirect 3rd part
2017
                                        add_fg <= x"B";
2018
                                        cycle_ctr <= cycle_ctr + x"1";
2019
                                when x"20" =>                   --JSR abs 3rd part
2020
                                        dat2pc_fg <= '0';
2021
                                        add_fg <= x"7";
2022 3 stanley82
                                        wr_fg <= '1';
2023
                                        dat_out <= reg_pc(7 downto 0);
2024 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2025
                                when x"60" =>                   --RTS third part
2026
                                        dat2pc_fg <= '1';
2027
                                        add_fg <= x"0";
2028
                                        cycle_ctr <= cycle_ctr + x"1";
2029
                                when x"40" =>           --RTI 3rd part pull old status from stack
2030
                                        pc_dec_fg <= '0';        --Get 1st PC byte
2031
                                        n_fg <= data_rd(7);     --cyc 6
2032
                                        v_fg <= data_rd(6);
2033
                                        b_fg <= data_rd(4);
2034
                                        d_fg <= data_rd(3);
2035
                                        i_fg <= data_rd(2);
2036
                                        z_fg <= data_rd(1);
2037
                                        reg_a(8) <= data_rd(0);
2038
                                        reg_sp <= reg_sp - "1";
2039
                                        dat2pc_fg <= '1';
2040
                                        cycle_ctr <= cycle_ctr + x"1";
2041
 
2042
                                when x"00" =>                   --Break third part cyc 2
2043 3 stanley82
                                        dat_out <= reg_pc(7 downto 0);   --put dat_out onto stack set up dat_out
2044 2 stanley82
                                        reg_sp <= reg_sp + "1";
2045
                                        cycle_ctr <= cycle_ctr + x"1";
2046
 
2047
                                when others =>
2048
                                cycle_ctr <= cycle_ctr + x"1";
2049
                        end case;       --Cycle 2
2050
 
2051
------------------------------------------------------------------------
2052
--      Cycle 3 is for single byte instructions ie TAY
2053
                when x"3" =>
2054
 
2055
 
2056
 
2057
                        if      instruction_in(7 downto 0) /= x"A2" and
2058
                                (
2059
                                instruction_in(3 downto 0) = x"3" or
2060
                                instruction_in(3 downto 0) = x"7" or
2061
                                instruction_in(3 downto 0) = x"B" or
2062
                                instruction_in(3 downto 0) = x"F"
2063
                                                                ) then          --NOPs
2064
                                        cycle_ctr <= x"0";
2065
                                        pc_dec_fg <= '1';
2066
                        else
2067
 
2068
                        case instruction_in(7 downto 0) is
2069
--      ======================================================================================
2070
                                when x"84" =>                   --STY zero 4th part proto
2071
                                        pc_inc_fg <= '0';
2072
                                        cycle_ctr <= x"0";
2073
                                when x"85" =>                   --STA zero 4th part proto
2074
                                        pc_inc_fg <= '0';
2075
                                        cycle_ctr <= x"0";
2076
                                when x"86" =>                   --STX zero 4th part proto
2077
                                        pc_inc_fg <= '0';
2078
                                        cycle_ctr <= x"0";
2079
                                when x"94" =>                   --STY zero, X 4th part proto
2080
                                        pc_inc_fg <= '0';
2081
                                        cycle_ctr <= x"0";
2082
                                when x"95" =>                   --STA zero, X 4th part proto
2083
                                        pc_inc_fg <= '0';
2084
                                        cycle_ctr <= x"0";
2085
                                when x"96" =>                   --STX zero, Y 4th part proto
2086
                                        pc_inc_fg <= '0';
2087
                                        cycle_ctr <= x"0";
2088
--      =======================================================================================
2089
 
2090
 
2091
                                when x"08" =>                   --PHP 4th part accumulator onto stack
2092 3 stanley82
                                        pc_inc_fg <= '1';
2093
                                        add_fg <= x"0";
2094
                                        reg_sp <= reg_sp + "1";
2095
                                        cycle_ctr <=  cycle_ctr + x"1";
2096 2 stanley82
 
2097
                                when x"48" =>                   --PHA 4th part accumulator onto stack
2098
                                        pc_inc_fg <= '0';
2099
                                        cycle_ctr <=  x"0";
2100
 
2101
 
2102
                                when x"68" =>                   --PLA 4th part  Pull Accumulator from Stack
2103
                                        reg_a(7 downto 0) <= data_rd;
2104
                                        pc_inc_fg <= '0';
2105
                                        cycle_ctr <= x"0";
2106
                                when x"28" =>                   --PLP 4th part  Pull Status from Stack
2107
                                        n_fg <= data_rd(7);
2108
                                        v_fg <= data_rd(6);
2109
--                                      b_fg <= data_rd(4);
2110
                                        d_fg <= data_rd(3);
2111
                                        i_fg <= data_rd(2);
2112
                                        z_fg <= data_rd(1);
2113
                                        reg_a(8) <= data_rd(0);
2114
                                        pc_inc_fg <= '0';
2115
                                        cycle_ctr <= x"0";
2116
 
2117
                                when x"F0" =>                   --BEQ branch true 4th part.
2118
                                                branch_fg <= '0';
2119
                                                pc_inc_fg <= '1';
2120
                                                cycle_ctr <= cycle_ctr + x"1";
2121
                                when x"D0" =>                   --BNE branch true 4th part.
2122
                                                branch_fg <= '0';
2123
                                                pc_inc_fg <= '1';
2124
                                                cycle_ctr <= cycle_ctr + x"1";
2125
                                when x"10" =>                   --BPL plus true 4th part.
2126
                                                branch_fg <= '0';
2127
                                                pc_inc_fg <= '1';
2128
                                                cycle_ctr <= cycle_ctr + x"1";
2129
                                when x"30" =>                   --BM1 negative true 4th part.
2130
                                                branch_fg <= '0';
2131
                                                pc_inc_fg <= '1';
2132
                                                cycle_ctr <= cycle_ctr + x"1";
2133
                                when x"50" =>                   --BVC overflow false 4th part.
2134
                                                branch_fg <= '0';
2135
                                                pc_inc_fg <= '1';
2136
                                                cycle_ctr <= cycle_ctr + x"1";
2137
                                when x"70" =>                   --BVS overflow true 4th part.
2138
                                                branch_fg <= '0';
2139
                                                pc_inc_fg <= '1';
2140
                                                cycle_ctr <= cycle_ctr + x"1";
2141
                                when x"90" =>                   --BCC carry false 4th part.
2142
                                                branch_fg <= '0';
2143
                                                pc_inc_fg <= '1';
2144
                                                cycle_ctr <= cycle_ctr + x"1";
2145
                                when x"B0" =>                   --BCS carry true 4th part.
2146
                                                branch_fg <= '0';
2147
                                                pc_inc_fg <= '1';
2148
                                                cycle_ctr <= cycle_ctr + x"1";
2149
 
2150
--      ======================================================================================
2151
 
2152
                                when x"E6" =>                   --INC zero fourth part
2153 3 stanley82
                                        wr_fg <= '0';
2154 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2155
 
2156
                                when x"F6" =>                   --INC zero,X fourth part
2157 3 stanley82
                                        wr_fg <= '0';
2158 2 stanley82
                                        cycle_ctr <= x"0";
2159
                                when x"C6" =>                   --DEC zero fourth part
2160 3 stanley82
                                        wr_fg <= '0';
2161 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2162
                                when x"D6" =>                   --DEC zero,X fourth part
2163 3 stanley82
                                        wr_fg <= '0';
2164 2 stanley82
                                        cycle_ctr <= x"0";
2165
 
2166
                                when x"26" =>                   --ROL zero fourth part
2167 3 stanley82
                                        wr_fg <= '0';
2168 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2169
                                when x"36" =>                   --ROL zero,X fourth part
2170 3 stanley82
                                        wr_fg <= '0';
2171 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2172
                                when x"66" =>                   --ROR zero fourth part
2173 3 stanley82
                                        wr_fg <= '0';
2174 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2175
                                when x"76" =>                   --ROR zero,X fourth part
2176 3 stanley82
                                        wr_fg <= '0';
2177 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2178
                                when x"06" =>                   --ASL zero fourth part
2179 3 stanley82
                                        wr_fg <= '0';
2180 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2181
                                when x"16" =>                   --ASL zero,X fourth part
2182 3 stanley82
                                        wr_fg <= '0';
2183 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2184
                                when x"46" =>                   --LSR zero fourth part
2185 3 stanley82
                                        wr_fg <= '0';
2186 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2187
                                when x"56" =>                   --LSR zero,X fourth part
2188 3 stanley82
                                        wr_fg <= '0';
2189 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2190
--
2191
--      ==============================================================================
2192
                                when x"AD" =>                   --LDA abs 4th part.
2193
                                        reg_a(7 downto 0) <= data_rd;
2194
                                        flags_fg <= "01";
2195 3 stanley82
                                        dat_out <= data_rd;
2196 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2197
                                when x"BD" =>                   --LDA, x abs 4th part.
2198
                                        reg_a(7 downto 0) <= data_rd;
2199
                                        flags_fg <= "01";
2200 3 stanley82
                                        dat_out <= data_rd;
2201 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2202
 
2203
                                when x"B9" =>                   --LDA, Y abs 4th part
2204
                                        reg_a(7 downto 0) <= data_rd;
2205
                                        flags_fg <= "01";
2206 3 stanley82
                                        dat_out <= data_rd;
2207 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2208
                                when x"2D" =>                   --AND abs 4th part.
2209
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
2210
                                        flags_fg <= "01";
2211 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
2212 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2213
                                when x"3D" =>                   --AND, x abs 4th part.
2214
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
2215
                                        flags_fg <= "01";
2216 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
2217 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2218
                                when x"39" =>                   --AND, Y abs 4th part.
2219
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
2220
                                        flags_fg <= "01";
2221 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
2222 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2223
 
2224
                                when x"0D" =>                   --ORA abs 4th part.
2225
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
2226
                                        flags_fg <= "01";
2227 3 stanley82
                                        dat_out <= reg_a(7 downto 0) or data_rd;
2228 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2229
                                when x"1D" =>                   --ORA, x abs 4th part.
2230
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
2231
                                        flags_fg <= "01";
2232 3 stanley82
                                        dat_out <= reg_a(7 downto 0) or data_rd;
2233 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2234
                                when x"19" =>                   --ORA, Y abs 4th part.
2235
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
2236
                                        flags_fg <= "01";
2237 3 stanley82
                                        dat_out <= reg_a(7 downto 0) or data_rd;
2238 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2239
 
2240
                                when x"4D" =>                   --EOR abs 4th part.
2241
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
2242
                                        flags_fg <= "01";
2243 3 stanley82
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
2244 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2245
                                when x"5D" =>                   --EOR, x abs 4th part.
2246
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
2247
                                        flags_fg <= "01";
2248 3 stanley82
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
2249 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2250
                                when x"59" =>                   --EOR, Y abs 4th part.
2251
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
2252
                                        flags_fg <= "01";
2253 3 stanley82
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
2254 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2255
 
2256
                                when x"6D" =>                   --ADC abs 4th part.
2257
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
2258
                                        flags_fg <= "01";
2259 3 stanley82
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
2260 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2261
                                when x"7D" =>                   --ADC, x abs 4th part.
2262
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
2263
                                        flags_fg <= "01";
2264 3 stanley82
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
2265 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2266
                                when x"79" =>                   --ADC, Y abs 4th part.
2267
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
2268
                                        flags_fg <= "01";
2269 3 stanley82
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
2270 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2271
 
2272
                                when x"ED" =>                   --SBC abs 4th part.
2273
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
2274
                                        flags_fg <= "01";
2275 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
2276 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2277
                                when x"FD" =>                   --SBC, x abs 4th part.
2278
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
2279
                                        flags_fg <= "01";
2280 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
2281 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2282
                                when x"F9" =>                   --SBC, Y abs 4th part.
2283
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
2284
                                        flags_fg <= "01";
2285 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
2286 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2287
 
2288
                                when x"AE" =>                   --LDX abs 4th part.
2289
                                        reg_x <= data_rd;
2290
                                        flags_fg <= "01";
2291 3 stanley82
                                        dat_out <= data_rd;
2292 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2293
                                when x"BE" =>                   --LDX, y abs 4th part.
2294
                                        reg_x <= data_rd;
2295
                                        flags_fg <= "01";
2296 3 stanley82
                                        dat_out <= data_rd;
2297 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2298
                                when x"AC" =>                   --LDY abs 4th part.
2299
                                        reg_y <= data_rd;
2300
                                        flags_fg <= "01";
2301 3 stanley82
                                        dat_out <= data_rd;
2302 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2303
                                when x"BC" =>                   --LDY, x abs 4th part.
2304
                                        reg_y <= data_rd;
2305
                                        flags_fg <= "01";
2306 3 stanley82
                                        dat_out <= data_rd;
2307 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2308
                                when x"2C" =>                   --BIT abs 4th part.
2309
                                        flags_fg <= "01";
2310 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
2311 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2312
 
2313
                                when x"CD" =>                   --CMP abs 4th part.
2314
                                        flags_fg <= "01";
2315 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd;
2316
                                        if reg_a(7 downto 0) >= data_rd then
2317 2 stanley82
                                                reg_a(8) <= '1';
2318
                                        else
2319
                                                reg_a(8) <= '0';
2320
                                        end if;
2321
                                        cycle_ctr <= cycle_ctr + x"1";
2322
                                when x"DD" =>                   --CMP, x abs 4th part.
2323
                                        flags_fg <= "01";
2324 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd;
2325
                                        if reg_a(7 downto 0) >= data_rd then
2326 2 stanley82
                                                reg_a(8) <= '1';
2327
                                        else
2328
                                                reg_a(8) <= '0';
2329
                                        end if;
2330
                                        cycle_ctr <= cycle_ctr + x"1";
2331
                                when x"D9" =>                   --CMP, Y abs 4th part.
2332
                                        flags_fg <= "01";
2333 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd;
2334
                                        if reg_a(7 downto 0) >= data_rd then
2335 2 stanley82
                                                reg_a(8) <= '1';
2336
                                        else
2337
                                                reg_a(8) <= '0';
2338
                                        end if;
2339
                                        cycle_ctr <= cycle_ctr + x"1";
2340
                                when x"EC" =>                   --CPX abs 4th part.
2341 3 stanley82
                                        flags_fg <= "01";
2342
                                        dat_out <= reg_x - data_rd;
2343 2 stanley82
                                        if reg_x >= data_rd then
2344
                                                reg_a(8) <= '1';
2345
                                        else
2346
                                                reg_a(8) <= '0';
2347
                                        end if;
2348
                                        cycle_ctr <= cycle_ctr + x"1";
2349
                                when x"CC" =>                   --CPY abs 4th part.
2350 3 stanley82
                                        flags_fg <= "01";
2351
                                        dat_out <= reg_y - data_rd;
2352 2 stanley82
                                        if reg_y >= data_rd then
2353
                                                reg_a(8) <= '1';
2354
                                        else
2355
                                                reg_a(8) <= '0';
2356
                                        end if;
2357
                                        cycle_ctr <= cycle_ctr + x"1";
2358
--      .................................................................................
2359
                                when x"8D" =>                   --STA abs 4th part.
2360
                                        add_fg <= x"0";
2361
                                        cycle_ctr <= cycle_ctr + x"1";
2362
                                when x"9D" =>                   --STA,x abs 4th part.
2363
                                        add_fg <= x"0";
2364
                                        cycle_ctr <= cycle_ctr + x"1";
2365
                                when x"99" =>                   --STA, y abs 4th part.
2366
                                        add_fg <= x"0";
2367
                                        pc_inc_fg <= '1';
2368
                                        cycle_ctr <= cycle_ctr + x"1";
2369
                                when x"8E" =>                   --STX abs 4th part.
2370
                                        add_fg <= x"0";
2371
                                        pc_inc_fg <= '1';
2372
                                        cycle_ctr <= cycle_ctr + x"1";
2373
                                when x"8C" =>                   --STY abs 4th part.
2374
                                        add_fg <= x"0";
2375
                                        pc_inc_fg <= '1';
2376
                                        cycle_ctr <= cycle_ctr + x"1";
2377
--      ........................................................................
2378
 
2379
                                when x"EE" =>                   --INC abs 4th part.
2380 3 stanley82
                                        dat_out <= data_rd + x"01";
2381
                                        wr_fg <= '1';
2382 2 stanley82
                                        flags_fg <= "01";
2383
                                        cycle_ctr <= cycle_ctr + x"1";
2384
                                when x"FE" =>                   --INC, x abs 4th part.
2385 3 stanley82
                                        dat_out <= data_rd + x"01";
2386
                                        wr_fg <= '1';
2387 2 stanley82
                                        flags_fg <= "01";
2388
                                        cycle_ctr <= cycle_ctr + x"1";
2389
                                when x"CE" =>                   --DEC abs 4th part.
2390 3 stanley82
                                        dat_out <= data_rd - x"01";
2391
                                        wr_fg <= '1';
2392 2 stanley82
                                        flags_fg <= "01";
2393
                                        cycle_ctr <= cycle_ctr + x"1";
2394
                                when x"DE" =>                   --DEC, x abs 4th part.
2395 3 stanley82
                                        dat_out <= data_rd - x"01";
2396
                                        wr_fg <= '1';
2397 2 stanley82
                                        flags_fg <= "01";
2398
                                        cycle_ctr <= cycle_ctr + x"1";
2399
 
2400
                                when x"2E" =>                   --ROL abs 4th part.
2401 3 stanley82
                                        dat_out(7 downto 1) <= data_rd(6 downto 0);
2402
                                        dat_out(0) <= reg_a(8);
2403 2 stanley82
                                        flags_fg <= "01";
2404 3 stanley82
                                        wr_fg <= '1';
2405 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
2406
                                when x"3E" =>                   --ROL, x abs 4th part.
2407 3 stanley82
                                        dat_out(7 downto 1) <= data_rd(6 downto 0);
2408
                                        dat_out(0) <= reg_a(8);
2409 2 stanley82
                                        flags_fg <= "01";
2410 3 stanley82
                                        wr_fg <= '1';
2411 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
2412
                                when x"6E" =>                   --ROR abs 4th part.
2413
                                        reg_a(8) <= data_rd(0);
2414 3 stanley82
                                        dat_out <= reg_a(8) & data_rd(7 downto 1);
2415
                                        wr_fg <= '1';
2416 2 stanley82
                                        flags_fg <= "01";
2417
                                        cycle_ctr <= cycle_ctr + x"1";
2418
                                when x"7E" =>                   --ROR, x abs 4th part.
2419
                                        reg_a(8) <= data_rd(0);
2420 3 stanley82
                                        dat_out <= reg_a(8) & data_rd(7 downto 1);
2421
                                        wr_fg <= '1';
2422 2 stanley82
                                        flags_fg <= "01";
2423
                                        cycle_ctr <= cycle_ctr + x"1";
2424
                                when x"4E" =>                   --LSR abs 4th part.
2425 3 stanley82
                                        dat_out <= '0' & reg_a(7 downto 1);
2426 2 stanley82
                                        reg_a(8) <= data_rd(0);
2427 3 stanley82
                                        wr_fg <= '1';
2428 2 stanley82
                                        flags_fg <= "01";
2429
                                        cycle_ctr <= cycle_ctr + "1";
2430
                                when x"5E" =>                   --LSR, x abs 4th part.
2431 3 stanley82
                                        dat_out <= '0' & reg_a(7 downto 1);
2432 2 stanley82
                                        reg_a(8) <= data_rd(0);
2433 3 stanley82
                                        wr_fg <= '1';
2434 2 stanley82
                                        flags_fg <= "01";
2435
                                        cycle_ctr <= cycle_ctr + "1";
2436
                                when x"0E" =>                   --ASL abs 4th part.
2437
                                        reg_a(8) <= data_rd(7);
2438 3 stanley82
                                        dat_out <= data_rd(6 downto 0) & data_rd(0);
2439
                                        wr_fg <= '1';
2440 2 stanley82
                                        flags_fg <= "01";
2441
                                        cycle_ctr <= cycle_ctr + x"1";
2442
                                when x"1E" =>                   --ASL, x abs 4th part.
2443
                                        reg_a(8) <= data_rd(7);
2444 3 stanley82
                                        dat_out <= data_rd(6 downto 0) & data_rd(0);
2445
                                        wr_fg <= '1';
2446 2 stanley82
                                        flags_fg <= "01";
2447
                                        cycle_ctr <= cycle_ctr + x"1";
2448
--      ............................................................................
2449
--      ==============================================================================
2450
                                when x"A1" =>                   --LDA (zero,x) 4th part proto
2451
                                        add_fg <= x"0";
2452
                                        pc_inc_fg <= '1';
2453
                                        cycle_ctr <= cycle_ctr + "1";
2454
 
2455
                                when x"B1" =>                   --LDA (zero),y 4th part proto
2456
                                        add_fg <= x"0";
2457
                                        pc_inc_fg <= '1';
2458
                                        cycle_ctr <= cycle_ctr + "1";
2459
 
2460
                                when x"21" =>                   --AND (zero,x) 4th part proto
2461
                                        add_fg <= x"0";
2462
                                        pc_inc_fg <= '1';
2463
                                        cycle_ctr <= cycle_ctr + "1";
2464
 
2465
                                when x"31" =>                   --AND (zero),y 4th part proto
2466
                                        add_fg <= x"0";
2467
                                        pc_inc_fg <= '1';
2468
                                        cycle_ctr <= cycle_ctr + "1";
2469
 
2470
                                when x"41" =>                   --EOR (zero,x) 4th part proto
2471
                                        add_fg <= x"0";
2472
                                        pc_inc_fg <= '1';
2473
                                        cycle_ctr <= cycle_ctr + "1";
2474
 
2475
                                when x"51" =>                   --EOR (zero),y 4th part proto
2476
                                        add_fg <= x"0";
2477
                                        pc_inc_fg <= '1';
2478
                                        cycle_ctr <= cycle_ctr + "1";
2479
 
2480
                                when x"01" =>                   --OR (zero,x) 4th part proto
2481
                                        add_fg <= x"0";
2482
                                        pc_inc_fg <= '1';
2483
                                        cycle_ctr <= cycle_ctr + "1";
2484
 
2485
                                when x"11" =>                   --OR (zero),y 4th part proto
2486
                                        add_fg <= x"0";
2487
                                        pc_inc_fg <= '1';
2488
                                        cycle_ctr <= cycle_ctr + "1";
2489
 
2490
 
2491
                                when x"61" =>                   --ADC (zero,x) 4th part proto
2492
                                        add_fg <= x"0";
2493
                                        pc_inc_fg <= '1';
2494
                                        cycle_ctr <= cycle_ctr + "1";
2495
 
2496
                                when x"71" =>                   --ADC (zero),y 4th part proto
2497
                                        add_fg <= x"0";
2498
                                        pc_inc_fg <= '1';
2499
                                        cycle_ctr <= cycle_ctr + "1";
2500
 
2501
                                when x"E1" =>                   --SBC (zero,x) 4th part proto
2502
                                        add_fg <= x"0";
2503
                                        pc_inc_fg <= '1';
2504
                                        cycle_ctr <= cycle_ctr + "1";
2505
 
2506
                                when x"F1" =>                   --SBC (zero),y 4th part proto
2507
                                        add_fg <= x"0";
2508
                                        pc_inc_fg <= '1';
2509
                                        cycle_ctr <= cycle_ctr + "1";
2510
 
2511
                                when x"C1" =>                   --CMP (zero,x) 4th part proto
2512
                                        add_fg <= x"0";
2513
                                        pc_inc_fg <= '1';
2514
                                        cycle_ctr <= cycle_ctr + "1";
2515
 
2516
                                when x"D1" =>                   --CMP (zero),y 4th part proto
2517
                                        add_fg <= x"0";
2518
                                        pc_inc_fg <= '1';
2519
                                        cycle_ctr <= cycle_ctr + "1";
2520
 
2521
 
2522
                                when x"81" =>                   --STA (zero,x) 4th part proto
2523 3 stanley82
                                        wr_fg <= '0';
2524 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
2525
                                when x"91" =>                   --STA (zero),y 4th part proto
2526 3 stanley82
                                        wr_fg <= '0';
2527 2 stanley82
                                        cycle_ctr <= cycle_ctr + "1";
2528
--      ==================================================================================
2529
 
2530
                                when x"4C"  =>                  --JMP abs 4th part
2531
                                        pc_inc_fg <= '1';
2532
                                        cycle_ctr <= cycle_ctr + x"1";
2533
                                when x"6C" =>                   --JMP abs 4th part
2534
                                        add_fg <= x"0";
2535
                                        dat2pc_fg <= '1';
2536
                                        pc_inc_fg <= '0';
2537
                                        cycle_ctr <= cycle_ctr + x"1";
2538
                                when x"20" =>                   --JSR indirect 4th part
2539 3 stanley82
                                        wr_fg <= '0';
2540 2 stanley82
                                        reg_sp <= reg_sp + "1";
2541
                                        cycle_ctr <= cycle_ctr + x"1";
2542
                                when x"60" =>                   --RTS fourth part
2543
                                        dat2pc_fg <= '0';
2544
                                        pc_inc_fg <= '1';
2545
                                        cycle_ctr <= cycle_ctr + x"1";
2546
 
2547
                                when x"40" =>                   --RTI forth part
2548
--                                      reg_sp <= reg_sp - "1";
2549
                                        add_fg <= x"7";         --Get 2nd PC byte
2550
                                        dat2pc_fg <= '0';
2551
                                        cycle_ctr <= cycle_ctr + x"1";
2552
 
2553
                                when x"00" =>                   --Break forth extra part cyc 3
2554 3 stanley82
                                        dat_out <= n_fg & v_fg & '1' & b_fg & d_fg & i_fg & z_fg & reg_a(8);
2555 2 stanley82
                                        reg_sp <= reg_sp + "1";
2556
                                        cycle_ctr <= cycle_ctr + x"1";
2557
 
2558
--------------------------------------------------------------------------------------
2559
                                when others =>
2560
                                        cycle_ctr <= cycle_ctr + x"1";
2561
 
2562
                end case;       --Cycle 3
2563
                end if;                                         --End single byte stuff
2564
 
2565
--      End of cycle 3
2566
--      Cycle 4 is for 2 byte/cycle instructions ie LDA #
2567
--
2568
                when x"4" =>
2569
                        case Instruction_in is
2570
--      ======================================================================================
2571 3 stanley82
                                when x"08" =>                   --PHP 5th part accumulator onto stack
2572
                                        pc_inc_fg <= '0';
2573
                                        cycle_ctr <=  x"0";
2574
 
2575 2 stanley82
                                when x"F0" =>                   --BEQ branch true 5th part.
2576
                                                pc_inc_fg <= '0';
2577
                                                cycle_ctr <= x"0";
2578
                                when x"D0" =>                   --BNE branch true 5th part.
2579
                                                pc_inc_fg <= '0';
2580
                                                cycle_ctr <= x"0";
2581
                                when x"10" =>                   --BPL plus true 5th part.
2582
                                                pc_inc_fg <= '0';
2583
                                                cycle_ctr <= x"0";
2584
                                when x"30" =>                   --BM1 negative true 5th part.
2585
                                                pc_inc_fg <= '0';
2586
                                                cycle_ctr <= x"0";
2587
                                when x"50" =>                   --BVC overflow false 5th part.
2588
                                                pc_inc_fg <= '0';
2589
                                                cycle_ctr <= x"0";
2590
                                when x"70" =>                   --BVS overflow true 5th part.
2591
                                                pc_inc_fg <= '0';
2592
                                                cycle_ctr <= x"0";
2593
                                when x"90" =>                   --BCC carry false 5th part.
2594
                                                pc_inc_fg <= '0';
2595
                                                cycle_ctr <= x"0";
2596
                                when x"B0" =>                   --BCS carry true 5th part.
2597
                                                pc_inc_fg <= '0';
2598
                                                cycle_ctr <= x"0";
2599
--      ======================================================================================
2600
 
2601
                                when x"E6" =>                   --INC zero 5th part
2602
                                        pc_inc_fg <= '1';
2603
                                        add_fg <= x"0";
2604
                                        cycle_ctr <= cycle_ctr + x"1";
2605
 
2606
                                when x"F6" =>                   --INC zero,X 5th part
2607 3 stanley82
                                        wr_fg <= '0';
2608 2 stanley82
                                        pc_inc_fg <= '0';
2609
                                        add_fg <= x"0";
2610
                                        cycle_ctr <= x"0";
2611
                                when x"c6" =>                   --DEC zero 5th part
2612
                                        pc_inc_fg <= '1';
2613
                                        add_fg <= x"0";
2614
                                        cycle_ctr <= cycle_ctr + x"1";
2615
 
2616
                                when x"46" =>                   --LSR zero 5th part
2617
                                        pc_inc_fg <= '1';
2618
                                        add_fg <= x"0";
2619
                                        cycle_ctr <= cycle_ctr + x"1";
2620
                                when x"56" =>                   --LSR zero,X 5th part
2621
                                        pc_inc_fg <= '1';
2622
                                        add_fg <= x"0";
2623
                                        cycle_ctr <= cycle_ctr + x"1";
2624
 
2625
                                when x"66" =>                   --ROR zero 5th part
2626
                                        pc_inc_fg <= '1';
2627
                                        add_fg <= x"0";
2628
                                        cycle_ctr <= cycle_ctr + x"1";
2629
                                when x"76" =>                   --ROR zero,X 5th part
2630
                                        pc_inc_fg <= '1';
2631
                                        add_fg <= x"0";
2632
                                        cycle_ctr <= cycle_ctr + x"1";
2633
                                when x"26" =>                   --ROL zero 5th part
2634
                                        pc_inc_fg <= '1';
2635
                                        add_fg <= x"0";
2636
                                        cycle_ctr <= cycle_ctr + x"1";
2637
                                when x"36" =>                   --ROL zero,X 5th part
2638
                                        pc_inc_fg <= '1';
2639
                                        add_fg <= x"0";
2640
                                        cycle_ctr <= cycle_ctr + x"1";
2641
                                when x"06" =>                   --ASL zero 5th part
2642
                                        pc_inc_fg <= '1';
2643
                                        add_fg <= x"0";
2644
                                        cycle_ctr <= cycle_ctr + x"1";
2645
                                when x"16" =>                   --ASL zero,X 5th part
2646
                                        pc_inc_fg <= '1';
2647
                                        add_fg <= x"0";
2648
                                        cycle_ctr <= cycle_ctr + x"1";
2649
 
2650
 
2651
--
2652
--      ======================================================================================
2653
                                when x"AD" =>                   --LDA 5th part.
2654
                                        pc_inc_fg <= '0';
2655
                                        cycle_ctr <= x"0";
2656
                                when x"BD" =>                   --LDA, x 5th part.
2657
                                        pc_inc_fg <= '0';
2658
                                        cycle_ctr <= x"0";
2659
                                when x"B9" =>                   --LDA, Y 5th part
2660
                                        pc_inc_fg <= '0';
2661
                                        cycle_ctr <= x"0";
2662
 
2663
                                when x"2D" =>                   --AND 5th part.
2664
                                        pc_inc_fg <= '0';
2665
                                        cycle_ctr <= x"0";
2666
                                when x"3D" =>                   --AND, x 5th part.
2667
                                        pc_inc_fg <= '0';
2668
                                        cycle_ctr <= x"0";
2669
                                when x"39" =>                   --AND, Y 5th part.
2670
                                        pc_inc_fg <= '0';
2671
                                        cycle_ctr <= x"0";
2672
 
2673
                                when x"0D" =>                   --ORA 5th part.
2674
                                        pc_inc_fg <= '0';
2675
                                        cycle_ctr <= x"0";
2676
                                when x"1D" =>                   --ORA, x 5th part.
2677
                                        pc_inc_fg <= '0';
2678
                                        cycle_ctr <= x"0";
2679
                                when x"19" =>                   --ORA, Y 5th part.
2680
                                        pc_inc_fg <= '0';
2681
                                        cycle_ctr <= x"0";
2682
 
2683
                                when x"4D" =>                   --EOR 5th part.
2684
                                        pc_inc_fg <= '0';
2685
                                        cycle_ctr <= x"0";
2686
                                when x"5D" =>                   --EOR, x 5th part.
2687
                                        pc_inc_fg <= '0';
2688
                                        cycle_ctr <= x"0";
2689
                                when x"59" =>                   --EOR, Y 5th part.
2690
                                        pc_inc_fg <= '0';
2691
                                        cycle_ctr <= x"0";
2692
 
2693
                                when x"6D" =>                   --ADC 5th part.
2694
                                        pc_inc_fg <= '0';
2695
                                        cycle_ctr <= x"0";
2696
                                when x"7D" =>                   --ADC, x 5th part.
2697
                                        pc_inc_fg <= '0';
2698
                                        cycle_ctr <= x"0";
2699
                                when x"79" =>                   --ADC, Y 5th part.
2700
                                        pc_inc_fg <= '0';
2701
                                        cycle_ctr <= x"0";
2702
 
2703
                                when x"ED" =>                   --SBC 5th part.
2704
                                        pc_inc_fg <= '0';
2705
                                        cycle_ctr <= x"0";
2706
                                when x"FD" =>                   --SBC, x 5th part.
2707
                                        pc_inc_fg <= '0';
2708
                                        cycle_ctr <= x"0";
2709
                                when x"F9" =>                   --SBC, Y 5th part.
2710
                                        pc_inc_fg <= '0';
2711
                                        cycle_ctr <= x"0";
2712
 
2713
                                when x"AE" =>                   --LDX 5th part.
2714
                                        pc_inc_fg <= '0';
2715
                                        cycle_ctr <= x"0";
2716
                                when x"BE" =>                   --LDX, y 5th part.
2717
                                        pc_inc_fg <= '0';
2718
                                        cycle_ctr <= x"0";
2719
                                when x"AC" =>                   --LDY 5th part.
2720
                                        pc_inc_fg <= '0';
2721
                                        cycle_ctr <= x"0";
2722
                                when x"BC" =>                   --LDY, x 5th part.
2723
                                        pc_inc_fg <= '0';
2724
                                        cycle_ctr <= x"0";
2725
 
2726
                                when x"2C" =>                   --BIT 5th part.
2727
                                        pc_inc_fg <= '0';
2728
                                        cycle_ctr <= x"0";
2729
 
2730
                                when x"CD" =>                   --CMP 5th part.
2731 3 stanley82
                                        pc_inc_fg <= '0';
2732 2 stanley82
                                        cycle_ctr <= x"0";
2733
                                when x"DD" =>                   --CMP, x 5th part.
2734
                                        pc_inc_fg <= '0';
2735
                                        cycle_ctr <= x"0";
2736
                                when x"D9" =>                   --CMP, Y 5th part.
2737
                                        pc_inc_fg <= '0';
2738
                                        cycle_ctr <= x"0";
2739
                                when x"EC" =>                   --CPX 5th part.
2740
                                        pc_inc_fg <= '0';
2741
                                        cycle_ctr <= x"0";
2742
                                when x"CC" =>                   --CPY 5th part.
2743
                                        pc_inc_fg <= '0';
2744
                                        cycle_ctr <= x"0";
2745
--      ............................................................................
2746
                                when x"8D" =>                   --STA 5th part.
2747
                                        pc_inc_fg <= '0';
2748
                                        cycle_ctr <= x"0";
2749
                                when x"9D" =>                   --STA,x 5th part.
2750
                                        pc_inc_fg <= '0';
2751
                                        cycle_ctr <= x"0";
2752
                                when x"99" =>                   --STA, y 5th part.
2753
                                        pc_inc_fg <= '0';
2754
                                        cycle_ctr <= x"0";
2755
                                when x"8E" =>                   --STX 5th part.
2756
                                        pc_inc_fg <= '0';
2757
                                        cycle_ctr <= x"0";
2758
                                when x"8C" =>                   --STY 5th part.
2759
                                        pc_inc_fg <= '0';
2760
                                        cycle_ctr <= x"0";
2761
--      ............................................................................
2762
 
2763
                                when x"EE" =>                   --INC abs 5th part.
2764 3 stanley82
                                        wr_fg <= '0';
2765 2 stanley82
                                        pc_inc_fg <= '1';
2766
                                        cycle_ctr <= cycle_ctr + x"1";
2767
 
2768
                                when x"FE" =>                   --INC, x 5th part.
2769 3 stanley82
                                        wr_fg <= '0';
2770 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
2771
                                when x"CE" =>                   --DEC 5th part.
2772 3 stanley82
                                        wr_fg <= '0';
2773 2 stanley82
                                        pc_inc_fg <= '1';
2774
                                        cycle_ctr <= cycle_ctr + x"1";
2775
                                when x"DE" =>                   --DEC, x 5th part.
2776 3 stanley82
                                        wr_fg <= '0';
2777 2 stanley82
                                        pc_inc_fg <= '1';
2778
                                        cycle_ctr <= cycle_ctr + x"1";
2779
 
2780
                                when x"2E" =>                   --ROL 5th part.
2781 3 stanley82
                                        wr_fg <= '0';
2782 2 stanley82
                                        pc_inc_fg <= '1';
2783
                                        cycle_ctr <= cycle_ctr + x"1";
2784
                                when x"3E" =>                   --ROL, x 5th part.
2785 3 stanley82
                                        wr_fg <= '0';
2786 2 stanley82
                                        pc_inc_fg <= '1';
2787
                                        cycle_ctr <= cycle_ctr + x"1";
2788
                                when x"6E" =>                   --ROR 5th part.
2789 3 stanley82
                                        wr_fg <= '0';
2790 2 stanley82
                                        pc_inc_fg <= '1';
2791
                                        cycle_ctr <= cycle_ctr + x"1";
2792
                                when x"7E" =>                   --ROR, x 5th part.
2793 3 stanley82
                                        wr_fg <= '0';
2794 2 stanley82
                                        pc_inc_fg <= '1';
2795
                                        cycle_ctr <= cycle_ctr + x"1";
2796
                                when x"4E" =>                   --LSR 5th part.
2797 3 stanley82
                                        wr_fg <= '0';
2798 2 stanley82
                                        pc_inc_fg <= '1';
2799
                                        cycle_ctr <= cycle_ctr + x"1";
2800
                                when x"5E" =>                   --LSR, x 5th part.
2801 3 stanley82
                                        wr_fg <= '0';
2802 2 stanley82
                                        pc_inc_fg <= '1';
2803
                                        cycle_ctr <= cycle_ctr + x"1";
2804
                                when x"0E" =>                   --ASL 5th part.
2805 3 stanley82
                                        wr_fg <= '0';
2806 2 stanley82
                                        pc_inc_fg <= '1';
2807
                                        cycle_ctr <= cycle_ctr + x"1";
2808
                                when x"1E" =>                   --ASL, x 5th part.
2809 3 stanley82
                                        wr_fg <= '0';
2810 2 stanley82
                                        pc_inc_fg <= '1';
2811
                                        cycle_ctr <= cycle_ctr + x"1";
2812
--      ............................................................................
2813
--      ==============================================================================
2814
                                when x"A1" =>                   --LDA (zero,x) 5th part proto
2815
                                        reg_a(7 downto 0) <= data_rd;
2816
                                        flags_fg <= "01";
2817 3 stanley82
                                        dat_out <= data_rd;
2818 2 stanley82
                                        pc_inc_fg <= '0';
2819
                                        cycle_ctr <= x"0";
2820
                                when x"B1" =>                   --LDA (zero),y 5th part proto
2821
                                        reg_a(7 downto 0) <= data_rd;
2822
                                        flags_fg <= "01";
2823 3 stanley82
                                        dat_out <= data_rd;
2824 2 stanley82
                                        pc_inc_fg <= '0';
2825
                                        cycle_ctr <= x"0";
2826
 
2827
                                when x"21" =>                   --AND (zero,x) 5th part proto
2828
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
2829
                                        flags_fg <= "01";
2830 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
2831 2 stanley82
                                        pc_inc_fg <= '0';
2832
                                        cycle_ctr <= x"0";
2833
                                when x"31" =>                   --AND (zero),y 5th part proto
2834
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) and data_rd;
2835
                                        flags_fg <= "01";
2836 3 stanley82
                                        dat_out <= reg_a(7 downto 0) and data_rd;
2837 2 stanley82
                                        pc_inc_fg <= '0';
2838
                                        cycle_ctr <= x"0";
2839
 
2840
                                when x"42" =>                   --EOR (zero,x) 5th part proto
2841
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
2842
                                        flags_fg <= "01";
2843 3 stanley82
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
2844 2 stanley82
                                        pc_inc_fg <= '0';
2845
                                        cycle_ctr <= x"0";
2846
                                when x"51" =>                   --EOR (zero),y 5th part proto
2847
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) xor data_rd;
2848
                                        flags_fg <= "01";
2849 3 stanley82
                                        dat_out <= reg_a(7 downto 0) xor data_rd;
2850 2 stanley82
                                        pc_inc_fg <= '0';
2851
                                        cycle_ctr <= x"0";
2852
 
2853
                                when x"01" =>                   --OR (zero,x) 5th part proto
2854
                                        reg_a(7 downto 0) <= reg_a(7 downto 0)    or data_rd;
2855
                                        flags_fg <= "01";
2856 3 stanley82
                                        dat_out <= reg_a(7 downto 0) or data_rd;
2857 2 stanley82
                                        pc_inc_fg <= '0';
2858
                                        cycle_ctr <= x"0";
2859
                                when x"11" =>                   --OR (zero),y 5th part proto
2860
                                        reg_a(7 downto 0) <= reg_a(7 downto 0) or data_rd;
2861
                                        flags_fg <= "01";
2862 3 stanley82
                                        dat_out <= reg_a(7 downto 0) or data_rd;
2863 2 stanley82
                                        pc_inc_fg <= '0';
2864
                                        cycle_ctr <= x"0";
2865
 
2866
                                when x"61" =>                   --ADC (zero,x) 5th part proto
2867
                                        flags_fg <= "01";
2868
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
2869 3 stanley82
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
2870 2 stanley82
                                        pc_inc_fg <= '0';
2871
                                        cycle_ctr <= x"0";
2872
 
2873
                                when x"71" =>                   --ADC (zero),y 5th part proto
2874
                                        flags_fg <= "01";
2875
                                        reg_a <= reg_a + ("0" & data_rd) + ("00000000" & reg_a(8));
2876 3 stanley82
                                        dat_out <= reg_a(7 downto 0) + data_rd + ("0000000" & reg_a(8));
2877 2 stanley82
                                        pc_inc_fg <= '0';
2878
                                        cycle_ctr <= x"0";
2879
 
2880
                                when x"E1" =>                   --SBC (zero,x) 5th part proto
2881
                                        flags_fg <= "01";
2882
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
2883 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
2884 2 stanley82
                                        pc_inc_fg <= '0';
2885
                                        cycle_ctr <= x"0";
2886
 
2887
                                when x"F1" =>                   --SBC (zero),y 5th part proto
2888
                                        flags_fg <= "01";
2889
                                        reg_a <= reg_a - ("0" & data_rd) - ("00000000" & reg_a(8));
2890 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd - ("0000000" & reg_a(8));
2891 2 stanley82
                                        pc_inc_fg <= '0';
2892
                                        cycle_ctr <= x"0";
2893
                                when x"C1" =>                   --CMP (zero,x) 5th part proto
2894
                                        flags_fg <= "01";
2895 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd;
2896
                                        if reg_a(7 downto 0) >= data_rd then
2897 2 stanley82
                                                reg_a(8) <= '1';
2898
                                        else
2899
                                                reg_a(8) <= '0';
2900
                                        end if;
2901
                                        pc_inc_fg <= '0';
2902
                                        cycle_ctr <= x"0";
2903
 
2904
                                when x"D1" =>                   --CMP (zero),y 5th part proto
2905
                                        flags_fg <= "01";
2906 3 stanley82
                                        dat_out <= reg_a(7 downto 0) - data_rd;
2907
                                        if reg_a(7 downto 0) >= data_rd then
2908 2 stanley82
                                                reg_a(8) <= '1';
2909
                                        else
2910
                                                reg_a(8) <= '0';
2911
                                        end if;
2912
                                        pc_inc_fg <= '0';
2913
                                        cycle_ctr <= x"0";
2914
 
2915
                                when x"81" =>                   --STA (zero,x) 5th part proto
2916
                                        pc_inc_fg <= '1';
2917
                                        add_fg <= x"0";
2918
                                        cycle_ctr <= cycle_ctr + x"1";
2919
                                when x"91" =>                   --STA (zero),y 5th part proto
2920
                                        pc_inc_fg <= '1';
2921
                                        add_fg <= x"0";
2922
                                        cycle_ctr <= cycle_ctr + x"1";
2923
--      ==============================================================================
2924
                                when x"4C"  =>                  --JMP abs 5th part
2925
                                        pc_inc_fg <= '0';
2926
                                        cycle_ctr <= x"0";
2927
                                when x"6C" =>                   --JMP indirect 5th part
2928
                                        pc_inc_fg <= '1';
2929
                                        dat2pc_fg <= '0';
2930
                                        cycle_ctr <= cycle_ctr + x"1";
2931
                                when x"20" =>                   --JSR 5th part
2932
                                        pc_inc_fg <= '1';
2933
                                        add_fg <= x"0";
2934
                                        reg_sp <= reg_sp + "1";
2935
                                        cycle_ctr <= cycle_ctr + x"1";
2936
                                when x"60" =>                   --RTS fifth part
2937
                                        dat2pc_fg <= '0';
2938
                                        cycle_ctr <= cycle_ctr + x"1";
2939
 
2940
                                when x"40" =>                   --RTI fifth part
2941
--                                      reg_sp <= reg_sp + "1";
2942
                                        add_fg <= x"0";
2943
--                                      dat2pc_fg <= '0';
2944
                                        cycle_ctr <= cycle_ctr + x"1";
2945
 
2946
                                when x"00" =>                   --Break fifth part cyc 4
2947 3 stanley82
                                        wr_fg <= '0';
2948 2 stanley82
                                        reg_sp <= reg_sp + "1";
2949
                                        if nmi_fg = '0' then
2950
                                                add_fg <= x"9";         --Complete stacking start getting vector
2951
                                        else
2952
                                                add_fg <= x"A";
2953
                                        end if;
2954
                                        cycle_ctr <= cycle_ctr + x"1";
2955
 
2956
 
2957
                                when others =>
2958
                                        cycle_ctr <= cycle_ctr + x"1";
2959
 
2960
                        end case;       --Cycle 4
2961
--                      end if;
2962
------------------------------------------------------------------------
2963
--      End of cycle 4
2964
--      Cycle 5 is for 3 byte instructions ie LDA abs
2965
 
2966
                when x"5" =>
2967
                        case Instruction_in is
2968
--      =========================================================================
2969
                                when x"81" =>                   --STA (zero,x) 6th part proto
2970
                                        pc_inc_fg <= '0';
2971
                                        cycle_ctr <= x"0";
2972
                                when x"91" =>                   --STA (zero),y 6th part proto
2973
                                        pc_inc_fg <= '0';
2974
                                        cycle_ctr <= x"0";
2975
 
2976
 
2977
--      ........................................................................................
2978
                                when x"E6" =>                   --INC zero 6th part
2979
                                        pc_inc_fg <= '0';
2980
                                        cycle_ctr <= x"0";
2981
                                when x"c6" =>                   --dec zero 6th part
2982
                                        pc_inc_fg <= '0';
2983
                                        cycle_ctr <= x"0";
2984
                                when x"26" =>                   --ROL zero 6th part
2985
                                        pc_inc_fg <= '0';
2986
                                        cycle_ctr <= x"0";
2987
 
2988
                                when x"F6" =>                   --INC zero,X 6th part
2989
                                        pc_inc_fg <= '0';
2990
                                        cycle_ctr <= x"0";
2991
                                when x"46" =>                   --LSR zero 6th part
2992
                                        pc_inc_fg <= '0';
2993
                                        cycle_ctr <= x"0";
2994
                                when x"56" =>                   --LSR zero,X 6th part
2995
                                        pc_inc_fg <= '0';
2996
                                        cycle_ctr <= x"0";
2997
 
2998
                                when x"66" =>                   --ROR zero 6th part
2999
                                        pc_inc_fg <= '0';
3000
                                        cycle_ctr <= x"0";
3001
                                when x"76" =>                   --ROR zero,X 6th part
3002
                                        pc_inc_fg <= '0';
3003
                                        cycle_ctr <= x"0";
3004
 
3005
                                when x"36" =>                   --ROL zero,X 6th part
3006
                                        pc_inc_fg <= '0';
3007
                                        cycle_ctr <= x"0";
3008
                                when x"06" =>                   --ASL zero 6th part
3009
                                        pc_inc_fg <= '0';
3010
                                        cycle_ctr <= x"0";
3011
                                when x"16" =>                   --ASL zero,X 6th part
3012
                                        pc_inc_fg <= '0';
3013
                                        cycle_ctr <= x"0";
3014
 
3015
 
3016
--==================================================
3017
 
3018
 
3019
                                when x"EE" =>                   --INC abs 6th part.
3020
                                        add_fg <= x"0";
3021
                                        cycle_ctr <= cycle_ctr + x"1";
3022
 
3023
                                when x"FE" =>                   --INC, x 6th part.
3024
                                        add_fg <= x"0";
3025
                                        cycle_ctr <= x"0";
3026
                                when x"CE" =>                   --DEC 6th part.
3027
                                        add_fg <= x"0";
3028
                                        cycle_ctr <= cycle_ctr + x"1";
3029
                                when x"DE" =>                   --DEC, x 6th part.
3030
                                        add_fg <= x"0";
3031
                                        cycle_ctr <= cycle_ctr + x"1";
3032
 
3033
                                when x"2E" =>                   --ROL 6th part.
3034
                                        add_fg <= x"0";
3035
                                        cycle_ctr <= cycle_ctr + x"1";
3036
                                when x"3E" =>                   --ROL, x 6th part.
3037
                                        add_fg <= x"0";
3038
                                        cycle_ctr <= cycle_ctr + x"1";
3039
                                when x"6E" =>                   --ROR 6th part.
3040
                                        add_fg <= x"0";
3041
                                        cycle_ctr <= cycle_ctr + x"1";
3042
                                when x"7E" =>                   --ROR, x 6th part.
3043
                                        add_fg <= x"0";
3044
                                        cycle_ctr <= cycle_ctr + x"1";
3045
                                when x"4E" =>                   --LSR 6th part.
3046
                                        add_fg <= x"0";
3047
                                        cycle_ctr <= cycle_ctr + x"1";
3048
                                when x"5E" =>                   --LSR, x 6th part.
3049
                                        add_fg <= x"0";
3050
                                        cycle_ctr <= cycle_ctr + x"1";
3051
                                when x"0E" =>                   --ASL 6th part.
3052
                                        add_fg <= x"0";
3053
                                        cycle_ctr <= cycle_ctr + x"1";
3054
                                when x"1E" =>                   --ASL, x 6th part.
3055
                                        add_fg <= x"0";
3056
                                        cycle_ctr <= cycle_ctr + x"1";
3057
--      ........................................................................................
3058
                                when x"6C" =>                   --JMP indirect 6th part
3059
                                        pc_inc_fg <= '0';
3060
                                        cycle_ctr <= x"0";
3061
 
3062
                                when x"60" =>                   --RTS 6th part
3063
                                        pc_inc_fg <= '0';
3064
                                        cycle_ctr <= x"0";
3065
 
3066
                                when x"40" =>                   --RTI sixth part
3067
                                        cycle_ctr <= cycle_ctr + x"1";
3068
                                                pc_inc_fg <= '1';
3069
                                        cycle_ctr <= cycle_ctr + x"1";
3070
 
3071
                                when x"20" =>                   --JSR 6th part
3072
                                        pc_inc_fg <= '0';
3073
                                        cycle_ctr <= x"0";
3074
 
3075
                                when x"00" =>                   --Break 6th part cyc 5
3076
                                        add_fg <= x"B";
3077
                                        irq_fg <= '0';
3078
                                        nmi_fg <= '0';
3079
                                        cycle_ctr <= cycle_ctr + "1";
3080
 
3081
                                when others =>
3082 3 stanley82
 
3083 2 stanley82
                                        cycle_ctr <= cycle_ctr + x"1";
3084
                        end  case;      --Cycle 5
3085
 
3086
------------------------------------------------------------------------
3087
--      End of cycle 5
3088
--      Cycle 6 is for 3 byte instructions ie LDA abs
3089
 
3090
                when x"6" =>
3091
                        case Instruction_in is
3092
 
3093
                                when x"EE" =>                   --INC abs 7th part.
3094
                                        pc_inc_fg <= '0';
3095
                                        cycle_ctr <= x"0";
3096
                                when x"cE" =>                   --DEC abs 7th part.
3097
                                        pc_inc_fg <= '0';
3098
                                        cycle_ctr <= x"0";
3099
                                when x"2E" =>                   --ROL abs 7th part.
3100
                                        pc_inc_fg <= '0';
3101
                                        cycle_ctr <= x"0";
3102
                                when x"3E" =>                   --ROL, x abs 7th part.
3103
                                        pc_inc_fg <= '0';
3104
                                        cycle_ctr <= x"0";
3105
                                when x"6E" =>                   --ROR abs 7th part.
3106
                                        pc_inc_fg <= '0';
3107
                                        cycle_ctr <= x"0";
3108
                                when x"7E" =>                   --ROR, x abs 7th part.
3109
                                        pc_inc_fg <= '0';
3110
                                        cycle_ctr <= x"0";
3111
                                when x"4E" =>                   --LSR abs 7th part.
3112
                                        pc_inc_fg <= '0';
3113
                                        cycle_ctr <= x"0";
3114
                                when x"5E" =>                   --LSR, x abs 7th part.
3115
                                        pc_inc_fg <= '0';
3116
                                        cycle_ctr <= x"0";
3117
                                when x"0E" =>                   --ASL abs 7th part.
3118
                                        pc_inc_fg <= '0';
3119
                                        cycle_ctr <= x"0";
3120
                                when x"1E" =>                   --ASL, x abs 7th part.
3121
                                        pc_inc_fg <= '0';
3122
                                        cycle_ctr <= x"0";
3123
--=============================================================================
3124
 
3125
                                when x"40" =>                   --RTI 7th part
3126
                                        pc_inc_fg <= '0';
3127
                                        cycle_ctr <= x"0";
3128
 
3129
                                when x"00" =>                   --Break 7th part cyc 6
3130
                                        dat2pc_fg <= '1';
3131
                                        add_fg <= x"0";
3132
                                        cycle_ctr <= cycle_ctr + "1";
3133
 
3134
                        when others =>
3135
                                cycle_ctr <=  x"0";
3136
                                --get_inst_fg <= '0';
3137
 
3138
 
3139
                        end  case;      --Cycle 6
3140
--      End of cycle 6
3141
 
3142
 
3143
--      Cycle 8 is for 3 byte instructions ie LDA abs
3144
 
3145
                when x"7" =>
3146
                        case Instruction_in is
3147
 
3148
                                when x"40" =>                   --RTI 8th cyc
3149
                                        cycle_ctr <= x"0";
3150
 
3151
                                when x"00" =>                   --Break 8th part cyc 7
3152
                                        if start_fg = '0' then   --When starting don't mess with this
3153
                                                i_fg <= '1';    --Break irq and start use this logic.
3154
                                        end if;
3155
                                        pc_inc_fg <= '1';
3156
                                        start_fg <= '0';
3157
                                        dat2pc_fg <= '0';
3158
                                        cycle_ctr <= cycle_ctr + "1";
3159
 
3160
 
3161
                                when others =>
3162
                                        cycle_ctr <= x"0";
3163
 
3164
                        end  case;      --Cycle 7
3165
--      Cycle 7
3166
                when x"8" =>
3167
                        case Instruction_in is
3168
 
3169
                                when x"00" =>                   --Break 10th part cyc 8
3170
                                        pc_inc_fg <= '0';
3171
                                        cycle_ctr <= x"0";
3172
 
3173
                                when others =>
3174
                                cycle_ctr <= cycle_ctr + "1";
3175
                                pc_inc_fg <= '0';
3176
 
3177
                        end  case;      --Cycle 8
3178
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3179
--      Cycle 9
3180
                when x"9" =>
3181
                        case Instruction_in is
3182
 
3183
                                when others =>
3184
                                cycle_ctr <= cycle_ctr + "1";
3185
                                pc_inc_fg <= '0';
3186
 
3187
                        end  case;      --Cycle 9
3188
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3189
--      Cycle A
3190
 
3191
                when x"A" =>
3192
                        case Instruction_in is
3193
 
3194
 
3195
                                when others =>
3196
                                cycle_ctr <= cycle_ctr + "1";
3197
                                pc_inc_fg <= '0';
3198
 
3199
                        end  case;      --Cycle A
3200
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3201
--      Cycle B
3202
 
3203
                when x"B" =>
3204
                        case Instruction_in is
3205
 
3206
                                when others =>
3207
                                        cycle_ctr <= cycle_ctr + "1";
3208
                                        pc_inc_fg <= '0';
3209
 
3210
                        end  case;      --Cycle B
3211
--      ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3212
--      Cycle C
3213
 
3214
                when x"C" =>
3215
                        case Instruction_in is
3216
 
3217
 
3218
                                when others =>
3219
                                cycle_ctr <=  x"0";
3220
 
3221
                        end  case;      --Cycle C
3222
 
3223
--      ==========================================================================
3224
 
3225
 
3226
                when others =>
3227
                        cycle_ctr<= x"0";
3228
        end case;       --cycle_ctr
3229
end if; --Reset stuff
3230
 
3231
end if; --rising edge
3232
 
3233
end process instruction_decode;
3234
 
3235
end P65C02_architecture;
3236
 

powered by: WebSVN 2.1.0

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