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

Subversion Repositories cpu65c02_true_cycle

[/] [cpu65c02_true_cycle/] [trunk/] [released/] [rtl/] [v2_00/] [vhdl/] [fsm_execution_unit.vhd] - Blame information for rev 24

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 24 fpga_is_fu
LIBRARY ieee;
2
USE ieee.std_logic_1164.all;
3
USE ieee.std_logic_arith.all;
4
 
5
entity fsm_execution_unit is
6
   port(
7
      adr_nxt_pc_i : in     std_logic_vector (15 downto 0);
8
      adr_pc_i     : in     std_logic_vector (15 downto 0);
9
      adr_sp_i     : in     std_logic_vector (15 downto 0);
10
      clk_clk_i    : in     std_logic;
11
      d_alu_i      : in     std_logic_vector ( 7 downto 0 );
12
      d_alu_prio_i : in     std_logic_vector (7 downto 0);
13
      d_i          : in     std_logic_vector ( 7 downto 0 );
14
      d_regs_out_i : in     std_logic_vector ( 7 downto 0 );
15
      irq_n_i      : in     std_logic;
16
      nmi_i        : in     std_logic;
17
      q_a_i        : in     std_logic_vector ( 7 downto 0 );
18
      q_x_i        : in     std_logic_vector ( 7 downto 0 );
19
      q_y_i        : in     std_logic_vector ( 7 downto 0 );
20
      rdy_i        : in     std_logic;
21
      reg_0flag_i  : in     std_logic;
22
      reg_1flag_i  : in     std_logic;
23
      reg_7flag_i  : in     std_logic;
24
      rst_rst_n_i  : in     std_logic;
25
      so_n_i       : in     std_logic;
26
      a_o          : out    std_logic_vector (15 downto 0);
27
      adr_o        : out    std_logic_vector (15 downto 0);
28
      ch_a_o       : out    std_logic_vector ( 7 downto 0 );
29
      ch_b_o       : out    std_logic_vector ( 7 downto 0 );
30
      d_o          : out    std_logic_vector ( 7 downto 0 );
31
      d_regs_in_o  : out    std_logic_vector ( 7 downto 0 );
32
      ld_o         : out    std_logic_vector ( 1 downto 0 );
33
      ld_pc_o      : out    std_logic;
34
      ld_sp_o      : out    std_logic;
35
      load_regs_o  : out    std_logic;
36
      offset_o     : out    std_logic_vector ( 15 downto 0 );
37
      rd_o         : out    std_logic;
38
      rst_nmi_o    : out    std_logic;
39
      sel_pc_in_o  : out    std_logic;
40
      sel_pc_val_o : out    std_logic_vector ( 1 downto 0 );
41
      sel_rb_in_o  : out    std_logic_vector ( 1 downto 0 );
42
      sel_rb_out_o : out    std_logic_vector ( 1 downto 0 );
43
      sel_reg_o    : out    std_logic_vector ( 1 downto 0 );
44
      sel_sp_as_o  : out    std_logic;
45
      sel_sp_in_o  : out    std_logic;
46
      sync_o       : out    std_logic;
47
      wr_n_o       : out    std_logic;
48
      wr_o         : out    std_logic
49
   );
50
 
51
-- Declarations
52
 
53
end fsm_execution_unit ;
54
-- (C) 2008 - 2021 Jens Gutschmidt
55
-- (email: opencores@vivare-services.com)
56
-- 
57
-- Versions:
58
-- Revision 1.15  2021/01/22 13:24:00  jens
59
-- Production Release
60
-- 
61
-- Revision 1.14  2021/01/10 17:56:00  jens
62
-- - Performance improvements
63
-- Revision 1.13  2018/10/14 11:50:00  jens
64
-- - Performance improvements
65
-- Revision 1.1202  2018/09/10 12:14:00  jens
66
-- - RESET generates SYNC now, 1 dead cycle delayed
67
-- Revision 1.1202  RC 2018/09/09 03:00:00  jens
68
-- - ADC / SBC flags and A like R65C02 now
69
-- Revision 1.1202  BETA 2018/09/05 19:35:00  jens
70
-- - BBRx/BBSx internal cycles like real 65C02 now
71
-- - Bug Fix ADC and SBC in decimal mode (all op codes -
72
--   1 cycle is missing
73
-- - Bug Fix ADC and SBC in decimal mode (all op codes -
74
--   "Overflow" flag was computed wrong)
75
-- Revision 1.1202  BETA 2018/09/02 18:49:00  jens
76
-- - Interrupt NMI and IRQ processing via FETCH stage now
77
-- Revision 1.1202  BETA 2018/08/30 15:39:00  jens
78
-- - Interrupt priority order is now: BRQ - NMI - IRQ
79
-- - Performance improvements on-going (Mealy -> Moore)
80
-- Revision 1.1202  BETA 2018/08/23 20:27:00  jens
81
-- - Bug Fixes All Branch Instructions 
82
--   (BCC, BCS, BEQ, BNE, BPL, BMI, BVC, BVS, BRA)
83
--   3 cycles now if branch forward occur and the branch
84
--   instruction lies on a xxFEh location.
85
--   (BBR, BBS) 6 cycles now if branch forward occur and the
86
--   branch instruction lies on a xxFDh location.
87
-- - Bug Fix Hardware Interrupts NMI & IRQ - 7 cycles & "SYNC" now
88
-- - Bug Fix Now all cycles are delayable (WR and internal)
89
-- 
90
-- Revision 1.1201  BETA 2014/04/19 14:44:00  jens
91
-- (never submitted to opencores)
92
-- - Bug Fix JMP ABS - produced a 6502 like JMP (IND) PCH.
93
--   When the ABS address data bytes cross the page
94
--   boundary (e.g. $02FE JMP hhll reads hh from
95
--   $02FF and ll from $0200, instead $02FF and $0300) 
96
-- 
97
-- Revision 1.12  RC 2013/07/31 11:53:00  jens
98
-- - Bug Fix CMP (IND) - wrongly decoded as function AND
99
-- - Bug Fix BRK should clear decimal flag P Reg
100
-- - Bug Fix JMP (ABS,X) - Low Address outputted twice - no High Address
101
-- - Bug Fix Unknown Ops - Used allways 1b2c NOP ($EA) - new NOPs created
102
-- - Bug Fix DECIMAL ADC and SBC (all op codes - "C" flag was computed wrong)
103
-- - Bug Fix INC/DEC ABS,X - N/Z flag wrongly computed
104
-- - Bug Fix RTI - should increment stack pointer (decremented)
105
-- - Bug Fix "E" & "B" flags (Bits 5 & 4) - should be always "1" in P Reg. Change "RES", "RTI", "IRQ" & "NMI" substates.
106
-- - Bug Fix ADC and SBC (all op codes - "Overflow" flag was computed wrong)
107
-- - Bug Fix RMB, SMB Bug - Bit position decoded wrong.
108
-- 
109
-- Revision 1.11  2013/07/21 11:11:00  jens
110
-- - Changing the title block and internal revision history
111
-- - Bug Fix STA [(IND)] op$92 ($92 was missed in the connection list at state FETCH)
112
-- 
113
-- Revision 1.10  2010/02/08 17:34:20  eda
114
-- BUGFIX for IRQn, NMIn and RTI
115
-- After detection of NMI or IRQ the address of the next instruction stacked wrong.
116
-- NMI now overwrites the vector address of IRQ if NMI asserted after IRQ and the
117
-- vector address is not loaded yet.
118
-- 
119
-- 
120
-- Revision 1.9  2010/02/08 17:32:19  eda
121
-- BUGFIX for IRQn, NMIn and RTI
122
-- After detection of NMI or IRQ the address of the next instruction stacked wrong.
123
-- NMI now overwrites the vector address of IRQ if NMI asserted after IRQ and the
124
-- vector address is not loaded yet.
125
-- 
126
-- 
127
-- Revision 1.8  2009/01/04 20:23:42  eda
128
-- *** EMERGENCY BUGFIX ***
129
-- - Signal rd_o was corrupted in last version. wr_o and wr_n are not effected.
130
-- - OP JMP (indirect) produced a 65C02 like jump. On 6502 a special case exist
131
--  when the (indirect) address cross the page boundary (e.g. JMP (02FF) reads from
132
--  $02FF and $0200, instead of $02FF and $0300)
133
-- 
134
-- Revision 1.7  2009/01/04 16:54:59  eda
135
-- - Removed unused bits in ALU (zw_ALUx)
136
-- 
137
-- Revision 1.6  2009/01/04 10:27:49  eda
138
-- Changes for cosmetic issues only
139
-- 
140
-- Revision 1.5  2009/01/04 10:25:04  eda
141
-- Changes for cosmetic issues only
142
-- 
143
-- Revision 1.4  2009/01/03 16:53:01  eda
144
-- - Unused nets and blocks deleted
145
-- - Re-arragend symbols in block FSM_Execution_Unit
146
-- - Renamed blocks
147
-- - Input SO implemented
148
-- 
149
-- Revision 1.3  2009/01/03 16:42:02  eda
150
-- - Unused nets and blocks deleted
151
-- - Re-arragend symbols in block FSM_Execution_Unit
152
-- - Renamed blocks
153
-- - Input SO implemented
154
-- 
155
-- Revision 1.2  2008/12/31 19:31:24  eda
156
-- Production Release
157
--  
158
-- 
159
-- (C) 2008 - 2021 Jens Gutschmidt
160
-- (email: opencores@vivare-services.com)
161
-- 
162
-- Versions:
163
-- Revision 1.13 2021/01/22 13:23:00  jens
164
-- Production Release
165
-- Revision 1.1207 2021/01/05 23:36:00  jens
166
-- - Bug Fixes RDY (='0') 
167
-- - Performance improvements
168
-- Revision 1.02  2020/12/31 17:22:00  jens
169
-- - Bug Fix RDY (='0') forces A, X, Y and flags
170
--   to be comulated at specific states on several
171
--   instructions.
172
-- Revision 1.01  2018/10/14 11:57:00  jens
173
-- Initial Version
174
--  
175
-- 
176
-- (C) 2008 - 2021 Jens Gutschmidt
177
-- (email: opencores@vivare-services.com)
178
-- 
179
-- Versions:
180
-- Revision 1.01  2018/09/26 11:11:00  jens
181
-- Production Release
182
--  
183
-- 
184
-- (C) 2008 - 2021 Jens Gutschmidt
185
-- (email: opencores@vivare-services.com)
186
-- 
187
-- Versions:
188
-- Revision 1.01  2018/09/26 11:11:00  jens
189
-- Production Release
190
--  
191
-- 
192
-- (C) 2008 - 2021 Jens Gutschmidt
193
-- (email: opencores@vivare-services.com)
194
-- 
195
-- Versions:
196
-- Revision 1.01  2018/09/26 11:11:00  jens
197
-- Production Release
198
--  
199
-- 
200
-- (C) 2008 - 2021 Jens Gutschmidt
201
-- (email: opencores@vivare-services.com)
202
-- 
203
-- Versions:
204
-- Revision 1.01  2018/10/02 10:36:00  jens
205
-- Production Release
206
--  
207
-- 
208
--
209
-- r65c02_tc.fsm_execution_unit.fsm
210
--
211
-- Date:    22.01.2021
212
-- Time:    14:49:40
213
-- By:        VIVARE GmbH, Switzerland
214
--
215
-- COPYRIGHT (C) 2008 - 2021 by Jens Gutschmidt
216
-- 
217
-- This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.
218
-- 
219
-- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
220
-- 
221
-- You should have received a copy of the GNU General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.
222
-- 
223
-- 
224
-- COPYRIGHT (C) 2008 - 2021 by Jens Gutschmidt
225
-- 
226
-- This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.
227
-- 
228
-- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
229
-- 
230
-- You should have received a copy of the GNU General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>.
231
-- 
232
-- 
233
LIBRARY ieee;
234
USE ieee.std_logic_1164.all;
235
USE ieee.std_logic_arith.all;
236
 
237
architecture fsm of fsm_execution_unit is
238
 
239
   -- Architecture Declarations
240
   signal adc_sbc_finished : std_logic;
241
   signal c_detect_out : std_logic;
242
   signal cnz_detect_in : std_logic_vector(8 DOWNTO 0);
243
   signal d_regs_out_bak_i : std_logic_vector( 7 DOWNTO 0 );
244
   signal irq_finished : std_logic;
245
   signal n_detect_out : std_logic;
246
   signal op_fetch : std_logic;
247
   signal op_finished : std_logic;
248
   signal op_finished_det : std_logic;
249
   signal q_a_bak_i : std_logic_vector( 7 DOWNTO 0 );
250
   signal q_x_bak_i : std_logic_vector( 7 DOWNTO 0 );
251
   signal q_y_bak_i : std_logic_vector( 7 DOWNTO 0 );
252
   signal reg_F : std_logic_vector( 7 DOWNTO 0 );
253
   signal reg_F_bak : std_logic_vector( 7 DOWNTO 0 );
254
   signal reg_op_finished : std_logic;
255
   signal reg_sel_rb_in : std_logic_vector( 1 DOWNTO 0 );
256
   signal reg_sel_rb_out : std_logic_vector( 1 DOWNTO 0 );
257
   signal reg_sel_reg : std_logic_vector( 1 DOWNTO 0 );
258
   signal rmb_started : std_logic;
259
   signal rst_finished : std_logic;
260
   signal sel_pc_in : std_logic;
261
   signal sel_pc_val : std_logic_vector( 1 DOWNTO 0 );
262
   signal sel_sp_as : std_logic;
263
   signal sel_sp_in : std_logic;
264
   signal shift_rot_asl_out : std_logic_vector( 7 DOWNTO 0 );
265
   signal shift_rot_in : std_logic_vector( 7 DOWNTO 0 );
266
   signal shift_rot_l_c_out : std_logic;
267
   signal shift_rot_lsr_out : std_logic_vector( 7 DOWNTO 0 );
268
   signal shift_rot_r_c_out : std_logic;
269
   signal shift_rot_rol_out : std_logic_vector( 7 DOWNTO 0 );
270
   signal shift_rot_ror_out : std_logic_vector( 7 DOWNTO 0 );
271
   signal sig_D_OUT : std_logic_vector( 7 DOWNTO 0 );
272
   signal sig_PC : std_logic_vector(15 DOWNTO 0);
273
   signal sig_RD : std_logic;
274
   signal sig_RWn : std_logic;
275
   signal sig_SYNC : std_logic;
276
   signal sig_WR : std_logic;
277
   signal z_detect_out : std_logic;
278
   signal zw_ALU : std_logic_vector(9 DOWNTO 0);
279
   signal zw_ALU1 : std_logic_vector(9 DOWNTO 0);
280
   signal zw_ALU2 : std_logic_vector(9 DOWNTO 0);
281
   signal zw_ALU3 : std_logic_vector(9 DOWNTO 0);
282
   signal zw_ALU4 : std_logic_vector(9 DOWNTO 0);
283
   signal zw_ALU5 : std_logic_vector(9 DOWNTO 0);
284
   signal zw_ALU6 : std_logic_vector(9 DOWNTO 0);
285
   signal zw_PC : std_logic_vector( 15 DOWNTO 0 );
286
   signal zw_REG_ALU : std_logic_vector( 8 DOWNTO 0 );
287
   signal zw_REG_OP : std_logic_vector( 7 DOWNTO 0 );
288
   signal zw_REG_sig_PC : std_logic_vector(15 DOWNTO 0);
289
   signal zw_b1 : std_logic_vector( 7 DOWNTO 0 );
290
   signal zw_b10 : std_logic_vector(9 DOWNTO 0);
291
   signal zw_b11 : std_logic_vector( 7 DOWNTO 0 );
292
   signal zw_b12 : std_logic_vector( 7 DOWNTO 0 );
293
   signal zw_b13 : std_logic_vector( 7 DOWNTO 0 );
294
   signal zw_b14 : std_logic_vector( 7 DOWNTO 0 );
295
   signal zw_b2 : std_logic_vector( 7 DOWNTO 0 );
296
   signal zw_b3 : std_logic_vector( 7 DOWNTO 0 );
297
   signal zw_b4 : std_logic_vector( 7 DOWNTO 0 );
298
   signal zw_b5 : std_logic_vector( 7 DOWNTO 0 );
299
   signal zw_b6 : std_logic_vector( 7 DOWNTO 0 );
300
   signal zw_b7 : std_logic_vector(9 DOWNTO 0);
301
   signal zw_b8 : std_logic_vector(9 DOWNTO 0);
302
   signal zw_b9 : std_logic_vector(9 DOWNTO 0);
303
   signal zw_din : std_logic_vector(7 DOWNTO 0);
304
   signal zw_reg_0flag : std_logic;
305
   signal zw_so : std_logic;
306
   signal zw_w1 : std_logic_vector( 15 DOWNTO 0 );
307
   signal zw_w2 : std_logic_vector( 15 DOWNTO 0 );
308
   signal zw_w3 : std_logic_vector( 15 DOWNTO 0 );
309
 
310
   type csm_state_type is (
311
      res2,
312
      res4,
313
      res5,
314
      res6,
315
      res7,
316
      res3,
317
      RES,
318
      FETCH,
319
      nop1,
320
      txs1,
321
      bxx1,
322
      bxx2,
323
      bxx3,
324
      jmp1,
325
      jmp2_1,
326
      jmp4_12,
327
      jmp_ex,
328
      jmp2_2,
329
      jmp3_1,
330
      jsr1,
331
      jsr2,
332
      jsr3,
333
      jsr4,
334
      jsr5,
335
      brk1,
336
      brk2,
337
      brk3,
338
      brk4,
339
      brk6,
340
      brk5,
341
      rti1,
342
      rti2,
343
      rti3,
344
      rti4,
345
      rti5,
346
      rts1,
347
      rts2,
348
      rts3,
349
      rts4,
350
      rts5,
351
      pha1,
352
      pha2,
353
      php1,
354
      php2,
355
      pla1,
356
      pla2,
357
      pla3,
358
      plp1,
359
      plp2,
360
      plp3,
361
      irq1,
362
      irq2,
363
      irq3,
364
      irq5b,
365
      irq5a,
366
      irq4,
367
      irq6a,
368
      nop22,
369
      nop231,
370
      nop232,
371
      nop241,
372
      nop242,
373
      nop243,
374
      nop341,
375
      nop342,
376
      nop343,
377
      nop381,
378
      nop382,
379
      nop383,
380
      nop384,
381
      nop387,
382
      nop385,
383
      nop386,
384
      jmp3_2,
385
      bbr1,
386
      bbr5,
387
      bbr4,
388
      bbr2,
389
      bbr3,
390
      bbr6,
391
      RES0,
392
      zp1,
393
      zp2,
394
      zpx1,
395
      zpx2,
396
      zpx3,
397
      ab1,
398
      ab2,
399
      ab3,
400
      absx1,
401
      absx2,
402
      absx4,
403
      absx3,
404
      ind1,
405
      ind3,
406
      ind4,
407
      ind2,
408
      indy1,
409
      indy2,
410
      indy3,
411
      indy5,
412
      indy4,
413
      indx1,
414
      indx4,
415
      indx2,
416
      indx3,
417
      indx5,
418
      zpy1,
419
      zpy2,
420
      zpy3,
421
      absy2,
422
      absy1,
423
      absy4,
424
      absy3,
425
      imm1,
426
      imp1,
427
      irq6b,
428
      absx5,
429
      absy5,
430
      indy6,
431
      zprmw1,
432
      zprmw2,
433
      zprmw31,
434
      zprmw41,
435
      zpxrmw1,
436
      zpxrmw2,
437
      zpxrmw3,
438
      zpxrmw41,
439
      zpxrmw51,
440
      abrmw1,
441
      abrmw2,
442
      abrmw3,
443
      abrmw41,
444
      abrmw51,
445
      abxrmb1,
446
      abxrmb2,
447
      abxrmb3,
448
      abxrmb41,
449
      abxrmb51,
450
      abxrmb61,
451
      zp2w,
452
      zpx3w,
453
      zpy3w,
454
      ab3w,
455
      absx4w,
456
      absx3w,
457
      absy4w,
458
      absy3w,
459
      ind4w,
460
      indx5w,
461
      indy5w,
462
      indy4w,
463
      zprmw32,
464
      zpxrmw42,
465
      abrmw42,
466
      abxrmb52,
467
      abxrmb42,
468
      zp3,
469
      zpx4,
470
      ab4,
471
      ind5,
472
      indx6,
473
      imm2
474
   );
475
   type csm_functions_state_type is (
476
      f_idle,
477
      f_and,
478
      f_lda,
479
      f_rst,
480
      f_eor,
481
      f_cmp,
482
      f_ora,
483
      f_clc,
484
      f_sec,
485
      f_cld,
486
      f_sed,
487
      f_clv,
488
      f_cli,
489
      f_sei,
490
      f_rti,
491
      f_irq,
492
      f_res,
493
      f_bit1,
494
      f_bit2,
495
      f_de_in_a,
496
      f_adc_bin,
497
      f_sbc_bin,
498
      f_adc_dec,
499
      f_adc_dec1,
500
      f_sbc_dec,
501
      f_sbc_dec1,
502
      f_asla,
503
      f_lsra,
504
      f_rola,
505
      f_rora,
506
      f_tax,
507
      f_tsx,
508
      f_decr,
509
      f_asl,
510
      f_lsr,
511
      f_rol,
512
      f_ror,
513
      f_rmb,
514
      f_smb,
515
      f_trb,
516
      f_tsb
517
   );
518
   type csm_rb_out_state_type is (
519
      rb_out_idle,
520
      rb_out_01,
521
      rb_out_10,
522
      rb_out_11
523
   );
524
   type csm_reg_state_type is (
525
      reg_idle,
526
      reg_10,
527
      reg_11,
528
      reg_01
529
   );
530
   type csm_rb_in_state_type is (
531
      rb_in_idle,
532
      rb_in_01,
533
      rb_in_10,
534
      rb_in_00
535
   );
536
   type csm_add_value_state_type is (
537
      add_val_idle,
538
      add_val
539
   );
540
 
541
   -- Declare current and next state signals
542
   signal csm_current_state : csm_state_type;
543
   signal csm_next_state : csm_state_type;
544
   signal csm_functions_current_state : csm_functions_state_type;
545
   signal csm_functions_next_state : csm_functions_state_type;
546
   signal csm_rb_out_current_state : csm_rb_out_state_type;
547
   signal csm_rb_out_next_state : csm_rb_out_state_type;
548
   signal csm_reg_current_state : csm_reg_state_type;
549
   signal csm_reg_next_state : csm_reg_state_type;
550
   signal csm_rb_in_current_state : csm_rb_in_state_type;
551
   signal csm_rb_in_next_state : csm_rb_in_state_type;
552
   signal csm_add_value_current_state : csm_add_value_state_type;
553
   signal csm_add_value_next_state : csm_add_value_state_type;
554
 
555
   -- Declare any pre-registered internal signals
556
   signal sync_o_cld : std_logic ;
557
 
558
begin
559
 
560
   -----------------------------------------------------------------
561
   csm_clocked_proc : process (
562
      clk_clk_i,
563
      rst_rst_n_i
564
   )
565
   -----------------------------------------------------------------
566
   begin
567
      if (rst_rst_n_i = '0') then
568
         csm_current_state <= RES;
569
         -- Default Reset Values
570
         sync_o_cld <= '0';
571
         reg_op_finished <= '0';
572
         reg_sel_rb_in <= "00";
573
         reg_sel_rb_out <= "00";
574
         reg_sel_reg <= "00";
575
         zw_PC <= X"0000";
576
         zw_REG_ALU <= '0' & X"00";
577
         zw_REG_OP <= X"00";
578
         zw_REG_sig_PC <= X"0000";
579
         zw_b1 <= X"00";
580
         zw_b11 <= X"00";
581
         zw_b12 <= X"00";
582
         zw_b2 <= X"00";
583
         zw_b3 <= X"00";
584
         zw_b5 <= X"00";
585
         zw_b6 <= X"00";
586
         zw_reg_0flag <= '0';
587
         zw_so <= '0';
588
         zw_w1 <= X"0000";
589
         zw_w2 <= X"0000";
590
         zw_w3 <= X"0000";
591
      elsif (clk_clk_i'event and clk_clk_i = '1') then
592
         csm_current_state <= csm_next_state;
593
         -- Default Assignment To Internals
594
         reg_op_finished <= op_finished;
595
         reg_sel_rb_in <= reg_sel_rb_in;
596
         reg_sel_rb_out <= reg_sel_rb_out;
597
         reg_sel_reg <= reg_sel_reg;
598
         zw_PC <= zw_PC;
599
         zw_REG_ALU <= zw_REG_ALU;
600
         zw_REG_OP <= zw_REG_OP;
601
         zw_REG_sig_PC <= zw_REG_sig_PC;
602
         zw_b1 <= zw_b1;
603
         zw_b11 <= zw_b11;
604
         zw_b12 <= zw_b12;
605
         zw_b2 <= zw_b2;
606
         zw_b3 <= zw_b3;
607
         zw_b5 <= zw_b5;
608
         zw_b6 <= zw_b6;
609
         zw_reg_0flag <= zw_reg_0flag;
610
         zw_so <= (zw_so OR (NOT(so_n_i))) AND (NOT(reg_F(6)));
611
         zw_w1 <= zw_w1;
612
         zw_w2 <= zw_w2;
613
         zw_w3 <= zw_w3;
614
         sync_o_cld <= sig_SYNC;
615
 
616
         -- Combined Actions
617
         case csm_current_state is
618
            when res6 =>
619
               zw_b5 <= d_i;
620
            when FETCH =>
621
               zw_REG_OP <= d_i;
622
               if ((d_i = X"00") and (rdy_i = '1')) then
623
               elsif ((nmi_i = '1') and (rdy_i = '1')) then
624
                  zw_w3 <= adr_pc_i;
625
               elsif ((irq_n_i = '0' and
626
                      reg_F(2) = '0') and (rdy_i = '1')) then
627
                  zw_w3 <= adr_pc_i;
628
               end if;
629
            when bxx1 =>
630
               zw_b3 <= adr_nxt_pc_i (15 downto 8);
631
               zw_b2 <= d_i;
632
            when jmp1 =>
633
               zw_b5 <= d_i;
634
            when jmp2_1 =>
635
               zw_b6 <= d_i;
636
            when jmp4_12 =>
637
               zw_b5 <= d_i;
638
            when jmp2_2 =>
639
               zw_b6 <= d_i;
640
            when jsr1 =>
641
               zw_b1 <= d_i;
642
            when jsr2 =>
643
               zw_b11 <= adr_pc_i (15 downto 8);
644
               zw_b12 <= adr_pc_i (7 downto 0);
645
            when brk1 =>
646
               zw_b11 <= adr_nxt_pc_i (15 downto 8);
647
               zw_b12 <= adr_nxt_pc_i (7 downto 0);
648
            when brk3 =>
649
               zw_b11 <= reg_F OR X"30";
650
            when brk5 =>
651
               zw_b5 <= d_i;
652
            when rti4 =>
653
               zw_b5 <= d_i;
654
            when rts3 =>
655
               zw_b5 <= d_i;
656
            when rts4 =>
657
               zw_b6 <= d_i;
658
            when irq1 =>
659
               zw_b11 <= zw_w3 (15 downto 8);
660
               zw_b12 <= zw_w3 (7 downto 0);
661
            when irq3 =>
662
               zw_b11 <= reg_F AND X"EF";
663
            when irq5b =>
664
               zw_b5 <= d_i;
665
            when irq5a =>
666
               zw_b5 <= d_i;
667
            when bbr1 =>
668
               zw_b2 <= d_i;
669
            when bbr4 =>
670
               zw_w3 <= adr_pc_i;
671
               zw_b2 <= d_i;
672
               zw_b3 <= adr_nxt_pc_i (15 downto 8);
673
            when bbr3 =>
674
               zw_b1 <= d_i;
675
            when zp1 =>
676
               zw_b5 <= d_i;
677
               zw_b11 <= d_regs_out_i;
678
            when zpx1 =>
679
               zw_b5 <= d_i;
680
               zw_b11 <= d_regs_out_i;
681
            when zpx2 =>
682
               zw_b1 <= d_alu_i;
683
            when ab1 =>
684
               zw_b5 <= d_i;
685
               zw_b11 <= d_regs_out_i;
686
            when ab2 =>
687
               zw_b6 <= d_i;
688
            when absx1 =>
689
               zw_b5 <= d_i;
690
               zw_b11 <= d_regs_out_i;
691
            when absx2 =>
692
               zw_b6 <= d_i;
693
               zw_b1 <= d_alu_i;
694
               zw_reg_0flag <= reg_0flag_i;
695
            when absx3 =>
696
               zw_b3 <= d_alu_i;
697
            when ind1 =>
698
               zw_b5 <= d_i;
699
               zw_b11 <= d_regs_out_i;
700
            when ind3 =>
701
               zw_b5 <= d_i;
702
            when ind2 =>
703
               zw_b1 <= d_alu_i;
704
               zw_b6 <= d_i;
705
            when indy1 =>
706
               zw_b5 <= d_i;
707
               zw_b11 <= d_regs_out_i;
708
            when indy2 =>
709
               zw_b2 <= d_i;
710
               zw_b1 <= d_alu_i;
711
            when indy3 =>
712
               zw_b5 <= d_i;
713
               zw_b6 <= d_alu_i;
714
               zw_reg_0flag <= reg_0flag_i;
715
            when indy4 =>
716
               zw_b3 <= d_alu_i;
717
            when indx1 =>
718
               zw_b5 <= d_i;
719
               zw_b11 <= d_regs_out_i;
720
            when indx4 =>
721
               zw_b2 <= d_i;
722
            when indx2 =>
723
               zw_b1 <= d_alu_i;
724
            when indx3 =>
725
               zw_b5 <= d_i;
726
               zw_b6 <= d_alu_i;
727
            when zpy1 =>
728
               zw_b5 <= d_i;
729
               zw_b11 <= d_regs_out_i;
730
            when zpy2 =>
731
               zw_b1 <= d_alu_i;
732
            when absy2 =>
733
               zw_b6 <= d_i;
734
               zw_b1 <= d_alu_i;
735
               zw_reg_0flag <= reg_0flag_i;
736
            when absy1 =>
737
               zw_b5 <= d_i;
738
               zw_b11 <= d_regs_out_i;
739
            when absy3 =>
740
               zw_b3 <= d_alu_i;
741
            when zprmw1 =>
742
               zw_b5 <= d_i;
743
            when zprmw2 =>
744
               zw_b2 <= d_i;
745
            when zprmw31 =>
746
               zw_b11 <= d_alu_i;
747
            when zpxrmw1 =>
748
               zw_b5 <= d_i;
749
            when zpxrmw2 =>
750
               zw_b1 <= d_alu_i;
751
            when zpxrmw3 =>
752
               zw_b2 <= d_i;
753
            when zpxrmw41 =>
754
               zw_b11 <= d_alu_i;
755
            when abrmw1 =>
756
               zw_b5 <= d_i;
757
            when abrmw2 =>
758
               zw_b6 <= d_i;
759
            when abrmw3 =>
760
               zw_b2 <= d_i;
761
            when abrmw41 =>
762
               zw_b11 <= d_alu_i;
763
            when abxrmb1 =>
764
               zw_b5 <= d_i;
765
            when abxrmb2 =>
766
               zw_b6 <= d_i;
767
               zw_b1 <= d_alu_i;
768
               zw_reg_0flag <= reg_0flag_i;
769
            when abxrmb3 =>
770
               zw_b2 <= d_i;
771
               zw_b3 <= d_alu_i;
772
            when abxrmb41 =>
773
               zw_b2 <= d_i;
774
            when abxrmb51 =>
775
               zw_b11 <= d_alu_i;
776
            when absx3w =>
777
               zw_b3 <= d_alu_i;
778
            when absy3w =>
779
               zw_b3 <= d_alu_i;
780
            when indy4w =>
781
               zw_b3 <= d_alu_i;
782
            when zprmw32 =>
783
               zw_b11 <= zw_b13;
784
            when zpxrmw42 =>
785
               zw_b11 <= zw_b13;
786
            when abrmw42 =>
787
               zw_b11 <= zw_b13;
788
            when abxrmb52 =>
789
               zw_b11 <= zw_b13;
790
            when others =>
791
               null;
792
         end case;
793
      end if;
794
   end process csm_clocked_proc;
795
 
796
   -----------------------------------------------------------------
797
   csm_nextstate_proc : process (
798
      adr_nxt_pc_i,
799
      csm_current_state,
800
      d_i,
801
      irq_n_i,
802
      nmi_i,
803
      rdy_i,
804
      reg_F,
805
      zw_REG_OP,
806
      zw_b1,
807
      zw_b3,
808
      zw_reg_0flag
809
   )
810
   -----------------------------------------------------------------
811
   begin
812
      case csm_current_state is
813
         when res2 =>
814
            if (rdy_i = '1') then
815
               csm_next_state <= res3;
816
            else
817
               csm_next_state <= res2;
818
            end if;
819
         when res4 =>
820
            if (rdy_i = '1') then
821
               csm_next_state <= res5;
822
            else
823
               csm_next_state <= res4;
824
            end if;
825
         when res5 =>
826
            if (rdy_i = '1') then
827
               csm_next_state <= res6;
828
            else
829
               csm_next_state <= res5;
830
            end if;
831
         when res6 =>
832
            if (rdy_i = '1') then
833
               csm_next_state <= res7;
834
            else
835
               csm_next_state <= res6;
836
            end if;
837
         when res7 =>
838
            if (rdy_i = '1') then
839
               csm_next_state <= FETCH;
840
            else
841
               csm_next_state <= res7;
842
            end if;
843
         when res3 =>
844
            if (rdy_i = '1') then
845
               csm_next_state <= res4;
846
            else
847
               csm_next_state <= res3;
848
            end if;
849
         when RES =>
850
            if (rdy_i = '1') then
851
               csm_next_state <= RES0;
852
            else
853
               csm_next_state <= RES;
854
            end if;
855
         when FETCH =>
856
            if ((d_i = X"00") and (rdy_i = '1')) then
857
               csm_next_state <= brk1;
858
            elsif ((nmi_i = '1') and (rdy_i = '1')) then
859
               csm_next_state <= irq1;
860
            elsif ((irq_n_i = '0' and
861
                   reg_F(2) = '0') and (rdy_i = '1')) then
862
               csm_next_state <= irq1;
863
            elsif ((d_i = X"8F" or
864
                   d_i = X"9F" or
865
                   d_i = X"AF" or
866
                   d_i = X"BF" or
867
                   d_i = X"CF" or
868
                   d_i = X"DF" or
869
                   d_i = X"EF" or
870
                   d_i = X"FF" or
871
                   d_i = X"0F" or
872
                   d_i = X"1F" or
873
                   d_i = X"2F" or
874
                   d_i = X"3F" or
875
                   d_i = X"4F" or
876
                   d_i = X"5F" or
877
                   d_i = X"6F" or
878
                   d_i = X"7F") and (rdy_i = '1')) then
879
               csm_next_state <= bbr1;
880
            elsif ((d_i = X"90" or
881
                   d_i = X"B0" or
882
                   d_i = X"F0" or
883
                   d_i = X"30" or
884
                   d_i = X"D0" or
885
                   d_i = X"10" or
886
                   d_i = X"50" or
887
                   d_i = X"70" or
888
                   d_i = X"80") and (rdy_i = '1')) then
889
               csm_next_state <= bxx1;
890
            elsif ((d_i = X"4C" or
891
                   d_i = X"6C" or
892
                   d_i = X"7C") and (rdy_i = '1')) then
893
               csm_next_state <= jmp1;
894
            elsif ((d_i = X"20") and (rdy_i = '1')) then
895
               csm_next_state <= jsr1;
896
            elsif ((d_i = X"68") and (rdy_i = '1')) then
897
               csm_next_state <= pla1;
898
            elsif ((d_i = X"FA") and (rdy_i = '1')) then
899
               csm_next_state <= pla1;
900
            elsif ((d_i = X"C6" or
901
                   d_i = X"E6" or
902
                   d_i = X"66" or
903
                   d_i = X"06" or
904
                   d_i = X"46" or
905
                   d_i = X"26" or
906
                   d_i (3 downto 0) = X"7" or
907
                   d_i = X"14" or
908
                   d_i = X"04") and (rdy_i = '1')) then
909
               csm_next_state <= zprmw1;
910
            elsif ((d_i = X"D6" or
911
                   d_i = X"F6" or
912
                   d_i = X"76" or
913
                   d_i = X"16" or
914
                   d_i = X"56" or
915
                   d_i = X"36") and (rdy_i = '1')) then
916
               csm_next_state <= zpxrmw1;
917
            elsif ((d_i = X"CE" or
918
                   d_i = X"EE" or
919
                   d_i = X"6E" or
920
                   d_i = X"0E" or
921
                   d_i = X"4E" or
922
                   d_i = X"2E" or
923
                   d_i = X"1C" or
924
                   d_i = X"0C") and (rdy_i = '1')) then
925
               csm_next_state <= abrmw1;
926
            elsif ((d_i = X"DE" or
927
                   d_i = X"FE" or
928
                   d_i = X"7E" or
929
                   d_i = X"1E" or
930
                   d_i = X"5E" or
931
                   d_i = X"3E") and (rdy_i = '1')) then
932
               csm_next_state <= abxrmb1;
933
            elsif ((d_i = X"09" or
934
                   d_i = X"29" or
935
                   d_i = X"49" or
936
                   d_i = X"69" or
937
                   d_i = X"89" or
938
                   d_i = X"A0" or
939
                   d_i = X"A2" or
940
                   d_i = X"A9" or
941
                   d_i = X"C9" or
942
                   d_i = X"E0" or
943
                   d_i = X"C0" or
944
                   d_i = X"E9") and (rdy_i = '1')) then
945
               csm_next_state <= imm1;
946
            elsif ((d_i = X"05" or
947
                   d_i = X"25" or
948
                   d_i = X"45" or
949
                   d_i = X"65" or
950
                   d_i = X"A5" or
951
                   d_i = X"24" or
952
                   d_i = X"C5" or
953
                   d_i = X"E4" or
954
                   d_i = X"C4" or
955
                   d_i = X"A6" or
956
                   d_i = X"A4" or
957
                   d_i = X"E5" or
958
                   d_i = X"85" or
959
                   d_i = X"86" or
960
                   d_i = X"84" or
961
                   d_i = X"64") and (rdy_i = '1')) then
962
               csm_next_state <= zp1;
963
            elsif ((d_i = X"15" or
964
                   d_i = X"35" or
965
                   d_i = X"55" or
966
                   d_i = X"75" or
967
                   d_i = X"B5" or
968
                   d_i = X"34" or
969
                   d_i = X"D5" or
970
                   d_i = X"B4" or
971
                   d_i = X"F5" or
972
                   d_i = X"95" or
973
                   d_i = X"94" or
974
                   d_i = X"74") and (rdy_i = '1')) then
975
               csm_next_state <= zpx1;
976
            elsif ((d_i = X"B6" or
977
                   d_i = X"96") and (rdy_i = '1')) then
978
               csm_next_state <= zpy1;
979
            elsif ((d_i = X"6D" or
980
                   d_i = X"2D" or
981
                   d_i = X"2C" or
982
                   d_i = X"CD" or
983
                   d_i = X"CC" or
984
                   d_i = X"EC" or
985
                   d_i = X"4D" or
986
                   d_i = X"AD" or
987
                   d_i = X"AE" or
988
                   d_i = X"AC" or
989
                   d_i = X"0D" or
990
                   d_i = X"ED" or
991
                   d_i = X"8D" or
992
                   d_i = X"8E" or
993
                   d_i = X"8C" or
994
                   d_i = X"9C") and (rdy_i = '1')) then
995
               csm_next_state <= ab1;
996
            elsif ((d_i = X"7D" or
997
                   d_i = X"3D" or
998
                   d_i = X"3C" or
999
                   d_i = X"DD" or
1000
                   d_i = X"5D" or
1001
                   d_i = X"BD" or
1002
                   d_i = X"BC" or
1003
                   d_i = X"1D" or
1004
                   d_i = X"FD" or
1005
                   d_i = X"9D" or
1006
                   d_i = X"9E") and (rdy_i = '1')) then
1007
               csm_next_state <= absx1;
1008
            elsif ((d_i = X"79" or
1009
                   d_i = X"39" or
1010
                   d_i = X"D9" or
1011
                   d_i = X"5D" or
1012
                   d_i = X"59" or
1013
                   d_i = X"B9" or
1014
                   d_i = X"BE" or
1015
                   d_i = X"19" or
1016
                   d_i = X"F9" or
1017
                   d_i = X"99") and (rdy_i = '1')) then
1018
               csm_next_state <= absy1;
1019
            elsif ((d_i = X"72" or
1020
                   d_i = X"32" or
1021
                   d_i = X"D2" or
1022
                   d_i = X"59" or
1023
                   d_i = X"52" or
1024
                   d_i = X"B2" or
1025
                   d_i = X"12" or
1026
                   d_i = X"F2" or
1027
                   d_i = X"92") and (rdy_i = '1')) then
1028
               csm_next_state <= ind1;
1029
            elsif ((d_i = X"71" or
1030
                   d_i = X"31" or
1031
                   d_i = X"D1" or
1032
                   d_i = X"51" or
1033
                   d_i = X"B1" or
1034
                   d_i = X"11" or
1035
                   d_i = X"F1" or
1036
                   d_i = X"91") and (rdy_i = '1')) then
1037
               csm_next_state <= indy1;
1038
            elsif ((d_i = X"61" or
1039
                   d_i = X"21" or
1040
                   d_i = X"C1" or
1041
                   d_i = X"41" or
1042
                   d_i = X"A1" or
1043
                   d_i = X"01" or
1044
                   d_i = X"E1" or
1045
                   d_i = X"81") and (rdy_i = '1')) then
1046
               csm_next_state <= indx1;
1047
            elsif ((d_i = X"B8" or
1048
                   d_i = X"38" or
1049
                   d_i = X"18" or
1050
                   d_i = X"F8" or
1051
                   d_i = X"D8" or
1052
                   d_i = X"78" or
1053
                   d_i = X"58" or
1054
                   d_i = X"0A" or
1055
                   d_i = X"4A" or
1056
                   d_i = X"2A" or
1057
                   d_i = X"6A" or
1058
                   d_i = X"A8" or
1059
                   d_i = X"98" or
1060
                   d_i = X"BA" or
1061
                   d_i = X"8A" or
1062
                   d_i = X"AA" or
1063
                   d_i = X"C8" or
1064
                   d_i = X"E8" or
1065
                   d_i = X"1A" or
1066
                   d_i = X"88" or
1067
                   d_i = X"CA" or
1068
                   d_i = X"3A") and (rdy_i = '1')) then
1069
               csm_next_state <= imp1;
1070
            elsif ((d_i = X"7A") and (rdy_i = '1')) then
1071
               csm_next_state <= pla1;
1072
            elsif ((d_i = X"28") and (rdy_i = '1')) then
1073
               csm_next_state <= plp1;
1074
            elsif ((d_i = X"9A") and (rdy_i = '1')) then
1075
               csm_next_state <= txs1;
1076
            elsif ((d_i = X"60") and (rdy_i = '1')) then
1077
               csm_next_state <= rts1;
1078
            elsif ((d_i = X"40") and (rdy_i = '1')) then
1079
               csm_next_state <= rti1;
1080
            elsif ((d_i = X"08") and (rdy_i = '1')) then
1081
               csm_next_state <= php1;
1082
            elsif ((d_i = X"5A") and (rdy_i = '1')) then
1083
               csm_next_state <= pha1;
1084
            elsif ((d_i = X"DA") and (rdy_i = '1')) then
1085
               csm_next_state <= pha1;
1086
            elsif ((d_i = X"48") and (rdy_i = '1')) then
1087
               csm_next_state <= pha1;
1088
            elsif ((d_i = X"EA") and (rdy_i = '1')) then
1089
               csm_next_state <= nop1;
1090
            elsif ((d_i(3 downto 0) = X"3" or
1091
                   d_i(3 downto 0) = X"B") and (rdy_i = '1')) then
1092
               csm_next_state <= FETCH;
1093
            elsif ((d_i = X"02" or
1094
                   d_i = X"22" or
1095
                   d_i = X"42" or
1096
                   d_i = X"62" or
1097
                   d_i = X"82" or
1098
                   d_i = X"C2" or
1099
                   d_i = X"E2") and (rdy_i = '1')) then
1100
               csm_next_state <= nop22;
1101
            elsif ((d_i = X"44") and (rdy_i = '1')) then
1102
               csm_next_state <= nop231;
1103
            elsif ((d_i = X"54" or
1104
                   d_i = X"D4" or
1105
                   d_i = X"F4") and (rdy_i = '1')) then
1106
               csm_next_state <= nop241;
1107
            elsif ((d_i = X"DC" or
1108
                   d_i = X"FC") and (rdy_i = '1')) then
1109
               csm_next_state <= nop341;
1110
            elsif ((d_i = X"5C") and (rdy_i = '1')) then
1111
               csm_next_state <= nop381;
1112
            else
1113
               csm_next_state <= FETCH;
1114
            end if;
1115
         when nop1 =>
1116
            if (rdy_i = '1') then
1117
               csm_next_state <= FETCH;
1118
            else
1119
               csm_next_state <= nop1;
1120
            end if;
1121
         when txs1 =>
1122
            if (rdy_i = '1') then
1123
               csm_next_state <= FETCH;
1124
            else
1125
               csm_next_state <= txs1;
1126
            end if;
1127
         when bxx1 =>
1128
            if (rdy_i = '1' and (
1129
                (reg_F(0) = '1' and zw_REG_OP = X"90") or (reg_F(0) = '0' and zw_REG_OP = X"B0") or
1130
                (reg_F(1) = '0' and zw_REG_OP = X"F0") or (reg_F(7) = '0' and zw_REG_OP = X"30") or
1131
                (reg_F(1) = '1' and zw_REG_OP = X"D0") or (reg_F(7) = '1' and zw_REG_OP = X"10") or
1132
                (reg_F(6) = '1' and zw_REG_OP = X"50") or (reg_F(6) = '0' and zw_REG_OP = X"70"))) then
1133
               csm_next_state <= FETCH;
1134
            elsif (rdy_i = '1') then
1135
               csm_next_state <= bxx2;
1136
            else
1137
               csm_next_state <= bxx1;
1138
            end if;
1139
         when bxx2 =>
1140
            if (rdy_i = '1' and
1141
                zw_b3 = adr_nxt_pc_i (15 downto 8)) then
1142
               csm_next_state <= FETCH;
1143
            elsif (rdy_i = '1') then
1144
               csm_next_state <= bxx3;
1145
            else
1146
               csm_next_state <= bxx2;
1147
            end if;
1148
         when bxx3 =>
1149
            if (rdy_i = '1') then
1150
               csm_next_state <= FETCH;
1151
            else
1152
               csm_next_state <= bxx3;
1153
            end if;
1154
         when jmp1 =>
1155
            if (rdy_i = '1' and
1156
                zw_REG_OP = X"4C") then
1157
               csm_next_state <= jmp_ex;
1158
            elsif (rdy_i = '1' and
1159
                   zw_REG_OP = X"6C") then
1160
               csm_next_state <= jmp2_1;
1161
            elsif (rdy_i = '1' and
1162
                   zw_REG_OP = X"7C") then
1163
               csm_next_state <= jmp2_2;
1164
            else
1165
               csm_next_state <= jmp1;
1166
            end if;
1167
         when jmp2_1 =>
1168
            if (rdy_i = '1') then
1169
               csm_next_state <= jmp3_1;
1170
            else
1171
               csm_next_state <= jmp2_1;
1172
            end if;
1173
         when jmp4_12 =>
1174
            if (rdy_i = '1') then
1175
               csm_next_state <= jmp_ex;
1176
            else
1177
               csm_next_state <= jmp4_12;
1178
            end if;
1179
         when jmp_ex =>
1180
            if (rdy_i = '1') then
1181
               csm_next_state <= FETCH;
1182
            else
1183
               csm_next_state <= jmp_ex;
1184
            end if;
1185
         when jmp2_2 =>
1186
            if (rdy_i = '1') then
1187
               csm_next_state <= jmp3_2;
1188
            else
1189
               csm_next_state <= jmp2_2;
1190
            end if;
1191
         when jmp3_1 =>
1192
            if (rdy_i = '1') then
1193
               csm_next_state <= jmp4_12;
1194
            else
1195
               csm_next_state <= jmp3_1;
1196
            end if;
1197
         when jsr1 =>
1198
            if (rdy_i = '1') then
1199
               csm_next_state <= jsr2;
1200
            else
1201
               csm_next_state <= jsr1;
1202
            end if;
1203
         when jsr2 =>
1204
            if (rdy_i = '1') then
1205
               csm_next_state <= jsr3;
1206
            else
1207
               csm_next_state <= jsr2;
1208
            end if;
1209
         when jsr3 =>
1210
            if (rdy_i = '1') then
1211
               csm_next_state <= jsr4;
1212
            else
1213
               csm_next_state <= jsr3;
1214
            end if;
1215
         when jsr4 =>
1216
            if (rdy_i = '1') then
1217
               csm_next_state <= jsr5;
1218
            else
1219
               csm_next_state <= jsr4;
1220
            end if;
1221
         when jsr5 =>
1222
            if (rdy_i = '1') then
1223
               csm_next_state <= FETCH;
1224
            else
1225
               csm_next_state <= jsr5;
1226
            end if;
1227
         when brk1 =>
1228
            if (rdy_i = '1') then
1229
               csm_next_state <= brk2;
1230
            else
1231
               csm_next_state <= brk1;
1232
            end if;
1233
         when brk2 =>
1234
            if (rdy_i = '1') then
1235
               csm_next_state <= brk3;
1236
            else
1237
               csm_next_state <= brk2;
1238
            end if;
1239
         when brk3 =>
1240
            if (rdy_i = '1') then
1241
               csm_next_state <= brk4;
1242
            else
1243
               csm_next_state <= brk3;
1244
            end if;
1245
         when brk4 =>
1246
            if (rdy_i = '1') then
1247
               csm_next_state <= brk5;
1248
            else
1249
               csm_next_state <= brk4;
1250
            end if;
1251
         when brk6 =>
1252
            if (rdy_i = '1') then
1253
               csm_next_state <= FETCH;
1254
            else
1255
               csm_next_state <= brk6;
1256
            end if;
1257
         when brk5 =>
1258
            if (rdy_i = '1') then
1259
               csm_next_state <= brk6;
1260
            else
1261
               csm_next_state <= brk5;
1262
            end if;
1263
         when rti1 =>
1264
            if (rdy_i = '1') then
1265
               csm_next_state <= rti2;
1266
            else
1267
               csm_next_state <= rti1;
1268
            end if;
1269
         when rti2 =>
1270
            if (rdy_i = '1') then
1271
               csm_next_state <= rti3;
1272
            else
1273
               csm_next_state <= rti2;
1274
            end if;
1275
         when rti3 =>
1276
            if (rdy_i = '1') then
1277
               csm_next_state <= rti4;
1278
            else
1279
               csm_next_state <= rti3;
1280
            end if;
1281
         when rti4 =>
1282
            if (rdy_i = '1') then
1283
               csm_next_state <= rti5;
1284
            else
1285
               csm_next_state <= rti4;
1286
            end if;
1287
         when rti5 =>
1288
            if (rdy_i = '1') then
1289
               csm_next_state <= FETCH;
1290
            else
1291
               csm_next_state <= rti5;
1292
            end if;
1293
         when rts1 =>
1294
            if (rdy_i = '1') then
1295
               csm_next_state <= rts2;
1296
            else
1297
               csm_next_state <= rts1;
1298
            end if;
1299
         when rts2 =>
1300
            if (rdy_i = '1') then
1301
               csm_next_state <= rts3;
1302
            else
1303
               csm_next_state <= rts2;
1304
            end if;
1305
         when rts3 =>
1306
            if (rdy_i = '1') then
1307
               csm_next_state <= rts4;
1308
            else
1309
               csm_next_state <= rts3;
1310
            end if;
1311
         when rts4 =>
1312
            if (rdy_i = '1') then
1313
               csm_next_state <= rts5;
1314
            else
1315
               csm_next_state <= rts4;
1316
            end if;
1317
         when rts5 =>
1318
            if (rdy_i = '1') then
1319
               csm_next_state <= FETCH;
1320
            else
1321
               csm_next_state <= rts5;
1322
            end if;
1323
         when pha1 =>
1324
            if (rdy_i = '1') then
1325
               csm_next_state <= pha2;
1326
            else
1327
               csm_next_state <= pha1;
1328
            end if;
1329
         when pha2 =>
1330
            if (rdy_i = '1') then
1331
               csm_next_state <= FETCH;
1332
            else
1333
               csm_next_state <= pha2;
1334
            end if;
1335
         when php1 =>
1336
            if (rdy_i = '1') then
1337
               csm_next_state <= php2;
1338
            else
1339
               csm_next_state <= php1;
1340
            end if;
1341
         when php2 =>
1342
            if (rdy_i = '1') then
1343
               csm_next_state <= FETCH;
1344
            else
1345
               csm_next_state <= php2;
1346
            end if;
1347
         when pla1 =>
1348
            if (rdy_i = '1') then
1349
               csm_next_state <= pla2;
1350
            else
1351
               csm_next_state <= pla1;
1352
            end if;
1353
         when pla2 =>
1354
            if (rdy_i = '1') then
1355
               csm_next_state <= pla3;
1356
            else
1357
               csm_next_state <= pla2;
1358
            end if;
1359
         when pla3 =>
1360
            if (rdy_i = '1') then
1361
               csm_next_state <= FETCH;
1362
            else
1363
               csm_next_state <= pla3;
1364
            end if;
1365
         when plp1 =>
1366
            if (rdy_i = '1') then
1367
               csm_next_state <= plp2;
1368
            else
1369
               csm_next_state <= plp1;
1370
            end if;
1371
         when plp2 =>
1372
            if (rdy_i = '1') then
1373
               csm_next_state <= plp3;
1374
            else
1375
               csm_next_state <= plp2;
1376
            end if;
1377
         when plp3 =>
1378
            if (rdy_i = '1') then
1379
               csm_next_state <= FETCH;
1380
            else
1381
               csm_next_state <= plp3;
1382
            end if;
1383
         when irq1 =>
1384
            if (rdy_i = '1') then
1385
               csm_next_state <= irq2;
1386
            else
1387
               csm_next_state <= irq1;
1388
            end if;
1389
         when irq2 =>
1390
            if (rdy_i = '1') then
1391
               csm_next_state <= irq3;
1392
            else
1393
               csm_next_state <= irq2;
1394
            end if;
1395
         when irq3 =>
1396
            if (rdy_i = '1') then
1397
               csm_next_state <= irq4;
1398
            else
1399
               csm_next_state <= irq3;
1400
            end if;
1401
         when irq5b =>
1402
            if (rdy_i = '1') then
1403
               csm_next_state <= irq6b;
1404
            else
1405
               csm_next_state <= irq5b;
1406
            end if;
1407
         when irq5a =>
1408
            if (rdy_i = '1') then
1409
               csm_next_state <= irq6a;
1410
            else
1411
               csm_next_state <= irq5a;
1412
            end if;
1413
         when irq4 =>
1414
            if (rdy_i = '1' and
1415
                nmi_i = '1') then
1416
               csm_next_state <= irq5a;
1417
            elsif (rdy_i = '1') then
1418
               csm_next_state <= irq5b;
1419
            else
1420
               csm_next_state <= irq4;
1421
            end if;
1422
         when irq6a =>
1423
            if (rdy_i = '1') then
1424
               csm_next_state <= FETCH;
1425
            else
1426
               csm_next_state <= irq6a;
1427
            end if;
1428
         when nop22 =>
1429
            if (rdy_i = '1') then
1430
               csm_next_state <= FETCH;
1431
            else
1432
               csm_next_state <= nop22;
1433
            end if;
1434
         when nop231 =>
1435
            if (rdy_i = '1') then
1436
               csm_next_state <= nop232;
1437
            else
1438
               csm_next_state <= nop231;
1439
            end if;
1440
         when nop232 =>
1441
            if (rdy_i = '1') then
1442
               csm_next_state <= FETCH;
1443
            else
1444
               csm_next_state <= nop232;
1445
            end if;
1446
         when nop241 =>
1447
            if (rdy_i = '1') then
1448
               csm_next_state <= nop242;
1449
            else
1450
               csm_next_state <= nop241;
1451
            end if;
1452
         when nop242 =>
1453
            if (rdy_i = '1') then
1454
               csm_next_state <= nop243;
1455
            else
1456
               csm_next_state <= nop242;
1457
            end if;
1458
         when nop243 =>
1459
            if (rdy_i = '1') then
1460
               csm_next_state <= FETCH;
1461
            else
1462
               csm_next_state <= nop243;
1463
            end if;
1464
         when nop341 =>
1465
            if (rdy_i = '1') then
1466
               csm_next_state <= nop342;
1467
            else
1468
               csm_next_state <= nop341;
1469
            end if;
1470
         when nop342 =>
1471
            if (rdy_i = '1') then
1472
               csm_next_state <= nop343;
1473
            else
1474
               csm_next_state <= nop342;
1475
            end if;
1476
         when nop343 =>
1477
            if (rdy_i = '1') then
1478
               csm_next_state <= FETCH;
1479
            else
1480
               csm_next_state <= nop343;
1481
            end if;
1482
         when nop381 =>
1483
            if (rdy_i = '1') then
1484
               csm_next_state <= nop382;
1485
            else
1486
               csm_next_state <= nop381;
1487
            end if;
1488
         when nop382 =>
1489
            if (rdy_i = '1') then
1490
               csm_next_state <= nop383;
1491
            else
1492
               csm_next_state <= nop382;
1493
            end if;
1494
         when nop383 =>
1495
            if (rdy_i = '1') then
1496
               csm_next_state <= nop384;
1497
            else
1498
               csm_next_state <= nop383;
1499
            end if;
1500
         when nop384 =>
1501
            if (rdy_i = '1') then
1502
               csm_next_state <= nop385;
1503
            else
1504
               csm_next_state <= nop384;
1505
            end if;
1506
         when nop387 =>
1507
            if (rdy_i = '1') then
1508
               csm_next_state <= FETCH;
1509
            else
1510
               csm_next_state <= nop387;
1511
            end if;
1512
         when nop385 =>
1513
            if (rdy_i = '1') then
1514
               csm_next_state <= nop386;
1515
            else
1516
               csm_next_state <= nop385;
1517
            end if;
1518
         when nop386 =>
1519
            if (rdy_i = '1') then
1520
               csm_next_state <= nop387;
1521
            else
1522
               csm_next_state <= nop386;
1523
            end if;
1524
         when jmp3_2 =>
1525
            if (rdy_i = '1') then
1526
               csm_next_state <= jmp4_12;
1527
            else
1528
               csm_next_state <= jmp3_2;
1529
            end if;
1530
         when bbr1 =>
1531
            if (rdy_i = '1') then
1532
               csm_next_state <= bbr2;
1533
            else
1534
               csm_next_state <= bbr1;
1535
            end if;
1536
         when bbr5 =>
1537
            if (rdy_i = '1' and
1538
                zw_b3 = adr_nxt_pc_i (15 downto 8)) then
1539
               csm_next_state <= FETCH;
1540
            elsif (rdy_i = '1') then
1541
               csm_next_state <= bbr6;
1542
            else
1543
               csm_next_state <= bbr5;
1544
            end if;
1545
         when bbr4 =>
1546
            if (rdy_i = '1' and (
1547
                (zw_b1(0) = '0' and zw_REG_OP = X"8F") or
1548
                (zw_b1(1) = '0' and zw_REG_OP = X"9F") or
1549
                (zw_b1(2) = '0' and zw_REG_OP = X"AF") or
1550
                (zw_b1(3) = '0' and zw_REG_OP = X"BF") or
1551
                (zw_b1(4) = '0' and zw_REG_OP = X"CF") or
1552
                (zw_b1(5) = '0' and zw_REG_OP = X"DF") or
1553
                (zw_b1(6) = '0' and zw_REG_OP = X"EF") or
1554
                (zw_b1(7) = '0' and zw_REG_OP = X"FF") or
1555
                (zw_b1(0) = '1' and zw_REG_OP = X"0F") or
1556
                (zw_b1(1) = '1' and zw_REG_OP = X"1F") or
1557
                (zw_b1(2) = '1' and zw_REG_OP = X"2F") or
1558
                (zw_b1(3) = '1' and zw_REG_OP = X"3F") or
1559
                (zw_b1(4) = '1' and zw_REG_OP = X"4F") or
1560
                (zw_b1(5) = '1' and zw_REG_OP = X"5F") or
1561
                (zw_b1(6) = '1' and zw_REG_OP = X"6F") or
1562
                (zw_b1(7) = '1' and zw_REG_OP = X"7F"))) then
1563
               csm_next_state <= FETCH;
1564
            elsif (rdy_i = '1') then
1565
               csm_next_state <= bbr5;
1566
            else
1567
               csm_next_state <= bbr4;
1568
            end if;
1569
         when bbr2 =>
1570
            if (rdy_i = '1') then
1571
               csm_next_state <= bbr3;
1572
            else
1573
               csm_next_state <= bbr2;
1574
            end if;
1575
         when bbr3 =>
1576
            if (rdy_i = '1') then
1577
               csm_next_state <= bbr4;
1578
            else
1579
               csm_next_state <= bbr3;
1580
            end if;
1581
         when bbr6 =>
1582
            if (rdy_i = '1') then
1583
               csm_next_state <= FETCH;
1584
            else
1585
               csm_next_state <= bbr6;
1586
            end if;
1587
         when RES0 =>
1588
            if (rdy_i = '1') then
1589
               csm_next_state <= res2;
1590
            else
1591
               csm_next_state <= RES0;
1592
            end if;
1593
         when zp1 =>
1594
            if (rdy_i = '1' and
1595
                (zw_REG_OP = X"85" OR
1596
                zw_REG_OP = X"86" OR
1597
                zw_REG_OP = X"64" OR
1598
                zw_REG_OP = X"84")) then
1599
               csm_next_state <= zp2w;
1600
            elsif (rdy_i = '1') then
1601
               csm_next_state <= zp2;
1602
            else
1603
               csm_next_state <= zp1;
1604
            end if;
1605
         when zp2 =>
1606
            if (rdy_i = '1' and
1607
                reg_F(3) = '1' and
1608
                (zw_REG_OP = X"65" OR
1609
                zw_REG_OP = X"E5")) then
1610
               csm_next_state <= zp3;
1611
            elsif (rdy_i = '1') then
1612
               csm_next_state <= FETCH;
1613
            else
1614
               csm_next_state <= zp2;
1615
            end if;
1616
         when zpx1 =>
1617
            if (rdy_i = '1') then
1618
               csm_next_state <= zpx2;
1619
            else
1620
               csm_next_state <= zpx1;
1621
            end if;
1622
         when zpx2 =>
1623
            if (rdy_i = '1' and
1624
                (zw_REG_OP = X"95" OR
1625
                zw_REG_OP = X"74" OR
1626
                zw_REG_OP = X"94")) then
1627
               csm_next_state <= zpx3w;
1628
            elsif (rdy_i = '1') then
1629
               csm_next_state <= zpx3;
1630
            else
1631
               csm_next_state <= zpx2;
1632
            end if;
1633
         when zpx3 =>
1634
            if (rdy_i = '1' and
1635
                reg_F(3) = '1' and
1636
                (zw_REG_OP = X"75" OR
1637
                zw_REG_OP = X"F5")) then
1638
               csm_next_state <= zpx4;
1639
            elsif (rdy_i = '1') then
1640
               csm_next_state <= FETCH;
1641
            else
1642
               csm_next_state <= zpx3;
1643
            end if;
1644
         when ab1 =>
1645
            if (rdy_i = '1') then
1646
               csm_next_state <= ab2;
1647
            else
1648
               csm_next_state <= ab1;
1649
            end if;
1650
         when ab2 =>
1651
            if (rdy_i = '1' and
1652
                (zw_REG_OP = X"8D" OR
1653
                zw_REG_OP = X"8E" OR
1654
                zw_REG_OP = X"9C" OR
1655
                zw_REG_OP = X"8C")) then
1656
               csm_next_state <= ab3w;
1657
            elsif (rdy_i = '1') then
1658
               csm_next_state <= ab3;
1659
            else
1660
               csm_next_state <= ab2;
1661
            end if;
1662
         when ab3 =>
1663
            if (rdy_i = '1' and
1664
                reg_F(3) = '1' and
1665
                (zw_REG_OP = X"6D" OR
1666
                zw_REG_OP = X"ED")) then
1667
               csm_next_state <= ab4;
1668
            elsif (rdy_i = '1') then
1669
               csm_next_state <= FETCH;
1670
            else
1671
               csm_next_state <= ab3;
1672
            end if;
1673
         when absx1 =>
1674
            if (rdy_i = '1') then
1675
               csm_next_state <= absx2;
1676
            else
1677
               csm_next_state <= absx1;
1678
            end if;
1679
         when absx2 =>
1680
            if (rdy_i = '1' and
1681
                (zw_REG_OP = X"9D" OR
1682
                zw_REG_OP = X"9E")) then
1683
               csm_next_state <= absx3w;
1684
            elsif (rdy_i = '1') then
1685
               csm_next_state <= absx3;
1686
            else
1687
               csm_next_state <= absx2;
1688
            end if;
1689
         when absx4 =>
1690
            if ((rdy_i = '1') and ((zw_REG_OP = X"7D" or
1691
                 zw_REG_OP = X"FD") and
1692
                reg_F(3) = '1')) then
1693
               csm_next_state <= absx5;
1694
            elsif (rdy_i = '1') then
1695
               csm_next_state <= FETCH;
1696
            else
1697
               csm_next_state <= absx4;
1698
            end if;
1699
         when absx3 =>
1700
            if ((rdy_i = '1' AND
1701
                zw_reg_0flag = '0') and ((zw_REG_OP = X"7D" or
1702
                 zw_REG_OP = X"FD") and
1703
                reg_F(3) = '1')) then
1704
               csm_next_state <= absx5;
1705
            elsif (rdy_i = '1' AND
1706
                   zw_reg_0flag = '0') then
1707
               csm_next_state <= FETCH;
1708
            elsif (rdy_i = '1') then
1709
               csm_next_state <= absx4;
1710
            else
1711
               csm_next_state <= absx3;
1712
            end if;
1713
         when ind1 =>
1714
            if (rdy_i = '1') then
1715
               csm_next_state <= ind2;
1716
            else
1717
               csm_next_state <= ind1;
1718
            end if;
1719
         when ind3 =>
1720
            if (rdy_i = '1' and
1721
                zw_REG_OP = X"92") then
1722
               csm_next_state <= ind4w;
1723
            elsif (rdy_i = '1') then
1724
               csm_next_state <= ind4;
1725
            else
1726
               csm_next_state <= ind3;
1727
            end if;
1728
         when ind4 =>
1729
            if (rdy_i = '1' and
1730
                reg_F(3) = '1' and
1731
                (zw_REG_OP = X"72" OR
1732
                zw_REG_OP = X"F2")) then
1733
               csm_next_state <= ind5;
1734
            elsif (rdy_i = '1') then
1735
               csm_next_state <= FETCH;
1736
            else
1737
               csm_next_state <= ind4;
1738
            end if;
1739
         when ind2 =>
1740
            if (rdy_i = '1') then
1741
               csm_next_state <= ind3;
1742
            else
1743
               csm_next_state <= ind2;
1744
            end if;
1745
         when indy1 =>
1746
            if (rdy_i = '1') then
1747
               csm_next_state <= indy2;
1748
            else
1749
               csm_next_state <= indy1;
1750
            end if;
1751
         when indy2 =>
1752
            if (rdy_i = '1') then
1753
               csm_next_state <= indy3;
1754
            else
1755
               csm_next_state <= indy2;
1756
            end if;
1757
         when indy3 =>
1758
            if (rdy_i = '1' and
1759
                zw_REG_OP = X"91") then
1760
               csm_next_state <= indy4w;
1761
            elsif (rdy_i = '1') then
1762
               csm_next_state <= indy4;
1763
            else
1764
               csm_next_state <= indy3;
1765
            end if;
1766
         when indy5 =>
1767
            if ((rdy_i = '1') and ((zw_REG_OP = X"71" or
1768
                 zw_REG_OP = X"F1") and
1769
                reg_F(3) = '1')) then
1770
               csm_next_state <= indy6;
1771
            elsif (rdy_i = '1') then
1772
               csm_next_state <= FETCH;
1773
            else
1774
               csm_next_state <= indy5;
1775
            end if;
1776
         when indy4 =>
1777
            if ((rdy_i = '1' AND
1778
                zw_reg_0flag = '0') and ((zw_REG_OP = X"71" or
1779
                 zw_REG_OP = X"F1") and
1780
                reg_F(3) = '1')) then
1781
               csm_next_state <= indy6;
1782
            elsif (rdy_i = '1' AND
1783
                   zw_reg_0flag = '0') then
1784
               csm_next_state <= FETCH;
1785
            elsif (rdy_i = '1') then
1786
               csm_next_state <= indy5;
1787
            else
1788
               csm_next_state <= indy4;
1789
            end if;
1790
         when indx1 =>
1791
            if (rdy_i = '1') then
1792
               csm_next_state <= indx2;
1793
            else
1794
               csm_next_state <= indx1;
1795
            end if;
1796
         when indx4 =>
1797
            if (rdy_i = '1' and
1798
                zw_REG_OP = X"81") then
1799
               csm_next_state <= indx5w;
1800
            elsif (rdy_i = '1') then
1801
               csm_next_state <= indx5;
1802
            else
1803
               csm_next_state <= indx4;
1804
            end if;
1805
         when indx2 =>
1806
            if (rdy_i = '1') then
1807
               csm_next_state <= indx3;
1808
            else
1809
               csm_next_state <= indx2;
1810
            end if;
1811
         when indx3 =>
1812
            if (rdy_i = '1') then
1813
               csm_next_state <= indx4;
1814
            else
1815
               csm_next_state <= indx3;
1816
            end if;
1817
         when indx5 =>
1818
            if (rdy_i = '1' and
1819
                reg_F(3) = '1' and
1820
                (zw_REG_OP = X"61" OR
1821
                zw_REG_OP = X"E1")) then
1822
               csm_next_state <= indx6;
1823
            elsif (rdy_i = '1') then
1824
               csm_next_state <= FETCH;
1825
            else
1826
               csm_next_state <= indx5;
1827
            end if;
1828
         when zpy1 =>
1829
            if (rdy_i = '1') then
1830
               csm_next_state <= zpy2;
1831
            else
1832
               csm_next_state <= zpy1;
1833
            end if;
1834
         when zpy2 =>
1835
            if (rdy_i = '1' and
1836
                zw_REG_OP = X"96") then
1837
               csm_next_state <= zpy3w;
1838
            elsif (rdy_i = '1') then
1839
               csm_next_state <= zpy3;
1840
            else
1841
               csm_next_state <= zpy2;
1842
            end if;
1843
         when zpy3 =>
1844
            if (rdy_i = '1') then
1845
               csm_next_state <= FETCH;
1846
            else
1847
               csm_next_state <= zpy3;
1848
            end if;
1849
         when absy2 =>
1850
            if (rdy_i = '1' and
1851
                zw_REG_OP = X"99") then
1852
               csm_next_state <= absy3w;
1853
            elsif (rdy_i = '1') then
1854
               csm_next_state <= absy3;
1855
            else
1856
               csm_next_state <= absy2;
1857
            end if;
1858
         when absy1 =>
1859
            if (rdy_i = '1') then
1860
               csm_next_state <= absy2;
1861
            else
1862
               csm_next_state <= absy1;
1863
            end if;
1864
         when absy4 =>
1865
            if ((rdy_i = '1') and ((zw_REG_OP = X"79" or
1866
                 zw_REG_OP = X"F9") and
1867
                reg_F(3) = '1')) then
1868
               csm_next_state <= absy5;
1869
            elsif (rdy_i = '1') then
1870
               csm_next_state <= FETCH;
1871
            else
1872
               csm_next_state <= absy4;
1873
            end if;
1874
         when absy3 =>
1875
            if ((rdy_i = '1' AND
1876
                zw_reg_0flag = '0') and ((zw_REG_OP = X"79" or
1877
                 zw_REG_OP = X"F9") and
1878
                reg_F(3) = '1')) then
1879
               csm_next_state <= absy5;
1880
            elsif (rdy_i = '1' AND
1881
                   zw_reg_0flag = '0') then
1882
               csm_next_state <= FETCH;
1883
            elsif (rdy_i = '1') then
1884
               csm_next_state <= absy4;
1885
            else
1886
               csm_next_state <= absy3;
1887
            end if;
1888
         when imm1 =>
1889
            if (rdy_i = '1' and
1890
                reg_F(3) = '1' and
1891
                (zw_REG_OP = X"69" OR
1892
                zw_REG_OP = X"E9")) then
1893
               csm_next_state <= imm2;
1894
            elsif (rdy_i = '1') then
1895
               csm_next_state <= FETCH;
1896
            else
1897
               csm_next_state <= imm1;
1898
            end if;
1899
         when imp1 =>
1900
            if (rdy_i = '1') then
1901
               csm_next_state <= FETCH;
1902
            else
1903
               csm_next_state <= imp1;
1904
            end if;
1905
         when irq6b =>
1906
            if (rdy_i = '1') then
1907
               csm_next_state <= FETCH;
1908
            else
1909
               csm_next_state <= irq6b;
1910
            end if;
1911
         when absx5 =>
1912
            if (rdy_i = '1') then
1913
               csm_next_state <= FETCH;
1914
            else
1915
               csm_next_state <= absx5;
1916
            end if;
1917
         when absy5 =>
1918
            if (rdy_i = '1') then
1919
               csm_next_state <= FETCH;
1920
            else
1921
               csm_next_state <= absy5;
1922
            end if;
1923
         when indy6 =>
1924
            if (rdy_i = '1') then
1925
               csm_next_state <= FETCH;
1926
            else
1927
               csm_next_state <= indy6;
1928
            end if;
1929
         when zprmw1 =>
1930
            if (rdy_i = '1') then
1931
               csm_next_state <= zprmw2;
1932
            else
1933
               csm_next_state <= zprmw1;
1934
            end if;
1935
         when zprmw2 =>
1936
            if (rdy_i = '1' and
1937
                (zw_REG_OP = X"C6" or
1938
                 zw_REG_OP = X"E6")) then
1939
               csm_next_state <= zprmw31;
1940
            elsif (rdy_i = '1') then
1941
               csm_next_state <= zprmw32;
1942
            else
1943
               csm_next_state <= zprmw2;
1944
            end if;
1945
         when zprmw31 =>
1946
            if (rdy_i = '1') then
1947
               csm_next_state <= zprmw41;
1948
            else
1949
               csm_next_state <= zprmw31;
1950
            end if;
1951
         when zprmw41 =>
1952
            if (rdy_i = '1') then
1953
               csm_next_state <= FETCH;
1954
            else
1955
               csm_next_state <= zprmw41;
1956
            end if;
1957
         when zpxrmw1 =>
1958
            if (rdy_i = '1') then
1959
               csm_next_state <= zpxrmw2;
1960
            else
1961
               csm_next_state <= zpxrmw1;
1962
            end if;
1963
         when zpxrmw2 =>
1964
            if (rdy_i = '1') then
1965
               csm_next_state <= zpxrmw3;
1966
            else
1967
               csm_next_state <= zpxrmw2;
1968
            end if;
1969
         when zpxrmw3 =>
1970
            if (rdy_i = '1' and
1971
                (zw_REG_OP = X"D6" or
1972
                 zw_REG_OP = X"F6")) then
1973
               csm_next_state <= zpxrmw41;
1974
            elsif (rdy_i = '1') then
1975
               csm_next_state <= zpxrmw42;
1976
            else
1977
               csm_next_state <= zpxrmw3;
1978
            end if;
1979
         when zpxrmw41 =>
1980
            if (rdy_i = '1') then
1981
               csm_next_state <= zpxrmw51;
1982
            else
1983
               csm_next_state <= zpxrmw41;
1984
            end if;
1985
         when zpxrmw51 =>
1986
            if (rdy_i = '1') then
1987
               csm_next_state <= FETCH;
1988
            else
1989
               csm_next_state <= zpxrmw51;
1990
            end if;
1991
         when abrmw1 =>
1992
            if (rdy_i = '1') then
1993
               csm_next_state <= abrmw2;
1994
            else
1995
               csm_next_state <= abrmw1;
1996
            end if;
1997
         when abrmw2 =>
1998
            if (rdy_i = '1') then
1999
               csm_next_state <= abrmw3;
2000
            else
2001
               csm_next_state <= abrmw2;
2002
            end if;
2003
         when abrmw3 =>
2004
            if (rdy_i = '1' and
2005
                (zw_REG_OP = X"CE" or
2006
                 zw_REG_OP = X"EE")) then
2007
               csm_next_state <= abrmw41;
2008
            elsif (rdy_i = '1') then
2009
               csm_next_state <= abrmw42;
2010
            else
2011
               csm_next_state <= abrmw3;
2012
            end if;
2013
         when abrmw41 =>
2014
            if (rdy_i = '1') then
2015
               csm_next_state <= abrmw51;
2016
            else
2017
               csm_next_state <= abrmw41;
2018
            end if;
2019
         when abrmw51 =>
2020
            if (rdy_i = '1') then
2021
               csm_next_state <= FETCH;
2022
            else
2023
               csm_next_state <= abrmw51;
2024
            end if;
2025
         when abxrmb1 =>
2026
            if (rdy_i = '1') then
2027
               csm_next_state <= abxrmb2;
2028
            else
2029
               csm_next_state <= abxrmb1;
2030
            end if;
2031
         when abxrmb2 =>
2032
            if (rdy_i = '1') then
2033
               csm_next_state <= abxrmb3;
2034
            else
2035
               csm_next_state <= abxrmb2;
2036
            end if;
2037
         when abxrmb3 =>
2038
            if (rdy_i = '1' AND
2039
                zw_reg_0flag = '0' and
2040
                (zw_REG_OP = X"DE" or
2041
                 zw_REG_OP = X"FE")) then
2042
               csm_next_state <= abxrmb51;
2043
            elsif (rdy_i = '1' and
2044
                   (zw_REG_OP = X"DE" or
2045
                    zw_REG_OP = X"FE")) then
2046
               csm_next_state <= abxrmb41;
2047
            elsif (rdy_i = '1' AND
2048
                   zw_reg_0flag = '0') then
2049
               csm_next_state <= abxrmb52;
2050
            elsif (rdy_i = '1') then
2051
               csm_next_state <= abxrmb42;
2052
            else
2053
               csm_next_state <= abxrmb3;
2054
            end if;
2055
         when abxrmb41 =>
2056
            if (rdy_i = '1') then
2057
               csm_next_state <= abxrmb51;
2058
            else
2059
               csm_next_state <= abxrmb41;
2060
            end if;
2061
         when abxrmb51 =>
2062
            if (rdy_i = '1') then
2063
               csm_next_state <= abxrmb61;
2064
            else
2065
               csm_next_state <= abxrmb51;
2066
            end if;
2067
         when abxrmb61 =>
2068
            if (rdy_i = '1') then
2069
               csm_next_state <= FETCH;
2070
            else
2071
               csm_next_state <= abxrmb61;
2072
            end if;
2073
         when zp2w =>
2074
            if (rdy_i = '1') then
2075
               csm_next_state <= FETCH;
2076
            else
2077
               csm_next_state <= zp2w;
2078
            end if;
2079
         when zpx3w =>
2080
            if (rdy_i = '1') then
2081
               csm_next_state <= FETCH;
2082
            else
2083
               csm_next_state <= zpx3w;
2084
            end if;
2085
         when zpy3w =>
2086
            if (rdy_i = '1') then
2087
               csm_next_state <= FETCH;
2088
            else
2089
               csm_next_state <= zpy3w;
2090
            end if;
2091
         when ab3w =>
2092
            if (rdy_i = '1') then
2093
               csm_next_state <= FETCH;
2094
            else
2095
               csm_next_state <= ab3w;
2096
            end if;
2097
         when absx4w =>
2098
            if (rdy_i = '1') then
2099
               csm_next_state <= FETCH;
2100
            else
2101
               csm_next_state <= absx4w;
2102
            end if;
2103
         when absx3w =>
2104
            if (rdy_i = '1' AND
2105
                zw_reg_0flag = '0') then
2106
               csm_next_state <= FETCH;
2107
            elsif (rdy_i = '1') then
2108
               csm_next_state <= absx4w;
2109
            else
2110
               csm_next_state <= absx3w;
2111
            end if;
2112
         when absy4w =>
2113
            if (rdy_i = '1') then
2114
               csm_next_state <= FETCH;
2115
            else
2116
               csm_next_state <= absy4w;
2117
            end if;
2118
         when absy3w =>
2119
            if (rdy_i = '1' AND
2120
                zw_reg_0flag = '0') then
2121
               csm_next_state <= FETCH;
2122
            elsif (rdy_i = '1') then
2123
               csm_next_state <= absy4w;
2124
            else
2125
               csm_next_state <= absy3w;
2126
            end if;
2127
         when ind4w =>
2128
            if (rdy_i = '1') then
2129
               csm_next_state <= FETCH;
2130
            else
2131
               csm_next_state <= ind4w;
2132
            end if;
2133
         when indx5w =>
2134
            if (rdy_i = '1') then
2135
               csm_next_state <= FETCH;
2136
            else
2137
               csm_next_state <= indx5w;
2138
            end if;
2139
         when indy5w =>
2140
            if (rdy_i = '1') then
2141
               csm_next_state <= FETCH;
2142
            else
2143
               csm_next_state <= indy5w;
2144
            end if;
2145
         when indy4w =>
2146
            if (rdy_i = '1' AND
2147
                zw_reg_0flag = '0') then
2148
               csm_next_state <= FETCH;
2149
            elsif (rdy_i = '1') then
2150
               csm_next_state <= indy5w;
2151
            else
2152
               csm_next_state <= indy4w;
2153
            end if;
2154
         when zprmw32 =>
2155
            if (rdy_i = '1') then
2156
               csm_next_state <= zprmw41;
2157
            else
2158
               csm_next_state <= zprmw32;
2159
            end if;
2160
         when zpxrmw42 =>
2161
            if (rdy_i = '1') then
2162
               csm_next_state <= zpxrmw51;
2163
            else
2164
               csm_next_state <= zpxrmw42;
2165
            end if;
2166
         when abrmw42 =>
2167
            if (rdy_i = '1') then
2168
               csm_next_state <= abrmw51;
2169
            else
2170
               csm_next_state <= abrmw42;
2171
            end if;
2172
         when abxrmb52 =>
2173
            if (rdy_i = '1') then
2174
               csm_next_state <= abxrmb61;
2175
            else
2176
               csm_next_state <= abxrmb52;
2177
            end if;
2178
         when abxrmb42 =>
2179
            if (rdy_i = '1') then
2180
               csm_next_state <= abxrmb52;
2181
            else
2182
               csm_next_state <= abxrmb42;
2183
            end if;
2184
         when zp3 =>
2185
            if (rdy_i = '1') then
2186
               csm_next_state <= FETCH;
2187
            else
2188
               csm_next_state <= zp3;
2189
            end if;
2190
         when zpx4 =>
2191
            if (rdy_i = '1') then
2192
               csm_next_state <= FETCH;
2193
            else
2194
               csm_next_state <= zpx4;
2195
            end if;
2196
         when ab4 =>
2197
            if (rdy_i = '1') then
2198
               csm_next_state <= FETCH;
2199
            else
2200
               csm_next_state <= ab4;
2201
            end if;
2202
         when ind5 =>
2203
            if (rdy_i = '1') then
2204
               csm_next_state <= FETCH;
2205
            else
2206
               csm_next_state <= ind5;
2207
            end if;
2208
         when indx6 =>
2209
            if (rdy_i = '1') then
2210
               csm_next_state <= FETCH;
2211
            else
2212
               csm_next_state <= indx6;
2213
            end if;
2214
         when imm2 =>
2215
            if (rdy_i = '1') then
2216
               csm_next_state <= FETCH;
2217
            else
2218
               csm_next_state <= imm2;
2219
            end if;
2220
         when others =>
2221
            csm_next_state <= RES;
2222
      end case;
2223
   end process csm_nextstate_proc;
2224
 
2225
   -----------------------------------------------------------------
2226
   csm_output_proc : process (
2227
      adr_nxt_pc_i,
2228
      adr_pc_i,
2229
      adr_sp_i,
2230
      csm_current_state,
2231
      d_i,
2232
      d_regs_out_i,
2233
      irq_n_i,
2234
      nmi_i,
2235
      op_finished,
2236
      q_x_i,
2237
      q_y_i,
2238
      rdy_i,
2239
      reg_F,
2240
      reg_op_finished,
2241
      sel_pc_in,
2242
      sel_pc_val,
2243
      sel_sp_as,
2244
      sel_sp_in,
2245
      sig_D_OUT,
2246
      sig_PC,
2247
      sig_RD,
2248
      sig_RWn,
2249
      sig_WR,
2250
      zw_REG_OP,
2251
      zw_b1,
2252
      zw_b11,
2253
      zw_b12,
2254
      zw_b2,
2255
      zw_b3,
2256
      zw_b4,
2257
      zw_b5,
2258
      zw_b6,
2259
      zw_reg_0flag,
2260
      zw_w3
2261
   )
2262
   -----------------------------------------------------------------
2263
   begin
2264
      -- Default Assignment
2265
      a_o <= sig_PC;
2266
      adr_o <= X"0000";
2267
      ch_a_o <= X"00";
2268
      ch_b_o <= X"00";
2269
      d_o <= sig_D_OUT;
2270
      ld_o <= "00";
2271
      ld_pc_o <= '0';
2272
      ld_sp_o <= '0';
2273
      offset_o <= X"0000";
2274
      rd_o <= sig_RD;
2275
      rst_nmi_o <= '0';
2276
      sel_pc_in_o <= sel_pc_in;
2277
      sel_pc_val_o <= sel_pc_val;
2278
      sel_sp_as_o <= sel_sp_as;
2279
      sel_sp_in_o <= sel_sp_in;
2280
      wr_n_o <= sig_RWn;
2281
      wr_o <= sig_WR;
2282
      -- Default Assignment To Internals
2283
      adc_sbc_finished <= '0';
2284
      irq_finished <= '0';
2285
      op_fetch <= '0';
2286
      op_finished <= '0';
2287
      op_finished_det <= reg_op_finished AND (op_finished XOR reg_op_finished);
2288
      rmb_started <= '0';
2289
      rst_finished <= '0';
2290
      sel_pc_in <= '0';
2291
      sel_pc_val <= "00";
2292
      sel_sp_as <= '1';
2293
      sel_sp_in <= '0';
2294
      sig_D_OUT <= X"00";
2295
      sig_PC <= X"0000";
2296
      sig_RD <= '1';
2297
      sig_RWn <= '1';
2298
      sig_SYNC <= '0';
2299
      sig_WR <= '0';
2300
 
2301
      -- Combined Actions
2302
      case csm_current_state is
2303
         when res2 =>
2304
            sig_PC <= adr_pc_i;
2305
            sel_sp_in <= '0';
2306
            sel_sp_as <= '0';
2307
            ld_sp_o <= '1';
2308
            if (rdy_i = '1') then
2309
               ld_o <= "11";
2310
            end if;
2311
         when res4 =>
2312
            sig_PC <= adr_sp_i;
2313
            adr_o <= X"FFFB";
2314
            sel_pc_in <= '1';
2315
            sel_pc_val <= "00";
2316
            ld_pc_o <= '1';
2317
            ld_sp_o <= '1';
2318
            if (rdy_i = '1') then
2319
               ld_o <= "11";
2320
            end if;
2321
         when res5 =>
2322
            sig_PC <= adr_sp_i;
2323
         when res6 =>
2324
            sig_PC <= adr_pc_i;
2325
            ld_pc_o <= '1';
2326
            if (rdy_i = '1') then
2327
               ld_o <= "11";
2328
            end if;
2329
         when res7 =>
2330
            sig_PC <= adr_pc_i;
2331
            adr_o <= d_i & zw_b5;
2332
            sel_pc_in <= '1';
2333
            sel_pc_val <= "11";
2334
            ld_pc_o <= '1';
2335
            rst_finished <= '1';
2336
            if (rdy_i = '1') then
2337
               ld_o <= "11";
2338
               sig_SYNC <= '1';
2339
            end if;
2340
         when res3 =>
2341
            sig_PC <= adr_sp_i;
2342
            ld_sp_o <= '1';
2343
            if (rdy_i = '1') then
2344
               ld_o <= "11";
2345
            end if;
2346
         when RES =>
2347
            sig_PC <= adr_pc_i;
2348
            sig_SYNC <= '1';
2349
         when FETCH =>
2350
            sig_PC <= adr_pc_i;
2351
            op_fetch <= '1';
2352
            sig_RWn <= '1';
2353
            sig_RD <= '1';
2354
            sig_SYNC <= NOT (rdy_i);
2355
            ld_pc_o <= '1';
2356
            if ((d_i = X"00") and (rdy_i = '1')) then
2357
               ld_o <= "11";
2358
            elsif ((nmi_i = '1') and (rdy_i = '1')) then
2359
               ld_o <= "11";
2360
            elsif ((irq_n_i = '0' and
2361
                   reg_F(2) = '0') and (rdy_i = '1')) then
2362
               ld_o <= "11";
2363
            elsif ((d_i = X"8F" or
2364
                   d_i = X"9F" or
2365
                   d_i = X"AF" or
2366
                   d_i = X"BF" or
2367
                   d_i = X"CF" or
2368
                   d_i = X"DF" or
2369
                   d_i = X"EF" or
2370
                   d_i = X"FF" or
2371
                   d_i = X"0F" or
2372
                   d_i = X"1F" or
2373
                   d_i = X"2F" or
2374
                   d_i = X"3F" or
2375
                   d_i = X"4F" or
2376
                   d_i = X"5F" or
2377
                   d_i = X"6F" or
2378
                   d_i = X"7F") and (rdy_i = '1')) then
2379
               ld_o <= "11";
2380
            elsif ((d_i = X"90" or
2381
                   d_i = X"B0" or
2382
                   d_i = X"F0" or
2383
                   d_i = X"30" or
2384
                   d_i = X"D0" or
2385
                   d_i = X"10" or
2386
                   d_i = X"50" or
2387
                   d_i = X"70" or
2388
                   d_i = X"80") and (rdy_i = '1')) then
2389
               ld_o <= "11";
2390
            elsif ((d_i = X"4C" or
2391
                   d_i = X"6C" or
2392
                   d_i = X"7C") and (rdy_i = '1')) then
2393
               ld_o <= "11";
2394
            elsif ((d_i = X"20") and (rdy_i = '1')) then
2395
               ld_o <= "11";
2396
            elsif ((d_i = X"68") and (rdy_i = '1')) then
2397
            elsif ((d_i = X"FA") and (rdy_i = '1')) then
2398
            elsif ((d_i = X"C6" or
2399
                   d_i = X"E6" or
2400
                   d_i = X"66" or
2401
                   d_i = X"06" or
2402
                   d_i = X"46" or
2403
                   d_i = X"26" or
2404
                   d_i (3 downto 0) = X"7" or
2405
                   d_i = X"14" or
2406
                   d_i = X"04") and (rdy_i = '1')) then
2407
               ld_o <= "11";
2408
            elsif ((d_i = X"D6" or
2409
                   d_i = X"F6" or
2410
                   d_i = X"76" or
2411
                   d_i = X"16" or
2412
                   d_i = X"56" or
2413
                   d_i = X"36") and (rdy_i = '1')) then
2414
               ld_o <= "11";
2415
            elsif ((d_i = X"CE" or
2416
                   d_i = X"EE" or
2417
                   d_i = X"6E" or
2418
                   d_i = X"0E" or
2419
                   d_i = X"4E" or
2420
                   d_i = X"2E" or
2421
                   d_i = X"1C" or
2422
                   d_i = X"0C") and (rdy_i = '1')) then
2423
               ld_o <= "11";
2424
            elsif ((d_i = X"DE" or
2425
                   d_i = X"FE" or
2426
                   d_i = X"7E" or
2427
                   d_i = X"1E" or
2428
                   d_i = X"5E" or
2429
                   d_i = X"3E") and (rdy_i = '1')) then
2430
               ld_o <= "11";
2431
            elsif ((d_i = X"09" or
2432
                   d_i = X"29" or
2433
                   d_i = X"49" or
2434
                   d_i = X"69" or
2435
                   d_i = X"89" or
2436
                   d_i = X"A0" or
2437
                   d_i = X"A2" or
2438
                   d_i = X"A9" or
2439
                   d_i = X"C9" or
2440
                   d_i = X"E0" or
2441
                   d_i = X"C0" or
2442
                   d_i = X"E9") and (rdy_i = '1')) then
2443
               ld_o <= "11";
2444
            elsif ((d_i = X"05" or
2445
                   d_i = X"25" or
2446
                   d_i = X"45" or
2447
                   d_i = X"65" or
2448
                   d_i = X"A5" or
2449
                   d_i = X"24" or
2450
                   d_i = X"C5" or
2451
                   d_i = X"E4" or
2452
                   d_i = X"C4" or
2453
                   d_i = X"A6" or
2454
                   d_i = X"A4" or
2455
                   d_i = X"E5" or
2456
                   d_i = X"85" or
2457
                   d_i = X"86" or
2458
                   d_i = X"84" or
2459
                   d_i = X"64") and (rdy_i = '1')) then
2460
               ld_o <= "11";
2461
            elsif ((d_i = X"15" or
2462
                   d_i = X"35" or
2463
                   d_i = X"55" or
2464
                   d_i = X"75" or
2465
                   d_i = X"B5" or
2466
                   d_i = X"34" or
2467
                   d_i = X"D5" or
2468
                   d_i = X"B4" or
2469
                   d_i = X"F5" or
2470
                   d_i = X"95" or
2471
                   d_i = X"94" or
2472
                   d_i = X"74") and (rdy_i = '1')) then
2473
               ld_o <= "11";
2474
            elsif ((d_i = X"B6" or
2475
                   d_i = X"96") and (rdy_i = '1')) then
2476
               ld_o <= "11";
2477
            elsif ((d_i = X"6D" or
2478
                   d_i = X"2D" or
2479
                   d_i = X"2C" or
2480
                   d_i = X"CD" or
2481
                   d_i = X"CC" or
2482
                   d_i = X"EC" or
2483
                   d_i = X"4D" or
2484
                   d_i = X"AD" or
2485
                   d_i = X"AE" or
2486
                   d_i = X"AC" or
2487
                   d_i = X"0D" or
2488
                   d_i = X"ED" or
2489
                   d_i = X"8D" or
2490
                   d_i = X"8E" or
2491
                   d_i = X"8C" or
2492
                   d_i = X"9C") and (rdy_i = '1')) then
2493
               ld_o <= "11";
2494
            elsif ((d_i = X"7D" or
2495
                   d_i = X"3D" or
2496
                   d_i = X"3C" or
2497
                   d_i = X"DD" or
2498
                   d_i = X"5D" or
2499
                   d_i = X"BD" or
2500
                   d_i = X"BC" or
2501
                   d_i = X"1D" or
2502
                   d_i = X"FD" or
2503
                   d_i = X"9D" or
2504
                   d_i = X"9E") and (rdy_i = '1')) then
2505
               ld_o <= "11";
2506
            elsif ((d_i = X"79" or
2507
                   d_i = X"39" or
2508
                   d_i = X"D9" or
2509
                   d_i = X"5D" or
2510
                   d_i = X"59" or
2511
                   d_i = X"B9" or
2512
                   d_i = X"BE" or
2513
                   d_i = X"19" or
2514
                   d_i = X"F9" or
2515
                   d_i = X"99") and (rdy_i = '1')) then
2516
               ld_o <= "11";
2517
            elsif ((d_i = X"72" or
2518
                   d_i = X"32" or
2519
                   d_i = X"D2" or
2520
                   d_i = X"59" or
2521
                   d_i = X"52" or
2522
                   d_i = X"B2" or
2523
                   d_i = X"12" or
2524
                   d_i = X"F2" or
2525
                   d_i = X"92") and (rdy_i = '1')) then
2526
               ld_o <= "11";
2527
            elsif ((d_i = X"71" or
2528
                   d_i = X"31" or
2529
                   d_i = X"D1" or
2530
                   d_i = X"51" or
2531
                   d_i = X"B1" or
2532
                   d_i = X"11" or
2533
                   d_i = X"F1" or
2534
                   d_i = X"91") and (rdy_i = '1')) then
2535
               ld_o <= "11";
2536
            elsif ((d_i = X"61" or
2537
                   d_i = X"21" or
2538
                   d_i = X"C1" or
2539
                   d_i = X"41" or
2540
                   d_i = X"A1" or
2541
                   d_i = X"01" or
2542
                   d_i = X"E1" or
2543
                   d_i = X"81") and (rdy_i = '1')) then
2544
               ld_o <= "11";
2545
            elsif ((d_i = X"B8" or
2546
                   d_i = X"38" or
2547
                   d_i = X"18" or
2548
                   d_i = X"F8" or
2549
                   d_i = X"D8" or
2550
                   d_i = X"78" or
2551
                   d_i = X"58" or
2552
                   d_i = X"0A" or
2553
                   d_i = X"4A" or
2554
                   d_i = X"2A" or
2555
                   d_i = X"6A" or
2556
                   d_i = X"A8" or
2557
                   d_i = X"98" or
2558
                   d_i = X"BA" or
2559
                   d_i = X"8A" or
2560
                   d_i = X"AA" or
2561
                   d_i = X"C8" or
2562
                   d_i = X"E8" or
2563
                   d_i = X"1A" or
2564
                   d_i = X"88" or
2565
                   d_i = X"CA" or
2566
                   d_i = X"3A") and (rdy_i = '1')) then
2567
            elsif ((d_i = X"7A") and (rdy_i = '1')) then
2568
            elsif ((d_i = X"28") and (rdy_i = '1')) then
2569
            elsif ((d_i = X"9A") and (rdy_i = '1')) then
2570
               ld_o <= "11";
2571
            elsif ((d_i = X"60") and (rdy_i = '1')) then
2572
               ld_o <= "11";
2573
            elsif ((d_i = X"40") and (rdy_i = '1')) then
2574
               ld_o <= "11";
2575
            elsif ((d_i = X"08") and (rdy_i = '1')) then
2576
               ld_o <= "11";
2577
            elsif ((d_i = X"5A") and (rdy_i = '1')) then
2578
               ld_o <= "11";
2579
            elsif ((d_i = X"DA") and (rdy_i = '1')) then
2580
               ld_o <= "11";
2581
            elsif ((d_i = X"48") and (rdy_i = '1')) then
2582
               ld_o <= "11";
2583
            elsif ((d_i = X"EA") and (rdy_i = '1')) then
2584
               ld_o <= "11";
2585
            elsif ((d_i(3 downto 0) = X"3" or
2586
                   d_i(3 downto 0) = X"B") and (rdy_i = '1')) then
2587
               ld_o <= "11";
2588
               sig_SYNC <= '1';
2589
            elsif ((d_i = X"02" or
2590
                   d_i = X"22" or
2591
                   d_i = X"42" or
2592
                   d_i = X"62" or
2593
                   d_i = X"82" or
2594
                   d_i = X"C2" or
2595
                   d_i = X"E2") and (rdy_i = '1')) then
2596
               ld_o <= "11";
2597
            elsif ((d_i = X"44") and (rdy_i = '1')) then
2598
               ld_o <= "11";
2599
            elsif ((d_i = X"54" or
2600
                   d_i = X"D4" or
2601
                   d_i = X"F4") and (rdy_i = '1')) then
2602
               ld_o <= "11";
2603
            elsif ((d_i = X"DC" or
2604
                   d_i = X"FC") and (rdy_i = '1')) then
2605
               ld_o <= "11";
2606
            elsif ((d_i = X"5C") and (rdy_i = '1')) then
2607
               ld_o <= "11";
2608
            end if;
2609
         when nop1 =>
2610
            sig_PC <= adr_pc_i;
2611
            if (rdy_i = '1') then
2612
               sig_SYNC <= '1';
2613
            end if;
2614
         when txs1 =>
2615
            sig_PC <= adr_pc_i;
2616
            sel_sp_in <= '1';
2617
            sel_sp_as <= '0';
2618
            ld_sp_o <= '1';
2619
            if (rdy_i = '1') then
2620
               adr_o <= X"01" & q_x_i;
2621
               ld_o <= "11";
2622
               sig_SYNC <= '1';
2623
            end if;
2624
         when bxx1 =>
2625
            sig_PC <= adr_pc_i;
2626
            ld_pc_o <= '1';
2627
            if (rdy_i = '1' and (
2628
                (reg_F(0) = '1' and zw_REG_OP = X"90") or (reg_F(0) = '0' and zw_REG_OP = X"B0") or
2629
                (reg_F(1) = '0' and zw_REG_OP = X"F0") or (reg_F(7) = '0' and zw_REG_OP = X"30") or
2630
                (reg_F(1) = '1' and zw_REG_OP = X"D0") or (reg_F(7) = '1' and zw_REG_OP = X"10") or
2631
                (reg_F(6) = '1' and zw_REG_OP = X"50") or (reg_F(6) = '0' and zw_REG_OP = X"70"))) then
2632
               ld_o <= "11";
2633
               sig_SYNC <= '1';
2634
            elsif (rdy_i = '1') then
2635
               ld_o <= "11";
2636
            end if;
2637
         when bxx2 =>
2638
            sig_PC <= adr_pc_i;
2639
            sel_pc_in <= '0';
2640
            sel_pc_val <= "10";
2641
            offset_o <= (zw_b2(7) & zw_b2(7) &
2642
            zw_b2(7) & zw_b2(7) & zw_b2(7) &
2643
            zw_b2(7) & zw_b2(7) & zw_b2(7) &
2644
            zw_b2(7) & zw_b2(6 downto 0));
2645
            ld_pc_o <= '1';
2646
            if (rdy_i = '1' and
2647
                zw_b3 = adr_nxt_pc_i (15 downto 8)) then
2648
               ld_o <= "11";
2649
               sig_SYNC <= '1';
2650
            elsif (rdy_i = '1') then
2651
               ld_o <= "11";
2652
            end if;
2653
         when bxx3 =>
2654
            sig_PC <= zw_b3 & adr_pc_i (7 downto 0);
2655
            if (rdy_i = '1') then
2656
               sig_SYNC <= '1';
2657
            end if;
2658
         when jmp1 =>
2659
            sig_PC <= adr_pc_i;
2660
            ld_pc_o <= '1';
2661
            if (rdy_i = '1' and
2662
                zw_REG_OP = X"4C") then
2663
               ld_o <= "11";
2664
            elsif (rdy_i = '1' and
2665
                   zw_REG_OP = X"6C") then
2666
               ld_o <= "11";
2667
            elsif (rdy_i = '1' and
2668
                   zw_REG_OP = X"7C") then
2669
               ld_o <= "11";
2670
            end if;
2671
         when jmp2_1 =>
2672
            sig_PC <= adr_pc_i;
2673
            ld_pc_o <= '1';
2674
            if (rdy_i = '1') then
2675
               ld_o <= "11";
2676
            end if;
2677
         when jmp4_12 =>
2678
            sig_PC <= adr_pc_i;
2679
            ld_pc_o <= '1';
2680
            if (rdy_i = '1') then
2681
               ld_o <= "11";
2682
            end if;
2683
         when jmp_ex =>
2684
            sig_PC <= adr_pc_i;
2685
            adr_o <= d_i & zw_b5;
2686
            sel_pc_in <= '1';
2687
            sel_pc_val <= "11";
2688
            ld_pc_o <= '1';
2689
            if (rdy_i = '1') then
2690
               ld_o <= "11";
2691
               sig_SYNC <= '1';
2692
            end if;
2693
         when jmp2_2 =>
2694
            sig_PC <= adr_pc_i;
2695
         when jmp3_1 =>
2696
            sig_PC <= zw_b6 & zw_b5;
2697
            adr_o <= zw_b6 & zw_b5;
2698
            sel_pc_in <= '1';
2699
            sel_pc_val <= "11";
2700
            ld_pc_o <= '1';
2701
            if (rdy_i = '1') then
2702
               ld_o <= "11";
2703
            end if;
2704
         when jsr1 =>
2705
            sig_PC <= adr_pc_i;
2706
            ld_pc_o <= '1';
2707
            if (rdy_i = '1') then
2708
               ld_o <= "11";
2709
            end if;
2710
         when jsr2 =>
2711
            sig_PC <= adr_sp_i;
2712
         when jsr3 =>
2713
            sig_PC <= adr_sp_i;
2714
            sig_RWn <= '0';
2715
            sig_RD <= '0';
2716
            sig_WR <= '1';
2717
            sig_D_OUT <= zw_b11;
2718
            ld_sp_o <= '1';
2719
            if (rdy_i = '1') then
2720
               ld_o <= "11";
2721
            end if;
2722
         when jsr4 =>
2723
            sig_PC <= adr_sp_i;
2724
            sig_RWn <= '0';
2725
            sig_RD <= '0';
2726
            sig_WR <= '1';
2727
            sig_D_OUT <= zw_b12;
2728
            ld_sp_o <= '1';
2729
            if (rdy_i = '1') then
2730
               ld_o <= "11";
2731
            end if;
2732
         when jsr5 =>
2733
            sig_PC <= adr_pc_i;
2734
            adr_o <= d_i & zw_b1;
2735
            sel_pc_in <= '1';
2736
            sel_pc_val <= "11";
2737
            ld_pc_o <= '1';
2738
            if (rdy_i = '1') then
2739
               ld_o <= "11";
2740
               sig_SYNC <= '1';
2741
            end if;
2742
         when brk1 =>
2743
            sig_PC <= adr_pc_i;
2744
            ld_pc_o <= '1';
2745
            if (rdy_i = '1') then
2746
               ld_o <= "11";
2747
            end if;
2748
         when brk2 =>
2749
            sig_PC <= adr_sp_i;
2750
            sig_RWn <= '0';
2751
            sig_RD <= '0';
2752
            sig_WR <= '1';
2753
            sig_D_OUT <= zw_b11;
2754
            ld_sp_o <= '1';
2755
            if (rdy_i = '1') then
2756
               ld_o <= "11";
2757
            end if;
2758
         when brk3 =>
2759
            sig_PC <= adr_sp_i;
2760
            sig_RWn <= '0';
2761
            sig_RD <= '0';
2762
            sig_WR <= '1';
2763
            sig_D_OUT <= zw_b12;
2764
            ld_sp_o <= '1';
2765
            if (rdy_i = '1') then
2766
               ld_o <= "11";
2767
            end if;
2768
         when brk4 =>
2769
            sig_PC <= adr_sp_i;
2770
            sig_RWn <= '0';
2771
            sig_RD <= '0';
2772
            sig_WR <= '1';
2773
            sig_D_OUT <= zw_b11;
2774
            ld_sp_o <= '1';
2775
            irq_finished <= '1';
2776
            if (rdy_i = '1') then
2777
               ld_o <= "11";
2778
            end if;
2779
         when brk6 =>
2780
            sig_PC <= X"FFFF";
2781
            adr_o <= d_i & zw_b5;
2782
            sel_pc_in <= '1';
2783
            sel_pc_val <= "11";
2784
            ld_pc_o <= '1';
2785
            if (rdy_i = '1') then
2786
               ld_o <= "11";
2787
               sig_SYNC <= '1';
2788
            end if;
2789
         when brk5 =>
2790
            sig_PC <= X"FFFE";
2791
         when rti1 =>
2792
            sig_PC <= adr_pc_i;
2793
         when rti2 =>
2794
            sig_PC <= adr_sp_i;
2795
            sel_sp_in <= '0';
2796
            sel_sp_as <= '0';
2797
            ld_sp_o <= '1';
2798
            if (rdy_i = '1') then
2799
               ld_o <= "11";
2800
            end if;
2801
         when rti3 =>
2802
            sig_PC <= adr_sp_i;
2803
            sel_sp_in <= '0';
2804
            sel_sp_as <= '0';
2805
            ld_sp_o <= '1';
2806
            op_finished <= '1';
2807
            if (rdy_i = '1') then
2808
               ld_o <= "11";
2809
            end if;
2810
         when rti4 =>
2811
            sig_PC <= adr_sp_i;
2812
            sel_sp_in <= '0';
2813
            sel_sp_as <= '0';
2814
            ld_sp_o <= '1';
2815
            if (rdy_i = '1') then
2816
               ld_o <= "11";
2817
            end if;
2818
         when rti5 =>
2819
            sig_PC <= adr_sp_i;
2820
            adr_o <= d_i & zw_b5;
2821
            sel_pc_in <= '1';
2822
            sel_pc_val <= "11";
2823
            ld_pc_o <= '1';
2824
            if (rdy_i = '1') then
2825
               ld_o <= "11";
2826
               sig_SYNC <= '1';
2827
            end if;
2828
         when rts1 =>
2829
            sig_PC <= adr_pc_i;
2830
         when rts2 =>
2831
            sig_PC <= adr_sp_i;
2832
            sel_sp_in <= '0';
2833
            sel_sp_as <= '0';
2834
            ld_sp_o <= '1';
2835
            if (rdy_i = '1') then
2836
               ld_o <= "11";
2837
            end if;
2838
         when rts3 =>
2839
            sig_PC <= adr_sp_i;
2840
            sel_sp_in <= '0';
2841
            sel_sp_as <= '0';
2842
            ld_sp_o <= '1';
2843
            if (rdy_i = '1') then
2844
               ld_o <= "11";
2845
            end if;
2846
         when rts4 =>
2847
            sig_PC <= adr_sp_i;
2848
            ld_pc_o <= '1';
2849
            if (rdy_i = '1') then
2850
               ld_o <= "11";
2851
            end if;
2852
         when rts5 =>
2853
            sig_PC <= zw_b6 & zw_b5;
2854
            adr_o <= zw_b6 & zw_b5;
2855
            sel_pc_in <= '1';
2856
            sel_pc_val <= "00";
2857
            ld_pc_o <= '1';
2858
            if (rdy_i = '1') then
2859
               ld_o <= "11";
2860
               sig_SYNC <= '1';
2861
            end if;
2862
         when pha1 =>
2863
            sig_PC <= adr_pc_i;
2864
         when pha2 =>
2865
            sig_PC <= adr_sp_i;
2866
            sig_RWn <= '0';
2867
            sig_RD <= '0';
2868
            sig_WR <= '1';
2869
            sig_D_OUT <= d_regs_out_i;
2870
            ld_sp_o <= '1';
2871
            if (rdy_i = '1') then
2872
               ld_o <= "11";
2873
               sig_SYNC <= '1';
2874
            end if;
2875
         when php1 =>
2876
            sig_PC <= adr_pc_i;
2877
         when php2 =>
2878
            sig_PC <= adr_sp_i;
2879
            sig_RWn <= '0';
2880
            sig_RD <= '0';
2881
            sig_WR <= '1';
2882
            sig_D_OUT <= reg_F OR X"30";
2883
            ld_sp_o <= '1';
2884
            if (rdy_i = '1') then
2885
               ld_o <= "11";
2886
               sig_SYNC <= '1';
2887
            end if;
2888
         when pla1 =>
2889
            sig_PC <= adr_pc_i;
2890
         when pla2 =>
2891
            sig_PC <= adr_pc_i;
2892
            sel_sp_in <= '0';
2893
            sel_sp_as <= '0';
2894
            ld_pc_o <= '1';
2895
            ld_sp_o <= '1';
2896
            if (rdy_i = '1') then
2897
               ld_o <= "11";
2898
            end if;
2899
         when pla3 =>
2900
            sig_PC <= adr_sp_i;
2901
            op_finished <= '1';
2902
            if (rdy_i = '1') then
2903
               sig_SYNC <= '1';
2904
            end if;
2905
         when plp1 =>
2906
            sig_PC <= adr_pc_i;
2907
         when plp2 =>
2908
            sig_PC <= adr_pc_i;
2909
            sel_sp_in <= '0';
2910
            sel_sp_as <= '0';
2911
            ld_pc_o <= '1';
2912
            ld_sp_o <= '1';
2913
            if (rdy_i = '1') then
2914
               ld_o <= "11";
2915
            end if;
2916
         when plp3 =>
2917
            sig_PC <= adr_sp_i;
2918
            op_finished <= '1';
2919
            if (rdy_i = '1') then
2920
               sig_SYNC <= '1';
2921
            end if;
2922
         when irq1 =>
2923
            sig_PC <= adr_pc_i;
2924
         when irq2 =>
2925
            sig_PC <= adr_sp_i;
2926
            sig_RWn <= '0';
2927
            sig_RD <= '0';
2928
            sig_WR <= '1';
2929
            sig_D_OUT <= zw_b11;
2930
            ld_sp_o <= '1';
2931
            if (rdy_i = '1') then
2932
               ld_o <= "11";
2933
            end if;
2934
         when irq3 =>
2935
            sig_PC <= adr_sp_i;
2936
            sig_RWn <= '0';
2937
            sig_RD <= '0';
2938
            sig_WR <= '1';
2939
            sig_D_OUT <= zw_b12;
2940
            ld_sp_o <= '1';
2941
            if (rdy_i = '1') then
2942
               ld_o <= "11";
2943
            end if;
2944
         when irq5b =>
2945
            sig_PC <= X"FFFE";
2946
         when irq5a =>
2947
            sig_PC <= X"FFFA";
2948
         when irq4 =>
2949
            sig_PC <= adr_sp_i;
2950
            sig_RWn <= '0';
2951
            sig_RD <= '0';
2952
            sig_WR <= '1';
2953
            sig_D_OUT <= zw_b11;
2954
            ld_sp_o <= '1';
2955
            irq_finished <= '1';
2956
            if (rdy_i = '1' and
2957
                nmi_i = '1') then
2958
               ld_o <= "11";
2959
            elsif (rdy_i = '1') then
2960
               ld_o <= "11";
2961
            end if;
2962
         when irq6a =>
2963
            sig_PC <= X"FFFB";
2964
            adr_o <= d_i & zw_b5;
2965
            rst_nmi_o <= '1';
2966
            sel_pc_in <= '1';
2967
            sel_pc_val <= "11";
2968
            ld_pc_o <= '1';
2969
            if (rdy_i = '1') then
2970
               ld_o <= "11";
2971
               sig_SYNC <= '1';
2972
            end if;
2973
         when nop22 =>
2974
            sig_PC <= adr_pc_i;
2975
            ld_pc_o <= '1';
2976
            if (rdy_i = '1') then
2977
               ld_o <= "11";
2978
               sig_SYNC <= '1';
2979
            end if;
2980
         when nop231 =>
2981
            sig_PC <= adr_pc_i;
2982
            ld_pc_o <= '1';
2983
            if (rdy_i = '1') then
2984
               ld_o <= "11";
2985
            end if;
2986
         when nop232 =>
2987
            sig_PC <= adr_pc_i;
2988
            if (rdy_i = '1') then
2989
               sig_SYNC <= '1';
2990
            end if;
2991
         when nop241 =>
2992
            sig_PC <= adr_pc_i;
2993
            ld_pc_o <= '1';
2994
            if (rdy_i = '1') then
2995
               ld_o <= "11";
2996
            end if;
2997
         when nop242 =>
2998
            sig_PC <= adr_pc_i;
2999
         when nop243 =>
3000
            sig_PC <= adr_pc_i;
3001
            if (rdy_i = '1') then
3002
               sig_SYNC <= '1';
3003
            end if;
3004
         when nop341 =>
3005
            sig_PC <= adr_pc_i;
3006
            ld_pc_o <= '1';
3007
            if (rdy_i = '1') then
3008
               ld_o <= "11";
3009
            end if;
3010
         when nop342 =>
3011
            sig_PC <= adr_pc_i;
3012
            ld_pc_o <= '1';
3013
            if (rdy_i = '1') then
3014
               ld_o <= "11";
3015
            end if;
3016
         when nop343 =>
3017
            sig_PC <= adr_pc_i;
3018
            if (rdy_i = '1') then
3019
               sig_SYNC <= '1';
3020
            end if;
3021
         when nop381 =>
3022
            sig_PC <= adr_pc_i;
3023
            ld_pc_o <= '1';
3024
            if (rdy_i = '1') then
3025
               ld_o <= "11";
3026
            end if;
3027
         when nop382 =>
3028
            sig_PC <= adr_pc_i;
3029
            ld_pc_o <= '1';
3030
            if (rdy_i = '1') then
3031
               ld_o <= "11";
3032
            end if;
3033
         when nop383 =>
3034
            sig_PC <= adr_pc_i;
3035
         when nop384 =>
3036
            sig_PC <= adr_pc_i;
3037
         when nop387 =>
3038
            sig_PC <= adr_pc_i;
3039
            if (rdy_i = '1') then
3040
               sig_SYNC <= '1';
3041
            end if;
3042
         when nop385 =>
3043
            sig_PC <= adr_pc_i;
3044
         when nop386 =>
3045
            sig_PC <= adr_pc_i;
3046
         when jmp3_2 =>
3047
            sig_PC <= zw_b6 & zw_b5;
3048
            adr_o <= zw_b6 & zw_b5;
3049
            offset_o <= (X"00" & q_x_i);
3050
            sel_pc_in <= '1';
3051
            sel_pc_val <= "10";
3052
            ld_pc_o <= '1';
3053
            if (rdy_i = '1') then
3054
               ld_o <= "11";
3055
            end if;
3056
         when bbr1 =>
3057
            sig_PC <= adr_pc_i;
3058
            ld_pc_o <= '1';
3059
            if (rdy_i = '1') then
3060
               ld_o <= "11";
3061
            end if;
3062
         when bbr5 =>
3063
            sig_PC <= zw_w3;
3064
            sel_pc_in <= '0';
3065
            sel_pc_val <= "10";
3066
            offset_o <= (zw_b2(7) & zw_b2(7) &
3067
            zw_b2(7) & zw_b2(7) & zw_b2(7) &
3068
            zw_b2(7) & zw_b2(7) & zw_b2(7) &
3069
            zw_b2(7) & zw_b2(6 downto 0));
3070
            ld_pc_o <= '1';
3071
            if (rdy_i = '1' and
3072
                zw_b3 = adr_nxt_pc_i (15 downto 8)) then
3073
               ld_o <= "11";
3074
               sig_SYNC <= '1';
3075
            elsif (rdy_i = '1') then
3076
               ld_o <= "11";
3077
            end if;
3078
         when bbr4 =>
3079
            sig_PC <= adr_pc_i;
3080
            ld_pc_o <= '1';
3081
            if (rdy_i = '1' and (
3082
                (zw_b1(0) = '0' and zw_REG_OP = X"8F") or
3083
                (zw_b1(1) = '0' and zw_REG_OP = X"9F") or
3084
                (zw_b1(2) = '0' and zw_REG_OP = X"AF") or
3085
                (zw_b1(3) = '0' and zw_REG_OP = X"BF") or
3086
                (zw_b1(4) = '0' and zw_REG_OP = X"CF") or
3087
                (zw_b1(5) = '0' and zw_REG_OP = X"DF") or
3088
                (zw_b1(6) = '0' and zw_REG_OP = X"EF") or
3089
                (zw_b1(7) = '0' and zw_REG_OP = X"FF") or
3090
                (zw_b1(0) = '1' and zw_REG_OP = X"0F") or
3091
                (zw_b1(1) = '1' and zw_REG_OP = X"1F") or
3092
                (zw_b1(2) = '1' and zw_REG_OP = X"2F") or
3093
                (zw_b1(3) = '1' and zw_REG_OP = X"3F") or
3094
                (zw_b1(4) = '1' and zw_REG_OP = X"4F") or
3095
                (zw_b1(5) = '1' and zw_REG_OP = X"5F") or
3096
                (zw_b1(6) = '1' and zw_REG_OP = X"6F") or
3097
                (zw_b1(7) = '1' and zw_REG_OP = X"7F"))) then
3098
               ld_o <= "11";
3099
               sig_SYNC <= '1';
3100
            elsif (rdy_i = '1') then
3101
               ld_o <= "11";
3102
            end if;
3103
         when bbr2 =>
3104
            sig_PC <= X"00" & zw_b2;
3105
         when bbr3 =>
3106
            sig_PC <= X"00" & zw_b2;
3107
         when bbr6 =>
3108
            sig_PC <= zw_b3 & adr_pc_i (7 downto 0);
3109
            if (rdy_i = '1') then
3110
               sig_SYNC <= '1';
3111
            end if;
3112
         when RES0 =>
3113
            sig_PC <= adr_pc_i;
3114
            ld_pc_o <= '1';
3115
            if (rdy_i = '1') then
3116
               ld_o <= "11";
3117
            end if;
3118
         when zp1 =>
3119
            sig_PC <= adr_pc_i;
3120
            ld_pc_o <= '1';
3121
            if (rdy_i = '1' and
3122
                (zw_REG_OP = X"85" OR
3123
                zw_REG_OP = X"86" OR
3124
                zw_REG_OP = X"64" OR
3125
                zw_REG_OP = X"84")) then
3126
               ld_o <= "11";
3127
            elsif (rdy_i = '1') then
3128
               ld_o <= "11";
3129
            end if;
3130
         when zp2 =>
3131
            sig_PC <= X"00" & zw_b5;
3132
            op_finished <= '1';
3133
            if (rdy_i = '1' and
3134
                reg_F(3) = '1' and
3135
                (zw_REG_OP = X"65" OR
3136
                zw_REG_OP = X"E5")) then
3137
            elsif (rdy_i = '1') then
3138
               sig_SYNC <= '1';
3139
            end if;
3140
         when zpx1 =>
3141
            sig_PC <= adr_pc_i;
3142
            ld_pc_o <= '1';
3143
         when zpx2 =>
3144
            sig_PC <= X"00" & zw_b5;
3145
            ch_a_o <=  zw_b5;
3146
            ch_b_o <= q_x_i;
3147
            ld_pc_o <= '1';
3148
            if (rdy_i = '1' and
3149
                (zw_REG_OP = X"95" OR
3150
                zw_REG_OP = X"74" OR
3151
                zw_REG_OP = X"94")) then
3152
               ld_o <= "11";
3153
            elsif (rdy_i = '1') then
3154
               ld_o <= "11";
3155
            end if;
3156
         when zpx3 =>
3157
            sig_PC <= X"00" & zw_b1;
3158
            op_finished <= '1';
3159
            if (rdy_i = '1' and
3160
                reg_F(3) = '1' and
3161
                (zw_REG_OP = X"75" OR
3162
                zw_REG_OP = X"F5")) then
3163
            elsif (rdy_i = '1') then
3164
               sig_SYNC <= '1';
3165
            end if;
3166
         when ab1 =>
3167
            sig_PC <= adr_pc_i;
3168
            ld_pc_o <= '1';
3169
            if (rdy_i = '1') then
3170
               ld_o <= "11";
3171
            end if;
3172
         when ab2 =>
3173
            sig_PC <= adr_pc_i;
3174
            ld_pc_o <= '1';
3175
            if (rdy_i = '1' and
3176
                (zw_REG_OP = X"8D" OR
3177
                zw_REG_OP = X"8E" OR
3178
                zw_REG_OP = X"9C" OR
3179
                zw_REG_OP = X"8C")) then
3180
               ld_o <= "11";
3181
            elsif (rdy_i = '1') then
3182
               ld_o <= "11";
3183
            end if;
3184
         when ab3 =>
3185
            sig_PC <= zw_b6 & zw_b5;
3186
            op_finished <= '1';
3187
            if (rdy_i = '1' and
3188
                reg_F(3) = '1' and
3189
                (zw_REG_OP = X"6D" OR
3190
                zw_REG_OP = X"ED")) then
3191
            elsif (rdy_i = '1') then
3192
               sig_SYNC <= '1';
3193
            end if;
3194
         when absx1 =>
3195
            sig_PC <= adr_pc_i;
3196
            ld_pc_o <= '1';
3197
            if (rdy_i = '1') then
3198
               ld_o <= "11";
3199
            end if;
3200
         when absx2 =>
3201
            sig_PC <= adr_pc_i;
3202
            ch_a_o <=  zw_b5;
3203
            ch_b_o <= q_x_i;
3204
            ld_pc_o <= '1';
3205
            if (rdy_i = '1' and
3206
                (zw_REG_OP = X"9D" OR
3207
                zw_REG_OP = X"9E")) then
3208
               ld_o <= "11";
3209
            elsif (rdy_i = '1') then
3210
               ld_o <= "11";
3211
            end if;
3212
         when absx4 =>
3213
            sig_PC <= zw_b3 & zw_b1;
3214
            op_finished <= '1';
3215
            adc_sbc_finished <= reg_F(3);
3216
            if ((rdy_i = '1') and ((zw_REG_OP = X"7D" or
3217
                 zw_REG_OP = X"FD") and
3218
                reg_F(3) = '1')) then
3219
            elsif (rdy_i = '1') then
3220
               sig_SYNC <= '1';
3221
            end if;
3222
         when absx3 =>
3223
            sig_PC <= zw_b6 & zw_b1;
3224
            ch_a_o <= zw_b6;
3225
            ch_b_o <= "0000000" & zw_reg_0flag;
3226
            op_finished <= NOT(zw_reg_0flag);
3227
            if ((rdy_i = '1' AND
3228
                zw_reg_0flag = '0') and ((zw_REG_OP = X"7D" or
3229
                 zw_REG_OP = X"FD") and
3230
                reg_F(3) = '1')) then
3231
            elsif (rdy_i = '1' AND
3232
                   zw_reg_0flag = '0') then
3233
               sig_SYNC <= '1';
3234
            end if;
3235
         when ind1 =>
3236
            sig_PC <= adr_pc_i;
3237
            ld_pc_o <= '1';
3238
         when ind3 =>
3239
            sig_PC <= X"00" & zw_b1;
3240
            ld_pc_o <= '1';
3241
            if (rdy_i = '1' and
3242
                zw_REG_OP = X"92") then
3243
               ld_o <= "11";
3244
            elsif (rdy_i = '1') then
3245
               ld_o <= "11";
3246
            end if;
3247
         when ind4 =>
3248
            sig_PC <= zw_b5 & zw_b6;
3249
            op_finished <= '1';
3250
            if (rdy_i = '1' and
3251
                reg_F(3) = '1' and
3252
                (zw_REG_OP = X"72" OR
3253
                zw_REG_OP = X"F2")) then
3254
            elsif (rdy_i = '1') then
3255
               sig_SYNC <= '1';
3256
            end if;
3257
         when ind2 =>
3258
            sig_PC <= X"00" & zw_b5;
3259
            ch_a_o <=  zw_b5;
3260
            ch_b_o <= X"01";
3261
         when indy1 =>
3262
            sig_PC <= adr_pc_i;
3263
            ld_pc_o <= '1';
3264
         when indy2 =>
3265
            sig_PC <= X"00" & zw_b5;
3266
            ch_a_o <=  zw_b5;
3267
            ch_b_o <= X"01";
3268
         when indy3 =>
3269
            sig_PC <= X"00" & zw_b1;
3270
            ch_a_o <= zw_b2;
3271
            ch_b_o <= q_y_i;
3272
            ld_pc_o <= '1';
3273
            if (rdy_i = '1' and
3274
                zw_REG_OP = X"91") then
3275
               ld_o <= "11";
3276
            elsif (rdy_i = '1') then
3277
               ld_o <= "11";
3278
            end if;
3279
         when indy5 =>
3280
            sig_PC <= zw_b3 & zw_b6;
3281
            op_finished <= '1';
3282
            adc_sbc_finished <= reg_F(3);
3283
            if ((rdy_i = '1') and ((zw_REG_OP = X"71" or
3284
                 zw_REG_OP = X"F1") and
3285
                reg_F(3) = '1')) then
3286
            elsif (rdy_i = '1') then
3287
               sig_SYNC <= '1';
3288
            end if;
3289
         when indy4 =>
3290
            sig_PC <= zw_b5 & zw_b6;
3291
            ch_a_o <= zw_b5;
3292
            ch_b_o <= "0000000" & zw_reg_0flag;
3293
            op_finished <= NOT(zw_reg_0flag);
3294
            if ((rdy_i = '1' AND
3295
                zw_reg_0flag = '0') and ((zw_REG_OP = X"71" or
3296
                 zw_REG_OP = X"F1") and
3297
                reg_F(3) = '1')) then
3298
            elsif (rdy_i = '1' AND
3299
                   zw_reg_0flag = '0') then
3300
               sig_SYNC <= '1';
3301
            end if;
3302
         when indx1 =>
3303
            sig_PC <= adr_pc_i;
3304
            ld_pc_o <= '1';
3305
         when indx4 =>
3306
            sig_PC <= X"00" & zw_b6;
3307
            ld_pc_o <= '1';
3308
            if (rdy_i = '1' and
3309
                zw_REG_OP = X"81") then
3310
               ld_o <= "11";
3311
            elsif (rdy_i = '1') then
3312
               ld_o <= "11";
3313
            end if;
3314
         when indx2 =>
3315
            sig_PC <= X"00" & zw_b5;
3316
            ch_a_o <=  zw_b5;
3317
            ch_b_o <= q_x_i;
3318
         when indx3 =>
3319
            sig_PC <= X"00" & zw_b1;
3320
            ch_a_o <=  zw_b1;
3321
            ch_b_o <= X"01";
3322
         when indx5 =>
3323
            sig_PC <= zw_b2 & zw_b5;
3324
            op_finished <= '1';
3325
            if (rdy_i = '1' and
3326
                reg_F(3) = '1' and
3327
                (zw_REG_OP = X"61" OR
3328
                zw_REG_OP = X"E1")) then
3329
            elsif (rdy_i = '1') then
3330
               sig_SYNC <= '1';
3331
            end if;
3332
         when zpy1 =>
3333
            sig_PC <= adr_pc_i;
3334
            ld_pc_o <= '1';
3335
         when zpy2 =>
3336
            sig_PC <= X"00" & zw_b5;
3337
            ch_a_o <=  zw_b5;
3338
            ch_b_o <= q_y_i;
3339
            ld_pc_o <= '1';
3340
            if (rdy_i = '1' and
3341
                zw_REG_OP = X"96") then
3342
               ld_o <= "11";
3343
            elsif (rdy_i = '1') then
3344
               ld_o <= "11";
3345
            end if;
3346
         when zpy3 =>
3347
            sig_PC <= X"00" & zw_b1;
3348
            op_finished <= '1';
3349
            if (rdy_i = '1') then
3350
               sig_SYNC <= '1';
3351
            end if;
3352
         when absy2 =>
3353
            sig_PC <= adr_pc_i;
3354
            ch_a_o <=  zw_b5;
3355
            ch_b_o <= q_y_i;
3356
            ld_pc_o <= '1';
3357
            if (rdy_i = '1' and
3358
                zw_REG_OP = X"99") then
3359
               ld_o <= "11";
3360
            elsif (rdy_i = '1') then
3361
               ld_o <= "11";
3362
            end if;
3363
         when absy1 =>
3364
            sig_PC <= adr_pc_i;
3365
            ld_pc_o <= '1';
3366
            if (rdy_i = '1') then
3367
               ld_o <= "11";
3368
            end if;
3369
         when absy4 =>
3370
            sig_PC <= zw_b3 & zw_b1;
3371
            op_finished <= '1';
3372
            adc_sbc_finished <= reg_F(3);
3373
            if ((rdy_i = '1') and ((zw_REG_OP = X"79" or
3374
                 zw_REG_OP = X"F9") and
3375
                reg_F(3) = '1')) then
3376
            elsif (rdy_i = '1') then
3377
               sig_SYNC <= '1';
3378
            end if;
3379
         when absy3 =>
3380
            sig_PC <= zw_b6 & zw_b1;
3381
            ch_a_o <= zw_b6;
3382
            ch_b_o <= "0000000" & zw_reg_0flag;
3383
            op_finished <= NOT(zw_reg_0flag);
3384
            if ((rdy_i = '1' AND
3385
                zw_reg_0flag = '0') and ((zw_REG_OP = X"79" or
3386
                 zw_REG_OP = X"F9") and
3387
                reg_F(3) = '1')) then
3388
            elsif (rdy_i = '1' AND
3389
                   zw_reg_0flag = '0') then
3390
               sig_SYNC <= '1';
3391
            end if;
3392
         when imm1 =>
3393
            sig_PC <= adr_pc_i;
3394
            ld_pc_o <= '1';
3395
            op_finished <= '1';
3396
            if (rdy_i = '1' and
3397
                reg_F(3) = '1' and
3398
                (zw_REG_OP = X"69" OR
3399
                zw_REG_OP = X"E9")) then
3400
            elsif (rdy_i = '1') then
3401
               ld_o <= "11";
3402
               sig_SYNC <= '1';
3403
            end if;
3404
         when imp1 =>
3405
            sig_PC <= adr_pc_i;
3406
            ld_pc_o <= '1';
3407
            op_finished <= '1';
3408
            if (rdy_i = '1') then
3409
               ld_o <= "11";
3410
               sig_SYNC <= '1';
3411
            end if;
3412
         when irq6b =>
3413
            sig_PC <= X"FFFF";
3414
            adr_o <= d_i & zw_b5;
3415
            sel_pc_in <= '1';
3416
            sel_pc_val <= "11";
3417
            ld_pc_o <= '1';
3418
            if (rdy_i = '1') then
3419
               ld_o <= "11";
3420
               sig_SYNC <= '1';
3421
            end if;
3422
         when absx5 =>
3423
            sig_PC <= zw_b3 & zw_b1;
3424
            adc_sbc_finished <= '1';
3425
            if (rdy_i = '1') then
3426
               sig_SYNC <= '1';
3427
            end if;
3428
         when absy5 =>
3429
            sig_PC <= zw_b3 & zw_b1;
3430
            adc_sbc_finished <= '1';
3431
            if (rdy_i = '1') then
3432
               sig_SYNC <= '1';
3433
            end if;
3434
         when indy6 =>
3435
            sig_PC <= zw_b3 & zw_b6;
3436
            adc_sbc_finished <= '1';
3437
            if (rdy_i = '1') then
3438
               sig_SYNC <= '1';
3439
            end if;
3440
         when zprmw1 =>
3441
            sig_PC <= adr_pc_i;
3442
            ld_pc_o <= '1';
3443
            if (rdy_i = '1') then
3444
               ld_o <= "11";
3445
            end if;
3446
         when zprmw2 =>
3447
            sig_PC <= X"00" & zw_b5;
3448
            rmb_started <= '1';
3449
         when zprmw31 =>
3450
            sig_PC <= X"00" & zw_b5;
3451
            ch_a_o <= zw_b2;
3452
            ch_b_o <= zw_b4;
3453
         when zprmw41 =>
3454
            sig_PC <= X"00" & zw_b5;
3455
            sig_RWn <= '0';
3456
            sig_RD <= '0';
3457
            sig_WR <= '1';
3458
            sig_D_OUT <= zw_b11;
3459
            op_finished <= '1';
3460
            if (rdy_i = '1') then
3461
               sig_SYNC <= '1';
3462
            end if;
3463
         when zpxrmw1 =>
3464
            sig_PC <= adr_pc_i;
3465
            ld_pc_o <= '1';
3466
         when zpxrmw2 =>
3467
            sig_PC <= X"00" & zw_b5;
3468
            ch_a_o <=  zw_b5;
3469
            ch_b_o <= q_x_i;
3470
            ld_pc_o <= '1';
3471
            if (rdy_i = '1') then
3472
               ld_o <= "11";
3473
            end if;
3474
         when zpxrmw3 =>
3475
            sig_PC <= X"00" & zw_b1;
3476
            rmb_started <= '1';
3477
         when zpxrmw41 =>
3478
            sig_PC <= X"00" & zw_b1;
3479
            ch_a_o <= zw_b2;
3480
            ch_b_o <= zw_b4;
3481
         when zpxrmw51 =>
3482
            sig_PC <= X"00" & zw_b1;
3483
            sig_RWn <= '0';
3484
            sig_RD <= '0';
3485
            sig_WR <= '1';
3486
            sig_D_OUT <= zw_b11;
3487
            op_finished <= '1';
3488
            if (rdy_i = '1') then
3489
               sig_SYNC <= '1';
3490
            end if;
3491
         when abrmw1 =>
3492
            sig_PC <= adr_pc_i;
3493
            ld_pc_o <= '1';
3494
            if (rdy_i = '1') then
3495
               ld_o <= "11";
3496
            end if;
3497
         when abrmw2 =>
3498
            sig_PC <= adr_pc_i;
3499
            ld_pc_o <= '1';
3500
            if (rdy_i = '1') then
3501
               ld_o <= "11";
3502
            end if;
3503
         when abrmw3 =>
3504
            sig_PC <= zw_b6 & zw_b5;
3505
            rmb_started <= '1';
3506
         when abrmw41 =>
3507
            sig_PC <= zw_b6 & zw_b5;
3508
            ch_a_o <= zw_b2;
3509
            ch_b_o <= zw_b4;
3510
         when abrmw51 =>
3511
            sig_PC <= zw_b6 & zw_b5;
3512
            sig_RWn <= '0';
3513
            sig_RD <= '0';
3514
            sig_WR <= '1';
3515
            sig_D_OUT <= zw_b11;
3516
            op_finished <= '1';
3517
            if (rdy_i = '1') then
3518
               sig_SYNC <= '1';
3519
            end if;
3520
         when abxrmb1 =>
3521
            sig_PC <= adr_pc_i;
3522
            ld_pc_o <= '1';
3523
            if (rdy_i = '1') then
3524
               ld_o <= "11";
3525
            end if;
3526
         when abxrmb2 =>
3527
            sig_PC <= adr_pc_i;
3528
            ch_a_o <= zw_b5;
3529
            ch_b_o <= q_x_i;
3530
            ld_pc_o <= '1';
3531
            if (rdy_i = '1') then
3532
               ld_o <= "11";
3533
            end if;
3534
         when abxrmb3 =>
3535
            sig_PC <= zw_b6 & zw_b1;
3536
            rmb_started <= NOT(zw_reg_0flag);
3537
            ch_a_o <= zw_b6;
3538
            ch_b_o <= "0000000" & zw_reg_0flag;
3539
         when abxrmb41 =>
3540
            sig_PC <= zw_b3 & zw_b1;
3541
         when abxrmb51 =>
3542
            sig_PC <= zw_b3 & zw_b1;
3543
            ch_a_o <= zw_b2;
3544
            ch_b_o <= zw_b4;
3545
         when abxrmb61 =>
3546
            sig_PC <= zw_b3 & zw_b1;
3547
            sig_RWn <= '0';
3548
            sig_RD <= '0';
3549
            sig_WR <= '1';
3550
            sig_D_OUT <= zw_b11;
3551
            op_finished <= '1';
3552
            if (rdy_i = '1') then
3553
               sig_SYNC <= '1';
3554
            end if;
3555
         when zp2w =>
3556
            sig_PC <= X"00" & zw_b5;
3557
            sig_RWn <= '0';
3558
            sig_RD <= '0';
3559
            sig_WR <= '1';
3560
            sig_D_OUT <= zw_b11;
3561
            op_finished <= '1';
3562
            if (rdy_i = '1') then
3563
               sig_SYNC <= '1';
3564
            end if;
3565
         when zpx3w =>
3566
            sig_PC <= X"00" & zw_b1;
3567
            sig_RWn <= '0';
3568
            sig_RD <= '0';
3569
            sig_WR <= '1';
3570
            sig_D_OUT <= zw_b11;
3571
            op_finished <= '1';
3572
            if (rdy_i = '1') then
3573
               sig_SYNC <= '1';
3574
            end if;
3575
         when zpy3w =>
3576
            sig_PC <= X"00" & zw_b1;
3577
            sig_RWn <= '0';
3578
            sig_RD <= '0';
3579
            sig_WR <= '1';
3580
            sig_D_OUT <= zw_b11;
3581
            op_finished <= '1';
3582
            if (rdy_i = '1') then
3583
               sig_SYNC <= '1';
3584
            end if;
3585
         when ab3w =>
3586
            sig_PC <= zw_b6 & zw_b5;
3587
            sig_RWn <= '0';
3588
            sig_RD <= '0';
3589
            sig_WR <= '1';
3590
            sig_D_OUT <= zw_b11;
3591
            op_finished <= '1';
3592
            if (rdy_i = '1') then
3593
               sig_SYNC <= '1';
3594
            end if;
3595
         when absx4w =>
3596
            sig_PC <= zw_b3 & zw_b1;
3597
            sig_RWn <= '0';
3598
            sig_RD <= '0';
3599
            sig_WR <= '1';
3600
            sig_D_OUT <= zw_b11;
3601
            op_finished <= '1';
3602
            if (rdy_i = '1') then
3603
               sig_SYNC <= '1';
3604
            end if;
3605
         when absx3w =>
3606
            sig_PC <= zw_b6 & zw_b1;
3607
            ch_a_o <= zw_b6;
3608
            ch_b_o <= "0000000" & zw_reg_0flag;
3609
            sig_RWn <= zw_reg_0flag;
3610
            sig_RD <= zw_reg_0flag;
3611
            sig_WR <= NOT(zw_reg_0flag);
3612
            sig_D_OUT <= zw_b11;
3613
            op_finished <= NOT(zw_reg_0flag);
3614
            if (rdy_i = '1' AND
3615
                zw_reg_0flag = '0') then
3616
               sig_SYNC <= '1';
3617
            end if;
3618
         when absy4w =>
3619
            sig_PC <= zw_b3 & zw_b1;
3620
            sig_RWn <= '0';
3621
            sig_RD <= '0';
3622
            sig_WR <= '1';
3623
            sig_D_OUT <= zw_b11;
3624
            op_finished <= '1';
3625
            if (rdy_i = '1') then
3626
               sig_SYNC <= '1';
3627
            end if;
3628
         when absy3w =>
3629
            sig_PC <= zw_b6 & zw_b1;
3630
            ch_a_o <= zw_b6;
3631
            ch_b_o <= "0000000" & zw_reg_0flag;
3632
            sig_RWn <= zw_reg_0flag;
3633
            sig_RD <= zw_reg_0flag;
3634
            sig_WR <= NOT(zw_reg_0flag);
3635
            sig_D_OUT <= zw_b11;
3636
            op_finished <= NOT(zw_reg_0flag);
3637
            if (rdy_i = '1' AND
3638
                zw_reg_0flag = '0') then
3639
               sig_SYNC <= '1';
3640
            end if;
3641
         when ind4w =>
3642
            sig_PC <= zw_b5 & zw_b6;
3643
            sig_RWn <= '0';
3644
            sig_RD <= '0';
3645
            sig_WR <= '1';
3646
            sig_D_OUT <= zw_b11;
3647
            op_finished <= '1';
3648
            if (rdy_i = '1') then
3649
               sig_SYNC <= '1';
3650
            end if;
3651
         when indx5w =>
3652
            sig_PC <= zw_b2 & zw_b5;
3653
            sig_RWn <= '0';
3654
            sig_RD <= '0';
3655
            sig_WR <= '1';
3656
            sig_D_OUT <= zw_b11;
3657
            op_finished <= '1';
3658
            if (rdy_i = '1') then
3659
               sig_SYNC <= '1';
3660
            end if;
3661
         when indy5w =>
3662
            sig_PC <= zw_b3 & zw_b6;
3663
            sig_RWn <= '0';
3664
            sig_RD <= '0';
3665
            sig_WR <= '1';
3666
            sig_D_OUT <= zw_b11;
3667
            op_finished <= '1';
3668
            if (rdy_i = '1') then
3669
               sig_SYNC <= '1';
3670
            end if;
3671
         when indy4w =>
3672
            sig_PC <= zw_b5 & zw_b6;
3673
            ch_a_o <= zw_b5;
3674
            ch_b_o <= "0000000" & zw_reg_0flag;
3675
            sig_RWn <= zw_reg_0flag;
3676
            sig_RD <= zw_reg_0flag;
3677
            sig_WR <= NOT(zw_reg_0flag);
3678
            sig_D_OUT <= zw_b11;
3679
            op_finished <= NOT(zw_reg_0flag);
3680
            if (rdy_i = '1' AND
3681
                zw_reg_0flag = '0') then
3682
               sig_SYNC <= '1';
3683
            end if;
3684
         when zprmw32 =>
3685
            sig_PC <= X"00" & zw_b5;
3686
            ch_a_o <= "00000" & zw_REG_OP (6 downto 4);
3687
            rmb_started <= '1';
3688
         when zpxrmw42 =>
3689
            sig_PC <= X"00" & zw_b1;
3690
            rmb_started <= '1';
3691
         when abrmw42 =>
3692
            sig_PC <= zw_b6 & zw_b5;
3693
            rmb_started <= '1';
3694
         when abxrmb52 =>
3695
            sig_PC <= zw_b3 & zw_b1;
3696
            rmb_started <= '1';
3697
         when abxrmb42 =>
3698
            sig_PC <= zw_b3 & zw_b1;
3699
            rmb_started <= '1';
3700
         when zp3 =>
3701
            sig_PC <= X"00" & zw_b5;
3702
            adc_sbc_finished <= '1';
3703
            if (rdy_i = '1') then
3704
               sig_SYNC <= '1';
3705
            end if;
3706
         when zpx4 =>
3707
            sig_PC <= X"00" & zw_b1;
3708
            adc_sbc_finished <= '1';
3709
            if (rdy_i = '1') then
3710
               sig_SYNC <= '1';
3711
            end if;
3712
         when ab4 =>
3713
            sig_PC <= zw_b6 & zw_b5;
3714
            adc_sbc_finished <= '1';
3715
            if (rdy_i = '1') then
3716
               sig_SYNC <= '1';
3717
            end if;
3718
         when ind5 =>
3719
            sig_PC <= zw_b5 & zw_b6;
3720
            adc_sbc_finished <= '1';
3721
            if (rdy_i = '1') then
3722
               sig_SYNC <= '1';
3723
            end if;
3724
         when indx6 =>
3725
            sig_PC <= zw_b2 & zw_b5;
3726
            adc_sbc_finished <= '1';
3727
            if (rdy_i = '1') then
3728
               sig_SYNC <= '1';
3729
            end if;
3730
         when imm2 =>
3731
            sig_PC <= adr_pc_i;
3732
            ld_pc_o <= '1';
3733
            adc_sbc_finished <= '1';
3734
            if (rdy_i = '1') then
3735
               ld_o <= "11";
3736
               sig_SYNC <= '1';
3737
            end if;
3738
         when others =>
3739
            null;
3740
      end case;
3741
   end process csm_output_proc;
3742
 
3743
   -----------------------------------------------------------------
3744
   csm_functions_clocked_proc : process (
3745
      clk_clk_i,
3746
      rst_rst_n_i
3747
   )
3748
   -----------------------------------------------------------------
3749
   begin
3750
      if (rst_rst_n_i = '0') then
3751
         csm_functions_current_state <= f_rst;
3752
         -- Default Reset Values
3753
         d_regs_out_bak_i <= (others => '0');
3754
         q_a_bak_i <= (others => '0');
3755
         q_x_bak_i <= (others => '0');
3756
         q_y_bak_i <= (others => '0');
3757
         reg_F <= "00110100";
3758
         reg_F_bak <= (others => '0');
3759
         zw_b10 <= "00" & X"00";
3760
         zw_b14 <= X"00";
3761
         zw_b7 <= "00" & X"00";
3762
         zw_b8 <= "00" & X"00";
3763
         zw_b9 <= "00" & X"00";
3764
         zw_din <= X"00";
3765
      elsif (clk_clk_i'event and clk_clk_i = '1') then
3766
         csm_functions_current_state <= csm_functions_next_state;
3767
         -- Default Assignment To Internals
3768
         d_regs_out_bak_i <= d_regs_out_bak_i;
3769
         q_a_bak_i <= q_a_bak_i;
3770
         q_x_bak_i <= q_x_bak_i;
3771
         q_y_bak_i <= q_y_bak_i;
3772
         reg_F <= reg_F(7) & (zw_so OR reg_F(6)) & reg_F(5 downto 0);
3773
         reg_F_bak <= reg_F_bak;
3774
         zw_b10 <= zw_b10;
3775
         zw_b14 <= zw_b14;
3776
         zw_b7 <= zw_b7;
3777
         zw_b8 <= zw_b8;
3778
         zw_b9 <= zw_b9;
3779
         zw_din <= zw_din;
3780
 
3781
         -- Combined Actions
3782
         case csm_functions_current_state is
3783
            when f_idle =>
3784
               zw_din <= d_i;
3785
               q_a_bak_i <= q_a_i;
3786
               q_x_bak_i <= q_x_i;
3787
               q_y_bak_i <= q_y_i;
3788
               reg_F_bak <= reg_F;
3789
               d_regs_out_bak_i <= d_regs_out_i;
3790
            when f_and =>
3791
               zw_din <= d_i;
3792
               reg_F(7) <= n_detect_out;
3793
               reg_F(1) <= z_detect_out;
3794
            when f_lda =>
3795
               zw_din <= d_i;
3796
               reg_F(7) <= n_detect_out;
3797
               reg_F(1) <= z_detect_out;
3798
            when f_eor =>
3799
               zw_din <= d_i;
3800
               reg_F(7) <= n_detect_out;
3801
               reg_F(1) <= z_detect_out;
3802
            when f_cmp =>
3803
               zw_din <= d_i;
3804
               reg_F(7) <= n_detect_out;
3805
               reg_F(1) <= z_detect_out;
3806
               reg_F(0) <= c_detect_out;
3807
            when f_ora =>
3808
               zw_din <= d_i;
3809
               reg_F(7) <= n_detect_out;
3810
               reg_F(1) <= z_detect_out;
3811
            when f_clc =>
3812
               reg_F(0) <= '0';
3813
            when f_sec =>
3814
               reg_F(0) <= '1';
3815
            when f_cld =>
3816
               reg_F(3) <= '0';
3817
            when f_sed =>
3818
               reg_F(3) <= '1';
3819
            when f_clv =>
3820
               reg_F(6) <= '0';
3821
            when f_cli =>
3822
               reg_F(2) <= '0';
3823
            when f_sei =>
3824
               reg_F(2) <= '1';
3825
            when f_rti =>
3826
               zw_din <= d_i;
3827
               reg_F(7 downto 6) <= zw_din(7 downto 6);
3828
               reg_F(3 downto 0) <= zw_din(3 downto 0);
3829
            when f_irq =>
3830
               reg_F(2) <= '1';
3831
               reg_F(3) <= '0';
3832
            when f_res =>
3833
               reg_F(2) <= '1';
3834
               reg_F(3) <= '0';
3835
               reg_F(5) <= '1';
3836
            when f_bit1 =>
3837
               zw_din <= d_i;
3838
               reg_F(1) <= z_detect_out;
3839
            when f_bit2 =>
3840
               zw_din <= d_i;
3841
               reg_F(7) <= zw_din(7);
3842
               reg_F(6) <= zw_din(6);
3843
               reg_F(1) <= z_detect_out;
3844
            when f_de_in_a =>
3845
               reg_F(7) <= n_detect_out;
3846
               reg_F(1) <= z_detect_out;
3847
            when f_adc_bin =>
3848
               zw_din <= d_i;
3849
               reg_F(7) <= zw_ALU(7);
3850
               reg_F(6) <= (zw_ALU(7) AND (NOT q_a_bak_i(7)) AND (NOT zw_din(7))) OR
3851
                (NOT zw_ALU(7) AND (q_a_bak_i(7)) AND (zw_din(7)));
3852
               reg_F(1) <= NOT ((zw_ALU(7)) OR (zw_ALU(6)) OR (zw_ALU(5)) OR
3853
                (zw_ALU(4)) OR (zw_ALU(3)) OR (zw_ALU(2)) OR (zw_ALU(1)) OR
3854
                (zw_ALU(0)));
3855
               reg_F(0) <= zw_ALU(8);
3856
            when f_sbc_bin =>
3857
               zw_din <= d_i;
3858
               reg_F(7) <= zw_ALU(7);
3859
               reg_F(6) <= (zw_ALU(7) AND (NOT q_a_bak_i(7)) AND (zw_din(7))) OR
3860
                (NOT zw_ALU(7) AND (q_a_bak_i(7)) AND (NOT zw_din(7)));
3861
               reg_F(1) <= NOT ((zw_ALU(7)) OR (zw_ALU(6)) OR (zw_ALU(5)) OR
3862
                (zw_ALU(4)) OR (zw_ALU(3)) OR (zw_ALU(2)) OR (zw_ALU(1)) OR
3863
                (zw_ALU(0)));
3864
               reg_F(0) <= (zw_ALU(8) AND (NOT q_a_bak_i(7)) AND (NOT zw_din(7))) OR
3865
                (zw_ALU(8) AND (q_a_bak_i(7)) AND (zw_din(7))) OR
3866
                (NOT zw_ALU(8) AND (q_a_bak_i(7)) AND (NOT zw_din(7))) OR
3867
                (zw_ALU(8) AND (q_a_bak_i(7)) AND (NOT zw_din(7)));
3868
            when f_adc_dec =>
3869
               zw_din <= d_i;
3870
               reg_F(6) <= (zw_ALU5(3) XOR q_a_bak_i(7)) AND (NOT (q_a_bak_i(7) XOR zw_din(7)));
3871
               reg_F(0) <= zw_ALU4(4);
3872
               zw_b8(8 downto 5) <= '0' & ((zw_ALU4(4))) & ((zw_ALU4(4))) & '0';
3873
               zw_b10(4 downto 0) <= unsigned ('0' & q_a_bak_i(7 downto 4)) +
3874
                                                     unsigned ('0' & zw_din(7 downto 4)) + (zw_ALU3(4));
3875
               zw_b7(8 downto 5) <= '0' & ((zw_ALU3(4))) & ((zw_ALU3(4))) & '0';
3876
               zw_b9(4 downto 0) <= unsigned ('0' & q_a_bak_i(3 downto 0)) +
3877
                                                     unsigned ('0' & zw_din(3 downto 0)) + reg_F_bak(0);
3878
            when f_adc_dec1 =>
3879
               reg_F(7) <= zw_ALU(7);
3880
               reg_F(1) <= NOT (zw_ALU(7) OR zw_ALU(6) OR zw_ALU(5) OR
3881
                zw_ALU(4) OR zw_ALU(3) OR zw_ALU(2) OR zw_ALU(1) OR
3882
                zw_ALU(0));
3883
            when f_sbc_dec =>
3884
               zw_din <= d_i;
3885
               reg_F(6) <= (zw_ALU2(3) XOR q_a_bak_i(7)) AND (q_a_bak_i(7) XOR zw_din(7));
3886
               reg_F(0) <=  (zw_ALU2(4));
3887
               zw_b9(7 downto 0) <=  '0' &
3888
                                                            (NOT zw_ALU2(4)) &
3889
                                                            (NOT zw_ALU2(4)) &
3890
                                                           '0' &
3891
                                                           '0' &
3892
                                                            (NOT zw_ALU1(4)) &
3893
                                                            (NOT zw_ALU1(4)) &
3894
                                                           '0';
3895
               zw_b8(5 downto 0) <= unsigned ("00" & q_a_bak_i(7 downto 4)) +
3896
                                                     unsigned ("00" & NOT (zw_din(7 downto 4))) + (zw_ALU1(4));
3897
               zw_b7(5 downto 0) <= unsigned ("00" & q_a_bak_i(3 downto 0)) +
3898
                                                     unsigned ("00" & NOT (zw_din(3 downto 0))) + reg_F_bak(0);
3899
            when f_sbc_dec1 =>
3900
               reg_F(7) <= zw_ALU(7);
3901
               reg_F(1) <= NOT ((zw_ALU(7)) OR (zw_ALU(6)) OR (zw_ALU(5)) OR
3902
                (zw_ALU(4)) OR (zw_ALU(3)) OR (zw_ALU(2)) OR (zw_ALU(1)) OR
3903
                (zw_ALU(0)));
3904
            when f_asla =>
3905
               reg_F(7) <= n_detect_out;
3906
               reg_F(1) <= z_detect_out;
3907
               reg_F(0) <= shift_rot_l_c_out;
3908
            when f_lsra =>
3909
               reg_F(7) <= n_detect_out;
3910
               reg_F(1) <= z_detect_out;
3911
               reg_F(0) <= shift_rot_r_c_out;
3912
            when f_rola =>
3913
               reg_F(7) <= n_detect_out;
3914
               reg_F(1) <= z_detect_out;
3915
               reg_F(0) <= shift_rot_l_c_out;
3916
            when f_rora =>
3917
               reg_F(7) <= n_detect_out;
3918
               reg_F(1) <= z_detect_out;
3919
               reg_F(0) <= shift_rot_r_c_out;
3920
            when f_tax =>
3921
               reg_F(7) <= n_detect_out;
3922
               reg_F(1) <= z_detect_out;
3923
            when f_tsx =>
3924
               reg_F(7) <= n_detect_out;
3925
               reg_F(1) <= z_detect_out;
3926
            when f_decr =>
3927
               reg_F(7) <= n_detect_out;
3928
               reg_F(1) <= z_detect_out;
3929
            when f_asl =>
3930
               reg_F(7) <= n_detect_out;
3931
               reg_F(1) <= z_detect_out;
3932
               reg_F(0) <= shift_rot_l_c_out;
3933
            when f_lsr =>
3934
               reg_F(7) <= n_detect_out;
3935
               reg_F(1) <= z_detect_out;
3936
               reg_F(0) <= shift_rot_r_c_out;
3937
            when f_rol =>
3938
               reg_F(7) <= n_detect_out;
3939
               reg_F(1) <= z_detect_out;
3940
               reg_F(0) <= shift_rot_l_c_out;
3941
            when f_ror =>
3942
               reg_F(7) <= n_detect_out;
3943
               reg_F(1) <= z_detect_out;
3944
               reg_F(0) <= shift_rot_r_c_out;
3945
            when f_trb =>
3946
               reg_F(1) <= z_detect_out;
3947
            when f_tsb =>
3948
               reg_F(1) <= z_detect_out;
3949
            when others =>
3950
               null;
3951
         end case;
3952
      end if;
3953
   end process csm_functions_clocked_proc;
3954
 
3955
   -----------------------------------------------------------------
3956
   csm_functions_nextstate_proc : process (
3957
      adc_sbc_finished,
3958
      csm_functions_current_state,
3959
      irq_finished,
3960
      op_finished,
3961
      op_finished_det,
3962
      reg_F,
3963
      rmb_started,
3964
      rst_finished,
3965
      zw_REG_OP
3966
   )
3967
   -----------------------------------------------------------------
3968
   begin
3969
      case csm_functions_current_state is
3970
         when f_idle =>
3971
            if (op_finished = '1' and
3972
                (zw_REG_OP = X"29" or zw_REG_OP = X"25" or
3973
                zw_REG_OP = X"35" or zw_REG_OP = X"2D" or
3974
                zw_REG_OP = X"3D" or zw_REG_OP = X"39" or
3975
                zw_REG_OP = X"21" or zw_REG_OP = X"31" or
3976
                zw_REG_OP = X"32")) then
3977
               csm_functions_next_state <= f_and;
3978
            elsif (op_finished = '1' and
3979
                   (zw_REG_OP = X"C9" or zw_REG_OP = X"C5" or zw_REG_OP = X"D5" or zw_REG_OP = X"CD" or
3980
                   zw_REG_OP = X"DD" or zw_REG_OP = X"D9" or zw_REG_OP = X"C1" or zw_REG_OP = X"D1" or
3981
                    zw_REG_OP = X"C0" or zw_REG_OP = X"E0" or  zw_REG_OP = X"C4" or zw_REG_OP = X"E4" or
3982
                    zw_REG_OP = X"CC" or zw_REG_OP = X"EC" or zw_REG_OP = X"D2")) then
3983
               csm_functions_next_state <= f_cmp;
3984
            elsif (op_finished = '1' and
3985
                   (zw_REG_OP = X"49" or zw_REG_OP = X"45" or zw_REG_OP = X"55" or zw_REG_OP = X"4D" or
3986
                   zw_REG_OP = X"5D" or zw_REG_OP = X"59" or zw_REG_OP = X"41" or zw_REG_OP = X"51" or
3987
                   zw_REG_OP = X"52")) then
3988
               csm_functions_next_state <= f_eor;
3989
            elsif (op_finished = '1' and
3990
                   (zw_REG_OP = X"09" or zw_REG_OP = X"05" or zw_REG_OP = X"15" or zw_REG_OP = X"0D" or
3991
                   zw_REG_OP = X"1D" or zw_REG_OP = X"19" or zw_REG_OP = X"01" or zw_REG_OP = X"11" or
3992
                   zw_REG_OP = X"12")) then
3993
               csm_functions_next_state <= f_ora;
3994
            elsif (op_finished = '1' and
3995
                   (zw_REG_OP = X"A9" or zw_REG_OP = X"A5" or zw_REG_OP = X"B5" or zw_REG_OP = X"AD" or
3996
                    zw_REG_OP = X"BD" or zw_REG_OP = X"B9" or zw_REG_OP = X"A1" or zw_REG_OP = X"B1" or
3997
                    zw_REG_OP = X"B2" or
3998
                    zw_REG_OP = X"A2" or zw_REG_OP = X"A6" or zw_REG_OP = X"B6" or zw_REG_OP = X"AE" or
3999
                    zw_REG_OP = X"BE" or
4000
                    zw_REG_OP = X"A0" or zw_REG_OP = X"A4" or zw_REG_OP = X"B4" or zw_REG_OP = X"AC" or
4001
                    zw_REG_OP = X"BC" or
4002
                    zw_REG_OP = X"68" or zw_REG_OP = X"FA" or zw_REG_OP = X"7A")) then
4003
               csm_functions_next_state <= f_lda;
4004
            elsif (op_finished = '1' and
4005
                   zw_REG_OP = X"18") then
4006
               csm_functions_next_state <= f_clc;
4007
            elsif (op_finished = '1' and
4008
                   zw_REG_OP = X"38") then
4009
               csm_functions_next_state <= f_sec;
4010
            elsif (op_finished = '1' and
4011
                   zw_REG_OP = X"D8") then
4012
               csm_functions_next_state <= f_cld;
4013
            elsif (op_finished = '1' and
4014
                   zw_REG_OP = X"F8") then
4015
               csm_functions_next_state <= f_sed;
4016
            elsif (op_finished = '1' and
4017
                   zw_REG_OP = X"B8") then
4018
               csm_functions_next_state <= f_clv;
4019
            elsif (op_finished = '1' and
4020
                   zw_REG_OP = X"58") then
4021
               csm_functions_next_state <= f_cli;
4022
            elsif (op_finished = '1' and
4023
                   (zw_REG_OP = X"78")) then
4024
               csm_functions_next_state <= f_sei;
4025
            elsif (op_finished = '1' and
4026
                   (zw_REG_OP = X"40" or
4027
                    zw_REG_OP = X"28")) then
4028
               csm_functions_next_state <= f_rti;
4029
            elsif (irq_finished = '1') then
4030
               csm_functions_next_state <= f_irq;
4031
            elsif (rst_finished = '1') then
4032
               csm_functions_next_state <= f_res;
4033
            elsif (op_finished = '1' and
4034
                   zw_REG_OP = X"89") then
4035
               csm_functions_next_state <= f_bit1;
4036
            elsif (op_finished = '1' and
4037
                   (zw_REG_OP = X"24" or
4038
                    zw_REG_OP = X"34" or
4039
                    zw_REG_OP = X"2C" or
4040
                    zw_REG_OP = X"3C")) then
4041
               csm_functions_next_state <= f_bit2;
4042
            elsif (op_finished = '1' and
4043
                   (zw_REG_OP = X"3A" or
4044
                    zw_REG_OP = X"CA" or
4045
                    zw_REG_OP = X"88" or
4046
                    zw_REG_OP = X"1A" or
4047
                    zw_REG_OP = X"E8" or
4048
                    zw_REG_OP = X"C8")) then
4049
               csm_functions_next_state <= f_de_in_a;
4050
            elsif (op_finished = '1' and
4051
                   reg_F(3) = '0' and
4052
                   (zw_REG_OP = X"69" or
4053
                    zw_REG_OP = X"65" or
4054
                    zw_REG_OP = X"75" or
4055
                    zw_REG_OP = X"6D" or
4056
                    zw_REG_OP = X"72" or
4057
                    zw_REG_OP = X"7D" or
4058
                    zw_REG_OP = X"79" or
4059
                    zw_REG_OP = X"71" or
4060
                    zw_REG_OP = X"61")) then
4061
               csm_functions_next_state <= f_adc_bin;
4062
            elsif (op_finished = '1' and
4063
                   reg_F(3) = '0' and
4064
                   (zw_REG_OP = X"E9" or
4065
                    zw_REG_OP = X"E5" or
4066
                    zw_REG_OP = X"F5" or
4067
                    zw_REG_OP = X"ED" or
4068
                    zw_REG_OP = X"F2" or
4069
                    zw_REG_OP = X"FD" or
4070
                    zw_REG_OP = X"F9" or
4071
                    zw_REG_OP = X"F1" or
4072
                    zw_REG_OP = X"E1")) then
4073
               csm_functions_next_state <= f_sbc_bin;
4074
            elsif (op_finished = '1' and
4075
                   reg_F(3) = '1' and
4076
                   (zw_REG_OP = X"69" or zw_REG_OP = X"65" or zw_REG_OP = X"75" or
4077
                    zw_REG_OP = X"6D" or zw_REG_OP = X"72" or zw_REG_OP = X"7D" or
4078
                    zw_REG_OP = X"79" or zw_REG_OP = X"71" or zw_REG_OP = X"61")) then
4079
               csm_functions_next_state <= f_adc_dec;
4080
            elsif (op_finished = '1' and
4081
                   reg_F(3) = '1' and
4082
                   (zw_REG_OP = X"E9" or zw_REG_OP = X"E5" or zw_REG_OP = X"F5" or
4083
                    zw_REG_OP = X"ED" or zw_REG_OP = X"F2" or zw_REG_OP = X"FD" or
4084
                    zw_REG_OP = X"F9" or zw_REG_OP = X"F1" or zw_REG_OP = X"E1")) then
4085
               csm_functions_next_state <= f_sbc_dec;
4086
            elsif (op_finished = '1' and
4087
                   zw_REG_OP = X"0A") then
4088
               csm_functions_next_state <= f_asla;
4089
            elsif (op_finished = '1' and
4090
                   zw_REG_OP = X"4A") then
4091
               csm_functions_next_state <= f_lsra;
4092
            elsif (op_finished = '1' and
4093
                   zw_REG_OP = X"2A") then
4094
               csm_functions_next_state <= f_rola;
4095
            elsif (op_finished = '1' and
4096
                   zw_REG_OP = X"6A") then
4097
               csm_functions_next_state <= f_rora;
4098
            elsif (op_finished = '1' and
4099
                   (zw_REG_OP = X"AA" or zw_REG_OP = X"8A" or
4100
                    zw_REG_OP = X"A8" or zw_REG_OP = X"98")) then
4101
               csm_functions_next_state <= f_tax;
4102
            elsif (op_finished = '1' and
4103
                   zw_REG_OP = X"BA") then
4104
               csm_functions_next_state <= f_tsx;
4105
            elsif (op_finished = '1' and
4106
                   (zw_REG_OP = X"C6" or zw_REG_OP = X"E6" or
4107
                    zw_REG_OP = X"D6" or zw_REG_OP = X"F6" or
4108
                    zw_REG_OP = X"CE" or zw_REG_OP = X"EE" or
4109
                    zw_REG_OP = X"DE" or zw_REG_OP = X"FE")) then
4110
               csm_functions_next_state <= f_decr;
4111
            elsif (rmb_started = '1' and
4112
                   (zw_REG_OP = X"66" or
4113
                   zw_REG_OP = X"76" or
4114
                   zw_REG_OP = X"6E" or
4115
                   zw_REG_OP = X"7E")) then
4116
               csm_functions_next_state <= f_ror;
4117
            elsif (rmb_started = '1' and
4118
                   (zw_REG_OP = X"06" or
4119
                   zw_REG_OP = X"16" or
4120
                   zw_REG_OP = X"0E" or
4121
                   zw_REG_OP = X"1E")) then
4122
               csm_functions_next_state <= f_asl;
4123
            elsif (rmb_started = '1' and
4124
                   (zw_REG_OP = X"46" or
4125
                   zw_REG_OP = X"56" or
4126
                   zw_REG_OP = X"4E" or
4127
                   zw_REG_OP = X"5E")) then
4128
               csm_functions_next_state <= f_lsr;
4129
            elsif (rmb_started = '1' and
4130
                   (zw_REG_OP = X"26" or
4131
                   zw_REG_OP = X"36" or
4132
                   zw_REG_OP = X"2E" or
4133
                   zw_REG_OP = X"3E")) then
4134
               csm_functions_next_state <= f_rol;
4135
            elsif (rmb_started = '1' and
4136
                   zw_REG_OP (7) = '0' and
4137
                   zw_REG_OP (3 downto 0) = X"7") then
4138
               csm_functions_next_state <= f_rmb;
4139
            elsif (rmb_started = '1' and
4140
                   zw_REG_OP (7) = '1' and
4141
                   zw_REG_OP (3 downto 0) = X"7") then
4142
               csm_functions_next_state <= f_smb;
4143
            elsif (rmb_started = '1' and
4144
                   (zw_REG_OP = X"14" or
4145
                   zw_REG_OP = X"1C")) then
4146
               csm_functions_next_state <= f_trb;
4147
            elsif (rmb_started = '1' and
4148
                   (zw_REG_OP = X"04" or
4149
                   zw_REG_OP = X"0C")) then
4150
               csm_functions_next_state <= f_tsb;
4151
            else
4152
               csm_functions_next_state <= f_idle;
4153
            end if;
4154
         when f_and =>
4155
            if (op_finished_det = '1') then
4156
               csm_functions_next_state <= f_idle;
4157
            else
4158
               csm_functions_next_state <= f_and;
4159
            end if;
4160
         when f_lda =>
4161
            if (op_finished_det = '1') then
4162
               csm_functions_next_state <= f_idle;
4163
            else
4164
               csm_functions_next_state <= f_lda;
4165
            end if;
4166
         when f_rst =>
4167
            csm_functions_next_state <= f_idle;
4168
         when f_eor =>
4169
            if (op_finished_det = '1') then
4170
               csm_functions_next_state <= f_idle;
4171
            else
4172
               csm_functions_next_state <= f_eor;
4173
            end if;
4174
         when f_cmp =>
4175
            if (op_finished_det = '1') then
4176
               csm_functions_next_state <= f_idle;
4177
            else
4178
               csm_functions_next_state <= f_cmp;
4179
            end if;
4180
         when f_ora =>
4181
            if (op_finished_det = '1') then
4182
               csm_functions_next_state <= f_idle;
4183
            else
4184
               csm_functions_next_state <= f_ora;
4185
            end if;
4186
         when f_clc =>
4187
            if (op_finished = '0') then
4188
               csm_functions_next_state <= f_idle;
4189
            else
4190
               csm_functions_next_state <= f_clc;
4191
            end if;
4192
         when f_sec =>
4193
            if (op_finished = '0') then
4194
               csm_functions_next_state <= f_idle;
4195
            else
4196
               csm_functions_next_state <= f_sec;
4197
            end if;
4198
         when f_cld =>
4199
            if (op_finished = '0') then
4200
               csm_functions_next_state <= f_idle;
4201
            else
4202
               csm_functions_next_state <= f_cld;
4203
            end if;
4204
         when f_sed =>
4205
            if (op_finished = '0') then
4206
               csm_functions_next_state <= f_idle;
4207
            else
4208
               csm_functions_next_state <= f_sed;
4209
            end if;
4210
         when f_clv =>
4211
            if (op_finished = '0') then
4212
               csm_functions_next_state <= f_idle;
4213
            else
4214
               csm_functions_next_state <= f_clv;
4215
            end if;
4216
         when f_cli =>
4217
            if (op_finished = '0') then
4218
               csm_functions_next_state <= f_idle;
4219
            else
4220
               csm_functions_next_state <= f_cli;
4221
            end if;
4222
         when f_sei =>
4223
            if (op_finished = '0') then
4224
               csm_functions_next_state <= f_idle;
4225
            else
4226
               csm_functions_next_state <= f_sei;
4227
            end if;
4228
         when f_rti =>
4229
            if (op_finished_det = '1') then
4230
               csm_functions_next_state <= f_idle;
4231
            else
4232
               csm_functions_next_state <= f_rti;
4233
            end if;
4234
         when f_irq =>
4235
            if (irq_finished = '0') then
4236
               csm_functions_next_state <= f_idle;
4237
            else
4238
               csm_functions_next_state <= f_irq;
4239
            end if;
4240
         when f_res =>
4241
            if (rst_finished = '0') then
4242
               csm_functions_next_state <= f_idle;
4243
            else
4244
               csm_functions_next_state <= f_res;
4245
            end if;
4246
         when f_bit1 =>
4247
            if (op_finished_det = '1') then
4248
               csm_functions_next_state <= f_idle;
4249
            else
4250
               csm_functions_next_state <= f_bit1;
4251
            end if;
4252
         when f_bit2 =>
4253
            if (op_finished_det = '1') then
4254
               csm_functions_next_state <= f_idle;
4255
            else
4256
               csm_functions_next_state <= f_bit2;
4257
            end if;
4258
         when f_de_in_a =>
4259
            if (op_finished_det = '1') then
4260
               csm_functions_next_state <= f_idle;
4261
            else
4262
               csm_functions_next_state <= f_de_in_a;
4263
            end if;
4264
         when f_adc_bin =>
4265
            if (op_finished_det = '1') then
4266
               csm_functions_next_state <= f_idle;
4267
            else
4268
               csm_functions_next_state <= f_adc_bin;
4269
            end if;
4270
         when f_sbc_bin =>
4271
            if (op_finished_det = '1') then
4272
               csm_functions_next_state <= f_idle;
4273
            else
4274
               csm_functions_next_state <= f_sbc_bin;
4275
            end if;
4276
         when f_adc_dec =>
4277
            if (op_finished_det = '1') then
4278
               csm_functions_next_state <= f_adc_dec1;
4279
            else
4280
               csm_functions_next_state <= f_adc_dec;
4281
            end if;
4282
         when f_adc_dec1 =>
4283
            if (adc_sbc_finished = '0') then
4284
               csm_functions_next_state <= f_idle;
4285
            else
4286
               csm_functions_next_state <= f_adc_dec1;
4287
            end if;
4288
         when f_sbc_dec =>
4289
            if (op_finished_det = '1') then
4290
               csm_functions_next_state <= f_sbc_dec1;
4291
            else
4292
               csm_functions_next_state <= f_sbc_dec;
4293
            end if;
4294
         when f_sbc_dec1 =>
4295
            if (adc_sbc_finished = '0') then
4296
               csm_functions_next_state <= f_idle;
4297
            else
4298
               csm_functions_next_state <= f_sbc_dec1;
4299
            end if;
4300
         when f_asla =>
4301
            if (op_finished = '0') then
4302
               csm_functions_next_state <= f_idle;
4303
            else
4304
               csm_functions_next_state <= f_asla;
4305
            end if;
4306
         when f_lsra =>
4307
            if (op_finished = '0') then
4308
               csm_functions_next_state <= f_idle;
4309
            else
4310
               csm_functions_next_state <= f_lsra;
4311
            end if;
4312
         when f_rola =>
4313
            if (op_finished = '0') then
4314
               csm_functions_next_state <= f_idle;
4315
            else
4316
               csm_functions_next_state <= f_rola;
4317
            end if;
4318
         when f_rora =>
4319
            if (op_finished = '0') then
4320
               csm_functions_next_state <= f_idle;
4321
            else
4322
               csm_functions_next_state <= f_rora;
4323
            end if;
4324
         when f_tax =>
4325
            if (op_finished_det = '1') then
4326
               csm_functions_next_state <= f_idle;
4327
            else
4328
               csm_functions_next_state <= f_tax;
4329
            end if;
4330
         when f_tsx =>
4331
            if (op_finished = '0') then
4332
               csm_functions_next_state <= f_idle;
4333
            else
4334
               csm_functions_next_state <= f_tsx;
4335
            end if;
4336
         when f_decr =>
4337
            if (op_finished = '0') then
4338
               csm_functions_next_state <= f_idle;
4339
            else
4340
               csm_functions_next_state <= f_decr;
4341
            end if;
4342
         when f_asl =>
4343
            if (rmb_started = '0') then
4344
               csm_functions_next_state <= f_idle;
4345
            else
4346
               csm_functions_next_state <= f_asl;
4347
            end if;
4348
         when f_lsr =>
4349
            if (rmb_started = '0') then
4350
               csm_functions_next_state <= f_idle;
4351
            else
4352
               csm_functions_next_state <= f_lsr;
4353
            end if;
4354
         when f_rol =>
4355
            if (rmb_started = '0') then
4356
               csm_functions_next_state <= f_idle;
4357
            else
4358
               csm_functions_next_state <= f_rol;
4359
            end if;
4360
         when f_ror =>
4361
            if (rmb_started = '0') then
4362
               csm_functions_next_state <= f_idle;
4363
            else
4364
               csm_functions_next_state <= f_ror;
4365
            end if;
4366
         when f_rmb =>
4367
            if (rmb_started = '0') then
4368
               csm_functions_next_state <= f_idle;
4369
            else
4370
               csm_functions_next_state <= f_rmb;
4371
            end if;
4372
         when f_smb =>
4373
            if (rmb_started = '0') then
4374
               csm_functions_next_state <= f_idle;
4375
            else
4376
               csm_functions_next_state <= f_smb;
4377
            end if;
4378
         when f_trb =>
4379
            if (rmb_started = '0') then
4380
               csm_functions_next_state <= f_idle;
4381
            else
4382
               csm_functions_next_state <= f_trb;
4383
            end if;
4384
         when f_tsb =>
4385
            if (rmb_started = '0') then
4386
               csm_functions_next_state <= f_idle;
4387
            else
4388
               csm_functions_next_state <= f_tsb;
4389
            end if;
4390
         when others =>
4391
            csm_functions_next_state <= f_rst;
4392
      end case;
4393
   end process csm_functions_nextstate_proc;
4394
 
4395
   -----------------------------------------------------------------
4396
   csm_functions_output_proc : process (
4397
      adr_sp_i,
4398
      cnz_detect_in,
4399
      csm_functions_current_state,
4400
      d_alu_prio_i,
4401
      d_regs_out_bak_i,
4402
      q_a_bak_i,
4403
      reg_F_bak,
4404
      shift_rot_asl_out,
4405
      shift_rot_in,
4406
      shift_rot_lsr_out,
4407
      shift_rot_rol_out,
4408
      shift_rot_ror_out,
4409
      zw_ALU,
4410
      zw_ALU1,
4411
      zw_ALU3,
4412
      zw_ALU5,
4413
      zw_b10,
4414
      zw_b11,
4415
      zw_b2,
4416
      zw_b4,
4417
      zw_b7,
4418
      zw_b8,
4419
      zw_b9,
4420
      zw_din
4421
   )
4422
   -----------------------------------------------------------------
4423
   begin
4424
      -- Default Assignment
4425
      d_regs_in_o <= X"00";
4426
      load_regs_o <= '0';
4427
      -- Default Assignment To Internals
4428
      c_detect_out <= cnz_detect_in(8);
4429
      cnz_detect_in <= '0' & X"00";
4430
      n_detect_out <= cnz_detect_in(7);
4431
      shift_rot_asl_out <= shift_rot_in (6 downto 0) & '0';
4432
      shift_rot_in <= X"00";
4433
      shift_rot_l_c_out <= shift_rot_in (7);
4434
      shift_rot_lsr_out <= '0' & shift_rot_in (7 downto 1);
4435
      shift_rot_r_c_out <= shift_rot_in (0);
4436
      shift_rot_rol_out <= shift_rot_in (6 downto 0) & reg_F_bak(0);
4437
      shift_rot_ror_out <= reg_F_bak(0) & shift_rot_in (7 downto 1);
4438
      z_detect_out <= NOT(cnz_detect_in(7) OR cnz_detect_in(6) OR cnz_detect_in(5) OR cnz_detect_in(4) OR cnz_detect_in(3) OR cnz_detect_in(2) OR cnz_detect_in(1) OR cnz_detect_in(0));
4439
      zw_ALU <= "00" & X"00";
4440
      zw_ALU1 <= "00" & X"00";
4441
      zw_ALU2 <= "00" & X"00";
4442
      zw_ALU3 <= "00" & X"00";
4443
      zw_ALU4 <= "00" & X"00";
4444
      zw_ALU5 <= "00" & X"00";
4445
      zw_ALU6 <= "00" & X"00";
4446
      zw_b13 <= (others => '0');
4447
 
4448
      -- Combined Actions
4449
      case csm_functions_current_state is
4450
         when f_and =>
4451
            d_regs_in_o <= zw_din AND q_a_bak_i;
4452
            load_regs_o <= '1';
4453
            cnz_detect_in <= '0' & (zw_din AND q_a_bak_i);
4454
         when f_lda =>
4455
            d_regs_in_o <= zw_din;
4456
            load_regs_o <= '1';
4457
            cnz_detect_in <= '0' & (zw_din);
4458
         when f_rst =>
4459
            d_regs_in_o <= X"00";
4460
            load_regs_o <= '0';
4461
         when f_eor =>
4462
            d_regs_in_o <= zw_din XOR q_a_bak_i;
4463
            load_regs_o <= '1';
4464
            cnz_detect_in <= '0' & (zw_din XOR q_a_bak_i);
4465
         when f_cmp =>
4466
            cnz_detect_in <= unsigned ('0' & d_regs_out_bak_i) +
4467
                                          unsigned ('0' & NOT (zw_din)) + 1;
4468
         when f_ora =>
4469
            d_regs_in_o <= zw_din OR q_a_bak_i;
4470
            load_regs_o <= '1';
4471
            cnz_detect_in <= '0' & (zw_din OR q_a_bak_i);
4472
         when f_bit1 =>
4473
            cnz_detect_in <= '0' & (zw_din AND q_a_bak_i);
4474
         when f_bit2 =>
4475
            cnz_detect_in <= '0' & (zw_din AND q_a_bak_i);
4476
         when f_de_in_a =>
4477
            d_regs_in_o <= unsigned(d_regs_out_bak_i) + unsigned(zw_b4);
4478
            load_regs_o <= '1';
4479
            cnz_detect_in <= '0' & (unsigned(d_regs_out_bak_i) + unsigned(zw_b4));
4480
         when f_adc_bin =>
4481
            d_regs_in_o <= zw_ALU(7 downto 0);
4482
            load_regs_o <= '1';
4483
            zw_ALU(8 downto 0) <= unsigned ('0' & q_a_bak_i) + unsigned ('0' & zw_din) + reg_F_bak(0);
4484
         when f_sbc_bin =>
4485
            d_regs_in_o <= zw_ALU(7 downto 0);
4486
            load_regs_o <= '1';
4487
            zw_ALU(8 downto 0) <= unsigned ('0' & q_a_bak_i) + unsigned ('0' & NOT (zw_din)) + reg_F_bak(0);
4488
         when f_adc_dec =>
4489
            zw_ALU4(4) <= zw_ALU5(4) OR
4490
                                        (zw_ALU5(3) AND zw_ALU5(2)) OR
4491
                                        (zw_ALU5(3) AND zw_ALU5(1));
4492
            zw_ALU5(4 downto 0) <= unsigned ('0' & q_a_bak_i(7 downto 4)) +
4493
                                                  unsigned ('0' & zw_din(7 downto 4)) + (zw_ALU3(4));
4494
            zw_ALU3(4) <= zw_ALU1(4) OR
4495
                                       (zw_ALU1(3) AND zw_ALU1(2)) OR
4496
                                       (zw_ALU1(3) AND zw_ALU1(1));
4497
            zw_ALU1(4 downto 0) <= unsigned ('0' & q_a_bak_i(3 downto 0)) +
4498
                                                  unsigned ('0' & zw_din(3 downto 0)) + reg_F_bak(0);
4499
         when f_adc_dec1 =>
4500
            d_regs_in_o <= zw_ALU(7 downto 0);
4501
            load_regs_o <= '1';
4502
            zw_ALU(7 downto 4) <= unsigned (zw_b10(3 downto 0)) + unsigned (zw_b8(8 downto 5));
4503
            zw_ALU(3 downto 0) <= unsigned (zw_b9(3 downto 0)) + unsigned (zw_b7(8 downto 5));
4504
         when f_sbc_dec =>
4505
            zw_ALU2(5 downto 0) <= unsigned ("00" & q_a_bak_i(7 downto 4)) +
4506
                                                  unsigned ("00" & NOT (zw_din(7 downto 4))) + (zw_ALU1(4));
4507
            zw_ALU1(5 downto 0) <= unsigned ("00" & q_a_bak_i(3 downto 0)) +
4508
                                                  unsigned ("00" & NOT (zw_din(3 downto 0))) + reg_F_bak(0);
4509
         when f_sbc_dec1 =>
4510
            d_regs_in_o <= zw_ALU(7 downto 0);
4511
            load_regs_o <= '1';
4512
            zw_ALU(7 downto 0) <= unsigned (( zw_b8(3 downto 0)) & ( zw_b7(3 downto 0))) -
4513
                                                      unsigned (zw_b9(7 downto 0));
4514
         when f_asla =>
4515
            shift_rot_in <= q_a_bak_i;
4516
            d_regs_in_o <= shift_rot_asl_out;
4517
            load_regs_o <= '1';
4518
            cnz_detect_in <= '0' & (shift_rot_asl_out);
4519
         when f_lsra =>
4520
            shift_rot_in <= q_a_bak_i;
4521
            d_regs_in_o <= shift_rot_lsr_out;
4522
            load_regs_o <= '1';
4523
            cnz_detect_in <= '0' & (shift_rot_lsr_out);
4524
         when f_rola =>
4525
            shift_rot_in <= q_a_bak_i;
4526
            d_regs_in_o <= shift_rot_rol_out;
4527
            load_regs_o <= '1';
4528
            cnz_detect_in <= '0' & (shift_rot_rol_out);
4529
         when f_rora =>
4530
            shift_rot_in <= q_a_bak_i;
4531
            d_regs_in_o <= shift_rot_ror_out;
4532
            load_regs_o <= '1';
4533
            cnz_detect_in <= '0' & (shift_rot_ror_out);
4534
         when f_tax =>
4535
            load_regs_o <= '1';
4536
            cnz_detect_in <= '0' & (d_regs_out_bak_i);
4537
         when f_tsx =>
4538
            d_regs_in_o <= adr_sp_i (7 downto 0);
4539
            load_regs_o <= '1';
4540
            cnz_detect_in <= '0' & (adr_sp_i (7 downto 0));
4541
         when f_decr =>
4542
            cnz_detect_in <= '0' & (zw_b11);
4543
         when f_asl =>
4544
            shift_rot_in <= zw_b2;
4545
            zw_b13 <= shift_rot_asl_out;
4546
            cnz_detect_in <= '0' & (shift_rot_asl_out);
4547
         when f_lsr =>
4548
            shift_rot_in <= zw_b2;
4549
            zw_b13 <= shift_rot_lsr_out;
4550
            cnz_detect_in <= '0' & (shift_rot_lsr_out);
4551
         when f_rol =>
4552
            shift_rot_in <= zw_b2;
4553
            zw_b13 <= shift_rot_rol_out;
4554
            cnz_detect_in <= '0' & (shift_rot_rol_out);
4555
         when f_ror =>
4556
            shift_rot_in <= zw_b2;
4557
            zw_b13 <= shift_rot_ror_out;
4558
            cnz_detect_in <= '0' & (shift_rot_ror_out);
4559
         when f_rmb =>
4560
            zw_b13 <= zw_b2 and NOT (d_alu_prio_i);
4561
         when f_smb =>
4562
            zw_b13 <= zw_b2 or d_alu_prio_i;
4563
         when f_trb =>
4564
            zw_b13 <= zw_b2 and NOT (q_a_bak_i);
4565
            cnz_detect_in <= '0' & (zw_b2 and q_a_bak_i);
4566
         when f_tsb =>
4567
            zw_b13 <= zw_b2 or q_a_bak_i;
4568
            cnz_detect_in <= '0' & (zw_b2 and q_a_bak_i);
4569
         when others =>
4570
            null;
4571
      end case;
4572
   end process csm_functions_output_proc;
4573
 
4574
   -----------------------------------------------------------------
4575
   csm_rb_out_clocked_proc : process (
4576
      clk_clk_i,
4577
      rst_rst_n_i
4578
   )
4579
   -----------------------------------------------------------------
4580
   begin
4581
      if (rst_rst_n_i = '0') then
4582
         csm_rb_out_current_state <= rb_out_idle;
4583
      elsif (clk_clk_i'event and clk_clk_i = '1') then
4584
         csm_rb_out_current_state <= csm_rb_out_next_state;
4585
      end if;
4586
   end process csm_rb_out_clocked_proc;
4587
 
4588
   -----------------------------------------------------------------
4589
   csm_rb_out_nextstate_proc : process (
4590
      csm_rb_out_current_state,
4591
      op_fetch,
4592
      zw_REG_OP
4593
   )
4594
   -----------------------------------------------------------------
4595
   begin
4596
      case csm_rb_out_current_state is
4597
         when rb_out_idle =>
4598
            if (op_fetch = '0' and
4599
                (zw_REG_OP = X"8A" or
4600
                 zw_REG_OP = X"9A" or
4601
                 zw_REG_OP = X"BA" or
4602
                 zw_REG_OP = X"86" or
4603
                 zw_REG_OP = X"96" or
4604
                 zw_REG_OP = X"8E" or
4605
                 zw_REG_OP = X"E8" or
4606
                 zw_REG_OP = X"CA" or
4607
                 zw_REG_OP = X"DA" or
4608
                 zw_REG_OP = X"E0" or
4609
                 zw_REG_OP = X"E4" or
4610
                 zw_REG_OP = X"EC")) then
4611
               csm_rb_out_next_state <= rb_out_01;
4612
            elsif (op_fetch = '0' and
4613
                   (zw_REG_OP = X"5A" or
4614
                    zw_REG_OP = X"98" or
4615
                    zw_REG_OP = X"84" or
4616
                    zw_REG_OP = X"88" or
4617
                    zw_REG_OP = X"94" or
4618
                    zw_REG_OP = X"8C" or
4619
                    zw_REG_OP = X"C8" or
4620
                    zw_REG_OP = X"C0" or
4621
                    zw_REG_OP = X"C4" or
4622
                    zw_REG_OP = X"CC")) then
4623
               csm_rb_out_next_state <= rb_out_10;
4624
            elsif (op_fetch = '0' and
4625
                   (zw_REG_OP = X"9C" or
4626
                    zw_REG_OP = X"9E" or
4627
                    zw_REG_OP = X"64" or
4628
                    zw_REG_OP = X"74")) then
4629
               csm_rb_out_next_state <= rb_out_11;
4630
            else
4631
               csm_rb_out_next_state <= rb_out_idle;
4632
            end if;
4633
         when rb_out_01 =>
4634
            if (op_fetch = '1') then
4635
               csm_rb_out_next_state <= rb_out_idle;
4636
            else
4637
               csm_rb_out_next_state <= rb_out_01;
4638
            end if;
4639
         when rb_out_10 =>
4640
            if (op_fetch = '1') then
4641
               csm_rb_out_next_state <= rb_out_idle;
4642
            else
4643
               csm_rb_out_next_state <= rb_out_10;
4644
            end if;
4645
         when rb_out_11 =>
4646
            if (op_fetch = '1') then
4647
               csm_rb_out_next_state <= rb_out_idle;
4648
            else
4649
               csm_rb_out_next_state <= rb_out_11;
4650
            end if;
4651
         when others =>
4652
            csm_rb_out_next_state <= rb_out_idle;
4653
      end case;
4654
   end process csm_rb_out_nextstate_proc;
4655
 
4656
   -----------------------------------------------------------------
4657
   csm_rb_out_output_proc : process (
4658
      csm_rb_out_current_state,
4659
      op_fetch,
4660
      zw_REG_OP
4661
   )
4662
   -----------------------------------------------------------------
4663
   begin
4664
      -- Default Assignment
4665
      sel_rb_out_o <= "00";
4666
 
4667
      -- Combined Actions
4668
      case csm_rb_out_current_state is
4669
         when rb_out_idle =>
4670
            sel_rb_out_o <= "00";
4671
            if (op_fetch = '0' and
4672
                (zw_REG_OP = X"8A" or
4673
                 zw_REG_OP = X"9A" or
4674
                 zw_REG_OP = X"BA" or
4675
                 zw_REG_OP = X"86" or
4676
                 zw_REG_OP = X"96" or
4677
                 zw_REG_OP = X"8E" or
4678
                 zw_REG_OP = X"E8" or
4679
                 zw_REG_OP = X"CA" or
4680
                 zw_REG_OP = X"DA" or
4681
                 zw_REG_OP = X"E0" or
4682
                 zw_REG_OP = X"E4" or
4683
                 zw_REG_OP = X"EC")) then
4684
               sel_rb_out_o <= "01";
4685
            elsif (op_fetch = '0' and
4686
                   (zw_REG_OP = X"5A" or
4687
                    zw_REG_OP = X"98" or
4688
                    zw_REG_OP = X"84" or
4689
                    zw_REG_OP = X"88" or
4690
                    zw_REG_OP = X"94" or
4691
                    zw_REG_OP = X"8C" or
4692
                    zw_REG_OP = X"C8" or
4693
                    zw_REG_OP = X"C0" or
4694
                    zw_REG_OP = X"C4" or
4695
                    zw_REG_OP = X"CC")) then
4696
               sel_rb_out_o <= "10";
4697
            elsif (op_fetch = '0' and
4698
                   (zw_REG_OP = X"9C" or
4699
                    zw_REG_OP = X"9E" or
4700
                    zw_REG_OP = X"64" or
4701
                    zw_REG_OP = X"74")) then
4702
               sel_rb_out_o <= "11";
4703
            end if;
4704
         when rb_out_01 =>
4705
            sel_rb_out_o <= "01";
4706
         when rb_out_10 =>
4707
            sel_rb_out_o <= "10";
4708
         when rb_out_11 =>
4709
            sel_rb_out_o <= "11";
4710
         when others =>
4711
            null;
4712
      end case;
4713
   end process csm_rb_out_output_proc;
4714
 
4715
   -----------------------------------------------------------------
4716
   csm_reg_clocked_proc : process (
4717
      clk_clk_i,
4718
      rst_rst_n_i
4719
   )
4720
   -----------------------------------------------------------------
4721
   begin
4722
      if (rst_rst_n_i = '0') then
4723
         csm_reg_current_state <= reg_idle;
4724
      elsif (clk_clk_i'event and clk_clk_i = '1') then
4725
         csm_reg_current_state <= csm_reg_next_state;
4726
      end if;
4727
   end process csm_reg_clocked_proc;
4728
 
4729
   -----------------------------------------------------------------
4730
   csm_reg_nextstate_proc : process (
4731
      csm_reg_current_state,
4732
      op_fetch,
4733
      zw_REG_OP
4734
   )
4735
   -----------------------------------------------------------------
4736
   begin
4737
      case csm_reg_current_state is
4738
         when reg_idle =>
4739
            if (op_fetch = '0' and
4740
                (zw_REG_OP = X"FA" or
4741
                 zw_REG_OP = X"BA" or
4742
                 zw_REG_OP = X"AA" or
4743
                 zw_REG_OP = X"A2" or
4744
                 zw_REG_OP = X"A6" or
4745
                 zw_REG_OP = X"B6" or
4746
                 zw_REG_OP = X"AE" or
4747
                 zw_REG_OP = X"BE" or
4748
                 zw_REG_OP = X"E8" or
4749
                 zw_REG_OP = X"CA")) then
4750
               csm_reg_next_state <= reg_01;
4751
            elsif (op_fetch = '0' and
4752
                   (zw_REG_OP = X"A8" or
4753
                    zw_REG_OP = X"7A" or
4754
                    zw_REG_OP = X"A0" or
4755
                    zw_REG_OP = X"A4" or
4756
                    zw_REG_OP = X"B4" or
4757
                    zw_REG_OP = X"AC" or
4758
                    zw_REG_OP = X"BC" or
4759
                    zw_REG_OP = X"C8" or
4760
                    zw_REG_OP = X"88")) then
4761
               csm_reg_next_state <= reg_10;
4762
            elsif (op_fetch = '0' and
4763
                   (zw_REG_OP = X"9A")) then
4764
               csm_reg_next_state <= reg_11;
4765
            else
4766
               csm_reg_next_state <= reg_idle;
4767
            end if;
4768
         when reg_10 =>
4769
            if (op_fetch = '1') then
4770
               csm_reg_next_state <= reg_idle;
4771
            else
4772
               csm_reg_next_state <= reg_10;
4773
            end if;
4774
         when reg_11 =>
4775
            if (op_fetch = '1') then
4776
               csm_reg_next_state <= reg_idle;
4777
            else
4778
               csm_reg_next_state <= reg_11;
4779
            end if;
4780
         when reg_01 =>
4781
            if (op_fetch = '1') then
4782
               csm_reg_next_state <= reg_idle;
4783
            else
4784
               csm_reg_next_state <= reg_01;
4785
            end if;
4786
         when others =>
4787
            csm_reg_next_state <= reg_idle;
4788
      end case;
4789
   end process csm_reg_nextstate_proc;
4790
 
4791
   -----------------------------------------------------------------
4792
   csm_reg_output_proc : process (
4793
      csm_reg_current_state,
4794
      op_fetch,
4795
      zw_REG_OP
4796
   )
4797
   -----------------------------------------------------------------
4798
   begin
4799
      -- Default Assignment
4800
      sel_reg_o <= "00";
4801
 
4802
      -- Combined Actions
4803
      case csm_reg_current_state is
4804
         when reg_idle =>
4805
            sel_reg_o<= "00";
4806
            if (op_fetch = '0' and
4807
                (zw_REG_OP = X"FA" or
4808
                 zw_REG_OP = X"BA" or
4809
                 zw_REG_OP = X"AA" or
4810
                 zw_REG_OP = X"A2" or
4811
                 zw_REG_OP = X"A6" or
4812
                 zw_REG_OP = X"B6" or
4813
                 zw_REG_OP = X"AE" or
4814
                 zw_REG_OP = X"BE" or
4815
                 zw_REG_OP = X"E8" or
4816
                 zw_REG_OP = X"CA")) then
4817
               sel_reg_o <= "01";
4818
            elsif (op_fetch = '0' and
4819
                   (zw_REG_OP = X"A8" or
4820
                    zw_REG_OP = X"7A" or
4821
                    zw_REG_OP = X"A0" or
4822
                    zw_REG_OP = X"A4" or
4823
                    zw_REG_OP = X"B4" or
4824
                    zw_REG_OP = X"AC" or
4825
                    zw_REG_OP = X"BC" or
4826
                    zw_REG_OP = X"C8" or
4827
                    zw_REG_OP = X"88")) then
4828
               sel_reg_o <= "10";
4829
            elsif (op_fetch = '0' and
4830
                   (zw_REG_OP = X"9A")) then
4831
               sel_reg_o <= "11";
4832
            end if;
4833
         when reg_10 =>
4834
            sel_reg_o <= "10";
4835
         when reg_11 =>
4836
            sel_reg_o <= "11";
4837
         when reg_01 =>
4838
            sel_reg_o <= "01";
4839
         when others =>
4840
            null;
4841
      end case;
4842
   end process csm_reg_output_proc;
4843
 
4844
   -----------------------------------------------------------------
4845
   csm_rb_in_clocked_proc : process (
4846
      clk_clk_i,
4847
      rst_rst_n_i
4848
   )
4849
   -----------------------------------------------------------------
4850
   begin
4851
      if (rst_rst_n_i = '0') then
4852
         csm_rb_in_current_state <= rb_in_idle;
4853
      elsif (clk_clk_i'event and clk_clk_i = '1') then
4854
         csm_rb_in_current_state <= csm_rb_in_next_state;
4855
      end if;
4856
   end process csm_rb_in_clocked_proc;
4857
 
4858
   -----------------------------------------------------------------
4859
   csm_rb_in_nextstate_proc : process (
4860
      csm_rb_in_current_state,
4861
      op_fetch,
4862
      zw_REG_OP
4863
   )
4864
   -----------------------------------------------------------------
4865
   begin
4866
      case csm_rb_in_current_state is
4867
         when rb_in_idle =>
4868
            if (op_fetch = '0' and
4869
                (zw_REG_OP = X"A8" or
4870
                 zw_REG_OP = X"AA")) then
4871
               csm_rb_in_next_state <= rb_in_00;
4872
            elsif (op_fetch = '0' and
4873
                   (zw_REG_OP = X"98")) then
4874
               csm_rb_in_next_state <= rb_in_01;
4875
            elsif (op_fetch = '0' and
4876
                   (zw_REG_OP = X"8A")) then
4877
               csm_rb_in_next_state <= rb_in_10;
4878
            else
4879
               csm_rb_in_next_state <= rb_in_idle;
4880
            end if;
4881
         when rb_in_01 =>
4882
            if (op_fetch = '1') then
4883
               csm_rb_in_next_state <= rb_in_idle;
4884
            else
4885
               csm_rb_in_next_state <= rb_in_01;
4886
            end if;
4887
         when rb_in_10 =>
4888
            if (op_fetch = '1') then
4889
               csm_rb_in_next_state <= rb_in_idle;
4890
            else
4891
               csm_rb_in_next_state <= rb_in_10;
4892
            end if;
4893
         when rb_in_00 =>
4894
            if (op_fetch = '1') then
4895
               csm_rb_in_next_state <= rb_in_idle;
4896
            else
4897
               csm_rb_in_next_state <= rb_in_00;
4898
            end if;
4899
         when others =>
4900
            csm_rb_in_next_state <= rb_in_idle;
4901
      end case;
4902
   end process csm_rb_in_nextstate_proc;
4903
 
4904
   -----------------------------------------------------------------
4905
   csm_rb_in_output_proc : process (
4906
      csm_rb_in_current_state,
4907
      op_fetch,
4908
      zw_REG_OP
4909
   )
4910
   -----------------------------------------------------------------
4911
   begin
4912
      -- Default Assignment
4913
      sel_rb_in_o <= "00";
4914
 
4915
      -- Combined Actions
4916
      case csm_rb_in_current_state is
4917
         when rb_in_idle =>
4918
            sel_rb_in_o <= "11";
4919
            if (op_fetch = '0' and
4920
                (zw_REG_OP = X"A8" or
4921
                 zw_REG_OP = X"AA")) then
4922
               sel_rb_in_o <= "00";
4923
            elsif (op_fetch = '0' and
4924
                   (zw_REG_OP = X"98")) then
4925
               sel_rb_in_o <= "01";
4926
            elsif (op_fetch = '0' and
4927
                   (zw_REG_OP = X"8A")) then
4928
               sel_rb_in_o <= "10";
4929
            end if;
4930
         when rb_in_01 =>
4931
            sel_rb_in_o <= "01";
4932
         when rb_in_10 =>
4933
            sel_rb_in_o <= "10";
4934
         when rb_in_00 =>
4935
            sel_rb_in_o <= "00";
4936
         when others =>
4937
            null;
4938
      end case;
4939
   end process csm_rb_in_output_proc;
4940
 
4941
   -----------------------------------------------------------------
4942
   csm_add_value_clocked_proc : process (
4943
      clk_clk_i,
4944
      rst_rst_n_i
4945
   )
4946
   -----------------------------------------------------------------
4947
   begin
4948
      if (rst_rst_n_i = '0') then
4949
         csm_add_value_current_state <= add_val_idle;
4950
      elsif (clk_clk_i'event and clk_clk_i = '1') then
4951
         csm_add_value_current_state <= csm_add_value_next_state;
4952
      end if;
4953
   end process csm_add_value_clocked_proc;
4954
 
4955
   -----------------------------------------------------------------
4956
   csm_add_value_nextstate_proc : process (
4957
      csm_add_value_current_state,
4958
      op_fetch,
4959
      zw_REG_OP
4960
   )
4961
   -----------------------------------------------------------------
4962
   begin
4963
      case csm_add_value_current_state is
4964
         when add_val_idle =>
4965
            if (op_fetch = '0' and
4966
                (zw_REG_OP = X"C6" or
4967
                 zw_REG_OP = X"D6" or
4968
                 zw_REG_OP = X"CE" or
4969
                 zw_REG_OP = X"DE" or
4970
                 zw_REG_OP = X"CA" or
4971
                 zw_REG_OP = X"88" or
4972
                 zw_REG_OP = X"3A")) then
4973
               csm_add_value_next_state <= add_val;
4974
            else
4975
               csm_add_value_next_state <= add_val_idle;
4976
            end if;
4977
         when add_val =>
4978
            if (op_fetch = '1') then
4979
               csm_add_value_next_state <= add_val_idle;
4980
            else
4981
               csm_add_value_next_state <= add_val;
4982
            end if;
4983
         when others =>
4984
            csm_add_value_next_state <= add_val_idle;
4985
      end case;
4986
   end process csm_add_value_nextstate_proc;
4987
 
4988
   -----------------------------------------------------------------
4989
   csm_add_value_output_proc : process (
4990
      csm_add_value_current_state
4991
   )
4992
   -----------------------------------------------------------------
4993
   begin
4994
      -- Default Assignment To Internals
4995
      zw_b4 <= X"00";
4996
 
4997
      -- Combined Actions
4998
      case csm_add_value_current_state is
4999
         when add_val_idle =>
5000
            zw_b4 <= X"01";
5001
         when add_val =>
5002
            zw_b4 <= X"FF";
5003
         when others =>
5004
            null;
5005
      end case;
5006
   end process csm_add_value_output_proc;
5007
 
5008
   -- Concurrent Statements
5009
   -- Clocked output assignments
5010
   sync_o <= sync_o_cld;
5011
end fsm;

powered by: WebSVN 2.1.0

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