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

Subversion Repositories System09

[/] [System09/] [tags/] [V10/] [rtl/] [vhdl/] [cpu09.vhd] - Blame information for rev 66

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dilbert57
--===========================================================================----
2
--
3
--  S Y N T H E Z I A B L E    CPU09 - 6809 compatible CPU Core
4
--
5
--  www.OpenCores.Org - September 2003
6
--  This core adheres to the GNU public license  
7
--
8
-- File name      : cpu09.vhd
9
--
10
-- Purpose        : 6809 CPU core
11
--
12
-- Dependencies   : ieee.Std_Logic_1164
13
--                  ieee.std_logic_unsigned
14
--
15
-- Uses           : None
16
--
17
-- Author         : John E. Kent
18
--                  dilbert57@opencores.org      
19
--
20
--===========================================================================----
21
--
22
-- Revision History:
23
--===========================================================================--
24
--
25
-- Version 0.1 - 26 June 2003 - John Kent
26
-- Added extra level in state stack
27
-- fixed some calls to the extended addressing state
28
--
29
-- Version 0.2 - 5 Sept 2003 - John Kent
30
-- Fixed 16 bit indexed offset (was doing read rather than fetch)
31
-- Added/Fixed STY and STS instructions.
32
-- ORCC_STATE ANDed CC state rather than ORed it - Now fixed
33
-- CMPX Loaded ACCA and ACCB - Now fixed 
34
--
35
-- Version 1.0 - 6 Sep 2003 - John Kent 
36
-- Initial release to Open Cores
37
-- reversed clock edge
38
--
39
library ieee;
40
use ieee.std_logic_1164.all;
41
use ieee.std_logic_unsigned.all;
42
 
43
entity cpu09 is
44
        port (
45
                clk:        in  std_logic;
46
                rst:        in  std_logic;
47
                rw:         out std_logic;
48
                vma:        out std_logic;
49
                address:         out std_logic_vector(15 downto 0);
50
           data_in:      in  std_logic_vector(7 downto 0);
51
           data_out: out std_logic_vector(7 downto 0);
52
                halt:     in  std_logic;
53
                hold:     in  std_logic;
54
                irq:      in  std_logic;
55
                firq:     in  std_logic;
56
                nmi:      in  std_logic;
57
                test_alu: out std_logic_vector(15 downto 0);
58
                test_cc:  out std_logic_vector(7 downto 0)
59
                );
60
end;
61
 
62
architecture CPU_ARCH of cpu09 is
63
 
64
  constant EBIT : integer := 7;
65
  constant FBIT : integer := 6;
66
  constant HBIT : integer := 5;
67
  constant IBIT : integer := 4;
68
  constant NBIT : integer := 3;
69
  constant ZBIT : integer := 2;
70
  constant VBIT : integer := 1;
71
  constant CBIT : integer := 0;
72
 
73
  --
74
  -- Interrupt vector modifiers
75
  --
76
  constant RST_VEC  : std_logic_vector(2 downto 0) := "111";
77
  constant NMI_VEC  : std_logic_vector(2 downto 0) := "110";
78
  constant SWI_VEC  : std_logic_vector(2 downto 0) := "101";
79
  constant IRQ_VEC  : std_logic_vector(2 downto 0) := "100";
80
  constant FIRQ_VEC : std_logic_vector(2 downto 0) := "011";
81
  constant SWI2_VEC : std_logic_vector(2 downto 0) := "010";
82
  constant SWI3_VEC : std_logic_vector(2 downto 0) := "001";
83
  constant RESV_VEC : std_logic_vector(2 downto 0) := "000";
84
 
85
        type state_type is (-- Start off in Reset
86
                            reset_state,
87
                                                          -- Fetch Interrupt Vectors (including reset)
88
                                                          vect_lo_state, vect_hi_state,
89
                       -- Fetch Instruction Cycle
90
                       fetch_state,
91
                                                          -- Decode Instruction Cycles
92
                       decode1_state, decode2_state, decode3_state,
93
                                                          -- Calculate Effective Address
94
                                                     imm16_state,
95
                                 indexed_state, index8_state, index16_state, index16_2_state,
96
                                                          pcrel8_state, pcrel16_state, pcrel16_2_state,
97
                                                          indexaddr_state, indexaddr2_state,
98
                                                     postincr1_state, postincr2_state,
99
                                                          indirect_state, indirect2_state, indirect3_state,
100
                       extended_state,
101
                                                          -- single ops
102
                                                          single_op_read_state,
103
                                                     single_op_exec_state,
104
                            single_op_write_state,
105
                                                          -- Dual op states
106
                                                          dual_op_read8_state, dual_op_read16_state, dual_op_read16_2_state,
107
                                                     dual_op_write8_state, dual_op_write16_state,
108
                       -- 
109
                                                     sync_state, halt_state, error_state,
110
                                                          --
111
                                                          andcc_state, orcc_state,
112
                                                          tfr_state, exg_state, exg1_state,
113
                                                          lea_state,
114
                                                          -- Multiplication
115
                                                     mul_state, mulea_state, muld_state,
116
                                                     mul0_state, mul1_state, mul2_state, mul3_state,
117
                                                     mul4_state, mul5_state, mul6_state, mul7_state,
118
                                                          --  Branches
119
                                                          lbranch_state, sbranch_state,
120
                                                          -- Jumps, Subroutine Calls and Returns
121
                       jsr_state, jmp_state,
122
                       push_return_hi_state, push_return_lo_state,
123
                       pull_return_hi_state, pull_return_lo_state,
124
                                                          -- Interrupt cycles
125
                                                          int_decr_state,
126
                                                          int_entire_state,
127
                                                          int_pcl_state,  int_pch_state,
128
                                                     int_upl_state,  int_uph_state,
129
                                                     int_iyl_state,  int_iyh_state,
130
                                                     int_ixl_state,  int_ixh_state,
131
                                                     int_cc_state,
132
                                           int_acca_state, int_accb_state,
133
                                                     int_dp_state,
134
                                                     int_cwai_state,  int_mask_state,
135
                                                          -- Return From Interrupt
136
                                                     rti_state,
137
                                                     rti_acca_state, rti_accb_state,
138
                                                     rti_cc_state,   rti_dp_state,
139
                                                     rti_ixl_state,  rti_ixh_state,
140
                                                     rti_iyl_state,  rti_iyh_state,
141
                                                     rti_upl_state,  rti_uph_state,
142
                                                     rti_pcl_state,  rti_pch_state,
143
                                                          -- Push Registers using SP
144
                                                          pshs_state,
145
                                                     pshs_pcl_state,  pshs_pch_state,
146
                                                     pshs_upl_state,  pshs_uph_state,
147
                                                     pshs_iyl_state,  pshs_iyh_state,
148
                                                     pshs_ixl_state,  pshs_ixh_state,
149
                                                     pshs_dp_state,
150
                                                     pshs_acca_state, pshs_accb_state,
151
                                                     pshs_cc_state,
152
                                                          -- Pull Registers using SP
153
                                                          puls_state,
154
                                                          puls_cc_state,
155
                                                          puls_acca_state, puls_accb_state,
156
                                                          puls_dp_state,
157
                                                     puls_ixl_state,  puls_ixh_state,
158
                                                     puls_iyl_state,  puls_iyh_state,
159
                                                     puls_upl_state,  puls_uph_state,
160
                                                     puls_pcl_state,  puls_pch_state,
161
                                                          -- Push Registers using UP
162
                                                          pshu_state,
163
                                                     pshu_pcl_state,  pshu_pch_state,
164
                                                     pshu_spl_state,  pshu_sph_state,
165
                                                     pshu_iyl_state,  pshu_iyh_state,
166
                                                     pshu_ixl_state,  pshu_ixh_state,
167
                                                     pshu_dp_state,
168
                                                     pshu_acca_state, pshu_accb_state,
169
                                                     pshu_cc_state,
170
                                                          -- Pull Registers using UP
171
                                                          pulu_state,
172
                                                          pulu_cc_state,
173
                                                          pulu_acca_state, pulu_accb_state,
174
                                                          pulu_dp_state,
175
                                                     pulu_ixl_state,  pulu_ixh_state,
176
                                                     pulu_iyl_state,  pulu_iyh_state,
177
                                                     pulu_spl_state,  pulu_sph_state,
178
                                                     pulu_pcl_state,  pulu_pch_state );
179
 
180
        type stack_type is array(2 downto 0) of state_type;
181
        type st_type    is (idle_st, push_st, pull_st );
182
        type addr_type  is (idle_ad, fetch_ad, read_ad, write_ad, pushu_ad, pullu_ad, pushs_ad, pulls_ad, int_hi_ad, int_lo_ad );
183
        type dout_type  is (cc_dout, acca_dout, accb_dout, dp_dout,
184
                       ix_lo_dout, ix_hi_dout, iy_lo_dout, iy_hi_dout,
185
                       up_lo_dout, up_hi_dout, sp_lo_dout, sp_hi_dout,
186
                       pc_lo_dout, pc_hi_dout, md_lo_dout, md_hi_dout );
187
   type op_type    is (reset_op, fetch_op, latch_op );
188
   type pre_type   is (reset_pre, fetch_pre, latch_pre );
189
   type cc_type    is (reset_cc, load_cc, pull_cc, latch_cc );
190
   type acca_type  is (reset_acca, load_acca, load_hi_acca, pull_acca, latch_acca );
191
   type accb_type  is (reset_accb, load_accb, pull_accb, latch_accb );
192
   type dp_type    is (reset_dp, load_dp, pull_dp, latch_dp );
193
        type ix_type    is (reset_ix, load_ix, pull_lo_ix, pull_hi_ix, latch_ix );
194
        type iy_type    is (reset_iy, load_iy, pull_lo_iy, pull_hi_iy, latch_iy );
195
        type sp_type    is (reset_sp, latch_sp, load_sp, pull_hi_sp, pull_lo_sp );
196
        type up_type    is (reset_up, latch_up, load_up, pull_hi_up, pull_lo_up );
197
        type pc_type    is (reset_pc, latch_pc, load_pc, pull_lo_pc, pull_hi_pc, incr_pc );
198
   type md_type    is (reset_md, latch_md, load_md, fetch_first_md, fetch_next_md, shiftl_md );
199
   type ea_type    is (reset_ea, latch_ea, load_ea, fetch_first_ea, fetch_next_ea );
200
        type iv_type    is (reset_iv, latch_iv, nmi_iv, irq_iv, firq_iv, swi_iv, swi2_iv, swi3_iv, resv_iv);
201
        type nmi_type   is (reset_nmi, set_nmi, latch_nmi );
202
        type left_type  is (cc_left, acca_left, accb_left, dp_left,
203
                                                          ix_left, iy_left, up_left, sp_left,
204
                       accd_left, md_left, pc_left, ea_left );
205
        type right_type is (ea_right, zero_right, one_right, two_right,
206
                       acca_right, accb_right, accd_right,
207
                                                          md_right, md_sign5_right, md_sign8_right );
208
   type alu_type   is (alu_add8, alu_sub8, alu_add16, alu_sub16, alu_adc, alu_sbc,
209
                       alu_and, alu_ora, alu_eor,
210
                       alu_tst, alu_inc, alu_dec, alu_clr, alu_neg, alu_com,
211
                                                          alu_inx, alu_dex,
212
                                                     alu_lsr16, alu_lsl16,
213
                                                     alu_ror8, alu_rol8,
214
                                                     alu_asr8, alu_asl8, alu_lsr8,
215
                                                     alu_andcc, alu_orcc, alu_sex, alu_tfr,
216
                                                          alu_seif, alu_sei, alu_see, alu_cle,
217
                                                     alu_ld8, alu_st8, alu_ld16, alu_st16, alu_nop, alu_daa );
218
 
219
        signal op_code:     std_logic_vector(7 downto 0);
220
        signal pre_code:    std_logic_vector(7 downto 0);
221
        signal acca:        std_logic_vector(7 downto 0);
222
        signal accb:        std_logic_vector(7 downto 0);
223
   signal cc:          std_logic_vector(7 downto 0);
224
        signal cc_out:      std_logic_vector(7 downto 0);
225
        signal dp:          std_logic_vector(7 downto 0);
226
        signal xreg:        std_logic_vector(15 downto 0);
227
        signal yreg:        std_logic_vector(15 downto 0);
228
        signal sp:          std_logic_vector(15 downto 0);
229
        signal up:          std_logic_vector(15 downto 0);
230
        signal ea:          std_logic_vector(15 downto 0);
231
        signal pc:              std_logic_vector(15 downto 0);
232
        signal md:          std_logic_vector(15 downto 0);
233
   signal left:        std_logic_vector(15 downto 0);
234
   signal right:       std_logic_vector(15 downto 0);
235
        signal out_alu:     std_logic_vector(15 downto 0);
236
        signal iv:          std_logic_vector(2 downto 0);
237
        signal nmi_req:     std_logic;
238
        signal nmi_ack:     std_logic;
239
 
240
        signal state:        state_type;
241
        signal next_state:   state_type;
242
        signal saved_state:  state_type;
243
        signal return_state: state_type;
244
        signal state_stack:  stack_type;
245
        signal st_ctrl:      st_type;
246
   signal pc_ctrl:      pc_type;
247
   signal ea_ctrl:      ea_type;
248
   signal op_ctrl:      op_type;
249
        signal pre_ctrl:     pre_type;
250
        signal md_ctrl:      md_type;
251
        signal acca_ctrl:    acca_type;
252
        signal accb_ctrl:    accb_type;
253
        signal ix_ctrl:      ix_type;
254
        signal iy_ctrl:      iy_type;
255
        signal cc_ctrl:      cc_type;
256
        signal dp_ctrl:      dp_type;
257
        signal sp_ctrl:      sp_type;
258
        signal up_ctrl:      up_type;
259
        signal iv_ctrl:      iv_type;
260
        signal left_ctrl:    left_type;
261
        signal right_ctrl:   right_type;
262
   signal alu_ctrl:     alu_type;
263
   signal addr_ctrl:    addr_type;
264
   signal dout_ctrl:    dout_type;
265
   signal nmi_ctrl:     nmi_type;
266
 
267
 
268
begin
269
 
270
----------------------------------
271
--
272
-- State machine stack
273
--
274
----------------------------------
275
state_stack_proc: process( clk, st_ctrl, state_stack, return_state, hold )
276
begin
277
  if clk'event and clk = '0' then
278
    if hold= '1' then
279
           state_stack(0) <= state_stack(0);
280
           state_stack(1) <= state_stack(1);
281
           state_stack(2) <= state_stack(2);
282
         else
283
           case st_ctrl is
284
                when idle_st =>
285
                  state_stack(0) <= state_stack(0);
286
             state_stack(1) <= state_stack(1);
287
             state_stack(2) <= state_stack(2);
288
      when push_st =>
289
                  state_stack(0) <= return_state;
290
             state_stack(1) <= state_stack(0);
291
             state_stack(2) <= state_stack(1);
292
      when pull_st =>
293
                  state_stack(0) <= state_stack(1);
294
             state_stack(1) <= state_stack(2);
295
             state_stack(2) <= fetch_state;
296
                when others =>
297
                  state_stack(0) <= state_stack(0);
298
             state_stack(1) <= state_stack(1);
299
             state_stack(2) <= state_stack(2);
300
           end case;
301
    end if;
302
  end if;
303
  saved_state <= state_stack(0);
304
end process;
305
 
306
----------------------------------
307
--
308
-- Program Counter Control
309
--
310
----------------------------------
311
 
312
pc_reg: process( clk, pc_ctrl, hold, pc, out_alu, data_in )
313
begin
314
  if clk'event and clk = '0' then
315
    if hold= '1' then
316
           pc <= pc;
317
         else
318
    case pc_ctrl is
319
         when reset_pc =>
320
           pc <= "0000000000000000";
321
         when load_pc =>
322
           pc <= out_alu(15 downto 0);
323
         when pull_lo_pc =>
324
           pc(7 downto 0) <= data_in;
325
         when pull_hi_pc =>
326
           pc(15 downto 8) <= data_in;
327
         when incr_pc =>
328
           pc <= pc + 1;
329
         when others =>
330
--       when latch_pc =>
331
      pc <= pc;
332
    end case;
333
         end if;
334
  end if;
335
end process;
336
 
337
----------------------------------
338
--
339
-- Effective Address  Control
340
--
341
----------------------------------
342
 
343
ea_reg: process( clk, ea_ctrl, hold, ea, out_alu, data_in, dp )
344
begin
345
 
346
  if clk'event and clk = '0' then
347
    if hold= '1' then
348
           ea <= ea;
349
         else
350
    case ea_ctrl is
351
         when reset_ea =>
352
           ea <= "0000000000000000";
353
         when fetch_first_ea =>
354
           ea(7 downto 0) <= data_in;
355
      ea(15 downto 8) <= dp;
356
         when fetch_next_ea =>
357
           ea(15 downto 8) <= ea(7 downto 0);
358
      ea(7 downto 0)  <= data_in;
359
         when load_ea =>
360
           ea <= out_alu(15 downto 0);
361
         when others =>
362
--       when latch_ea =>
363
      ea <= ea;
364
    end case;
365
         end if;
366
  end if;
367
end process;
368
 
369
--------------------------------
370
--
371
-- Accumulator A
372
--
373
--------------------------------
374
acca_reg : process( clk, acca_ctrl, hold, out_alu, acca, data_in )
375
begin
376
  if clk'event and clk = '0' then
377
    if hold= '1' then
378
           acca <= acca;
379
         else
380
    case acca_ctrl is
381
    when reset_acca =>
382
           acca <= "00000000";
383
         when load_acca =>
384
           acca <= out_alu(7 downto 0);
385
         when load_hi_acca =>
386
           acca <= out_alu(15 downto 8);
387
         when pull_acca =>
388
           acca <= data_in;
389
         when others =>
390
--       when latch_acca =>
391
           acca <= acca;
392
    end case;
393
         end if;
394
  end if;
395
end process;
396
 
397
--------------------------------
398
--
399
-- Accumulator B
400
--
401
--------------------------------
402
accb_reg : process( clk, accb_ctrl, hold, out_alu, accb, data_in )
403
begin
404
  if clk'event and clk = '0' then
405
    if hold= '1' then
406
           accb <= accb;
407
         else
408
    case accb_ctrl is
409
    when reset_accb =>
410
           accb <= "00000000";
411
         when load_accb =>
412
           accb <= out_alu(7 downto 0);
413
         when pull_accb =>
414
           accb <= data_in;
415
         when others =>
416
--       when latch_accb =>
417
           accb <= accb;
418
    end case;
419
         end if;
420
  end if;
421
end process;
422
 
423
--------------------------------
424
--
425
-- X Index register
426
--
427
--------------------------------
428
ix_reg : process( clk, ix_ctrl, hold, out_alu, xreg, data_in )
429
begin
430
  if clk'event and clk = '0' then
431
    if hold= '1' then
432
           xreg <= xreg;
433
         else
434
    case ix_ctrl is
435
    when reset_ix =>
436
           xreg <= "0000000000000000";
437
         when load_ix =>
438
           xreg <= out_alu(15 downto 0);
439
         when pull_hi_ix =>
440
           xreg(15 downto 8) <= data_in;
441
         when pull_lo_ix =>
442
           xreg(7 downto 0) <= data_in;
443
         when others =>
444
--       when latch_ix =>
445
           xreg <= xreg;
446
    end case;
447
         end if;
448
  end if;
449
end process;
450
 
451
--------------------------------
452
--
453
-- Y Index register
454
--
455
--------------------------------
456
iy_reg : process( clk, iy_ctrl, hold, out_alu, yreg, data_in )
457
begin
458
  if clk'event and clk = '0' then
459
    if hold= '1' then
460
           yreg <= yreg;
461
         else
462
    case iy_ctrl is
463
    when reset_iy =>
464
           yreg <= "0000000000000000";
465
         when load_iy =>
466
           yreg <= out_alu(15 downto 0);
467
         when pull_hi_iy =>
468
           yreg(15 downto 8) <= data_in;
469
         when pull_lo_iy =>
470
           yreg(7 downto 0) <= data_in;
471
         when others =>
472
--       when latch_iy =>
473
           yreg <= yreg;
474
    end case;
475
         end if;
476
  end if;
477
end process;
478
 
479
--------------------------------
480
--
481
-- S stack pointer
482
--
483
--------------------------------
484
sp_reg : process( clk, sp_ctrl, hold, sp, out_alu, data_in )
485
begin
486
  if clk'event and clk = '0' then
487
    if hold= '1' then
488
           sp <= sp;
489
         else
490
    case sp_ctrl is
491
    when reset_sp =>
492
           sp <= "0000000000000000";
493
         when load_sp =>
494
           sp <= out_alu(15 downto 0);
495
         when pull_hi_sp =>
496
           sp(15 downto 8) <= data_in;
497
         when pull_lo_sp =>
498
           sp(7 downto 0) <= data_in;
499
         when others =>
500
--       when latch_sp =>
501
           sp <= sp;
502
    end case;
503
         end if;
504
  end if;
505
end process;
506
 
507
--------------------------------
508
--
509
-- U stack pointer
510
--
511
--------------------------------
512
up_reg : process( clk, up_ctrl, hold, up, out_alu, data_in )
513
begin
514
  if clk'event and clk = '0' then
515
    if hold= '1' then
516
           up <= up;
517
         else
518
    case up_ctrl is
519
    when reset_up =>
520
           up <= "0000000000000000";
521
         when load_up =>
522
           up <= out_alu(15 downto 0);
523
         when pull_hi_up =>
524
           up(15 downto 8) <= data_in;
525
         when pull_lo_up =>
526
           up(7 downto 0) <= data_in;
527
         when others =>
528
--       when latch_up =>
529
           up <= up;
530
    end case;
531
         end if;
532
  end if;
533
end process;
534
 
535
--------------------------------
536
--
537
-- Memory Data
538
--
539
--------------------------------
540
md_reg : process( clk, md_ctrl, hold, out_alu, data_in, md )
541
begin
542
  if clk'event and clk = '0' then
543
    if hold= '1' then
544
           md <= md;
545
         else
546
    case md_ctrl is
547
    when reset_md =>
548
           md <= "0000000000000000";
549
         when load_md =>
550
           md <= out_alu(15 downto 0);
551
         when fetch_first_md => -- sign extend md for branches
552
           md(15 downto 8) <= data_in(7) & data_in(7) & data_in(7) & data_in(7) &
553
                              data_in(7) & data_in(7) & data_in(7) & data_in(7) ;
554
           md(7 downto 0) <= data_in;
555
         when fetch_next_md =>
556
           md(15 downto 8) <= md(7 downto 0);
557
                md(7 downto 0) <= data_in;
558
         when shiftl_md =>
559
           md(15 downto 1) <= md(14 downto 0);
560
                md(0) <= '0';
561
         when others =>
562
--       when latch_md =>
563
           md <= md;
564
    end case;
565
         end if;
566
  end if;
567
end process;
568
 
569
 
570
----------------------------------
571
--
572
-- Condition Codes
573
--
574
----------------------------------
575
 
576
cc_reg: process( clk, cc_ctrl, hold, cc_out, cc, data_in )
577
begin
578
  if clk'event and clk = '0' then
579
    if hold= '1' then
580
           cc <= cc;
581
         else
582
    case cc_ctrl is
583
         when reset_cc =>
584
           cc <= "11010000"; -- set EBIT, FBIT & IBIT
585
         when load_cc =>
586
           cc <= cc_out;
587
         when pull_cc =>
588
      cc <= data_in;
589
         when others =>
590
--  when latch_cc =>
591
      cc <= cc;
592
    end case;
593
         end if;
594
  end if;
595
end process;
596
 
597
----------------------------------
598
--
599
-- Direct Page register
600
--
601
----------------------------------
602
 
603
dp_reg: process( clk, dp_ctrl, hold, out_alu, dp, data_in )
604
begin
605
  if clk'event and clk = '0' then
606
    if hold= '1' then
607
           dp <= dp;
608
         else
609
    case dp_ctrl is
610
         when reset_dp =>
611
           dp <= "00000000";
612
         when load_dp =>
613
           dp <= out_alu(7 downto 0);
614
         when pull_dp =>
615
      dp <= data_in;
616
         when others =>
617
--  when latch_dp =>
618
      dp <= dp;
619
    end case;
620
         end if;
621
  end if;
622
end process;
623
 
624
----------------------------------
625
--
626
-- interrupt vector
627
--
628
----------------------------------
629
 
630
iv_mux: process( clk, iv_ctrl, hold, iv )
631
begin
632
  if clk'event and clk = '0' then
633
    if hold= '1' then
634
           iv <= iv;
635
         else
636
    case iv_ctrl is
637
         when reset_iv =>
638
           iv <= RST_VEC;
639
         when nmi_iv =>
640
      iv <= NMI_VEC;
641
         when swi_iv =>
642
      iv <= SWI_VEC;
643
         when irq_iv =>
644
      iv <= IRQ_VEC;
645
         when firq_iv =>
646
           iv <= FIRQ_VEC;
647
         when swi2_iv =>
648
      iv <= SWI2_VEC;
649
         when swi3_iv =>
650
      iv <= SWI3_VEC;
651
         when resv_iv =>
652
      iv <= RESV_VEC;
653
         when others =>
654
           iv <= iv;
655
    end case;
656
         end if;
657
  end if;
658
end process;
659
 
660
 
661
----------------------------------
662
--
663
-- op code register
664
--
665
----------------------------------
666
 
667
op_reg: process( clk, op_ctrl, hold, op_code, data_in )
668
begin
669
  if clk'event and clk = '0' then
670
    if hold= '1' then
671
           op_code <= op_code;
672
         else
673
    case op_ctrl is
674
         when reset_op =>
675
           op_code <= "00010010";
676
         when fetch_op =>
677
      op_code <= data_in;
678
         when others =>
679
--       when latch_op =>
680
           op_code <= op_code;
681
    end case;
682
         end if;
683
  end if;
684
end process;
685
 
686
 
687
----------------------------------
688
--
689
-- pre byte op code register
690
--
691
----------------------------------
692
 
693
pre_reg: process( clk, pre_ctrl, hold, pre_code, data_in )
694
begin
695
  if clk'event and clk = '0' then
696
    if hold= '1' then
697
           pre_code <= pre_code;
698
         else
699
    case pre_ctrl is
700
         when reset_pre =>
701
           pre_code <= "00000000";
702
         when fetch_pre =>
703
      pre_code <= data_in;
704
         when others =>
705
--       when latch_pre =>
706
           pre_code <= pre_code;
707
    end case;
708
         end if;
709
  end if;
710
end process;
711
 
712
--------------------------------
713
--
714
-- state machine
715
--
716
--------------------------------
717
 
718
change_state: process( clk, rst, state, hold, next_state )
719
begin
720
  if clk'event and clk = '0' then
721
    if rst = '1' then
722
           state <= reset_state;
723
    else
724
           if hold = '1' then
725
                  state <= state;
726
                else
727
        state <= next_state;
728
                end if;
729
         end if;
730
  end if;
731
end process;
732
        -- output
733
 
734
------------------------------------
735
--
736
-- Nmi register
737
--
738
------------------------------------
739
 
740
nmi_reg: process( clk, nmi_ctrl, hold, nmi_ack )
741
begin
742
  if clk'event and clk='0' then
743
    if hold = '1' then
744
      nmi_ack <= nmi_ack;
745
    else
746
    case nmi_ctrl is
747
         when set_nmi =>
748
      nmi_ack <= '1';
749
         when reset_nmi =>
750
           nmi_ack <= '0';
751
         when others =>
752
--  when latch_nmi =>
753
           nmi_ack <= nmi_ack;
754
         end case;
755
         end if;
756
  end if;
757
end process;
758
 
759
------------------------------------
760
--
761
-- Detect Edge of NMI interrupt
762
--
763
------------------------------------
764
 
765
nmi_handler : process( clk, rst, nmi, nmi_ack, nmi_req )
766
begin
767
  if clk'event and clk='0' then
768
    if rst='1' then
769
           nmi_req <= '0';
770
    else
771
           if (nmi='1') and (nmi_ack='0') then
772
             nmi_req <= '1';
773
           else
774
                  if (nmi='0') and (nmi_ack='1') then
775
               nmi_req <= '0';
776
             else
777
               nmi_req <= nmi_req;
778
                  end if;
779
                end if;
780
         end if;
781
  end if;
782
end process;
783
 
784
 
785
----------------------------------
786
--
787
-- Address output multiplexer
788
--
789
----------------------------------
790
 
791
addr_mux: process( addr_ctrl, pc, ea, up, sp, iv )
792
begin
793
  case addr_ctrl is
794
    when idle_ad =>
795
           address <= "1111111111111111";
796
                vma     <= '0';
797
                rw      <= '1';
798
    when fetch_ad =>
799
           address <= pc;
800
                vma     <= '1';
801
                rw      <= '1';
802
         when read_ad =>
803
           address <= ea;
804
                vma     <= '1';
805
                rw      <= '1';
806
    when write_ad =>
807
           address <= ea;
808
                vma     <= '1';
809
                rw      <= '0';
810
         when pushs_ad =>
811
           address <= sp;
812
                vma     <= '1';
813
                rw      <= '0';
814
    when pulls_ad =>
815
           address <= sp;
816
                vma     <= '1';
817
                rw      <= '1';
818
         when pushu_ad =>
819
           address <= up;
820
                vma     <= '1';
821
                rw      <= '0';
822
    when pullu_ad =>
823
           address <= up;
824
                vma     <= '1';
825
                rw      <= '1';
826
         when int_hi_ad =>
827
           address <= "111111111111" & iv & "0";
828
                vma     <= '1';
829
                rw      <= '1';
830
    when int_lo_ad =>
831
           address <= "111111111111" & iv & "1";
832
                vma     <= '1';
833
                rw      <= '1';
834
         when others =>
835
           address <= "1111111111111111";
836
                vma     <= '0';
837
                rw      <= '1';
838
  end case;
839
end process;
840
 
841
--------------------------------
842
--
843
-- Data Bus output
844
--
845
--------------------------------
846
dout_mux : process( dout_ctrl, md, acca, accb, dp, xreg, yreg, sp, up, pc, cc )
847
begin
848
    case dout_ctrl is
849
         when md_hi_dout => -- alu output
850
           data_out <= md(15 downto 8);
851
         when md_lo_dout => -- alu output
852
           data_out <= md(7 downto 0);
853
         when acca_dout => -- accumulator a
854
           data_out <= acca;
855
         when accb_dout => -- accumulator b
856
           data_out <= accb;
857
         when ix_lo_dout => -- index reg
858
           data_out <= xreg(7 downto 0);
859
         when ix_hi_dout => -- index reg
860
           data_out <= xreg(15 downto 8);
861
         when iy_lo_dout => -- index reg
862
           data_out <= yreg(7 downto 0);
863
         when iy_hi_dout => -- index reg
864
           data_out <= yreg(15 downto 8);
865
         when sp_lo_dout => -- s stack pointer
866
           data_out <= sp(7 downto 0);
867
         when sp_hi_dout => -- s stack pointer
868
           data_out <= sp(15 downto 8);
869
         when up_lo_dout => -- u stack pointer
870
           data_out <= up(7 downto 0);
871
         when up_hi_dout => -- u stack pointer
872
           data_out <= up(15 downto 8);
873
         when cc_dout => -- condition code register
874
           data_out <= cc;
875
         when dp_dout => -- direct page register
876
           data_out <= dp;
877
         when pc_lo_dout => -- low order pc
878
           data_out <= pc(7 downto 0);
879
         when pc_hi_dout => -- high order pc
880
           data_out <= pc(15 downto 8);
881
         when others =>
882
           data_out <= "00000000";
883
    end case;
884
end process;
885
 
886
----------------------------------
887
--
888
-- Left Mux
889
--
890
----------------------------------
891
 
892
left_mux: process( left_ctrl, acca, accb, cc, dp, xreg, yreg, up, sp, pc, ea, md )
893
begin
894
  case left_ctrl is
895
         when cc_left =>
896
           left(15 downto 8) <= "00000000";
897
                left(7 downto 0)  <= cc;
898
         when acca_left =>
899
           left(15 downto 8) <= "00000000";
900
                left(7 downto 0)  <= acca;
901
         when accb_left =>
902
           left(15 downto 8) <= "00000000";
903
                left(7 downto 0)  <= accb;
904
         when dp_left =>
905
           left(15 downto 8) <= "00000000";
906
                left(7 downto 0)  <= dp;
907
         when accd_left =>
908
           left(15 downto 8) <= acca;
909
                left(7 downto 0)  <= accb;
910
         when md_left =>
911
           left <= md;
912
         when ix_left =>
913
           left <= xreg;
914
         when iy_left =>
915
           left <= yreg;
916
         when sp_left =>
917
           left <= sp;
918
         when up_left =>
919
           left <= up;
920
         when pc_left =>
921
           left <= pc;
922
         when others =>
923
--       when ea_left =>
924
           left <= ea;
925
    end case;
926
end process;
927
 
928
----------------------------------
929
--
930
-- Right Mux
931
--
932
----------------------------------
933
 
934
right_mux: process( right_ctrl, md, acca, accb, ea )
935
begin
936
  case right_ctrl is
937
         when ea_right =>
938
           right <= ea;
939
         when zero_right =>
940
           right <= "0000000000000000";
941
         when one_right =>
942
           right <= "0000000000000001";
943
         when two_right =>
944
           right <= "0000000000000010";
945
         when acca_right =>
946
           right <= "00000000" & acca;
947
         when accb_right =>
948
           right <= "00000000" & accb;
949
         when accd_right =>
950
           right <= acca & accb;
951
         when md_sign5_right =>
952
           if md(4) = '0' then
953
             right <= "00000000000" & md(4 downto 0);
954
                else
955
                  right <= "11111111111" & md(4 downto 0);
956
                end if;
957
         when md_sign8_right =>
958
           if md(7) = '0' then
959
             right <= "00000000" & md(7 downto 0);
960
                else
961
                  right <= "11111111" & md(7 downto 0);
962
                end if;
963
         when others =>
964
--       when md_right =>
965
           right <= md;
966
    end case;
967
end process;
968
 
969
----------------------------------
970
--
971
-- Arithmetic Logic Unit
972
--
973
----------------------------------
974
 
975
alu: process( alu_ctrl, cc, left, right, out_alu, cc_out )
976
variable valid_lo, valid_hi : boolean;
977
variable carry_in : std_logic;
978
variable daa_reg : std_logic_vector(7 downto 0);
979
begin
980
 
981
  case alu_ctrl is
982
         when alu_adc | alu_sbc |
983
              alu_rol8 | alu_ror8 =>
984
           carry_in := cc(CBIT);
985
         when others =>
986
           carry_in := '0';
987
  end case;
988
 
989
  valid_lo := left(3 downto 0) <= 9;
990
  valid_hi := left(7 downto 4) <= 9;
991
 
992
  if (cc(CBIT) = '0') then
993
    if( cc(HBIT) = '1' ) then
994
                if valid_hi then
995
                  daa_reg := "00000110";
996
                else
997
                  daa_reg := "01100110";
998
           end if;
999
    else
1000
                if valid_lo then
1001
                  if valid_hi then
1002
                    daa_reg := "00000000";
1003
                  else
1004
                    daa_reg := "01100000";
1005
                  end if;
1006
                else
1007
             if( left(7 downto 4) <= 8 ) then
1008
                    daa_reg := "00000110";
1009
                  else
1010
                         daa_reg := "01100110";
1011
                  end if;
1012
                end if;
1013
         end if;
1014
  else
1015
    if ( cc(HBIT) = '1' )then
1016
                daa_reg := "01100110";
1017
         else
1018
                if valid_lo then
1019
                  daa_reg := "01100000";
1020
           else
1021
                  daa_reg := "01100110";
1022
                end if;
1023
         end if;
1024
  end if;
1025
 
1026
  case alu_ctrl is
1027
         when alu_add8 | alu_inc |
1028
              alu_add16 | alu_inx |
1029
              alu_adc =>
1030
                out_alu <= left + right + ("000000000000000" & carry_in);
1031
         when alu_sub8 | alu_dec |
1032
              alu_sub16 | alu_dex |
1033
              alu_sbc =>
1034
           out_alu <= left - right - ("000000000000000" & carry_in);
1035
         when alu_and =>
1036
           out_alu   <= left and right;         -- and/bit
1037
         when alu_ora =>
1038
           out_alu   <= left or right;  -- or
1039
         when alu_eor =>
1040
           out_alu   <= left xor right;         -- eor/xor
1041
         when alu_lsl16 | alu_asl8 | alu_rol8 =>
1042
           out_alu   <= left(14 downto 0) & carry_in;    -- rol8/asl8/lsl16
1043
         when alu_lsr16 | alu_lsr8 =>
1044
           out_alu   <= carry_in & left(15 downto 1);   -- lsr
1045
         when alu_ror8 =>
1046
           out_alu   <= "00000000" & carry_in & left(7 downto 1);       -- ror
1047
         when alu_asr8 =>
1048
           out_alu   <= "00000000" & left(7) & left(7 downto 1);        -- asr
1049
         when alu_neg =>
1050
           out_alu   <= right - left;   -- neg (right=0)
1051
         when alu_com =>
1052
           out_alu   <= not left;
1053
         when alu_clr | alu_ld8 | alu_ld16 =>
1054
           out_alu   <= right;           -- clr, ld
1055
         when alu_st8 | alu_st16 | alu_andcc | alu_orcc =>
1056
           out_alu   <= left;
1057
         when alu_daa =>
1058
           out_alu   <= left + ("00000000" & daa_reg);
1059
         when alu_sex =>
1060
           if left(7) = '0' then
1061
              out_alu <= "00000000" & left(7 downto 0);
1062
                else
1063
                   out_alu <= "11111111" & left(7 downto 0);
1064
                end if;
1065
         when others =>
1066
           out_alu   <= left; -- nop, tfr
1067
    end case;
1068
 
1069
         --
1070
         -- carry bit
1071
         --
1072
    case alu_ctrl is
1073
         when alu_add8 | alu_adc  =>
1074
      cc_out(CBIT) <= (left(7) and right(7)) or
1075
                                (left(7) and not out_alu(7)) or
1076
                                                   (right(7) and not out_alu(7));
1077
         when alu_sub8 | alu_sbc =>
1078
      cc_out(CBIT) <= ((not left(7)) and right(7)) or
1079
                                ((not left(7)) and out_alu(7)) or
1080
                                                         (right(7) and out_alu(7));
1081
         when alu_add16  =>
1082
      cc_out(CBIT) <= (left(15) and right(15)) or
1083
                                (left(15) and not out_alu(15)) or
1084
                                                   (right(15) and not out_alu(15));
1085
         when alu_sub16 =>
1086
      cc_out(CBIT) <= ((not left(15)) and right(15)) or
1087
                                ((not left(15)) and out_alu(15)) or
1088
                                                         (right(15) and out_alu(15));
1089
         when alu_ror8 | alu_lsr16 | alu_lsr8 | alu_asr8 =>
1090
           cc_out(CBIT) <= left(0);
1091
         when alu_rol8 | alu_asl8 =>
1092
           cc_out(CBIT) <= left(7);
1093
         when alu_lsl16 =>
1094
           cc_out(CBIT) <= left(15);
1095
         when alu_com =>
1096
           cc_out(CBIT) <= '1';
1097
         when alu_neg | alu_clr =>
1098
           cc_out(CBIT) <= out_alu(7) or out_alu(6) or out_alu(5) or out_alu(4) or
1099
                                out_alu(3) or out_alu(2) or out_alu(1) or out_alu(0);
1100
    when alu_daa =>
1101
           if ( daa_reg(7 downto 4) = "0110" ) then
1102
                  cc_out(CBIT) <= '1';
1103
                else
1104
                  cc_out(CBIT) <= '0';
1105
           end if;
1106
         when alu_andcc =>
1107
      cc_out(CBIT) <= left(CBIT) and cc(CBIT);
1108
         when alu_orcc =>
1109
      cc_out(CBIT) <= left(CBIT) or cc(CBIT);
1110
         when alu_tfr =>
1111
      cc_out(CBIT) <= left(CBIT);
1112
         when others =>
1113
      cc_out(CBIT) <= cc(CBIT);
1114
    end case;
1115
         --
1116
         -- Zero flag
1117
         --
1118
    case alu_ctrl is
1119
         when alu_add8 | alu_sub8 |
1120
              alu_adc | alu_sbc |
1121
              alu_and | alu_ora | alu_eor |
1122
              alu_inc | alu_dec |
1123
                        alu_neg | alu_com | alu_clr |
1124
                        alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 |
1125
                   alu_ld8  | alu_st8 | alu_sex =>
1126
      cc_out(ZBIT) <= not( out_alu(7)  or out_alu(6)  or out_alu(5)  or out_alu(4)  or
1127
                                out_alu(3)  or out_alu(2)  or out_alu(1)  or out_alu(0) );
1128
         when alu_add16 | alu_sub16 |
1129
              alu_lsl16 | alu_lsr16 |
1130
              alu_inx | alu_dex |
1131
                   alu_ld16  | alu_st16 =>
1132
      cc_out(ZBIT) <= not( out_alu(15) or out_alu(14) or out_alu(13) or out_alu(12) or
1133
                                out_alu(11) or out_alu(10) or out_alu(9)  or out_alu(8)  or
1134
                                out_alu(7)  or out_alu(6)  or out_alu(5)  or out_alu(4)  or
1135
                                out_alu(3)  or out_alu(2)  or out_alu(1)  or out_alu(0) );
1136
         when alu_andcc =>
1137
      cc_out(ZBIT) <= left(ZBIT) and cc(ZBIT);
1138
         when alu_orcc =>
1139
      cc_out(ZBIT) <= left(ZBIT) or cc(ZBIT);
1140
         when alu_tfr =>
1141
      cc_out(ZBIT) <= left(ZBIT);
1142
         when others =>
1143
      cc_out(ZBIT) <= cc(ZBIT);
1144
    end case;
1145
 
1146
    --
1147
         -- negative flag
1148
         --
1149
    case alu_ctrl is
1150
         when alu_add8 | alu_sub8 |
1151
              alu_adc | alu_sbc |
1152
              alu_and | alu_ora | alu_eor |
1153
              alu_rol8 | alu_ror8 | alu_asr8 | alu_asl8 | alu_lsr8 |
1154
              alu_inc | alu_dec | alu_neg | alu_com | alu_clr |
1155
                        alu_ld8  | alu_st8 | alu_sex =>
1156
      cc_out(NBIT) <= out_alu(7);
1157
         when alu_add16 | alu_sub16 |
1158
              alu_lsl16 | alu_lsr16 |
1159
                        alu_ld16 | alu_st16 =>
1160
                cc_out(NBIT) <= out_alu(15);
1161
         when alu_andcc =>
1162
      cc_out(NBIT) <= left(NBIT) and cc(NBIT);
1163
         when alu_orcc =>
1164
      cc_out(NBIT) <= left(NBIT) or cc(NBIT);
1165
         when alu_tfr =>
1166
      cc_out(NBIT) <= left(NBIT);
1167
         when others =>
1168
      cc_out(NBIT) <= cc(NBIT);
1169
    end case;
1170
 
1171
    --
1172
         -- Interrupt mask flag
1173
    --
1174
    case alu_ctrl is
1175
         when alu_andcc =>
1176
      cc_out(IBIT) <= left(IBIT) and cc(IBIT);
1177
         when alu_orcc =>
1178
      cc_out(IBIT) <= left(IBIT) or cc(IBIT);
1179
    when alu_seif | alu_sei =>
1180
           cc_out(IBIT) <= '1';
1181
    when alu_tfr =>
1182
      cc_out(IBIT) <= left(IBIT);
1183
         when others =>
1184
                cc_out(IBIT) <= cc(IBIT);             -- interrupt mask
1185
    end case;
1186
 
1187
    --
1188
    -- Half Carry flag
1189
         --
1190
    case alu_ctrl is
1191
         when alu_add8 | alu_adc =>
1192
      cc_out(HBIT) <= (left(3) and right(3)) or
1193
                     (right(3) and not out_alu(3)) or
1194
                      (left(3) and not out_alu(3));
1195
         when alu_andcc =>
1196
      cc_out(HBIT) <= left(HBIT) and cc(HBIT);
1197
         when alu_orcc =>
1198
      cc_out(HBIT) <= left(HBIT) or cc(HBIT);
1199
         when alu_tfr =>
1200
      cc_out(HBIT) <= left(HBIT);
1201
         when others =>
1202
                cc_out(HBIT) <= cc(HBIT);
1203
    end case;
1204
 
1205
    --
1206
    -- Overflow flag
1207
         --
1208
    case alu_ctrl is
1209
         when alu_add8 | alu_adc =>
1210
      cc_out(VBIT) <= (left(7)  and      right(7)  and (not out_alu(7))) or
1211
                 ((not left(7)) and (not right(7)) and      out_alu(7));
1212
         when alu_sub8 | alu_sbc =>
1213
      cc_out(VBIT) <= (left(7)  and (not right(7)) and (not out_alu(7))) or
1214
                 ((not left(7)) and      right(7)  and      out_alu(7));
1215
         when alu_add16 =>
1216
      cc_out(VBIT) <= (left(15)  and      right(15)  and (not out_alu(15))) or
1217
                 ((not left(15)) and (not right(15)) and      out_alu(15));
1218
         when alu_sub16 =>
1219
      cc_out(VBIT) <= (left(15)  and (not right(15)) and (not out_alu(15))) or
1220
                 ((not left(15)) and      right(15) and       out_alu(15));
1221
         when alu_inc =>
1222
           cc_out(VBIT) <= ((not left(7)) and left(6) and left(5) and left(4) and
1223
                                      left(3)  and left(2) and left(1) and left(0));
1224
         when alu_dec | alu_neg =>
1225
           cc_out(VBIT) <= (left(7)  and (not left(6)) and (not left(5)) and (not left(4)) and
1226
                            (not left(3)) and (not left(2)) and (not left(1)) and (not left(0)));
1227
         when alu_asr8 =>
1228
           cc_out(VBIT) <= left(0) xor left(7);
1229
         when alu_lsr8 | alu_lsr16 =>
1230
           cc_out(VBIT) <= left(0);
1231
         when alu_ror8 =>
1232
      cc_out(VBIT) <= left(0) xor cc(CBIT);
1233
    when alu_lsl16 =>
1234
      cc_out(VBIT) <= left(15) xor left(14);
1235
         when alu_rol8 | alu_asl8  =>
1236
      cc_out(VBIT) <= left(7) xor left(6);
1237
         when alu_and | alu_ora | alu_eor | alu_com |
1238
              alu_st8 | alu_st16 | alu_ld8 | alu_ld16 | alu_sex =>
1239
      cc_out(VBIT) <= '0';
1240
         when alu_andcc =>
1241
      cc_out(VBIT) <= left(VBIT) and cc(VBIT);
1242
         when alu_orcc =>
1243
      cc_out(VBIT) <= left(VBIT) or cc(VBIT);
1244
         when alu_tfr =>
1245
      cc_out(VBIT) <= left(VBIT);
1246
         when others =>
1247
                cc_out(VBIT) <= cc(VBIT);
1248
    end case;
1249
 
1250
         case alu_ctrl is
1251
         when alu_andcc =>
1252
      cc_out(FBIT) <= left(FBIT) and cc(FBIT);
1253
         when alu_orcc =>
1254
      cc_out(FBIT) <= left(FBIT) or cc(FBIT);
1255
         when alu_tfr =>
1256
      cc_out(FBIT) <= left(FBIT);
1257
    when alu_seif =>
1258
           cc_out(FBIT) <= '1';
1259
         when others =>
1260
      cc_out(FBIT) <= cc(FBIT);
1261
         end case;
1262
 
1263
         case alu_ctrl is
1264
         when alu_andcc =>
1265
      cc_out(EBIT) <= left(EBIT) and cc(EBIT);
1266
         when alu_orcc =>
1267
      cc_out(EBIT) <= left(EBIT) or cc(EBIT);
1268
         when alu_tfr =>
1269
      cc_out(EBIT) <= left(EBIT);
1270
    when alu_see =>
1271
           cc_out(EBIT) <= '1';
1272
    when alu_cle =>
1273
           cc_out(EBIT) <= '0';
1274
         when others =>
1275
           cc_out(EBIT) <= cc(EBIT);
1276
         end case;
1277
 
1278
         test_alu <= out_alu;
1279
         test_cc  <= cc_out;
1280
end process;
1281
 
1282
------------------------------------
1283
--
1284
-- state sequencer
1285
--
1286
------------------------------------
1287
process( state, saved_state,
1288
         op_code, pre_code,
1289
                        cc, ea, md, iv,
1290
                        irq, firq, nmi_req, nmi_ack, halt )
1291
variable cond_true : boolean;  -- variable used to evaluate coditional branches
1292
begin
1293
                  case state is
1294
          when reset_state =>        --  released from reset
1295
                            -- reset the registers
1296
             op_ctrl    <= reset_op;
1297
             pre_ctrl   <= reset_pre;
1298
                                 acca_ctrl  <= reset_acca;
1299
                                 accb_ctrl  <= reset_accb;
1300
                                 ix_ctrl    <= reset_ix;
1301
                                 iy_ctrl    <= reset_iy;
1302
                       sp_ctrl    <= reset_sp;
1303
                       up_ctrl    <= reset_up;
1304
                       pc_ctrl    <= reset_pc;
1305
                            ea_ctrl    <= reset_ea;
1306
                                 md_ctrl    <= reset_md;
1307
                                 iv_ctrl    <= reset_iv;
1308
                                 nmi_ctrl   <= reset_nmi;
1309
                                 -- idle the ALU
1310
             left_ctrl  <= pc_left;
1311
                                 right_ctrl <= zero_right;
1312
                                 alu_ctrl   <= alu_nop;
1313
             cc_ctrl    <= reset_cc;
1314
             dp_ctrl    <= reset_dp;
1315
                                 -- idle the bus
1316
                                 dout_ctrl  <= md_lo_dout;
1317
             addr_ctrl  <= idle_ad;
1318
                                 st_ctrl    <= idle_st;
1319
                                 return_state <= vect_hi_state;
1320
                       next_state <= vect_hi_state;
1321
 
1322
                         --
1323
                         -- Jump via interrupt vector
1324
                         -- iv holds interrupt type
1325
                         -- fetch PC hi from vector location
1326
                         --
1327
          when vect_hi_state =>
1328
                            -- default the registers
1329
             op_ctrl    <= latch_op;
1330
             pre_ctrl   <= latch_pre;
1331
                                 nmi_ctrl   <= latch_nmi;
1332
             acca_ctrl  <= latch_acca;
1333
             accb_ctrl  <= latch_accb;
1334
             ix_ctrl    <= latch_ix;
1335
             iy_ctrl    <= latch_iy;
1336
             sp_ctrl    <= latch_sp;
1337
             up_ctrl    <= latch_up;
1338
             md_ctrl    <= latch_md;
1339
             ea_ctrl    <= latch_ea;
1340
             iv_ctrl    <= latch_iv;
1341
                                 -- idle the ALU
1342
             left_ctrl  <= pc_left;
1343
             right_ctrl <= zero_right;
1344
             alu_ctrl   <= alu_nop;
1345
             cc_ctrl    <= latch_cc;
1346
             dp_ctrl    <= latch_dp;
1347
                                 -- fetch pc low interrupt vector
1348
                       pc_ctrl    <= pull_hi_pc;
1349
             addr_ctrl  <= int_hi_ad;
1350
             dout_ctrl  <= pc_hi_dout;
1351
                                 st_ctrl    <= idle_st;
1352
                                 return_state <= vect_lo_state;
1353
                       next_state <= vect_lo_state;
1354
                         --
1355
                         -- jump via interrupt vector
1356
                         -- iv holds vector type
1357
                         -- fetch PC lo from vector location
1358
                         --
1359
          when vect_lo_state =>
1360
                            -- default the registers
1361
             op_ctrl    <= latch_op;
1362
             pre_ctrl   <= latch_pre;
1363
                                 nmi_ctrl   <= latch_nmi;
1364
             acca_ctrl  <= latch_acca;
1365
             accb_ctrl  <= latch_accb;
1366
             ix_ctrl    <= latch_ix;
1367
             iy_ctrl    <= latch_iy;
1368
             sp_ctrl    <= latch_sp;
1369
             up_ctrl    <= latch_up;
1370
             md_ctrl    <= latch_md;
1371
             ea_ctrl    <= latch_ea;
1372
             iv_ctrl    <= latch_iv;
1373
                                 -- idle the ALU
1374
             left_ctrl  <= pc_left;
1375
             right_ctrl <= zero_right;
1376
             alu_ctrl   <= alu_nop;
1377
             cc_ctrl    <= latch_cc;
1378
             dp_ctrl    <= latch_dp;
1379
                                 -- fetch the vector low byte
1380
                       pc_ctrl    <= pull_lo_pc;
1381
             addr_ctrl  <= int_lo_ad;
1382
             dout_ctrl  <= pc_lo_dout;
1383
                                 st_ctrl    <= idle_st;
1384
                                 return_state <= fetch_state;
1385
                       next_state <= fetch_state;
1386
                         --
1387
                         -- Here to fetch an instruction
1388
                         -- PC points to opcode
1389
                         -- Should service interrupt requests at this point
1390
                         -- either from the timer
1391
                         -- or from the external input.
1392
                         --
1393
          when fetch_state =>
1394
                                   -- fetch the op code
1395
                              op_ctrl    <= fetch_op;
1396
               pre_ctrl   <= fetch_pre;
1397
               ea_ctrl    <= reset_ea;
1398
               md_ctrl    <= latch_md;
1399
                                   -- Fetch op code
1400
               addr_ctrl  <= fetch_ad;
1401
               dout_ctrl  <= md_lo_dout;
1402
               dp_ctrl    <= latch_dp;
1403
                                   --
1404
                                        case op_code(7 downto 6) is
1405
                                        when "10" => -- acca
1406
                                     case op_code(3 downto 0) is
1407
                                          when "0000" => -- suba
1408
                                            left_ctrl  <= acca_left;
1409
                                            right_ctrl <= md_right;
1410
                                            alu_ctrl   <= alu_sub8;
1411
                                                 cc_ctrl    <= load_cc;
1412
                                            acca_ctrl  <= load_acca;
1413
                   accb_ctrl  <= latch_accb;
1414
                   ix_ctrl    <= latch_ix;
1415
                   iy_ctrl    <= latch_iy;
1416
                   up_ctrl    <= latch_up;
1417
                   sp_ctrl    <= latch_sp;
1418
                                          when "0001" => -- cmpa
1419
                                            left_ctrl   <= acca_left;
1420
                                            right_ctrl  <= md_right;
1421
                                            alu_ctrl    <= alu_sub8;
1422
                                                 cc_ctrl     <= load_cc;
1423
                                            acca_ctrl   <= latch_acca;
1424
                   accb_ctrl   <= latch_accb;
1425
                   ix_ctrl     <= latch_ix;
1426
                   iy_ctrl     <= latch_iy;
1427
                   up_ctrl     <= latch_up;
1428
                   sp_ctrl     <= latch_sp;
1429
                                          when "0010" => -- sbca
1430
                                            left_ctrl   <= acca_left;
1431
                                            right_ctrl  <= md_right;
1432
                                            alu_ctrl    <= alu_sbc;
1433
                                                 cc_ctrl     <= load_cc;
1434
                                            acca_ctrl   <= load_acca;
1435
                   accb_ctrl   <= latch_accb;
1436
                   ix_ctrl     <= latch_ix;
1437
                   iy_ctrl     <= latch_iy;
1438
                   up_ctrl     <= latch_up;
1439
                   sp_ctrl     <= latch_sp;
1440
                                          when "0011" =>
1441
                                            case pre_code is
1442
                                                 when "00010000" => -- page 2 -- cmpd
1443
                                              left_ctrl   <= accd_left;
1444
                                              right_ctrl  <= md_right;
1445
                                              alu_ctrl    <= alu_sub16;
1446
                                                   cc_ctrl     <= load_cc;
1447
                                              acca_ctrl   <= latch_acca;
1448
                     accb_ctrl   <= latch_accb;
1449
                     ix_ctrl     <= latch_ix;
1450
                     iy_ctrl     <= latch_iy;
1451
                     up_ctrl     <= latch_up;
1452
                     sp_ctrl     <= latch_sp;
1453
                                                 when "00010001" => -- page 3 -- cmpu
1454
                                              left_ctrl   <= up_left;
1455
                                              right_ctrl  <= md_right;
1456
                                              alu_ctrl    <= alu_sub16;
1457
                                                   cc_ctrl     <= load_cc;
1458
                                              acca_ctrl   <= latch_acca;
1459
                     accb_ctrl   <= latch_accb;
1460
                     ix_ctrl     <= latch_ix;
1461
                     iy_ctrl     <= latch_iy;
1462
                     up_ctrl     <= latch_up;
1463
                     sp_ctrl     <= latch_sp;
1464
                                                 when others => -- page 1 -- subd
1465
                                              left_ctrl   <= accd_left;
1466
                                              right_ctrl  <= md_right;
1467
                                              alu_ctrl    <= alu_sub16;
1468
                                                   cc_ctrl     <= load_cc;
1469
                                              acca_ctrl   <= load_hi_acca;
1470
                                                   accb_ctrl   <= load_accb;
1471
                     ix_ctrl     <= latch_ix;
1472
                     iy_ctrl     <= latch_iy;
1473
                     up_ctrl     <= latch_up;
1474
                     sp_ctrl     <= latch_sp;
1475
                                                 end case;
1476
                                          when "0100" => -- anda
1477
                                            left_ctrl   <= acca_left;
1478
                                            right_ctrl  <= md_right;
1479
                                            alu_ctrl    <= alu_and;
1480
                                                 cc_ctrl     <= load_cc;
1481
                                            acca_ctrl   <= load_acca;
1482
                   accb_ctrl   <= latch_accb;
1483
                   ix_ctrl     <= latch_ix;
1484
                   iy_ctrl     <= latch_iy;
1485
                   up_ctrl     <= latch_up;
1486
                   sp_ctrl     <= latch_sp;
1487
                                          when "0101" => -- bita
1488
                                            left_ctrl   <= acca_left;
1489
                                            right_ctrl  <= md_right;
1490
                                            alu_ctrl    <= alu_and;
1491
                                                 cc_ctrl     <= load_cc;
1492
                                            acca_ctrl   <= latch_acca;
1493
                   accb_ctrl   <= latch_accb;
1494
                   ix_ctrl     <= latch_ix;
1495
                   iy_ctrl     <= latch_iy;
1496
                   up_ctrl     <= latch_up;
1497
                   sp_ctrl     <= latch_sp;
1498
                                          when "0110" => -- ldaa
1499
                                            left_ctrl   <= acca_left;
1500
                                            right_ctrl  <= md_right;
1501
                                            alu_ctrl    <= alu_ld8;
1502
                                                 cc_ctrl     <= load_cc;
1503
                                            acca_ctrl   <= load_acca;
1504
                   accb_ctrl   <= latch_accb;
1505
                   ix_ctrl     <= latch_ix;
1506
                   iy_ctrl     <= latch_iy;
1507
                   up_ctrl     <= latch_up;
1508
                   sp_ctrl     <= latch_sp;
1509
                                          when "0111" => -- staa
1510
                                            left_ctrl   <= acca_left;
1511
                                            right_ctrl  <= md_right;
1512
                                            alu_ctrl    <= alu_st8;
1513
                                                 cc_ctrl     <= load_cc;
1514
                                            acca_ctrl   <= latch_acca;
1515
                   accb_ctrl   <= latch_accb;
1516
                   ix_ctrl     <= latch_ix;
1517
                   iy_ctrl     <= latch_iy;
1518
                   up_ctrl     <= latch_up;
1519
                   sp_ctrl     <= latch_sp;
1520
                                          when "1000" => -- eora
1521
                                            left_ctrl   <= acca_left;
1522
                                            right_ctrl  <= md_right;
1523
                                            alu_ctrl    <= alu_eor;
1524
                                                 cc_ctrl     <= load_cc;
1525
                                            acca_ctrl   <= load_acca;
1526
                   accb_ctrl   <= latch_accb;
1527
                   ix_ctrl     <= latch_ix;
1528
                   iy_ctrl     <= latch_iy;
1529
                   up_ctrl     <= latch_up;
1530
                   sp_ctrl     <= latch_sp;
1531
                                          when "1001" => -- adca
1532
                                            left_ctrl   <= acca_left;
1533
                                            right_ctrl  <= md_right;
1534
                                            alu_ctrl    <= alu_adc;
1535
                                                 cc_ctrl     <= load_cc;
1536
                                            acca_ctrl   <= load_acca;
1537
                   accb_ctrl   <= latch_accb;
1538
                   ix_ctrl     <= latch_ix;
1539
                   iy_ctrl     <= latch_iy;
1540
                   up_ctrl     <= latch_up;
1541
                   sp_ctrl     <= latch_sp;
1542
                                          when "1010" => -- oraa
1543
                                            left_ctrl   <= acca_left;
1544
                                            right_ctrl  <= md_right;
1545
                                            alu_ctrl    <= alu_ora;
1546
                                                 cc_ctrl     <= load_cc;
1547
                                            acca_ctrl   <= load_acca;
1548
                   accb_ctrl   <= latch_accb;
1549
                   ix_ctrl     <= latch_ix;
1550
                   iy_ctrl     <= latch_iy;
1551
                   up_ctrl     <= latch_up;
1552
                   sp_ctrl     <= latch_sp;
1553
                                          when "1011" => -- adda
1554
                                            left_ctrl   <= acca_left;
1555
                                            right_ctrl  <= md_right;
1556
                                            alu_ctrl    <= alu_add8;
1557
                                                 cc_ctrl     <= load_cc;
1558
                                            acca_ctrl   <= load_acca;
1559
                   accb_ctrl   <= latch_accb;
1560
                   ix_ctrl     <= latch_ix;
1561
                   iy_ctrl     <= latch_iy;
1562
                   up_ctrl     <= latch_up;
1563
                   sp_ctrl     <= latch_sp;
1564
                                          when "1100" =>
1565
                                            case pre_code is
1566
                                                 when "00010000" => -- page 2 -- cmpy
1567
                                              left_ctrl   <= iy_left;
1568
                                              right_ctrl  <= md_right;
1569
                                              alu_ctrl    <= alu_sub16;
1570
                                                   cc_ctrl     <= load_cc;
1571
                                              acca_ctrl   <= latch_acca;
1572
                     accb_ctrl   <= latch_accb;
1573
                     ix_ctrl     <= latch_ix;
1574
                     iy_ctrl     <= latch_iy;
1575
                     up_ctrl     <= latch_up;
1576
                     sp_ctrl     <= latch_sp;
1577
                                                 when "00010001" => -- page 3 -- cmps
1578
                                              left_ctrl   <= sp_left;
1579
                                              right_ctrl  <= md_right;
1580
                                              alu_ctrl    <= alu_sub16;
1581
                                                   cc_ctrl     <= load_cc;
1582
                                              acca_ctrl   <= latch_acca;
1583
                     accb_ctrl   <= latch_accb;
1584
                     ix_ctrl     <= latch_ix;
1585
                     iy_ctrl     <= latch_iy;
1586
                     up_ctrl     <= latch_up;
1587
                     sp_ctrl     <= latch_sp;
1588
                                                 when others => -- page 1 -- cmpx
1589
                                              left_ctrl   <= ix_left;
1590
                                              right_ctrl  <= md_right;
1591
                                              alu_ctrl    <= alu_sub16;
1592
                                                   cc_ctrl     <= load_cc;
1593
                                              acca_ctrl   <= latch_acca;
1594
                                                   accb_ctrl   <= latch_accb;
1595
                     ix_ctrl     <= latch_ix;
1596
                     iy_ctrl     <= latch_iy;
1597
                     up_ctrl     <= latch_up;
1598
                     sp_ctrl     <= latch_sp;
1599
                                                 end case;
1600
                                          when "1101" => -- bsr / jsr
1601
                                            left_ctrl   <= pc_left;
1602
                                            right_ctrl  <= md_right;
1603
                                            alu_ctrl    <= alu_nop;
1604
                                                 cc_ctrl     <= latch_cc;
1605
                                            acca_ctrl   <= latch_acca;
1606
                   accb_ctrl   <= latch_accb;
1607
                   ix_ctrl     <= latch_ix;
1608
                   iy_ctrl     <= latch_iy;
1609
                   up_ctrl     <= latch_up;
1610
                   sp_ctrl     <= latch_sp;
1611
                                          when "1110" => -- ldx
1612
                                            case pre_code is
1613
                                                 when "00010000" => -- page 2 -- ldy
1614
                                              left_ctrl   <= iy_left;
1615
                                              right_ctrl  <= md_right;
1616
                                              alu_ctrl    <= alu_ld16;
1617
                                                   cc_ctrl     <= load_cc;
1618
                                              acca_ctrl   <= latch_acca;
1619
                     accb_ctrl   <= latch_accb;
1620
                     ix_ctrl     <= latch_ix;
1621
                     iy_ctrl     <= load_iy;
1622
                     up_ctrl     <= latch_up;
1623
                                                   sp_ctrl     <= latch_sp;
1624
                                                 when others =>   -- page 1 -- ldx
1625
                                              left_ctrl   <= ix_left;
1626
                                              right_ctrl  <= md_right;
1627
                                              alu_ctrl    <= alu_ld16;
1628
                                                   cc_ctrl     <= load_cc;
1629
                                              acca_ctrl   <= latch_acca;
1630
                     accb_ctrl   <= latch_accb;
1631
                     ix_ctrl     <= load_ix;
1632
                     iy_ctrl     <= latch_iy;
1633
                     up_ctrl     <= latch_up;
1634
                                                   sp_ctrl     <= latch_sp;
1635
                                                 end case;
1636
                                          when "1111" => -- stx
1637
                                            case pre_code is
1638
                                                 when "00010000" => -- page 2 -- sty
1639
                                              left_ctrl   <= iy_left;
1640
                                              right_ctrl  <= md_right;
1641
                                              alu_ctrl    <= alu_st16;
1642
                                                   cc_ctrl     <= load_cc;
1643
                                              acca_ctrl   <= latch_acca;
1644
                     accb_ctrl   <= latch_accb;
1645
                     ix_ctrl     <= latch_ix;
1646
                     iy_ctrl     <= latch_iy;
1647
                     up_ctrl     <= latch_up;
1648
                     sp_ctrl     <= latch_sp;
1649
                                                 when others =>     -- page 1 -- stx
1650
                                              left_ctrl   <= ix_left;
1651
                                              right_ctrl  <= md_right;
1652
                                              alu_ctrl    <= alu_st16;
1653
                                                   cc_ctrl     <= load_cc;
1654
                                              acca_ctrl   <= latch_acca;
1655
                     accb_ctrl   <= latch_accb;
1656
                     ix_ctrl     <= latch_ix;
1657
                     iy_ctrl     <= latch_iy;
1658
                     up_ctrl     <= latch_up;
1659
                     sp_ctrl     <= latch_sp;
1660
                                                 end case;
1661
                                          when others =>
1662
                                            left_ctrl   <= acca_left;
1663
                                            right_ctrl  <= md_right;
1664
                                            alu_ctrl    <= alu_nop;
1665
                                                 cc_ctrl     <= latch_cc;
1666
                                            acca_ctrl   <= latch_acca;
1667
                   accb_ctrl   <= latch_accb;
1668
                   ix_ctrl     <= latch_ix;
1669
                   iy_ctrl     <= latch_iy;
1670
                   up_ctrl     <= latch_up;
1671
                   sp_ctrl     <= latch_sp;
1672
                                          end case;
1673
                                        when "11" => -- accb dual op
1674
                                     case op_code(3 downto 0) is
1675
                                          when "0000" => -- subb
1676
                                            left_ctrl   <= accb_left;
1677
                                            right_ctrl  <= md_right;
1678
                                            alu_ctrl    <= alu_sub8;
1679
                                                 cc_ctrl     <= load_cc;
1680
                                            acca_ctrl   <= latch_acca;
1681
                   accb_ctrl   <= load_accb;
1682
                   ix_ctrl     <= latch_ix;
1683
                   iy_ctrl     <= latch_iy;
1684
                   up_ctrl     <= latch_up;
1685
                   sp_ctrl     <= latch_sp;
1686
                                          when "0001" => -- cmpb
1687
                                            left_ctrl   <= accb_left;
1688
                                            right_ctrl  <= md_right;
1689
                                            alu_ctrl    <= alu_sub8;
1690
                                                 cc_ctrl     <= load_cc;
1691
                                            acca_ctrl   <= latch_acca;
1692
                   accb_ctrl   <= latch_accb;
1693
                   ix_ctrl     <= latch_ix;
1694
                   iy_ctrl     <= latch_iy;
1695
                   up_ctrl     <= latch_up;
1696
                   sp_ctrl     <= latch_sp;
1697
                                          when "0010" => -- sbcb
1698
                                            left_ctrl   <= accb_left;
1699
                                            right_ctrl  <= md_right;
1700
                                            alu_ctrl    <= alu_sbc;
1701
                                                 cc_ctrl     <= load_cc;
1702
                                            acca_ctrl   <= latch_acca;
1703
                   accb_ctrl   <= load_accb;
1704
                   ix_ctrl     <= latch_ix;
1705
                   iy_ctrl     <= latch_iy;
1706
                   up_ctrl     <= latch_up;
1707
                   sp_ctrl     <= latch_sp;
1708
                                          when "0011" => -- addd
1709
                                            left_ctrl   <= accd_left;
1710
                                            right_ctrl  <= md_right;
1711
                                            alu_ctrl    <= alu_add16;
1712
                                                 cc_ctrl     <= load_cc;
1713
                                            acca_ctrl   <= load_hi_acca;
1714
                                                 accb_ctrl   <= load_accb;
1715
                   ix_ctrl     <= latch_ix;
1716
                   iy_ctrl     <= latch_iy;
1717
                   up_ctrl     <= latch_up;
1718
                   sp_ctrl     <= latch_sp;
1719
                                          when "0100" => -- andb
1720
                                            left_ctrl   <= accb_left;
1721
                                            right_ctrl  <= md_right;
1722
                                            alu_ctrl    <= alu_and;
1723
                                                 cc_ctrl     <= load_cc;
1724
                                            acca_ctrl   <= latch_acca;
1725
                   accb_ctrl   <= load_accb;
1726
                   ix_ctrl     <= latch_ix;
1727
                   iy_ctrl     <= latch_iy;
1728
                   up_ctrl     <= latch_up;
1729
                   sp_ctrl     <= latch_sp;
1730
                                          when "0101" => -- bitb
1731
                                            left_ctrl   <= accb_left;
1732
                                            right_ctrl  <= md_right;
1733
                                            alu_ctrl    <= alu_and;
1734
                                                 cc_ctrl     <= load_cc;
1735
                                            acca_ctrl   <= latch_acca;
1736
                   accb_ctrl   <= latch_accb;
1737
                   ix_ctrl     <= latch_ix;
1738
                   iy_ctrl     <= latch_iy;
1739
                   up_ctrl     <= latch_up;
1740
                   sp_ctrl     <= latch_sp;
1741
                                          when "0110" => -- ldab
1742
                                            left_ctrl   <= accb_left;
1743
                                            right_ctrl  <= md_right;
1744
                                            alu_ctrl    <= alu_ld8;
1745
                                                 cc_ctrl     <= load_cc;
1746
                                            acca_ctrl   <= latch_acca;
1747
                   accb_ctrl   <= load_accb;
1748
                   ix_ctrl     <= latch_ix;
1749
                   iy_ctrl     <= latch_iy;
1750
                   up_ctrl     <= latch_up;
1751
                   sp_ctrl     <= latch_sp;
1752
                                          when "0111" => -- stab
1753
                                            left_ctrl   <= accb_left;
1754
                                            right_ctrl  <= md_right;
1755
                                            alu_ctrl    <= alu_st8;
1756
                                                 cc_ctrl     <= load_cc;
1757
                                            acca_ctrl   <= latch_acca;
1758
                   accb_ctrl   <= latch_accb;
1759
                   ix_ctrl     <= latch_ix;
1760
                   iy_ctrl     <= latch_iy;
1761
                   up_ctrl     <= latch_up;
1762
                   sp_ctrl     <= latch_sp;
1763
                                          when "1000" => -- eorb
1764
                                            left_ctrl   <= accb_left;
1765
                                            right_ctrl  <= md_right;
1766
                                            alu_ctrl    <= alu_eor;
1767
                                                 cc_ctrl     <= load_cc;
1768
                                            acca_ctrl   <= latch_acca;
1769
                   accb_ctrl   <= load_accb;
1770
                   ix_ctrl     <= latch_ix;
1771
                   iy_ctrl     <= latch_iy;
1772
                   up_ctrl     <= latch_up;
1773
                   sp_ctrl     <= latch_sp;
1774
                                          when "1001" => -- adcb
1775
                                            left_ctrl   <= accb_left;
1776
                                            right_ctrl  <= md_right;
1777
                                            alu_ctrl    <= alu_adc;
1778
                                                 cc_ctrl     <= load_cc;
1779
                                            acca_ctrl   <= latch_acca;
1780
                   accb_ctrl   <= load_accb;
1781
                   ix_ctrl     <= latch_ix;
1782
                   iy_ctrl     <= latch_iy;
1783
                   up_ctrl     <= latch_up;
1784
                   sp_ctrl     <= latch_sp;
1785
                                          when "1010" => -- orab
1786
                                            left_ctrl   <= accb_left;
1787
                                            right_ctrl  <= md_right;
1788
                                            alu_ctrl    <= alu_ora;
1789
                                                 cc_ctrl     <= load_cc;
1790
                                            acca_ctrl   <= latch_acca;
1791
                   accb_ctrl   <= load_accb;
1792
                   ix_ctrl     <= latch_ix;
1793
                   iy_ctrl     <= latch_iy;
1794
                   up_ctrl     <= latch_up;
1795
                   sp_ctrl     <= latch_sp;
1796
                                          when "1011" => -- addb
1797
                                            left_ctrl   <= accb_left;
1798
                                            right_ctrl  <= md_right;
1799
                                            alu_ctrl    <= alu_add8;
1800
                                                 cc_ctrl     <= load_cc;
1801
                                            acca_ctrl   <= latch_acca;
1802
                   accb_ctrl   <= load_accb;
1803
                   ix_ctrl     <= latch_ix;
1804
                   iy_ctrl     <= latch_iy;
1805
                   up_ctrl     <= latch_up;
1806
                   sp_ctrl     <= latch_sp;
1807
                                          when "1100" => -- ldd
1808
                                            left_ctrl   <= accd_left;
1809
                                            right_ctrl  <= md_right;
1810
                                            alu_ctrl    <= alu_ld16;
1811
                                                 cc_ctrl     <= load_cc;
1812
                                            acca_ctrl   <= load_hi_acca;
1813
                   accb_ctrl   <= load_accb;
1814
                   ix_ctrl     <= latch_ix;
1815
                   iy_ctrl     <= latch_iy;
1816
                   up_ctrl     <= latch_up;
1817
                   sp_ctrl     <= latch_sp;
1818
                                          when "1101" => -- std
1819
                                            left_ctrl   <= accd_left;
1820
                                            right_ctrl  <= md_right;
1821
                                            alu_ctrl    <= alu_st16;
1822
                                                 cc_ctrl     <= latch_cc;
1823
                                            acca_ctrl   <= latch_acca;
1824
                   accb_ctrl   <= latch_accb;
1825
                   ix_ctrl     <= latch_ix;
1826
                   iy_ctrl     <= latch_iy;
1827
                   up_ctrl     <= latch_up;
1828
                   sp_ctrl     <= latch_sp;
1829
                                          when "1110" => -- ldu
1830
                                            case pre_code is
1831
                                                 when "00010000" => -- page 2 -- lds
1832
                                              left_ctrl   <= sp_left;
1833
                                              right_ctrl  <= md_right;
1834
                                              alu_ctrl    <= alu_ld16;
1835
                                                   cc_ctrl     <= load_cc;
1836
                                              acca_ctrl   <= latch_acca;
1837
                     accb_ctrl   <= latch_accb;
1838
                     ix_ctrl     <= latch_ix;
1839
                     iy_ctrl     <= latch_iy;
1840
                     up_ctrl     <= latch_up;
1841
                                                   sp_ctrl     <= load_sp;
1842
                                                 when others => -- page 1 -- ldu
1843
                                              left_ctrl   <= up_left;
1844
                                              right_ctrl  <= md_right;
1845
                                              alu_ctrl    <= alu_ld16;
1846
                                                   cc_ctrl     <= load_cc;
1847
                                              acca_ctrl   <= latch_acca;
1848
                     accb_ctrl   <= latch_accb;
1849
                     ix_ctrl     <= latch_ix;
1850
                     iy_ctrl     <= latch_iy;
1851
                     up_ctrl     <= load_up;
1852
                                                   sp_ctrl     <= latch_sp;
1853
                                                 end case;
1854
                                          when "1111" =>
1855
                                            case pre_code is
1856
                                                 when "00010000" => -- page 2 -- sts
1857
                                              left_ctrl   <= sp_left;
1858
                                              right_ctrl  <= md_right;
1859
                                              alu_ctrl    <= alu_st16;
1860
                                                   cc_ctrl     <= load_cc;
1861
                                              acca_ctrl   <= latch_acca;
1862
                     accb_ctrl   <= latch_accb;
1863
                     ix_ctrl     <= latch_ix;
1864
                     iy_ctrl     <= latch_iy;
1865
                     up_ctrl     <= latch_up;
1866
                     sp_ctrl     <= latch_sp;
1867
                                                 when others =>     -- page 1 -- stu
1868
                                              left_ctrl   <= up_left;
1869
                                              right_ctrl  <= md_right;
1870
                                              alu_ctrl    <= alu_st16;
1871
                                                   cc_ctrl     <= load_cc;
1872
                                              acca_ctrl   <= latch_acca;
1873
                     accb_ctrl   <= latch_accb;
1874
                     ix_ctrl     <= latch_ix;
1875
                     iy_ctrl     <= latch_iy;
1876
                     up_ctrl     <= latch_up;
1877
                     sp_ctrl     <= latch_sp;
1878
                                                 end case;
1879
                                          when others =>
1880
                                            left_ctrl   <= accb_left;
1881
                                            right_ctrl  <= md_right;
1882
                                            alu_ctrl    <= alu_nop;
1883
                                                 cc_ctrl     <= latch_cc;
1884
                                            acca_ctrl   <= latch_acca;
1885
                   accb_ctrl   <= latch_accb;
1886
                   ix_ctrl     <= latch_ix;
1887
                   iy_ctrl     <= latch_iy;
1888
                   up_ctrl     <= latch_up;
1889
                   sp_ctrl     <= latch_sp;
1890
                                          end case;
1891
                                        when others =>
1892
                                            left_ctrl   <= acca_left;
1893
                                            right_ctrl  <= md_right;
1894
                                            alu_ctrl    <= alu_nop;
1895
                                                 cc_ctrl     <= latch_cc;
1896
                                            acca_ctrl   <= latch_acca;
1897
                   accb_ctrl   <= latch_accb;
1898
                   ix_ctrl     <= latch_ix;
1899
                   iy_ctrl     <= latch_iy;
1900
                   up_ctrl     <= latch_up;
1901
                   sp_ctrl     <= latch_sp;
1902
                                        end case;
1903
                                 if halt = '1' then
1904
                              iv_ctrl    <= reset_iv;
1905
               pc_ctrl    <= latch_pc;
1906
                                   nmi_ctrl   <= latch_nmi;
1907
                                   st_ctrl    <= push_st;
1908
                                   return_state <= fetch_state;
1909
                              next_state <= halt_state;
1910
                                 -- service non maskable interrupts
1911
                            elsif (nmi_req = '1') and (nmi_ack = '0') then
1912
                              iv_ctrl    <= nmi_iv;
1913
               pc_ctrl    <= latch_pc;
1914
                                   nmi_ctrl   <= set_nmi;
1915
                                   st_ctrl    <= idle_st;
1916
                                   return_state <= fetch_state;
1917
                              next_state <= int_decr_state;
1918
                                 -- service maskable interrupts
1919
                            else
1920
                                   --
1921
                                        -- nmi request is not cleared until nmi input goes low
1922
                                        --
1923
                                   if(nmi_req = '0') and (nmi_ack='1') then
1924
                                     nmi_ctrl <= reset_nmi;
1925
                                        else
1926
                                          nmi_ctrl <= latch_nmi;
1927
                                        end if;
1928
                                        --
1929
                                        -- IRQ is level sensitive
1930
                                        --
1931
                                   if (irq = '1') and (cc(IBIT) = '0') then
1932
                                iv_ctrl    <= irq_iv;
1933
                 pc_ctrl    <= latch_pc;
1934
                                     st_ctrl    <= idle_st;
1935
                                     return_state <= fetch_state;
1936
                                next_state <= int_decr_state;
1937
               elsif (firq = '1') and (cc(FBIT) = '0') then
1938
                                iv_ctrl    <= firq_iv;
1939
                 pc_ctrl    <= latch_pc;
1940
                                     st_ctrl    <= idle_st;
1941
                                     return_state <= fetch_state;
1942
                                next_state <= int_decr_state;
1943
               else
1944
                                   -- Advance the PC to fetch next instruction byte
1945
                                iv_ctrl    <= reset_iv; -- default to reset
1946
                 pc_ctrl    <= incr_pc;
1947
                                     st_ctrl    <= idle_st;
1948
                                     return_state <= fetch_state;
1949
                                next_state <= decode1_state;
1950
               end if;
1951
                                 end if;
1952
                         --
1953
                         -- Here to decode instruction
1954
                         -- and fetch next byte of intruction
1955
                         -- whether it be necessary or not
1956
                         --
1957
          when decode1_state =>
1958
             pre_ctrl   <= latch_pre;
1959
                                 -- fetch first byte of address or immediate data
1960
             ea_ctrl    <= fetch_first_ea;
1961
                                 md_ctrl    <= fetch_first_md;
1962
             addr_ctrl  <= fetch_ad;
1963
             dout_ctrl  <= md_lo_dout;
1964
                                 nmi_ctrl   <= latch_nmi;
1965
             dp_ctrl    <= latch_dp;
1966
                            case op_code(7 downto 4) is
1967
                                 --
1968
                                 -- direct single op (2 bytes)
1969
                                 -- 6809 => 6 cycles
1970
                                 -- cpu09 => 5 cycles
1971
                            -- 1 op=(pc) / pc=pc+1
1972
                                 -- 2 ea_hi=0 / ea_lo=(pc) / pc=pc+1
1973
                                 -- 3 md_lo=(ea) / pc=pc
1974
                                 -- 4 alu_left=md / md=alu_out / pc=pc
1975
                                 -- 5 (ea)=md_lo / pc=pc
1976
                                 --
1977
                                 -- Exception is JMP
1978
                            -- 6809 => 3 cycles
1979
                                 -- cpu09 => 3 cycles
1980
                                 -- 1 op=(pc) / pc=pc+1
1981
                                 -- 2 ea_hi=0 / ea_lo=(pc) / pc=pc+1
1982
                                 -- 3 pc=ea
1983
                                 --
1984
                  when "0000" =>
1985
                              op_ctrl    <= latch_op;
1986
               acca_ctrl  <= latch_acca;
1987
                                        accb_ctrl  <= latch_accb;
1988
                                   ix_ctrl    <= latch_ix;
1989
                                   iy_ctrl    <= latch_iy;
1990
                                   sp_ctrl    <= latch_sp;
1991
                                   up_ctrl    <= latch_up;
1992
               iv_ctrl    <= latch_iv;
1993
                                        -- idle ALU
1994
               left_ctrl  <= pc_left;
1995
               right_ctrl <= one_right;
1996
               alu_ctrl   <= alu_add16;
1997
                                        cc_ctrl    <= latch_cc;
1998
                                        -- advance the PC
1999
               pc_ctrl    <= incr_pc;
2000
                                        --
2001
                                   st_ctrl      <= idle_st;
2002
                                   return_state <= fetch_state;
2003
                                   next_state   <= single_op_read_state;
2004
 
2005
                                 -- acca / accb inherent instructions
2006
                  when "0001" =>
2007
               accb_ctrl  <= latch_accb;
2008
               ix_ctrl    <= latch_ix;
2009
               iy_ctrl    <= latch_iy;
2010
               up_ctrl    <= latch_up;
2011
               iv_ctrl    <= latch_iv;
2012
                    case op_code(3 downto 0) is
2013
                                        --
2014
                                        -- Page2 pre byte
2015
                                        -- pre=(pc) / pc=pc+1
2016
                                        -- op=(pc) / pc=pc+1
2017
                                        --
2018
                         when "0000" => -- page2
2019
                                op_ctrl    <= fetch_op;
2020
                                          acca_ctrl  <= latch_acca;
2021
                                          --
2022
                                          left_ctrl  <= pc_left;
2023
                      right_ctrl <= zero_right;
2024
                                          alu_ctrl   <= alu_nop;
2025
                 cc_ctrl    <= latch_cc;
2026
                 sp_ctrl    <= latch_sp;
2027
                                          -- advance pc
2028
                 pc_ctrl    <= incr_pc;
2029
                                          --
2030
                                     st_ctrl      <= idle_st;
2031
                                     return_state <= fetch_state;
2032
                                          next_state   <= decode2_state;
2033
 
2034
                                        --
2035
                                        -- Page3 pre byte
2036
                                        -- pre=(pc) / pc=pc+1
2037
                                        -- op=(pc) / pc=pc+1
2038
                                        --
2039
                         when "0001" => -- page3
2040
                                op_ctrl    <= fetch_op;
2041
                                          acca_ctrl  <= latch_acca;
2042
                                          -- idle ALU
2043
                                          left_ctrl  <= pc_left;
2044
                      right_ctrl <= zero_right;
2045
                                          alu_ctrl   <= alu_nop;
2046
                 cc_ctrl    <= latch_cc;
2047
                 sp_ctrl    <= latch_sp;
2048
                                          -- advance pc
2049
                 pc_ctrl    <= incr_pc;
2050
                                          -- Next state
2051
                                     st_ctrl      <= idle_st;
2052
                                     return_state <= fetch_state;
2053
                                          next_state   <= decode3_state;
2054
 
2055
                                        --
2056
                                        -- nop - No operation ( 1 byte )
2057
                                        -- 6809 => 2 cycles
2058
                                        -- cpu09 => 2 cycles
2059
                                        -- 1 op=(pc) / pc=pc+1
2060
                                        -- 2 decode
2061
                                        -- 
2062
                         when "0010" => -- nop
2063
                                op_ctrl    <= latch_op;
2064
                                          acca_ctrl  <= latch_acca;
2065
                                          --
2066
                                          left_ctrl  <= acca_left;
2067
                      right_ctrl <= zero_right;
2068
                                          alu_ctrl   <= alu_nop;
2069
                 cc_ctrl    <= latch_cc;
2070
                 sp_ctrl    <= latch_sp;
2071
                                          --
2072
                 pc_ctrl    <= latch_pc;
2073
                                          --
2074
                                     st_ctrl      <= idle_st;
2075
                                     return_state <= fetch_state;
2076
                                          next_state   <= fetch_state;
2077
 
2078
                                        --
2079
                                        -- sync - halt execution until an interrupt is received
2080
                                        -- interrupt may be NMI, IRQ or FIRQ
2081
                                        -- program execution continues if the 
2082
                                        -- interrupt is asserted for 3 clock cycles
2083
                                        -- note that registers are not pushed onto the stack
2084
                                        -- CPU09 => Interrupts need only be asserted for one clock cycle
2085
                                        --
2086
                         when "0011" => -- sync
2087
                                op_ctrl    <= latch_op;
2088
                                          acca_ctrl  <= latch_acca;
2089
                                          --
2090
                                          left_ctrl  <= acca_left;
2091
                      right_ctrl <= zero_right;
2092
                                          alu_ctrl   <= alu_nop;
2093
                 cc_ctrl    <= latch_cc;
2094
                 sp_ctrl    <= latch_sp;
2095
                                          --
2096
                 pc_ctrl    <= latch_pc;
2097
                                          --
2098
                                     st_ctrl      <= idle_st;
2099
                                     return_state <= fetch_state;
2100
                                          next_state   <= sync_state;
2101
 
2102
                                        --
2103
                                        -- lbra -- long branch (3 bytes)
2104
                                        -- 6809 => 5 cycles
2105
                                        -- cpu09 => 4 cycles
2106
                                        -- 1 op=(pc) / pc=pc+1
2107
                                        -- 2 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1
2108
                                        -- 3 md_hi=md_lo / md_lo=(pc) / pc=pc+1
2109
                                        -- 4 pc=pc+md
2110
                                        --
2111
                         when "0110" =>
2112
                                op_ctrl    <= latch_op;
2113
                                          acca_ctrl  <= latch_acca;
2114
                                          -- idle ALU
2115
                 left_ctrl  <= pc_left;
2116
                 right_ctrl <= zero_right;
2117
                 alu_ctrl   <= alu_nop;
2118
                                          cc_ctrl    <= latch_cc;
2119
                 sp_ctrl    <= latch_sp;
2120
                                          -- increment the pc
2121
                 pc_ctrl    <= incr_pc;
2122
                                          --
2123
                                     st_ctrl      <= idle_st;
2124
                                     return_state <= fetch_state;
2125
                                          next_state   <= lbranch_state;
2126
 
2127
                                        --
2128
                                        -- lbsr - long branch to subroutine (3 bytes)
2129
                                        -- 6809 => 9 cycles
2130
                                        -- cpu09 => 6 cycles
2131
                                        -- 1 op=(pc) /pc=pc+1
2132
                                        -- 2 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1 / sp=sp-1
2133
                                        -- 3 md_hi=md_lo / md_lo=(pc) / pc=pc+1
2134
                                        -- 4 (sp)= pc_lo / sp=sp-1 / pc=pc
2135
                                        -- 5 (sp)=pc_hi / pc=pc
2136
                                        -- 6 pc=pc+md
2137
                                        --
2138
                         when "0111" =>
2139
                                op_ctrl    <= latch_op;
2140
                                          acca_ctrl  <= latch_acca;
2141
                                          -- pre decrement sp
2142
                 left_ctrl  <= sp_left;
2143
                 right_ctrl <= one_right;
2144
                 alu_ctrl   <= alu_sub16;
2145
                                          cc_ctrl    <= latch_cc;
2146
                 sp_ctrl    <= load_sp;
2147
                                          -- increment the pc
2148
                 pc_ctrl    <= incr_pc;
2149
                                          --
2150
                                     st_ctrl      <= idle_st;
2151
                                     return_state <= fetch_state;
2152
                                          next_state   <= lbranch_state;
2153
 
2154
                         when "1001" => -- daa
2155
                                op_ctrl    <= latch_op;
2156
                                          --
2157
                                          left_ctrl  <= acca_left;
2158
                      right_ctrl <= accb_right;
2159
                                          alu_ctrl   <= alu_daa;
2160
                 cc_ctrl    <= load_cc;
2161
                                          acca_ctrl  <= load_acca;
2162
                 sp_ctrl    <= latch_sp;
2163
                                          -- idle pc
2164
                 pc_ctrl    <= latch_pc;
2165
                                          --
2166
                                     st_ctrl      <= idle_st;
2167
                                     return_state <= fetch_state;
2168
                                          next_state   <= fetch_state;
2169
 
2170
                         when "1010" => -- orcc
2171
                                op_ctrl    <= latch_op;
2172
                                          acca_ctrl  <= latch_acca;
2173
                                          -- idle ALU
2174
                 left_ctrl  <= pc_left;
2175
                 right_ctrl <= zero_right;
2176
                 alu_ctrl   <= alu_nop;
2177
                                          cc_ctrl    <= latch_cc;
2178
                 sp_ctrl    <= latch_sp;
2179
                                          -- increment the pc
2180
                 pc_ctrl    <= incr_pc;
2181
                                          -- next state
2182
                                     st_ctrl      <= push_st;
2183
                                     return_state <= fetch_state;
2184
                                          next_state   <= orcc_state;
2185
 
2186
                         when "1100" => -- andcc
2187
                                op_ctrl    <= latch_op;
2188
                                          acca_ctrl  <= latch_acca;
2189
                                          -- idle ALU
2190
                 left_ctrl  <= pc_left;
2191
                 right_ctrl <= zero_right;
2192
                 alu_ctrl   <= alu_nop;
2193
                                          cc_ctrl    <= latch_cc;
2194
                 sp_ctrl    <= latch_sp;
2195
                                          -- increment the pc
2196
                 pc_ctrl    <= incr_pc;
2197
                                          --
2198
                                     st_ctrl      <= push_st;
2199
                                     return_state <= fetch_state;
2200
                                          next_state   <= andcc_state;
2201
 
2202
                         when "1101" => -- sex
2203
                                op_ctrl    <= latch_op;
2204
                                          -- have sex
2205
                 left_ctrl  <= accb_left;
2206
                 right_ctrl <= zero_right;
2207
                 alu_ctrl   <= alu_sex;
2208
                                          cc_ctrl    <= load_cc;
2209
                                          acca_ctrl  <= load_hi_acca;
2210
                 sp_ctrl    <= latch_sp;
2211
                                          -- idle PC
2212
                 pc_ctrl    <= latch_pc;
2213
                                          --
2214
                                     st_ctrl      <= idle_st;
2215
                                     return_state <= fetch_state;
2216
                                          next_state   <= fetch_state;
2217
 
2218
                         when "1110" => -- exg
2219
                                op_ctrl    <= latch_op;
2220
                                          acca_ctrl  <= latch_acca;
2221
                                          -- idle ALU
2222
                 left_ctrl  <= pc_left;
2223
                 right_ctrl <= zero_right;
2224
                 alu_ctrl   <= alu_nop;
2225
                                          cc_ctrl    <= latch_cc;
2226
                 sp_ctrl    <= latch_sp;
2227
                                          -- increment the pc
2228
                 pc_ctrl    <= incr_pc;
2229
                                          --
2230
                                     st_ctrl      <= idle_st;
2231
                                     return_state <= fetch_state;
2232
                                          next_state   <= exg_state;
2233
 
2234
                         when "1111" => -- tfr
2235
                                op_ctrl    <= latch_op;
2236
                                          acca_ctrl  <= latch_acca;
2237
                                          -- idle ALU
2238
                 left_ctrl  <= pc_left;
2239
                 right_ctrl <= zero_right;
2240
                 alu_ctrl   <= alu_nop;
2241
                                          cc_ctrl    <= latch_cc;
2242
                 sp_ctrl    <= latch_sp;
2243
                                          -- increment the pc
2244
                 pc_ctrl    <= incr_pc;
2245
                                          -- call transfer as a subroutine
2246
                                     st_ctrl      <= push_st;
2247
                                     return_state <= fetch_state;
2248
                                          next_state   <= tfr_state;
2249
 
2250
                         when others =>
2251
                                op_ctrl    <= latch_op;
2252
                                          acca_ctrl  <= latch_acca;
2253
                                          -- idle ALU
2254
                 left_ctrl  <= pc_left;
2255
                 right_ctrl <= zero_right;
2256
                 alu_ctrl   <= alu_nop;
2257
                                          cc_ctrl    <= latch_cc;
2258
                 sp_ctrl    <= latch_sp;
2259
                                          -- increment the pc
2260
                 pc_ctrl    <= incr_pc;
2261
                                          --
2262
                                     st_ctrl      <= idle_st;
2263
                                     return_state <= fetch_state;
2264
                                          next_state   <= fetch_state;
2265
                         end case;
2266
             --
2267
                                 -- Short branch conditional
2268
                                 -- 6809 => always 3 cycles
2269
                                 -- cpu09 => always = 3 cycles
2270
                                 -- 1 op=(pc) / pc=pc+1
2271
                                 -- 2 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1 / test cc
2272
                                 -- 3 if cc tru pc=pc+md else pc=pc
2273
                                 --
2274
                  when "0010" => -- branch conditional
2275
                              op_ctrl    <= latch_op;
2276
                                        acca_ctrl  <= latch_acca;
2277
               accb_ctrl  <= latch_accb;
2278
               ix_ctrl    <= latch_ix;
2279
               iy_ctrl    <= latch_iy;
2280
               sp_ctrl    <= latch_sp;
2281
               up_ctrl    <= latch_up;
2282
               iv_ctrl    <= latch_iv;
2283
                                        -- idle ALU
2284
               left_ctrl  <= pc_left;
2285
               right_ctrl <= one_right;
2286
               alu_ctrl   <= alu_add16;
2287
                                        cc_ctrl    <= latch_cc;
2288
                                        -- increment the pc
2289
               pc_ctrl    <= incr_pc;
2290
                                        --
2291
                                   st_ctrl      <= idle_st;
2292
                                   return_state <= fetch_state;
2293
               next_state   <= sbranch_state;
2294
                                 --
2295
                                 -- Single byte stack operators
2296
                                 -- Do not advance PC
2297
                                 --
2298
                  when "0011" =>
2299
                              op_ctrl    <= latch_op;
2300
                                        acca_ctrl  <= latch_acca;
2301
               accb_ctrl  <= latch_accb;
2302
                                        --
2303
                                        -- lea - load effective address (2+ bytes)
2304
                                        -- 6809 => 4 cycles + addressing mode
2305
                                        -- cpu09 => 4 cycles + addressing mode
2306
                                        -- 1 op=(pc) / pc=pc+1
2307
                                        -- 2 md_lo=(pc) / pc=pc+1
2308
                                        -- 3 calculate ea
2309
                                        -- 4 ix/iy/sp/up = ea
2310
                                        --
2311
                    case op_code(3 downto 0) is
2312
                         when "0000" |  -- leax
2313
                              "0001" |  -- leay
2314
                              "0010" |  -- leas
2315
                              "0011" => -- leau
2316
                            left_ctrl  <= pc_left;
2317
                            right_ctrl <= one_right;
2318
                                                alu_ctrl   <= alu_add16;
2319
                                           cc_ctrl    <= latch_cc;
2320
                                                -- advance PC
2321
                  pc_ctrl    <= incr_pc;
2322
                                                --
2323
                                                ix_ctrl    <= latch_ix;
2324
                                      iy_ctrl    <= latch_iy;
2325
                                                sp_ctrl    <= latch_sp;
2326
                  up_ctrl    <= latch_up;
2327
                  iv_ctrl    <= latch_iv;
2328
                                                --
2329
                                      st_ctrl      <= push_st;
2330
                                      return_state <= lea_state;
2331
                                                next_state   <= indexed_state;
2332
 
2333
                                        --
2334
                                        -- pshs - push registers onto sp stack
2335
                                        -- 6809 => 5 cycles + registers
2336
                                        -- cpu09 => 3 cycles + registers
2337
                                        --  1 op=(pc) / pc=pc+1
2338
                                        --  2 ea_lo=(pc) / pc=pc+1 
2339
                                        --  3 if ea(7 downto 0) != "00000000" then sp=sp-1
2340
                                        --  4 if ea(7) = 1 (sp)=pcl, sp=sp-1
2341
                                        --  5 if ea(7) = 1 (sp)=pch
2342
                                        --    if ea(6 downto 0) != "0000000" then sp=sp-1
2343
                                        --  6 if ea(6) = 1 (sp)=upl, sp=sp-1
2344
                                        --  7 if ea(6) = 1 (sp)=uph
2345
                                        --    if ea(5 downto 0) != "000000" then sp=sp-1
2346
                                        --  8 if ea(5) = 1 (sp)=iyl, sp=sp-1
2347
                                        --  9 if ea(5) = 1 (sp)=iyh
2348
                                        --    if ea(4 downto 0) != "00000" then sp=sp-1
2349
                                        -- 10 if ea(4) = 1 (sp)=ixl, sp=sp-1
2350
                                        -- 11 if ea(4) = 1 (sp)=ixh
2351
                                        --    if ea(3 downto 0) != "0000" then sp=sp-1
2352
                                        -- 12 if ea(3) = 1 (sp)=dp
2353
                                        --    if ea(2 downto 0) != "000" then sp=sp-1
2354
                                        -- 13 if ea(2) = 1 (sp)=accb
2355
                                        --    if ea(1 downto 0) != "00" then sp=sp-1
2356
                                        -- 14 if ea(1) = 1 (sp)=acca
2357
                                        --    if ea(0 downto 0) != "0" then sp=sp-1
2358
                                        -- 15 if ea(0) = 1 (sp)=cc
2359
                                        --
2360
                         when "0100" => -- pshs
2361
                                           --
2362
                            left_ctrl  <= sp_left;
2363
                            right_ctrl <= one_right;
2364
                                                alu_ctrl   <= alu_nop;
2365
                                           cc_ctrl    <= latch_cc;
2366
                                                -- advance PC
2367
                  pc_ctrl    <= incr_pc;
2368
                                                --
2369
                                                ix_ctrl    <= latch_ix;
2370
                                      iy_ctrl    <= latch_iy;
2371
                                                sp_ctrl    <= latch_sp;
2372
                  up_ctrl    <= latch_up;
2373
                  iv_ctrl    <= latch_iv;
2374
                                                --
2375
                                      st_ctrl      <= idle_st;
2376
                                      return_state <= fetch_state;
2377
                                                next_state   <= pshs_state;
2378
 
2379
                                        --
2380
                                        -- puls - pull registers of sp stack
2381
                                        -- 6809 => 5 cycles + registers
2382
                                        -- cpu09 => 3 cycles + registers
2383
                                        --
2384
                         when "0101" => -- puls
2385
                  left_ctrl  <= pc_left;
2386
                  right_ctrl <= one_right;
2387
                  alu_ctrl   <= alu_add16;
2388
                                           cc_ctrl    <= latch_cc;
2389
                                                -- advance PC
2390
                  pc_ctrl    <= incr_pc;
2391
                                                --
2392
                                                ix_ctrl    <= latch_ix;
2393
                                      iy_ctrl    <= latch_iy;
2394
                  sp_ctrl    <= latch_sp;
2395
                  up_ctrl    <= latch_up;
2396
                  iv_ctrl    <= latch_iv;
2397
                                                --
2398
                                      st_ctrl      <= idle_st;
2399
                                      return_state <= fetch_state;
2400
                                                next_state   <= puls_state;
2401
 
2402
                                        --
2403
                                        -- pshu - push registers onto up stack
2404
                                        -- 6809 => 5 cycles + registers
2405
                                        -- cpu09 => 3 cycles + registers
2406
                                        --
2407
                         when "0110" => -- pshu
2408
                                           -- idle UP
2409
                            left_ctrl  <= up_left;
2410
                            right_ctrl <= one_right;
2411
                                                alu_ctrl   <= alu_nop;
2412
                                           cc_ctrl    <= latch_cc;
2413
                                                -- advance PC
2414
                  pc_ctrl    <= incr_pc;
2415
                                                --
2416
                                                ix_ctrl    <= latch_ix;
2417
                                      iy_ctrl    <= latch_iy;
2418
                                                sp_ctrl    <= latch_sp;
2419
                  up_ctrl    <= latch_up;
2420
                  iv_ctrl    <= latch_iv;
2421
                                                --
2422
                                      st_ctrl      <= idle_st;
2423
                                      return_state <= fetch_state;
2424
                                                next_state   <= pshu_state;
2425
 
2426
                                        --
2427
                                        -- pulu - pull registers of up stack
2428
                                        -- 6809 => 5 cycles + registers
2429
                                        -- cpu09 => 3 cycles + registers
2430
                                        --
2431
                         when "0111" => -- pulu
2432
                  left_ctrl  <= pc_left;
2433
                  right_ctrl <= one_right;
2434
                  alu_ctrl   <= alu_add16;
2435
                                           cc_ctrl    <= latch_cc;
2436
                                                -- advance PC
2437
                  pc_ctrl    <= incr_pc;
2438
                                                --
2439
                                                ix_ctrl    <= latch_ix;
2440
                                      iy_ctrl    <= latch_iy;
2441
                  sp_ctrl    <= latch_sp;
2442
                  up_ctrl    <= latch_up;
2443
                  iv_ctrl    <= latch_iv;
2444
                                                --
2445
                                      st_ctrl    <= idle_st;
2446
                                      return_state <= fetch_state;
2447
                                                next_state <= pulu_state;
2448
 
2449
                                        --
2450
                                        -- rts - return from subroutine
2451
                                        -- 6809 => 5 cycles
2452
                                        -- cpu09 => 4 cycles 
2453
                                        -- 1 op=(pc) / pc=pc+1
2454
                                        -- 2 decode op
2455
                                        -- 3 pc_hi = (sp) / sp=sp+1
2456
                                        -- 4 pc_lo = (sp) / sp=sp+1
2457
                                        --
2458
                         when "1001" =>
2459
                  left_ctrl  <= sp_left;
2460
                  right_ctrl <= zero_right;
2461
                  alu_ctrl   <= alu_nop;
2462
                                           cc_ctrl    <= latch_cc;
2463
                                                -- idle PC
2464
                  pc_ctrl    <= latch_pc;
2465
                                                --
2466
                                                ix_ctrl    <= latch_ix;
2467
                                      iy_ctrl    <= latch_iy;
2468
                  sp_ctrl    <= latch_sp;
2469
                  up_ctrl    <= latch_up;
2470
                  iv_ctrl    <= latch_iv;
2471
                                                --
2472
                                      st_ctrl    <= push_st;
2473
                                      return_state <= fetch_state;
2474
                                                next_state <= pull_return_hi_state;
2475
 
2476
                                        --
2477
                                        -- abx - add accb to index register
2478
                                        -- 6809 => 3 cycles
2479
                                        -- cpu09 => 2 cycles
2480
                                        -- 1 op=(pc) / pc=pc+1
2481
                                        -- 2 alu_left=ix / alu_right=accb / ix=alu_out / pc=pc
2482
                                        --
2483
                         when "1010" => -- abx
2484
                            left_ctrl  <= ix_left;
2485
                            right_ctrl <= accb_right;
2486
                                                alu_ctrl   <= alu_add16;
2487
                                           cc_ctrl    <= latch_cc;
2488
                                                ix_ctrl    <= load_ix;
2489
                                                --
2490
                  pc_ctrl    <= latch_pc;
2491
                                      iy_ctrl    <= latch_iy;
2492
                  sp_ctrl    <= latch_sp;
2493
                  up_ctrl    <= latch_up;
2494
                  iv_ctrl    <= latch_iv;
2495
                                                --
2496
                                      st_ctrl    <= idle_st;
2497
                                      return_state <= fetch_state;
2498
                                                next_state <= fetch_state;
2499
 
2500
                         when "1011" => -- rti
2501
                                           -- idle ALU
2502
                  left_ctrl  <= sp_left;
2503
                  right_ctrl <= zero_right;
2504
                  alu_ctrl   <= alu_nop;
2505
                                           cc_ctrl    <= latch_cc;
2506
                                                --
2507
                  pc_ctrl    <= latch_pc;
2508
                                                ix_ctrl    <= latch_ix;
2509
                                      iy_ctrl    <= latch_iy;
2510
                  sp_ctrl    <= latch_sp;
2511
                  up_ctrl    <= latch_up;
2512
                  iv_ctrl    <= latch_iv;
2513
                                                --
2514
                                      st_ctrl    <= idle_st;
2515
                                      return_state <= fetch_state;
2516
                                                next_state <= rti_cc_state;
2517
 
2518
                         when "1100" => -- cwai
2519
                                           -- pre decrement sp
2520
                            left_ctrl  <= sp_left;
2521
                            right_ctrl <= one_right;
2522
                                                alu_ctrl   <= alu_sub16;
2523
                                           cc_ctrl    <= latch_cc;
2524
                                                sp_ctrl    <= load_sp;
2525
                                                --
2526
                  pc_ctrl    <= latch_pc;
2527
                                                ix_ctrl    <= latch_ix;
2528
                                      iy_ctrl    <= latch_iy;
2529
                  up_ctrl    <= latch_up;
2530
                  iv_ctrl    <= latch_iv;
2531
                                                --
2532
                                      st_ctrl    <= idle_st;
2533
                                      return_state <= int_entire_state; -- set entire flag
2534
                                                next_state <= andcc_state;
2535
 
2536
                         when "1101" => -- mul
2537
                            left_ctrl  <= acca_left;
2538
                            right_ctrl <= zero_right;
2539
                                                alu_ctrl   <= alu_nop;
2540
                                           cc_ctrl    <= latch_cc;
2541
                                                --
2542
                  pc_ctrl    <= latch_pc;
2543
                                                ix_ctrl    <= latch_ix;
2544
                                      iy_ctrl    <= latch_iy;
2545
                                                sp_ctrl    <= latch_sp;
2546
                  up_ctrl    <= latch_up;
2547
                  iv_ctrl    <= latch_iv;
2548
                                                --
2549
                                      st_ctrl    <= idle_st;
2550
                                      return_state <= fetch_state;
2551
                                                next_state <= mul_state;
2552
 
2553
                         when "1111" => -- swi
2554
                                           -- predecrement SP
2555
                            left_ctrl  <= sp_left;
2556
                            right_ctrl <= one_right;
2557
                                                alu_ctrl   <= alu_sub16;
2558
                                           cc_ctrl    <= latch_cc;
2559
                                                sp_ctrl    <= load_sp;
2560
                                                --
2561
                  pc_ctrl    <= latch_pc;
2562
                                                ix_ctrl    <= latch_ix;
2563
                                      iy_ctrl    <= latch_iy;
2564
                  up_ctrl    <= latch_up;
2565
                  iv_ctrl    <= swi_iv;
2566
                                                --
2567
                                      st_ctrl      <= idle_st;
2568
                                      return_state <= fetch_state;
2569
                                                next_state   <= int_entire_state;
2570
 
2571
                         when others =>
2572
                                           -- idle ALU
2573
                            left_ctrl  <= pc_left;
2574
                            right_ctrl <= zero_right;
2575
                                                alu_ctrl   <= alu_nop;
2576
                                           cc_ctrl    <= latch_cc;
2577
                                                -- idle PC
2578
                  pc_ctrl    <= latch_pc;
2579
                                                --
2580
                                                ix_ctrl    <= latch_ix;
2581
                                      iy_ctrl    <= latch_iy;
2582
                                                sp_ctrl    <= latch_sp;
2583
                  up_ctrl    <= latch_up;
2584
                  iv_ctrl    <= latch_iv;
2585
                                                --
2586
                                      st_ctrl    <= idle_st;
2587
                                      return_state <= fetch_state;
2588
                                                next_state <= fetch_state;
2589
 
2590
                         end case;
2591
                                 --
2592
                                 -- Accumulator A Single operand
2593
                                 -- source = acca, dest = acca
2594
                                 -- Do not advance PC
2595
                                 -- Typically 2 cycles 1 bytes
2596
                                 -- 1 opcode fetch
2597
                                 -- 2 post byte fetch / instruction decode
2598
                                 -- Note that there is no post byte
2599
                                 -- so do not advance PC in decode cycle
2600
                                 -- Re-run opcode fetch cycle after decode
2601
                                 -- 
2602
                  when "0100" => -- acca single op
2603
                              op_ctrl    <= latch_op;
2604
               accb_ctrl  <= latch_accb;
2605
               pc_ctrl    <= latch_pc;
2606
                                   ix_ctrl    <= latch_ix;
2607
               iy_ctrl    <= latch_iy;
2608
               up_ctrl    <= latch_up;
2609
                                   sp_ctrl    <= latch_sp;
2610
               iv_ctrl    <= latch_iv;
2611
                         left_ctrl  <= acca_left;
2612
                    case op_code(3 downto 0) is
2613
                         when "0000" => -- neg
2614
                                          right_ctrl <= zero_right;
2615
                                          alu_ctrl   <= alu_neg;
2616
                                          acca_ctrl  <= load_acca;
2617
                                          cc_ctrl    <= load_cc;
2618
                    when "0011" => -- com
2619
                           right_ctrl <= zero_right;
2620
                                          alu_ctrl   <= alu_com;
2621
                                          acca_ctrl  <= load_acca;
2622
                                          cc_ctrl    <= load_cc;
2623
                         when "0100" => -- lsr
2624
                           right_ctrl <= zero_right;
2625
                                          alu_ctrl   <= alu_lsr8;
2626
                                          acca_ctrl  <= load_acca;
2627
                                          cc_ctrl    <= load_cc;
2628
                         when "0110" => -- ror
2629
                           right_ctrl <= zero_right;
2630
                                          alu_ctrl   <= alu_ror8;
2631
                                          acca_ctrl  <= load_acca;
2632
                                          cc_ctrl    <= load_cc;
2633
                         when "0111" => -- asr
2634
                           right_ctrl <= zero_right;
2635
                                          alu_ctrl   <= alu_asr8;
2636
                                          acca_ctrl  <= load_acca;
2637
                                          cc_ctrl    <= load_cc;
2638
                         when "1000" => -- asl
2639
                           right_ctrl <= zero_right;
2640
                                          alu_ctrl   <= alu_asl8;
2641
                                          acca_ctrl  <= load_acca;
2642
                                          cc_ctrl    <= load_cc;
2643
                         when "1001" => -- rol
2644
                           right_ctrl <= zero_right;
2645
                                          alu_ctrl   <= alu_rol8;
2646
                                          acca_ctrl  <= load_acca;
2647
                                          cc_ctrl    <= load_cc;
2648
                         when "1010" => -- dec
2649
                           right_ctrl <= one_right;
2650
                                          alu_ctrl   <= alu_dec;
2651
                                          acca_ctrl  <= load_acca;
2652
                                          cc_ctrl    <= load_cc;
2653
                         when "1011" => -- undefined
2654
                           right_ctrl <= zero_right;
2655
                                          alu_ctrl   <= alu_nop;
2656
                                          acca_ctrl  <= latch_acca;
2657
                                          cc_ctrl    <= latch_cc;
2658
                         when "1100" => -- inc
2659
                           right_ctrl <= one_right;
2660
                                          alu_ctrl   <= alu_inc;
2661
                                          acca_ctrl  <= load_acca;
2662
                                          cc_ctrl    <= load_cc;
2663
                         when "1101" => -- tst
2664
                           right_ctrl <= zero_right;
2665
                                          alu_ctrl   <= alu_st8;
2666
                                          acca_ctrl  <= latch_acca;
2667
                                          cc_ctrl    <= load_cc;
2668
                         when "1110" => -- jmp
2669
                           right_ctrl <= zero_right;
2670
                                          alu_ctrl   <= alu_nop;
2671
                                          acca_ctrl  <= latch_acca;
2672
                                          cc_ctrl    <= latch_cc;
2673
                         when "1111" => -- clr
2674
                           right_ctrl <= zero_right;
2675
                                          alu_ctrl   <= alu_ld8;
2676
                                          acca_ctrl  <= load_acca;
2677
                                          cc_ctrl    <= load_cc;
2678
                         when others =>
2679
                           right_ctrl <= zero_right;
2680
                                          alu_ctrl   <= alu_nop;
2681
                                          acca_ctrl  <= latch_acca;
2682
                                          cc_ctrl    <= latch_cc;
2683
                         end case;
2684
                                   st_ctrl    <= idle_st;
2685
                                   return_state <= fetch_state;
2686
                                   next_state <= fetch_state;
2687
                                 --
2688
                                 -- Single Operand accb
2689
                                 -- source = accb, dest = accb
2690
                                 -- Typically 2 cycles 1 bytes
2691
                                 -- 1 opcode fetch
2692
                                 -- 2 post byte fetch / instruction decode
2693
                                 -- Note that there is no post byte
2694
                                 -- so do not advance PC in decode cycle
2695
                                 -- Re-run opcode fetch cycle after decode
2696
                                 --
2697
                  when "0101" =>
2698
                              op_ctrl    <= latch_op;
2699
               acca_ctrl  <= latch_acca;
2700
               pc_ctrl    <= latch_pc;
2701
                                   ix_ctrl    <= latch_ix;
2702
               iy_ctrl    <= latch_iy;
2703
               up_ctrl    <= latch_up;
2704
                                   sp_ctrl    <= latch_sp;
2705
               iv_ctrl    <= latch_iv;
2706
                         left_ctrl  <= accb_left;
2707
                    case op_code(3 downto 0) is
2708
                         when "0000" => -- neg
2709
                                          right_ctrl <= zero_right;
2710
                                          alu_ctrl   <= alu_neg;
2711
                                          accb_ctrl  <= load_accb;
2712
                                          cc_ctrl    <= load_cc;
2713
                    when "0011" => -- com
2714
                           right_ctrl <= zero_right;
2715
                                          alu_ctrl   <= alu_com;
2716
                                          accb_ctrl  <= load_accb;
2717
                                          cc_ctrl    <= load_cc;
2718
                         when "0100" => -- lsr
2719
                           right_ctrl <= zero_right;
2720
                                          alu_ctrl   <= alu_lsr8;
2721
                                          accb_ctrl  <= load_accb;
2722
                                          cc_ctrl    <= load_cc;
2723
                         when "0110" => -- ror
2724
                           right_ctrl <= zero_right;
2725
                                          alu_ctrl   <= alu_ror8;
2726
                                          accb_ctrl  <= load_accb;
2727
                                          cc_ctrl    <= load_cc;
2728
                         when "0111" => -- asr
2729
                           right_ctrl <= zero_right;
2730
                                          alu_ctrl   <= alu_asr8;
2731
                                          accb_ctrl  <= load_accb;
2732
                                          cc_ctrl    <= load_cc;
2733
                         when "1000" => -- asl
2734
                           right_ctrl <= zero_right;
2735
                                          alu_ctrl   <= alu_asl8;
2736
                                          accb_ctrl  <= load_accb;
2737
                                          cc_ctrl    <= load_cc;
2738
                         when "1001" => -- rol
2739
                           right_ctrl <= zero_right;
2740
                                          alu_ctrl   <= alu_rol8;
2741
                                          accb_ctrl  <= load_accb;
2742
                                          cc_ctrl    <= load_cc;
2743
                         when "1010" => -- dec
2744
                           right_ctrl <= one_right;
2745
                                          alu_ctrl   <= alu_dec;
2746
                                          accb_ctrl  <= load_accb;
2747
                                          cc_ctrl    <= load_cc;
2748
                         when "1011" => -- undefined
2749
                           right_ctrl <= zero_right;
2750
                                          alu_ctrl   <= alu_nop;
2751
                                          accb_ctrl  <= latch_accb;
2752
                                          cc_ctrl    <= latch_cc;
2753
                         when "1100" => -- inc
2754
                           right_ctrl <= one_right;
2755
                                          alu_ctrl   <= alu_inc;
2756
                                          accb_ctrl  <= load_accb;
2757
                                          cc_ctrl    <= load_cc;
2758
                         when "1101" => -- tst
2759
                           right_ctrl <= zero_right;
2760
                                          alu_ctrl   <= alu_st8;
2761
                                          accb_ctrl  <= latch_accb;
2762
                                          cc_ctrl    <= load_cc;
2763
                         when "1110" => -- jmp
2764
                           right_ctrl <= zero_right;
2765
                                          alu_ctrl   <= alu_nop;
2766
                                          accb_ctrl  <= latch_accb;
2767
                                          cc_ctrl    <= latch_cc;
2768
                         when "1111" => -- clr
2769
                           right_ctrl <= zero_right;
2770
                                          alu_ctrl   <= alu_ld8;
2771
                                          accb_ctrl  <= load_accb;
2772
                                          cc_ctrl    <= load_cc;
2773
                         when others =>
2774
                           right_ctrl <= zero_right;
2775
                                          alu_ctrl   <= alu_nop;
2776
                                          accb_ctrl  <= latch_accb;
2777
                                          cc_ctrl    <= latch_cc;
2778
                         end case;
2779
                                   st_ctrl    <= idle_st;
2780
                                   return_state <= fetch_state;
2781
                                   next_state <= fetch_state;
2782
                                 --
2783
                                 -- Single operand indexed
2784
                                 -- Two byte instruction so advance PC
2785
                                 -- EA should hold index offset
2786
                                 --
2787
                  when "0110" => -- indexed single op
2788
                              op_ctrl    <= latch_op;
2789
               acca_ctrl  <= latch_acca;
2790
                                        accb_ctrl  <= latch_accb;
2791
                                   ix_ctrl    <= latch_ix;
2792
               iy_ctrl    <= latch_iy;
2793
               up_ctrl    <= latch_up;
2794
                                   sp_ctrl    <= latch_sp;
2795
               iv_ctrl    <= latch_iv;
2796
                                        -- idle ALU
2797
               left_ctrl  <= pc_left;
2798
               right_ctrl <= one_right;
2799
               alu_ctrl   <= alu_add16;
2800
                                        cc_ctrl    <= latch_cc;
2801
                                        -- increment the pc 
2802
               pc_ctrl    <= incr_pc;
2803
                                        -- next state
2804
                                        case op_code(3 downto 0) is
2805
                                   when "1110" => -- jmp
2806
                                     return_state <= jmp_state;
2807
                                        when "1111" => -- clr
2808
                                     return_state <= single_op_exec_state;
2809
                                        when others =>
2810
                                     return_state <= single_op_read_state;
2811
                                        end case;
2812
                                   st_ctrl    <= push_st;
2813
                                   next_state <= indexed_state;
2814
             --
2815
                                 -- Single operand extended addressing
2816
                                 -- three byte instruction so advance the PC
2817
                                 -- Low order EA holds high order address
2818
                                 --
2819
                  when "0111" => -- extended single op
2820
                              op_ctrl    <= latch_op;
2821
               acca_ctrl  <= latch_acca;
2822
                                        accb_ctrl  <= latch_accb;
2823
                                   ix_ctrl    <= latch_ix;
2824
               iy_ctrl    <= latch_iy;
2825
               up_ctrl    <= latch_up;
2826
                                   sp_ctrl    <= latch_sp;
2827
               iv_ctrl    <= latch_iv;
2828
                                        -- idle ALU
2829
               left_ctrl  <= pc_left;
2830
               right_ctrl <= one_right;
2831
               alu_ctrl   <= alu_add16;
2832
                                        cc_ctrl    <= latch_cc;
2833
                                        -- increment PC
2834
               pc_ctrl    <= incr_pc;
2835
                                        --
2836
                                        case op_code(3 downto 0) is
2837
                                   when "1110" => -- jmp
2838
                                     return_state <= jmp_state;
2839
                                        when "1111" => -- clr
2840
                                     return_state <= single_op_exec_state;
2841
                                        when others =>
2842
                                     return_state <= single_op_read_state;
2843
                                        end case;
2844
                                   st_ctrl    <= push_st;
2845
                                   next_state <= extended_state;
2846
 
2847
                  when "1000" => -- acca immediate
2848
                              op_ctrl    <= latch_op;
2849
               acca_ctrl  <= latch_acca;
2850
                                        accb_ctrl  <= latch_accb;
2851
                                   ix_ctrl    <= latch_ix;
2852
               iy_ctrl    <= latch_iy;
2853
               up_ctrl    <= latch_up;
2854
               iv_ctrl    <= latch_iv;
2855
                                   -- increment the pc
2856
               pc_ctrl    <= incr_pc;
2857
                                        case op_code(3 downto 0) is
2858
               when "0011" | -- subd #
2859
                                             "1100" | -- cmpx #
2860
                                             "1110" => -- ldx #
2861
                                          -- idle ALU
2862
                 left_ctrl  <= pc_left;
2863
                 right_ctrl <= zero_right;
2864
                 alu_ctrl   <= alu_add16;
2865
                                          cc_ctrl    <= latch_cc;
2866
                                     sp_ctrl    <= latch_sp;
2867
                                          --
2868
                                     st_ctrl      <= push_st;
2869
                                     return_state <= fetch_state;
2870
                                          next_state   <= imm16_state;
2871
 
2872
                                        --
2873
                                        -- bsr offset - Branch to subroutine (2 bytes)
2874
                                        -- 6809 => 7 cycles
2875
                                        -- cpu09 => 5 cycles
2876
                                        -- 1 op=(pc) / pc=pc+1
2877
                                   -- 2 md_hi=sign(pc) / md_lo=(pc) / sp=sp-1 / pc=pc+1
2878
                                        -- 3 (sp)=pc_lo / sp=sp-1
2879
                                        -- 4 (sp)=pc_hi
2880
                                        -- 5 pc=pc+md
2881
                                        --
2882
                                        when "1101" => -- bsr
2883
                                          -- pre decrement SP
2884
                 left_ctrl  <= sp_left;
2885
                 right_ctrl <= one_right;
2886
                 alu_ctrl   <= alu_sub16;
2887
                                          cc_ctrl    <= latch_cc;
2888
                                     sp_ctrl    <= load_sp;
2889
                                          --
2890
                                     st_ctrl      <= push_st;
2891
                                     return_state <= sbranch_state;
2892
                                          next_state   <= push_return_lo_state;
2893
 
2894
                                        when others =>
2895
                                          -- idle ALU
2896
                 left_ctrl  <= pc_left;
2897
                 right_ctrl <= zero_right;
2898
                 alu_ctrl   <= alu_add16;
2899
                                          cc_ctrl    <= latch_cc;
2900
                                     sp_ctrl    <= latch_sp;
2901
                                          --
2902
                                     st_ctrl      <= idle_st;
2903
                                     return_state <= fetch_state;
2904
                                     next_state   <= fetch_state;
2905
               end case;
2906
 
2907
                  when "1001" => -- acca direct
2908
                              op_ctrl    <= latch_op;
2909
               acca_ctrl  <= latch_acca;
2910
                                        accb_ctrl  <= latch_accb;
2911
                                   ix_ctrl    <= latch_ix;
2912
               iy_ctrl    <= latch_iy;
2913
               up_ctrl    <= latch_up;
2914
               iv_ctrl    <= latch_iv;
2915
                                        -- increment the pc
2916
               pc_ctrl    <= incr_pc;
2917
                                        case op_code(3 downto 0) is
2918
               when "0011" | -- subd
2919
                                             "1100" | -- cmpx
2920
                                             "1110" => -- ldx
2921
                                          -- idle ALU
2922
                 left_ctrl  <= pc_left;
2923
                 right_ctrl <= one_right;
2924
                 alu_ctrl   <= alu_add16;
2925
                                          cc_ctrl    <= latch_cc;
2926
                                     sp_ctrl    <= latch_sp;
2927
                                          --
2928
                                     st_ctrl      <= idle_st;
2929
                                     return_state <= fetch_state;
2930
                                     next_state   <= dual_op_read16_state;
2931
 
2932
                                        when "0111" =>  -- sta direct
2933
                                          -- idle ALU
2934
                 left_ctrl  <= acca_left;
2935
                 right_ctrl <= zero_right;
2936
                 alu_ctrl   <= alu_nop;
2937
                                          cc_ctrl    <= latch_cc;
2938
                                     sp_ctrl    <= latch_sp;
2939
                                          --
2940
                                     st_ctrl      <= idle_st;
2941
                                     return_state <= fetch_state;
2942
                                     next_state   <= dual_op_write8_state;
2943
 
2944
                                        when "1111" => -- stx direct
2945
                                          -- idle ALU
2946
                 left_ctrl  <= ix_left;
2947
                 right_ctrl <= zero_right;
2948
                 alu_ctrl   <= alu_nop;
2949
                                          cc_ctrl    <= latch_cc;
2950
                                     sp_ctrl    <= latch_sp;
2951
                                          --
2952
                                     st_ctrl      <= idle_st;
2953
                                     return_state <= fetch_state;
2954
                                     next_state   <= dual_op_write16_state;
2955
 
2956
                                        --
2957
                                        -- jsr direct - Jump to subroutine in direct page (2 bytes)
2958
                                        -- 6809 => 7 cycles
2959
                                        -- cpu09 => 5 cycles
2960
                                        -- 1 op=(pc) / pc=pc+1
2961
                                   -- 2 ea_hi=0 / ea_lo=(pc) / sp=sp-1 / pc=pc+1
2962
                                        -- 3 (sp)=pc_lo / sp=sp-1
2963
                                        -- 4 (sp)=pc_hi
2964
                                        -- 5 pc=ea
2965
                                        --
2966
                                        when "1101" => -- jsr direct
2967
                                          -- pre decrement sp
2968
                 left_ctrl  <= sp_left;
2969
                 right_ctrl <= one_right;
2970
                 alu_ctrl   <= alu_sub16;
2971
                                          cc_ctrl    <= latch_cc;
2972
                                     sp_ctrl    <= load_sp;
2973
                                          --
2974
                                     st_ctrl      <= push_st;
2975
                                     return_state <= jmp_state;
2976
                                          next_state   <= push_return_lo_state;
2977
 
2978
                                        when others =>
2979
                                          -- idle ALU
2980
                 left_ctrl  <= acca_left;
2981
                 right_ctrl <= zero_right;
2982
                 alu_ctrl   <= alu_nop;
2983
                                          cc_ctrl    <= latch_cc;
2984
                                     sp_ctrl    <= latch_sp;
2985
                                          --
2986
                                     st_ctrl      <= idle_st;
2987
                                     return_state <= fetch_state;
2988
                                     next_state   <= dual_op_read8_state;
2989
               end case;
2990
 
2991
                  when "1010" => -- acca indexed
2992
                              op_ctrl    <= latch_op;
2993
               acca_ctrl  <= latch_acca;
2994
                                        accb_ctrl  <= latch_accb;
2995
                                   ix_ctrl    <= latch_ix;
2996
               iy_ctrl    <= latch_iy;
2997
               up_ctrl    <= latch_up;
2998
               iv_ctrl    <= latch_iv;
2999
                                        -- increment the pc
3000
               pc_ctrl    <= incr_pc;
3001
                                        case op_code(3 downto 0) is
3002
               when "0011" | -- subd
3003
                                             "1100" | -- cmpx
3004
                                             "1110" => -- ldx
3005
                                          -- idle ALU
3006
                 left_ctrl  <= pc_left;
3007
                 right_ctrl <= zero_right;
3008
                 alu_ctrl   <= alu_add16;
3009
                                          cc_ctrl    <= latch_cc;
3010
                                     sp_ctrl    <= latch_sp;
3011
                                          --
3012
                                     st_ctrl    <= push_st;
3013
                                     return_state <= dual_op_read16_state;
3014
                                     next_state <= indexed_state;
3015
 
3016
                                        when "0111" =>  -- staa ,x
3017
                                          -- idle ALU
3018
                 left_ctrl  <= acca_left;
3019
                 right_ctrl <= zero_right;
3020
                 alu_ctrl   <= alu_nop;
3021
                                          cc_ctrl    <= latch_cc;
3022
                                     sp_ctrl    <= latch_sp;
3023
                                          --
3024
                                     st_ctrl      <= push_st;
3025
                                     return_state <= dual_op_write8_state;
3026
                                     next_state   <= indexed_state;
3027
 
3028
                                        when "1111" => -- stx ,x
3029
                                          -- idle ALU
3030
                 left_ctrl  <= ix_left;
3031
                 right_ctrl <= zero_right;
3032
                 alu_ctrl   <= alu_nop;
3033
                                          cc_ctrl    <= latch_cc;
3034
                                     sp_ctrl    <= latch_sp;
3035
                                          --
3036
                                     st_ctrl      <= push_st;
3037
                                     return_state <= dual_op_write16_state;
3038
                                     next_state   <= indexed_state;
3039
 
3040
                                        when "1101" => -- jsr ,x
3041
                                          -- pre decrement SP
3042
                 left_ctrl  <= sp_left;
3043
                 right_ctrl <= one_right;
3044
                 alu_ctrl   <= alu_sub16;
3045
                                          cc_ctrl    <= latch_cc;
3046
                                     sp_ctrl    <= load_sp;
3047
                                          --
3048
                                     st_ctrl      <= push_st;
3049
                                     return_state <= jsr_state;
3050
                                          next_state   <= indexed_state;
3051
 
3052
                                        when others =>
3053
                                          -- idle ALU
3054
                 left_ctrl  <= pc_left;
3055
                 right_ctrl <= one_right;
3056
                 alu_ctrl   <= alu_add16;
3057
                                          cc_ctrl    <= latch_cc;
3058
                                     sp_ctrl    <= latch_sp;
3059
                                          --
3060
                                     st_ctrl      <= push_st;
3061
                                     return_state <= dual_op_read8_state;
3062
                                     next_state   <= indexed_state;
3063
               end case;
3064
 
3065
             when "1011" => -- acca extended
3066
                              op_ctrl    <= latch_op;
3067
               acca_ctrl  <= latch_acca;
3068
                                        accb_ctrl  <= latch_accb;
3069
                                   ix_ctrl    <= latch_ix;
3070
               iy_ctrl    <= latch_iy;
3071
               up_ctrl    <= latch_up;
3072
               iv_ctrl    <= latch_iv;
3073
                                        -- increment the pc
3074
               pc_ctrl    <= incr_pc;
3075
                                        case op_code(3 downto 0) is
3076
               when "0011" | -- subd
3077
                                             "1100" | -- cmpx
3078
                                             "1110" => -- ldx
3079
                                          -- idle ALU
3080
                 left_ctrl  <= pc_left;
3081
                 right_ctrl <= one_right;
3082
                 alu_ctrl   <= alu_add16;
3083
                                          cc_ctrl    <= latch_cc;
3084
                                     sp_ctrl    <= latch_sp;
3085
                                          --
3086
                                     st_ctrl    <= push_st;
3087
                                     return_state <= dual_op_read16_state;
3088
                                     next_state <= extended_state;
3089
 
3090
                                        when "0111" =>  -- staa >
3091
                                          -- idle ALU
3092
                 left_ctrl  <= acca_left;
3093
                 right_ctrl <= zero_right;
3094
                 alu_ctrl   <= alu_nop;
3095
                                          cc_ctrl    <= latch_cc;
3096
                                     sp_ctrl    <= latch_sp;
3097
                                          --
3098
                                     st_ctrl      <= push_st;
3099
                                     return_state <= dual_op_write8_state;
3100
                                     next_state   <= extended_state;
3101
 
3102
                                        when "1111" => -- stx >
3103
                                          -- idle ALU
3104
                 left_ctrl  <= ix_left;
3105
                 right_ctrl <= zero_right;
3106
                 alu_ctrl   <= alu_nop;
3107
                                          cc_ctrl    <= latch_cc;
3108
                                     sp_ctrl    <= latch_sp;
3109
                                          --
3110
                                     st_ctrl      <= push_st;
3111
                                     return_state <= dual_op_write16_state;
3112
                                     next_state   <= extended_state;
3113
 
3114
                                        when "1101" => -- jsr >extended
3115
                                          -- pre decrement sp
3116
                 left_ctrl  <= sp_left;
3117
                 right_ctrl <= one_right;
3118
                 alu_ctrl   <= alu_sub16;
3119
                                          cc_ctrl    <= latch_cc;
3120
                                     sp_ctrl    <= load_sp;
3121
                                          --
3122
                                     st_ctrl      <= push_st;
3123
                                     return_state <= jsr_state;
3124
                                          next_state   <= extended_state;
3125
 
3126
                                        when others =>
3127
                                          -- idle ALU
3128
                 left_ctrl  <= acca_left;
3129
                 right_ctrl <= zero_right;
3130
                 alu_ctrl   <= alu_st8;
3131
                                          cc_ctrl    <= latch_cc;
3132
                                     sp_ctrl    <= latch_sp;
3133
                                          --
3134
                                     st_ctrl      <= push_st;
3135
                                     return_state <= dual_op_read8_state;
3136
                                     next_state   <= extended_state;
3137
               end case;
3138
 
3139
                  when "1100" => -- accb immediate
3140
                              op_ctrl    <= latch_op;
3141
               acca_ctrl  <= latch_acca;
3142
                                        accb_ctrl  <= latch_accb;
3143
                                   ix_ctrl    <= latch_ix;
3144
               iy_ctrl    <= latch_iy;
3145
               up_ctrl    <= latch_up;
3146
                                   sp_ctrl    <= latch_sp;
3147
               iv_ctrl    <= latch_iv;
3148
                                        --
3149
               left_ctrl  <= pc_left;
3150
               right_ctrl <= one_right;
3151
               alu_ctrl   <= alu_add16;
3152
                                        cc_ctrl    <= latch_cc;
3153
                                        -- increment the pc
3154
               pc_ctrl    <= incr_pc;
3155
                                        case op_code(3 downto 0) is
3156
               when "0011" | -- addd #
3157
                                             "1100" | -- ldd #
3158
                                             "1110" => -- ldu #
3159
                                     st_ctrl    <= push_st;
3160
                                     return_state <= fetch_state;
3161
                                          next_state <= imm16_state;
3162
 
3163
                                        when others =>
3164
                                     st_ctrl    <= idle_st;
3165
                                     return_state <= fetch_state;
3166
                                     next_state <= fetch_state;
3167
 
3168
               end case;
3169
 
3170
 
3171
                  when "1101" => -- accb direct
3172
                              op_ctrl    <= latch_op;
3173
               acca_ctrl  <= latch_acca;
3174
                                        accb_ctrl  <= latch_accb;
3175
                                   ix_ctrl    <= latch_ix;
3176
               iy_ctrl    <= latch_iy;
3177
               up_ctrl    <= latch_up;
3178
                                   sp_ctrl    <= latch_sp;
3179
               iv_ctrl    <= latch_iv;
3180
                                        -- increment the pc
3181
               pc_ctrl    <= incr_pc;
3182
                                        --
3183
               left_ctrl  <= pc_left;
3184
               right_ctrl <= zero_right;
3185
               alu_ctrl   <= alu_nop;
3186
                                        cc_ctrl    <= latch_cc;
3187
                                        --
3188
                                        case op_code(3 downto 0) is
3189
               when "0011" | -- addd
3190
                                             "1100" | -- ldd
3191
                                             "1110" => -- ldu
3192
                                     st_ctrl      <= idle_st;
3193
                                     return_state <= fetch_state;
3194
                                     next_state   <= dual_op_read16_state;
3195
 
3196
                                        when "0111" =>  -- stab direct
3197
                                     st_ctrl      <= idle_st;
3198
                                     return_state <= fetch_state;
3199
                                     next_state   <= dual_op_write8_state;
3200
 
3201
                                        when "1101" =>  -- std direct
3202
                                     st_ctrl      <= idle_st;
3203
                                     return_state <= fetch_state;
3204
                                     next_state   <= dual_op_write16_state;
3205
 
3206
                                        when "1111" => -- stu direct
3207
                                     st_ctrl      <= idle_st;
3208
                                     return_state <= fetch_state;
3209
                                     next_state   <= dual_op_write16_state;
3210
 
3211
                                        when others =>
3212
                                     st_ctrl      <= idle_st;
3213
                                     return_state <= fetch_state;
3214
                                     next_state   <= dual_op_read8_state;
3215
               end case;
3216
 
3217
                  when "1110" => -- accb indexed
3218
                              op_ctrl    <= latch_op;
3219
               acca_ctrl  <= latch_acca;
3220
                                        accb_ctrl  <= latch_accb;
3221
                                   ix_ctrl    <= latch_ix;
3222
               iy_ctrl    <= latch_iy;
3223
               up_ctrl    <= latch_up;
3224
                                   sp_ctrl    <= latch_sp;
3225
               iv_ctrl    <= latch_iv;
3226
                                        -- increment the pc
3227
               pc_ctrl    <= incr_pc;
3228
                                        --
3229
               left_ctrl  <= pc_left;
3230
               right_ctrl <= zero_right;
3231
               alu_ctrl   <= alu_nop;
3232
                                        cc_ctrl    <= latch_cc;
3233
                                        --
3234
                                        case op_code(3 downto 0) is
3235
               when "0011" | -- addd
3236
                                             "1100" | -- ldd
3237
                                             "1110" => -- ldu
3238
                                     st_ctrl    <= push_st;
3239
                                     return_state <= dual_op_read16_state;
3240
                                     next_state <= indexed_state;
3241
 
3242
                                        when "0111" =>  -- stab indexed
3243
                                     st_ctrl      <= push_st;
3244
                                     return_state <= dual_op_write8_state;
3245
                                     next_state   <= indexed_state;
3246
 
3247
                                        when "1101" =>  -- std indexed
3248
                                     st_ctrl      <= push_st;
3249
                                     return_state <= dual_op_write16_state;
3250
                                     next_state   <= indexed_state;
3251
 
3252
                                        when "1111" => -- stu indexed
3253
                                     st_ctrl      <= push_st;
3254
                                     return_state <= dual_op_write16_state;
3255
                                     next_state   <= indexed_state;
3256
 
3257
                                        when others =>
3258
                                     st_ctrl      <= push_st;
3259
                                     return_state <= dual_op_read8_state;
3260
                                     next_state   <= indexed_state;
3261
               end case;
3262
 
3263
             when "1111" => -- accb extended
3264
                              op_ctrl    <= latch_op;
3265
               acca_ctrl  <= latch_acca;
3266
                                        accb_ctrl  <= latch_accb;
3267
                                   ix_ctrl    <= latch_ix;
3268
               iy_ctrl    <= latch_iy;
3269
               up_ctrl    <= latch_up;
3270
                                   sp_ctrl    <= latch_sp;
3271
               iv_ctrl    <= latch_iv;
3272
                                        -- increment the pc
3273
               pc_ctrl    <= incr_pc;
3274
                                        --
3275
               left_ctrl  <= pc_left;
3276
               right_ctrl <= zero_right;
3277
               alu_ctrl   <= alu_nop;
3278
                                        cc_ctrl    <= latch_cc;
3279
                                          --
3280
                                        case op_code(3 downto 0) is
3281
               when "0011" | -- addd
3282
                                             "1100" | -- ldd
3283
                                             "1110" => -- ldu
3284
                                     st_ctrl      <= push_st;
3285
                                     return_state <= dual_op_read16_state;
3286
                                     next_state   <= extended_state;
3287
 
3288
                                        when "0111" =>  -- stab extended
3289
                                     st_ctrl      <= push_st;
3290
                                     return_state <= dual_op_write8_state;
3291
                                     next_state   <= extended_state;
3292
 
3293
                                        when "1101" =>  -- std extended
3294
                                     st_ctrl      <= push_st;
3295
                                     return_state <= dual_op_write16_state;
3296
                                     next_state   <= extended_state;
3297
 
3298
                                        when "1111" => -- stu  extended
3299
                                     st_ctrl      <= push_st;
3300
                                     return_state <= dual_op_write16_state;
3301
                                     next_state   <= extended_state;
3302
 
3303
                                        when others =>
3304
                                     st_ctrl      <= push_st;
3305
                                     return_state <= dual_op_read8_state;
3306
                                     next_state   <= extended_state;
3307
               end case;
3308
 
3309
                  when others =>
3310
                              op_ctrl    <= latch_op;
3311
               acca_ctrl  <= latch_acca;
3312
                                        accb_ctrl  <= latch_accb;
3313
                                   ix_ctrl    <= latch_ix;
3314
               iy_ctrl    <= latch_iy;
3315
               up_ctrl    <= latch_up;
3316
                                   sp_ctrl    <= latch_sp;
3317
               iv_ctrl    <= latch_iv;
3318
                                        -- idle the ALU
3319
               left_ctrl  <= pc_left;
3320
               right_ctrl <= zero_right;
3321
               alu_ctrl   <= alu_nop;
3322
                                        cc_ctrl    <= latch_cc;
3323
                                        -- idle the pc
3324
               pc_ctrl    <= latch_pc;
3325
                                        --
3326
                                   st_ctrl      <= idle_st;
3327
                                   return_state <= fetch_state;
3328
                         next_state   <= fetch_state;
3329
             end case;
3330
 
3331
                         --
3332
                         -- Here to decode prefix 2 instruction
3333
                         -- and fetch next byte of intruction
3334
                         -- whether it be necessary or not
3335
                         --
3336
          when decode2_state =>
3337
                            op_ctrl    <= latch_op;
3338
             pre_ctrl   <= latch_pre;
3339
                                 -- fetch first byte of address or immediate data
3340
             ea_ctrl    <= fetch_first_ea;
3341
                                 md_ctrl    <= fetch_first_md;
3342
             addr_ctrl  <= fetch_ad;
3343
             dout_ctrl  <= md_lo_dout;
3344
                                 nmi_ctrl   <= latch_nmi;
3345
             dp_ctrl    <= latch_dp;
3346
                            case op_code(7 downto 4) is
3347
                                 --
3348
                                 -- lbcc -- long branch conditional
3349
                                 -- 6809 => branch 6 cycles, no branch 5 cycles
3350
                                 -- cpu09 => always 5 cycles
3351
                                 -- 1 pre=(pc) / pc=pc+1
3352
                                 -- 2 op=(pc) / pc=pc+1
3353
                                 -- 3 md_hi=sign(pc) / md_lo=(pc) / pc=pc+1
3354
             -- 4 md_hi=md_lo / md_lo=(pc) / pc=pc+1
3355
                                 -- 5 if cond pc=pc+md else pc=pc
3356
                                 --
3357
                  when "0010" =>
3358
                                        acca_ctrl  <= latch_acca;
3359
               accb_ctrl  <= latch_accb;
3360
               ix_ctrl    <= latch_ix;
3361
               iy_ctrl    <= latch_iy;
3362
               sp_ctrl    <= latch_sp;
3363
               up_ctrl    <= latch_up;
3364
               iv_ctrl    <= latch_iv;
3365
                                        -- increment the pc
3366
               left_ctrl  <= pc_left;
3367
               right_ctrl <= zero_right;
3368
               alu_ctrl   <= alu_nop;
3369
                                        cc_ctrl    <= latch_cc;
3370
               pc_ctrl    <= incr_pc;
3371
                                        --
3372
                                        st_ctrl      <= idle_st;
3373
               return_state <= fetch_state;
3374
                                        next_state   <= lbranch_state;
3375
 
3376
                                 --
3377
                                 -- Single byte stack operators
3378
                                 -- Do not advance PC
3379
                                 --
3380
                  when "0011" =>
3381
                                        acca_ctrl  <= latch_acca;
3382
               accb_ctrl  <= latch_accb;
3383
                                   ix_ctrl    <= latch_ix;
3384
                                   iy_ctrl    <= latch_iy;
3385
               up_ctrl    <= latch_up;
3386
               pc_ctrl    <= latch_pc;
3387
                    case op_code(3 downto 0) is
3388
                         when "1111" => -- swi 2
3389
                                           -- predecrement sp
3390
                            left_ctrl  <= sp_left;
3391
                            right_ctrl <= one_right;
3392
                                                alu_ctrl   <= alu_sub16;
3393
                                           cc_ctrl    <= latch_cc;
3394
                                                sp_ctrl    <= load_sp;
3395
                  iv_ctrl    <= swi2_iv;
3396
                                                --
3397
                                      st_ctrl      <= idle_st;
3398
                                      return_state <= fetch_state;
3399
                                                next_state   <= int_entire_state;
3400
 
3401
                         when others =>
3402
                            left_ctrl  <= sp_left;
3403
                            right_ctrl <= zero_right;
3404
                                                alu_ctrl   <= alu_nop;
3405
                                           cc_ctrl    <= latch_cc;
3406
                                                sp_ctrl    <= latch_sp;
3407
                  iv_ctrl    <= latch_iv;
3408
                                                --
3409
                                      st_ctrl      <= idle_st;
3410
                                      return_state <= fetch_state;
3411
                                                next_state   <= fetch_state;
3412
                         end case;
3413
 
3414
                  when "1000" => -- acca immediate
3415
               acca_ctrl  <= latch_acca;
3416
                                        accb_ctrl  <= latch_accb;
3417
                                   ix_ctrl    <= latch_ix;
3418
               iy_ctrl    <= latch_iy;
3419
               up_ctrl    <= latch_up;
3420
                                   sp_ctrl    <= latch_sp;
3421
               iv_ctrl    <= latch_iv;
3422
                                   -- Idle the ALU
3423
               left_ctrl  <= pc_left;
3424
               right_ctrl <= one_right;
3425
               alu_ctrl   <= alu_add16;
3426
                                        cc_ctrl    <= latch_cc;
3427
                                   -- increment the pc
3428
               pc_ctrl    <= incr_pc;
3429
                                        case op_code(3 downto 0) is
3430
               when "0011" | -- cmpd #
3431
                                             "1100" | -- cmpy #
3432
                                             "1110" => -- ldy #
3433
                                     st_ctrl      <= push_st;
3434
                                     return_state <= fetch_state;
3435
                                          next_state   <= imm16_state;
3436
 
3437
                                        when others =>
3438
                                     st_ctrl      <= idle_st;
3439
                                     return_state <= fetch_state;
3440
                                     next_state   <= fetch_state;
3441
 
3442
               end case;
3443
 
3444
                  when "1001" => -- acca direct
3445
               acca_ctrl  <= latch_acca;
3446
                                        accb_ctrl  <= latch_accb;
3447
                                   ix_ctrl    <= latch_ix;
3448
               iy_ctrl    <= latch_iy;
3449
               up_ctrl    <= latch_up;
3450
                                   sp_ctrl    <= latch_sp;
3451
               iv_ctrl    <= latch_iv;
3452
                                        -- idle the ALU
3453
               left_ctrl  <= pc_left;
3454
               right_ctrl <= zero_right;
3455
               alu_ctrl   <= alu_nop;
3456
                                        cc_ctrl    <= latch_cc;
3457
                                        -- increment the pc
3458
               pc_ctrl    <= incr_pc;
3459
                                        case op_code(3 downto 0) is
3460
               when "0011" | -- cmpd <
3461
                                             "1100" | -- cmpy <
3462
                                             "1110" => -- ldy <
3463
                                     st_ctrl      <= idle_st;
3464
                                     return_state <= fetch_state;
3465
                                          next_state   <= dual_op_read16_state;
3466
 
3467
                                        when "1111" => -- sty <
3468
                                     st_ctrl      <= push_st;
3469
                                     return_state <= fetch_state;
3470
                                     next_state   <= dual_op_write16_state;
3471
 
3472
                                        when others =>
3473
                                     st_ctrl      <= idle_st;
3474
                                     return_state <= fetch_state;
3475
                                     next_state   <= fetch_state;
3476
 
3477
               end case;
3478
 
3479
                  when "1010" => -- acca indexed
3480
               acca_ctrl  <= latch_acca;
3481
                                        accb_ctrl  <= latch_accb;
3482
                                   ix_ctrl    <= latch_ix;
3483
               iy_ctrl    <= latch_iy;
3484
               up_ctrl    <= latch_up;
3485
                                   sp_ctrl    <= latch_sp;
3486
               iv_ctrl    <= latch_iv;
3487
                                        -- idle the ALU
3488
               left_ctrl  <= pc_left;
3489
               right_ctrl <= zero_right;
3490
               alu_ctrl   <= alu_nop;
3491
                                        cc_ctrl    <= latch_cc;
3492
                                        -- increment the pc
3493
               pc_ctrl    <= incr_pc;
3494
                                        case op_code(3 downto 0) is
3495
               when "0011" | -- cmpd ,ind
3496
                                             "1100" | -- cmpy ,ind
3497
                                             "1110" => -- ldy ,ind
3498
                                     st_ctrl      <= push_st;
3499
                                     return_state <= dual_op_read16_state;
3500
                                          next_state   <= indexed_state;
3501
 
3502
                                        when "1111" => -- sty ,ind
3503
                                     st_ctrl      <= push_st;
3504
                                     return_state <= dual_op_write16_state;
3505
                                     next_state   <= indexed_state;
3506
 
3507
                                        when others =>
3508
                                     st_ctrl      <= idle_st;
3509
                                     return_state <= fetch_state;
3510
                                     next_state   <= fetch_state;
3511
               end case;
3512
 
3513
             when "1011" => -- acca extended
3514
               acca_ctrl  <= latch_acca;
3515
                                        accb_ctrl  <= latch_accb;
3516
                                   ix_ctrl    <= latch_ix;
3517
               iy_ctrl    <= latch_iy;
3518
               up_ctrl    <= latch_up;
3519
                                   sp_ctrl    <= latch_sp;
3520
               iv_ctrl    <= latch_iv;
3521
                                        -- idle the ALU
3522
               left_ctrl  <= pc_left;
3523
               right_ctrl <= zero_right;
3524
               alu_ctrl   <= alu_nop;
3525
                                        cc_ctrl    <= latch_cc;
3526
                                        -- increment the pc
3527
               pc_ctrl    <= incr_pc;
3528
                                        case op_code(3 downto 0) is
3529
               when "0011" | -- cmpd <
3530
                                             "1100" | -- cmpy <
3531
                                             "1110" => -- ldy <
3532
                                     st_ctrl      <= push_st;
3533
                                     return_state <= dual_op_read16_state;
3534
                                          next_state   <= extended_state;
3535
 
3536
                                        when "1111" => -- sty >
3537
                                     st_ctrl      <= push_st;
3538
                                     return_state <= dual_op_write16_state;
3539
                                     next_state   <= extended_state;
3540
 
3541
                                        when others =>
3542
                                     st_ctrl      <= idle_st;
3543
                                     return_state <= fetch_state;
3544
                                     next_state   <= fetch_state;
3545
 
3546
               end case;
3547
 
3548
                  when "1100" => -- accb immediate
3549
               acca_ctrl  <= latch_acca;
3550
                                        accb_ctrl  <= latch_accb;
3551
                                   ix_ctrl    <= latch_ix;
3552
               iy_ctrl    <= latch_iy;
3553
               up_ctrl    <= latch_up;
3554
                                   sp_ctrl    <= latch_sp;
3555
               iv_ctrl    <= latch_iv;
3556
                                        -- idle the alu
3557
               left_ctrl  <= pc_left;
3558
               right_ctrl <= zero_right;
3559
               alu_ctrl   <= alu_nop;
3560
                                        cc_ctrl    <= latch_cc;
3561
                                        -- increment the pc
3562
               pc_ctrl    <= incr_pc;
3563
                                        case op_code(3 downto 0) is
3564
               when "0011" | -- undef #
3565
                                             "1100" | -- undef #
3566
                                             "1110" => -- lds #
3567
                                     st_ctrl      <= push_st;
3568
                                     return_state <= fetch_state;
3569
                                          next_state   <= imm16_state;
3570
 
3571
                                        when others =>
3572
                                     st_ctrl      <= idle_st;
3573
                                     return_state <= fetch_state;
3574
                                     next_state   <= fetch_state;
3575
 
3576
               end case;
3577
 
3578
                  when "1101" => -- accb direct
3579
               acca_ctrl  <= latch_acca;
3580
                                        accb_ctrl  <= latch_accb;
3581
                                   ix_ctrl    <= latch_ix;
3582
               iy_ctrl    <= latch_iy;
3583
               up_ctrl    <= latch_up;
3584
                                   sp_ctrl    <= latch_sp;
3585
               iv_ctrl    <= latch_iv;
3586
                                        -- idle the alu
3587
               left_ctrl  <= pc_left;
3588
               right_ctrl <= zero_right;
3589
               alu_ctrl   <= alu_nop;
3590
                                        cc_ctrl    <= latch_cc;
3591
                                        -- increment the pc
3592
               pc_ctrl    <= incr_pc;
3593
                                        case op_code(3 downto 0) is
3594
               when "0011" | -- undef <
3595
                                             "1100" | -- undef <
3596
                                             "1110" => -- lds <
3597
                                     st_ctrl      <= idle_st;
3598
                                     return_state <= fetch_state;
3599
                                          next_state   <= dual_op_read16_state;
3600
 
3601
                                        when "1111" => -- sts <
3602
                                     st_ctrl      <= push_st;
3603
                                     return_state <= fetch_state;
3604
                                     next_state   <= dual_op_write16_state;
3605
 
3606
                                        when others =>
3607
                                     st_ctrl      <= idle_st;
3608
                                     return_state <= fetch_state;
3609
                                     next_state   <= fetch_state;
3610
 
3611
               end case;
3612
 
3613
                  when "1110" => -- accb indexed
3614
               acca_ctrl  <= latch_acca;
3615
                                        accb_ctrl  <= latch_accb;
3616
                                   ix_ctrl    <= latch_ix;
3617
               iy_ctrl    <= latch_iy;
3618
               up_ctrl    <= latch_up;
3619
                                   sp_ctrl    <= latch_sp;
3620
                                   md_ctrl    <= latch_md;
3621
               iv_ctrl    <= latch_iv;
3622
                                        -- idle the alu
3623
               left_ctrl  <= pc_left;
3624
               right_ctrl <= zero_right;
3625
               alu_ctrl   <= alu_nop;
3626
                                        cc_ctrl    <= latch_cc;
3627
                                        -- increment the pc
3628
               pc_ctrl    <= incr_pc;
3629
                                        case op_code(3 downto 0) is
3630
               when "0011" | -- undef ,ind
3631
                                             "1100" | -- undef ,ind
3632
                                             "1110" => -- lds ,ind
3633
                                     st_ctrl      <= push_st;
3634
                                     return_state <= dual_op_read16_state;
3635
                                          next_state   <= indexed_state;
3636
 
3637
                                        when "1111" => -- sts ,ind
3638
                                     st_ctrl      <= push_st;
3639
                                     return_state <= dual_op_write16_state;
3640
                                     next_state   <= indexed_state;
3641
 
3642
                                        when others =>
3643
                                     st_ctrl      <= idle_st;
3644
                                     return_state <= fetch_state;
3645
                                     next_state   <= fetch_state;
3646
 
3647
               end case;
3648
 
3649
             when "1111" => -- accb extended
3650
               acca_ctrl  <= latch_acca;
3651
                                        accb_ctrl  <= latch_accb;
3652
                                   ix_ctrl    <= latch_ix;
3653
               iy_ctrl    <= latch_iy;
3654
               up_ctrl    <= latch_up;
3655
                                   sp_ctrl    <= latch_sp;
3656
               iv_ctrl    <= latch_iv;
3657
                                        -- idle the alu
3658
               left_ctrl  <= pc_left;
3659
               right_ctrl <= zero_right;
3660
               alu_ctrl   <= alu_nop;
3661
                                        cc_ctrl    <= latch_cc;
3662
                                        -- increment the pc
3663
               pc_ctrl    <= incr_pc;
3664
                                        case op_code(3 downto 0) is
3665
               when "0011" | -- undef >
3666
                                             "1100" | -- undef >
3667
                                             "1110" => -- lds >
3668
                                     st_ctrl      <= push_st;
3669
                                     return_state <= dual_op_read16_state;
3670
                                          next_state   <= extended_state;
3671
 
3672
                                        when "1111" => -- sts >
3673
                                     st_ctrl      <= push_st;
3674
                                     return_state <= dual_op_write16_state;
3675
                                     next_state   <= extended_state;
3676
 
3677
                                        when others =>
3678
                                     st_ctrl      <= idle_st;
3679
                                     return_state <= fetch_state;
3680
                                     next_state   <= fetch_state;
3681
 
3682
               end case;
3683
 
3684
                  when others =>
3685
               acca_ctrl  <= latch_acca;
3686
                                        accb_ctrl  <= latch_accb;
3687
                                   ix_ctrl    <= latch_ix;
3688
               iy_ctrl    <= latch_iy;
3689
               up_ctrl    <= latch_up;
3690
                                   sp_ctrl    <= latch_sp;
3691
               iv_ctrl    <= latch_iv;
3692
                                        -- idle the alu
3693
               left_ctrl  <= pc_left;
3694
               right_ctrl <= zero_right;
3695
               alu_ctrl   <= alu_nop;
3696
                                        cc_ctrl    <= latch_cc;
3697
                                        -- idle the pc
3698
               pc_ctrl    <= latch_pc;
3699
                                   st_ctrl      <= idle_st;
3700
                                   return_state <= fetch_state;
3701
                         next_state   <= fetch_state;
3702
             end case;
3703
                         --
3704
                         -- Here to decode instruction
3705
                         -- and fetch next byte of intruction
3706
                         -- whether it be necessary or not
3707
                         --
3708
          when decode3_state =>
3709
                            op_ctrl    <= latch_op;
3710
             pre_ctrl   <= latch_pre;
3711
             ea_ctrl    <= fetch_first_ea;
3712
                                 md_ctrl    <= fetch_first_md;
3713
             addr_ctrl  <= fetch_ad;
3714
             dout_ctrl  <= md_lo_dout;
3715
                                 nmi_ctrl   <= latch_nmi;
3716
             dp_ctrl    <= latch_dp;
3717
                            case op_code(7 downto 4) is
3718
                                 --
3719
                                 -- Single byte stack operators
3720
                                 -- Do not advance PC
3721
                                 --
3722
                  when "0011" =>
3723
                                        acca_ctrl  <= latch_acca;
3724
               accb_ctrl  <= latch_accb;
3725
                                   ix_ctrl    <= latch_ix;
3726
                                   iy_ctrl    <= latch_iy;
3727
               up_ctrl    <= latch_up;
3728
               pc_ctrl    <= latch_pc;
3729
                                        --
3730
                    case op_code(3 downto 0) is
3731
                         when "1111" => -- swi3
3732
                                           -- predecrement sp
3733
                            left_ctrl  <= sp_left;
3734
                            right_ctrl <= one_right;
3735
                                                alu_ctrl   <= alu_sub16;
3736
                                           cc_ctrl    <= latch_cc;
3737
                                                sp_ctrl    <= load_sp;
3738
                  iv_ctrl    <= swi3_iv;
3739
                                                --
3740
                                      st_ctrl      <= idle_st;
3741
                                      return_state <= fetch_state;
3742
                                                next_state   <= int_entire_state;
3743
                         when others =>
3744
                            left_ctrl  <= sp_left;
3745
                            right_ctrl <= zero_right;
3746
                                                alu_ctrl   <= alu_nop;
3747
                                           cc_ctrl    <= latch_cc;
3748
                                                sp_ctrl    <= latch_sp;
3749
                  iv_ctrl    <= latch_iv;
3750
                                                --
3751
                                      st_ctrl      <= idle_st;
3752
                                      return_state <= fetch_state;
3753
                                                next_state   <= fetch_state;
3754
                         end case;
3755
 
3756
                  when "1000" => -- acca immediate
3757
               acca_ctrl  <= latch_acca;
3758
                                        accb_ctrl  <= latch_accb;
3759
                                   ix_ctrl    <= latch_ix;
3760
               iy_ctrl    <= latch_iy;
3761
               up_ctrl    <= latch_up;
3762
                                   sp_ctrl    <= latch_sp;
3763
               iv_ctrl    <= latch_iv;
3764
                                   -- idle the alu
3765
               left_ctrl  <= pc_left;
3766
               right_ctrl <= zero_right;
3767
               alu_ctrl   <= alu_nop;
3768
                                        cc_ctrl    <= latch_cc;
3769
                                   -- increment the pc
3770
               pc_ctrl    <= incr_pc;
3771
                                        case op_code(3 downto 0) is
3772
               when "0011" | -- cmpu #
3773
                                             "1100" | -- cmps #
3774
                                             "1110" => -- undef #
3775
                                     st_ctrl      <= push_st;
3776
                                     return_state <= fetch_state;
3777
                                          next_state   <= imm16_state;
3778
                                        when others =>
3779
                                     st_ctrl      <= idle_st;
3780
                                     return_state <= fetch_state;
3781
                                     next_state   <= fetch_state;
3782
               end case;
3783
 
3784
                  when "1001" => -- acca direct
3785
               acca_ctrl  <= latch_acca;
3786
                                        accb_ctrl  <= latch_accb;
3787
                                   ix_ctrl    <= latch_ix;
3788
               iy_ctrl    <= latch_iy;
3789
               up_ctrl    <= latch_up;
3790
                                   sp_ctrl    <= latch_sp;
3791
               iv_ctrl    <= latch_iv;
3792
                                        -- idle the alu
3793
               left_ctrl  <= pc_left;
3794
               right_ctrl <= zero_right;
3795
               alu_ctrl   <= alu_nop;
3796
                                        cc_ctrl    <= latch_cc;
3797
                                        -- increment the pc
3798
               pc_ctrl    <= incr_pc;
3799
                                        case op_code(3 downto 0) is
3800
               when "0011" | -- cmpu <
3801
                                             "1100" | -- cmps <
3802
                                             "1110" => -- undef <
3803
                                     st_ctrl      <= idle_st;
3804
                                     return_state <= fetch_state;
3805
                                          next_state   <= dual_op_read16_state;
3806
 
3807
                                        when others =>
3808
                                     st_ctrl      <= idle_st;
3809
                                     return_state <= fetch_state;
3810
                                     next_state   <= fetch_state;
3811
 
3812
               end case;
3813
 
3814
                  when "1010" => -- acca indexed
3815
               acca_ctrl  <= latch_acca;
3816
                                        accb_ctrl  <= latch_accb;
3817
                                   ix_ctrl    <= latch_ix;
3818
               iy_ctrl    <= latch_iy;
3819
               up_ctrl    <= latch_up;
3820
                                   sp_ctrl    <= latch_sp;
3821
               iv_ctrl    <= latch_iv;
3822
                                        -- idle the alu
3823
               left_ctrl  <= pc_left;
3824
               right_ctrl <= zero_right;
3825
               alu_ctrl   <= alu_nop;
3826
                                        cc_ctrl    <= latch_cc;
3827
                                        -- increment the pc
3828
               pc_ctrl    <= incr_pc;
3829
                                        case op_code(3 downto 0) is
3830
               when "0011" | -- cmpu ,X
3831
                                             "1100" | -- cmps ,X
3832
                                             "1110" => -- undef ,X
3833
                                     st_ctrl      <= push_st;
3834
                                     return_state <= dual_op_read16_state;
3835
                                          next_state   <= indexed_state;
3836
 
3837
                                        when others =>
3838
                                     st_ctrl      <= idle_st;
3839
                                     return_state <= fetch_state;
3840
                                     next_state   <= fetch_state;
3841
 
3842
               end case;
3843
 
3844
             when "1011" => -- acca extended
3845
               acca_ctrl  <= latch_acca;
3846
                                        accb_ctrl  <= latch_accb;
3847
                                   ix_ctrl    <= latch_ix;
3848
               iy_ctrl    <= latch_iy;
3849
               up_ctrl    <= latch_up;
3850
                                   sp_ctrl    <= latch_sp;
3851
               iv_ctrl    <= latch_iv;
3852
                                        -- idle the alu
3853
               left_ctrl  <= pc_left;
3854
               right_ctrl <= zero_right;
3855
               alu_ctrl   <= alu_nop;
3856
                                        cc_ctrl    <= latch_cc;
3857
                                        -- increment the pc
3858
               pc_ctrl    <= incr_pc;
3859
                                        case op_code(3 downto 0) is
3860
               when "0011" | -- cmpu >
3861
                                             "1100" | -- cmps >
3862
                                             "1110" => -- undef >
3863
                                     st_ctrl      <= push_st;
3864
                                     return_state <= dual_op_read16_state;
3865
                                          next_state   <= extended_state;
3866
                                        when others =>
3867
                                     st_ctrl      <= idle_st;
3868
                                     return_state <= fetch_state;
3869
                                     next_state   <= fetch_state;
3870
               end case;
3871
 
3872
                  when others =>
3873
               acca_ctrl  <= latch_acca;
3874
                                        accb_ctrl  <= latch_accb;
3875
                                   ix_ctrl    <= latch_ix;
3876
               iy_ctrl    <= latch_iy;
3877
               up_ctrl    <= latch_up;
3878
                                   sp_ctrl    <= latch_sp;
3879
               iv_ctrl    <= latch_iv;
3880
                                        -- idle the alu
3881
               left_ctrl  <= pc_left;
3882
               right_ctrl <= zero_right;
3883
               alu_ctrl   <= alu_nop;
3884
                                        cc_ctrl    <= latch_cc;
3885
                                        -- idle the pc
3886
               pc_ctrl    <= latch_pc;
3887
                                   st_ctrl      <= idle_st;
3888
                                   return_state <= fetch_state;
3889
                         next_state   <= fetch_state;
3890
             end case;
3891
 
3892
           --
3893
                          -- here if ea holds low byte
3894
                          -- Direct
3895
                          -- Extended
3896
                          -- Indexed
3897
                          -- read memory location
3898
                          --
3899
                          when single_op_read_state =>
3900
                              op_ctrl    <= latch_op;
3901
               pre_ctrl   <= latch_pre;
3902
               acca_ctrl  <= latch_acca;
3903
               accb_ctrl  <= latch_accb;
3904
               ix_ctrl    <= latch_ix;
3905
               iy_ctrl    <= latch_iy;
3906
               up_ctrl    <= latch_up;
3907
               sp_ctrl    <= latch_sp;
3908
               pc_ctrl    <= latch_pc;
3909
               iv_ctrl    <= latch_iv;
3910
               dp_ctrl    <= latch_dp;
3911
                                   nmi_ctrl   <= latch_nmi;
3912
                                        -- idle ALU
3913
                                        left_ctrl  <= ea_left;
3914
                                        right_ctrl <= zero_right;
3915
                                        alu_ctrl   <= alu_nop;
3916
               cc_ctrl    <= latch_cc;
3917
                                        ea_ctrl    <= latch_ea;
3918
                                        -- read memory into md
3919
                                   md_ctrl    <= fetch_first_md;
3920
               addr_ctrl  <= read_ad;
3921
                                        dout_ctrl  <= md_lo_dout;
3922
                                        --
3923
                                        st_ctrl    <= idle_st;
3924
                                        return_state <= fetch_state;
3925
                                        next_state <= single_op_exec_state;
3926
 
3927
                when single_op_exec_state =>
3928
                              op_ctrl    <= latch_op;
3929
               pre_ctrl   <= latch_pre;
3930
               acca_ctrl  <= latch_acca;
3931
               accb_ctrl  <= latch_accb;
3932
               ix_ctrl    <= latch_ix;
3933
               iy_ctrl    <= latch_iy;
3934
               up_ctrl    <= latch_up;
3935
               sp_ctrl    <= latch_sp;
3936
               dp_ctrl    <= latch_dp;
3937
                                   nmi_ctrl   <= latch_nmi;
3938
               iv_ctrl    <= latch_iv;
3939
               ea_ctrl    <= latch_ea;
3940
                                          -- idle the bus
3941
               addr_ctrl  <= idle_ad;
3942
               dout_ctrl  <= md_lo_dout;
3943
                                        st_ctrl    <= idle_st;
3944
                                        return_state <= fetch_state;
3945
                    case op_code(3 downto 0) is
3946
                         when "0000" => -- neg
3947
                   left_ctrl  <= md_left;
3948
                                            right_ctrl <= zero_right;
3949
                                            alu_ctrl   <= alu_neg;
3950
                                            cc_ctrl    <= load_cc;
3951
                                       md_ctrl    <= load_md;
3952
                   pc_ctrl    <= latch_pc;
3953
                                       next_state <= single_op_write_state;
3954
                    when "0011" => -- com
3955
                   left_ctrl  <= md_left;
3956
                             right_ctrl <= zero_right;
3957
                                            alu_ctrl   <= alu_com;
3958
                                            cc_ctrl    <= load_cc;
3959
                                       md_ctrl    <= load_md;
3960
                   pc_ctrl    <= latch_pc;
3961
                                       next_state <= single_op_write_state;
3962
                         when "0100" => -- lsr
3963
                   left_ctrl  <= md_left;
3964
                                                 right_ctrl <= zero_right;
3965
                                            alu_ctrl   <= alu_lsr8;
3966
                                            cc_ctrl    <= load_cc;
3967
                                       md_ctrl    <= load_md;
3968
                   pc_ctrl    <= latch_pc;
3969
                                       next_state <= single_op_write_state;
3970
                         when "0110" => -- ror
3971
                   left_ctrl  <= md_left;
3972
                                                 right_ctrl <= zero_right;
3973
                                            alu_ctrl   <= alu_ror8;
3974
                                            cc_ctrl    <= load_cc;
3975
                                       md_ctrl    <= load_md;
3976
                   pc_ctrl    <= latch_pc;
3977
                                       next_state <= single_op_write_state;
3978
                         when "0111" => -- asr
3979
                   left_ctrl  <= md_left;
3980
                                                 right_ctrl <= zero_right;
3981
                                            alu_ctrl   <= alu_asr8;
3982
                                            cc_ctrl    <= load_cc;
3983
                                       md_ctrl    <= load_md;
3984
                   pc_ctrl    <= latch_pc;
3985
                                       next_state <= single_op_write_state;
3986
                         when "1000" => -- asl
3987
                   left_ctrl  <= md_left;
3988
                                                 right_ctrl <= zero_right;
3989
                                            alu_ctrl   <= alu_asl8;
3990
                                            cc_ctrl    <= load_cc;
3991
                                       md_ctrl    <= load_md;
3992
                   pc_ctrl    <= latch_pc;
3993
                                       next_state <= single_op_write_state;
3994
                         when "1001" => -- rol
3995
                   left_ctrl  <= md_left;
3996
                                                 right_ctrl <= zero_right;
3997
                                            alu_ctrl   <= alu_rol8;
3998
                                            cc_ctrl    <= load_cc;
3999
                                       md_ctrl    <= load_md;
4000
                   pc_ctrl    <= latch_pc;
4001
                                       next_state <= single_op_write_state;
4002
                         when "1010" => -- dec
4003
                   left_ctrl  <= md_left;
4004
                             right_ctrl <= one_right;
4005
                                            alu_ctrl   <= alu_dec;
4006
                                            cc_ctrl    <= load_cc;
4007
                                       md_ctrl    <= load_md;
4008
                   pc_ctrl    <= latch_pc;
4009
                                       next_state <= single_op_write_state;
4010
                         when "1011" => -- undefined
4011
                   left_ctrl  <= md_left;
4012
                                                 right_ctrl <= zero_right;
4013
                                            alu_ctrl   <= alu_nop;
4014
                                            cc_ctrl    <= latch_cc;
4015
                                       md_ctrl    <= latch_md;
4016
                   pc_ctrl    <= latch_pc;
4017
                                       next_state <= fetch_state;
4018
                         when "1100" => -- inc
4019
                   left_ctrl  <= md_left;
4020
                             right_ctrl <= one_right;
4021
                                            alu_ctrl   <= alu_inc;
4022
                                            cc_ctrl    <= load_cc;
4023
                                       md_ctrl    <= load_md;
4024
                   pc_ctrl    <= latch_pc;
4025
                                       next_state <= single_op_write_state;
4026
                         when "1101" => -- tst
4027
                   left_ctrl  <= md_left;
4028
                             right_ctrl <= zero_right;
4029
                                            alu_ctrl   <= alu_st8;
4030
                                            cc_ctrl    <= load_cc;
4031
                                       md_ctrl    <= latch_md;
4032
                   pc_ctrl    <= latch_pc;
4033
                                       next_state <= fetch_state;
4034
                         when "1110" => -- jmp
4035
                   left_ctrl  <= md_left;
4036
                                                 right_ctrl <= zero_right;
4037
                                            alu_ctrl   <= alu_ld16;
4038
                                            cc_ctrl    <= latch_cc;
4039
                                       md_ctrl    <= latch_md;
4040
                   pc_ctrl    <= load_pc;
4041
                                       next_state <= fetch_state;
4042
                         when "1111" => -- clr
4043
                   left_ctrl  <= md_left;
4044
                                                 right_ctrl <= zero_right;
4045
                                            alu_ctrl   <= alu_ld8;
4046
                                            cc_ctrl    <= load_cc;
4047
                                       md_ctrl    <= load_md;
4048
                   pc_ctrl    <= latch_pc;
4049
                                       next_state <= single_op_write_state;
4050
                         when others =>
4051
                   left_ctrl  <= md_left;
4052
                                                 right_ctrl <= zero_right;
4053
                                            alu_ctrl   <= alu_nop;
4054
                                            cc_ctrl    <= latch_cc;
4055
                                       md_ctrl    <= latch_md;
4056
                   pc_ctrl    <= latch_pc;
4057
                                       next_state <= fetch_state;
4058
                         end case;
4059
           --
4060
                          -- single operand 8 bit write
4061
                          -- Write low 8 bits of ALU output
4062
                          -- EA holds address
4063
                          -- MD holds data
4064
                          --
4065
                          when single_op_write_state =>
4066
                            op_ctrl    <= latch_op;
4067
             pre_ctrl   <= latch_pre;
4068
             acca_ctrl  <= latch_acca;
4069
             accb_ctrl  <= latch_accb;
4070
             ix_ctrl    <= latch_ix;
4071
             iy_ctrl    <= latch_iy;
4072
             up_ctrl    <= latch_up;
4073
             sp_ctrl    <= latch_sp;
4074
             pc_ctrl    <= latch_pc;
4075
             md_ctrl    <= latch_md;
4076
             iv_ctrl    <= latch_iv;
4077
             dp_ctrl    <= latch_dp;
4078
                                 nmi_ctrl   <= latch_nmi;
4079
             ea_ctrl    <= latch_ea;
4080
                                 -- idle the ALU
4081
             left_ctrl  <= acca_left;
4082
             right_ctrl <= zero_right;
4083
             alu_ctrl   <= alu_nop;
4084
             cc_ctrl    <= latch_cc;
4085
                                 -- write ALU low byte output
4086
             addr_ctrl  <= write_ad;
4087
             dout_ctrl  <= md_lo_dout;
4088
                                 --
4089
                            st_ctrl      <= idle_st;
4090
                            return_state <= fetch_state;
4091
                                 next_state <= fetch_state;
4092
 
4093
           --
4094
                          -- here if ea holds address of low byte
4095
                          -- read memory location
4096
                          --
4097
                          when dual_op_read8_state =>
4098
                              op_ctrl    <= latch_op;
4099
               pre_ctrl   <= latch_pre;
4100
               acca_ctrl  <= latch_acca;
4101
               accb_ctrl  <= latch_accb;
4102
               ix_ctrl    <= latch_ix;
4103
               iy_ctrl    <= latch_iy;
4104
               up_ctrl    <= latch_up;
4105
               sp_ctrl    <= latch_sp;
4106
               pc_ctrl    <= latch_pc;
4107
               iv_ctrl    <= latch_iv;
4108
               dp_ctrl    <= latch_dp;
4109
                                   nmi_ctrl   <= latch_nmi;
4110
                                        left_ctrl  <= ea_left;
4111
                                        -- Leave the ea alone
4112
                                        right_ctrl <= zero_right;
4113
                                        alu_ctrl   <= alu_nop;
4114
               cc_ctrl    <= latch_cc;
4115
                                        ea_ctrl    <= latch_ea;
4116
                                   -- read first data byte from ea
4117
                                   md_ctrl    <= fetch_first_md;
4118
               addr_ctrl  <= read_ad;
4119
                                        dout_ctrl  <= md_lo_dout;
4120
                                        --
4121
                                        st_ctrl      <= idle_st;
4122
                                        return_state <= fetch_state;
4123
                                        next_state   <= fetch_state;
4124
 
4125
                                --
4126
                                -- Here to read a 16 bit value into MD
4127
                                -- pointed to by the EA register
4128
                                -- The first byte is read
4129
                                -- and the EA is incremented
4130
                                --
4131
                           when dual_op_read16_state =>
4132
                              op_ctrl    <= latch_op;
4133
               pre_ctrl   <= latch_pre;
4134
               acca_ctrl  <= latch_acca;
4135
               accb_ctrl  <= latch_accb;
4136
               cc_ctrl    <= latch_cc;
4137
               dp_ctrl    <= latch_dp;
4138
               ix_ctrl    <= latch_ix;
4139
               iy_ctrl    <= latch_iy;
4140
               up_ctrl    <= latch_up;
4141
               sp_ctrl    <= latch_sp;
4142
               pc_ctrl    <= latch_pc;
4143
               iv_ctrl    <= latch_iv;
4144
                                   nmi_ctrl   <= latch_nmi;
4145
                                        -- increment the effective address
4146
               left_ctrl  <= ea_left;
4147
               right_ctrl <= one_right;
4148
               alu_ctrl   <= alu_add16;
4149
               ea_ctrl    <= load_ea;
4150
                                        -- read the low byte of the 16 bit data
4151
                                   md_ctrl    <= fetch_first_md;
4152
               addr_ctrl  <= read_ad;
4153
               dout_ctrl  <= md_lo_dout;
4154
                                        --
4155
                                        st_ctrl      <= idle_st;
4156
                                        return_state <= fetch_state;
4157
                                        next_state   <= dual_op_read16_2_state;
4158
 
4159
                                --
4160
                                -- here to read the second byte
4161
                           -- pointed to by EA into MD
4162
                                --
4163
                           when dual_op_read16_2_state =>
4164
                              op_ctrl    <= latch_op;
4165
               pre_ctrl   <= latch_pre;
4166
               acca_ctrl  <= latch_acca;
4167
               accb_ctrl  <= latch_accb;
4168
               cc_ctrl    <= latch_cc;
4169
               dp_ctrl    <= latch_dp;
4170
               ix_ctrl    <= latch_ix;
4171
               iy_ctrl    <= latch_iy;
4172
               up_ctrl    <= latch_up;
4173
               sp_ctrl    <= latch_sp;
4174
               pc_ctrl    <= latch_pc;
4175
               iv_ctrl    <= latch_iv;
4176
                                   nmi_ctrl   <= latch_nmi;
4177
                                        -- idle the effective address
4178
               left_ctrl  <= ea_left;
4179
               right_ctrl <= one_right;
4180
               alu_ctrl   <= alu_nop;
4181
               ea_ctrl    <= latch_ea;
4182
                                        -- read the low byte of the 16 bit data
4183
                                   md_ctrl    <= fetch_next_md;
4184
               addr_ctrl  <= read_ad;
4185
               dout_ctrl  <= md_lo_dout;
4186
                                        --
4187
                                        st_ctrl      <= idle_st;
4188
                                        return_state <= fetch_state;
4189
                                        next_state   <= fetch_state;
4190
 
4191
           --
4192
                          -- 16 bit Write state
4193
                          -- EA hold address of memory to write to
4194
                          -- Advance the effective address in ALU
4195
                          -- decode op_code to determine which
4196
                          -- register to write
4197
                          --
4198
                          when dual_op_write16_state =>
4199
                            op_ctrl    <= latch_op;
4200
             pre_ctrl   <= latch_pre;
4201
             acca_ctrl  <= latch_acca;
4202
             accb_ctrl  <= latch_accb;
4203
             ix_ctrl    <= latch_ix;
4204
             iy_ctrl    <= latch_iy;
4205
             up_ctrl    <= latch_up;
4206
             sp_ctrl    <= latch_sp;
4207
             pc_ctrl    <= latch_pc;
4208
             md_ctrl    <= latch_md;
4209
             iv_ctrl    <= latch_iv;
4210
             dp_ctrl    <= latch_dp;
4211
                                 nmi_ctrl   <= latch_nmi;
4212
                                 -- increment the effective address
4213
                                 left_ctrl  <= ea_left;
4214
                                 right_ctrl <= one_right;
4215
                                 alu_ctrl   <= alu_add16;
4216
             cc_ctrl    <= latch_cc;
4217
                            ea_ctrl    <= load_ea;
4218
                                 -- write the ALU hi byte at ea
4219
             addr_ctrl  <= write_ad;
4220
                                 if op_code(6) = '0' then
4221
                                   case op_code(3 downto 0) is
4222
                                        when "1111" => -- stx / sty
4223
                                          case pre_code is
4224
                                          when "00010000" => -- page 2 -- sty
4225
                        dout_ctrl  <= iy_hi_dout;
4226
                                     when others =>     -- page 1 -- stx
4227
                   dout_ctrl  <= ix_hi_dout;
4228
                                          end case;
4229
                                        when others =>
4230
                 dout_ctrl  <= md_hi_dout;
4231
                                        end case;
4232
                                 else
4233
                                   case op_code(3 downto 0) is
4234
                                        when "1101" => -- std
4235
                 dout_ctrl  <= acca_dout; -- acca is high byte of ACCD
4236
                                        when "1111" => -- stu / sts
4237
                                          case pre_code is
4238
                                          when "00010000" => -- page 2 -- sts
4239
                        dout_ctrl  <= sp_hi_dout;
4240
                                          when others =>     -- page 1 -- stu
4241
                        dout_ctrl  <= up_hi_dout;
4242
                                          end case;
4243
                                        when others =>
4244
                 dout_ctrl  <= md_hi_dout;
4245
                                        end case;
4246
                                 end if;
4247
                            st_ctrl      <= idle_st;
4248
                            return_state <= fetch_state;
4249
                                 next_state   <= dual_op_write8_state;
4250
 
4251
           --
4252
                          -- Dual operand 8 bit write
4253
           -- Write 8 bit accumulator
4254
                          -- or low byte of 16 bit register
4255
                          -- EA holds address
4256
                          -- decode opcode to determine
4257
                          -- which register to apply to the bus
4258
                          -- Also set the condition codes here
4259
                          --
4260
                          when dual_op_write8_state =>
4261
                            op_ctrl    <= latch_op;
4262
             pre_ctrl   <= latch_pre;
4263
             acca_ctrl  <= latch_acca;
4264
             accb_ctrl  <= latch_accb;
4265
             ix_ctrl    <= latch_ix;
4266
             iy_ctrl    <= latch_iy;
4267
             up_ctrl    <= latch_up;
4268
             sp_ctrl    <= latch_sp;
4269
             pc_ctrl    <= latch_pc;
4270
             iv_ctrl    <= latch_iv;
4271
             dp_ctrl    <= latch_dp;
4272
                                 nmi_ctrl   <= latch_nmi;
4273
             md_ctrl    <= latch_md;
4274
                                 -- idle ALU
4275
             left_ctrl  <= ea_left;
4276
             right_ctrl <= zero_right;
4277
             alu_ctrl   <= alu_nop;
4278
             cc_ctrl    <= latch_cc;
4279
             ea_ctrl    <= latch_ea;
4280
                                 --
4281
                                 if op_code(6) = '0' then -- '0' = acca line
4282
                                   case op_code(3 downto 0) is
4283
                                        when "0111" => -- sta
4284
                 dout_ctrl  <= acca_dout;
4285
                                        when "1111" => -- stx / sty
4286
                                          case pre_code is
4287
                                          when "00010000" => -- page 2 -- sty
4288
                        dout_ctrl  <= iy_lo_dout;
4289
                                     when others =>     -- page 1 -- stx
4290
                   dout_ctrl  <= ix_lo_dout;
4291
                                          end case;
4292
                                        when others =>
4293
                 dout_ctrl  <= md_lo_dout;
4294
                                        end case;
4295
                                 else                    -- '1' = accb line
4296
                                   case op_code(3 downto 0) is
4297
                                        when "0111" => -- stb
4298
                 dout_ctrl  <= accb_dout;
4299
                                        when "1101" => -- std
4300
                 dout_ctrl  <= accb_dout; -- accb is low byte of accd
4301
                                        when "1111" => -- stu / sts
4302
                                          case pre_code is
4303
                                          when "00010000" => -- page 2 -- sts
4304
                        dout_ctrl  <= sp_lo_dout;
4305
                                          when others =>     -- page 1 -- stu
4306
                        dout_ctrl  <= up_lo_dout;
4307
                                          end case;
4308
                                        when others =>
4309
                 dout_ctrl  <= md_lo_dout;
4310
                                        end case;
4311
                                 end if;
4312
                                 -- write ALU low byte output
4313
             addr_ctrl    <= write_ad;
4314
                                 --
4315
                            st_ctrl      <= idle_st;
4316
                            return_state <= fetch_state;
4317
                                 next_state   <= fetch_state;
4318
 
4319
                          --
4320
                          -- 16 bit immediate addressing mode
4321
                          --
4322
                          when imm16_state =>
4323
                              op_ctrl    <= latch_op;
4324
               pre_ctrl   <= latch_pre;
4325
               acca_ctrl  <= latch_acca;
4326
               accb_ctrl  <= latch_accb;
4327
               cc_ctrl    <= latch_cc;
4328
               dp_ctrl    <= latch_dp;
4329
                                        --
4330
               ix_ctrl    <= latch_ix;
4331
               iy_ctrl    <= latch_iy;
4332
               up_ctrl    <= latch_up;
4333
               sp_ctrl    <= latch_sp;
4334
                                        --
4335
               iv_ctrl    <= latch_iv;
4336
                                   nmi_ctrl   <= latch_nmi;
4337
               ea_ctrl    <= latch_ea;
4338
                                   -- increment pc
4339
               left_ctrl  <= pc_left;
4340
               right_ctrl <= zero_right;
4341
               alu_ctrl   <= alu_nop;
4342
               pc_ctrl    <= incr_pc;
4343
                                   -- fetch next immediate byte
4344
                              md_ctrl    <= fetch_next_md;
4345
               addr_ctrl  <= fetch_ad;
4346
               dout_ctrl  <= md_lo_dout;
4347
                                   -- return to caller
4348
                              st_ctrl      <= pull_st;
4349
                              return_state <= fetch_state;
4350
                                   next_state   <= saved_state;
4351
 
4352
           --
4353
                          -- ea holds 8 bit index offet
4354
                          -- calculate the effective memory address
4355
                          -- using the alu
4356
                          --
4357
           when indexed_state =>
4358
                            op_ctrl    <= latch_op;
4359
             pre_ctrl   <= latch_pre;
4360
             acca_ctrl  <= latch_acca;
4361
             accb_ctrl  <= latch_accb;
4362
             iv_ctrl    <= latch_iv;
4363
             dp_ctrl    <= latch_dp;
4364
                                 nmi_ctrl   <= latch_nmi;
4365
             dout_ctrl  <= md_lo_dout;
4366
                                 --
4367
                                 -- decode indexing mode
4368
                                 --
4369
                                 if md(7) = '0' then
4370
               ix_ctrl    <= latch_ix;
4371
               iy_ctrl    <= latch_iy;
4372
               up_ctrl    <= latch_up;
4373
               sp_ctrl    <= latch_sp;
4374
                                   case md(6 downto 5) is
4375
                                        when "00" =>
4376
                                left_ctrl  <= ix_left;
4377
                                        when "01" =>
4378
                                left_ctrl  <= iy_left;
4379
                                        when "10" =>
4380
                                left_ctrl  <= up_left;
4381
                                        when others =>
4382
                                        -- when "11" =>
4383
                                left_ctrl  <= sp_left;
4384
                                        end case;
4385
                                   right_ctrl <= md_sign5_right;
4386
                                   alu_ctrl   <= alu_add16;
4387
               cc_ctrl    <= latch_cc;
4388
               ea_ctrl    <= load_ea;
4389
                                        --
4390
               md_ctrl    <= latch_md;
4391
               addr_ctrl  <= idle_ad;
4392
               pc_ctrl    <= latch_pc;
4393
                                        --
4394
                                        st_ctrl      <= pull_st;
4395
                                        return_state <= fetch_state;
4396
                                        next_state   <= saved_state;
4397
 
4398
                                 else
4399
                                   case md(3 downto 0) is
4400
                                        when "0000" =>     -- ,R+
4401
                 ix_ctrl    <= latch_ix;
4402
                 iy_ctrl    <= latch_iy;
4403
                 up_ctrl    <= latch_up;
4404
                 sp_ctrl    <= latch_sp;
4405
                                     case md(6 downto 5) is
4406
                                          when "00" =>
4407
                                  left_ctrl  <= ix_left;
4408
                                          when "01" =>
4409
                                  left_ctrl  <= iy_left;
4410
                                          when "10" =>
4411
                                  left_ctrl  <= up_left;
4412
                                          when others =>
4413
                                  left_ctrl  <= sp_left;
4414
                                          end case;
4415
                                          --
4416
                                     right_ctrl <= zero_right;
4417
                                     alu_ctrl   <= alu_st16;
4418
                 cc_ctrl    <= latch_cc;
4419
                 ea_ctrl    <= load_ea;
4420
                                          --
4421
                 md_ctrl    <= latch_md;
4422
                 addr_ctrl  <= idle_ad;
4423
                 pc_ctrl    <= latch_pc;
4424
                                          --
4425
                                          st_ctrl      <= idle_st;
4426
                                          return_state <= fetch_state;
4427
                 next_state   <= postincr1_state;
4428
 
4429
                                        when "0001" =>     -- ,R++
4430
                 ix_ctrl    <= latch_ix;
4431
                 iy_ctrl    <= latch_iy;
4432
                 up_ctrl    <= latch_up;
4433
                 sp_ctrl    <= latch_sp;
4434
                                     case md(6 downto 5) is
4435
                                          when "00" =>
4436
                                  left_ctrl  <= ix_left;
4437
                                          when "01" =>
4438
                                  left_ctrl  <= iy_left;
4439
                                          when "10" =>
4440
                                  left_ctrl  <= up_left;
4441
                                          when others =>
4442
                                          -- when "11" =>
4443
                                  left_ctrl  <= sp_left;
4444
                                          end case;
4445
                                     right_ctrl <= zero_right;
4446
                                     alu_ctrl   <= alu_st16;
4447
                 cc_ctrl    <= latch_cc;
4448
                 ea_ctrl    <= load_ea;
4449
                                          --
4450
                 md_ctrl    <= latch_md;
4451
                 addr_ctrl  <= idle_ad;
4452
                 pc_ctrl    <= latch_pc;
4453
                                          --
4454
                                          st_ctrl      <= idle_st;
4455
                                          return_state <= fetch_state;
4456
                 next_state   <= postincr2_state;
4457
 
4458
                                        when "0010" =>     -- ,-R
4459
                                     case md(6 downto 5) is
4460
                                          when "00" =>
4461
                                  left_ctrl  <= ix_left;
4462
                   ix_ctrl    <= load_ix;
4463
                   iy_ctrl    <= latch_iy;
4464
                   up_ctrl    <= latch_up;
4465
                   sp_ctrl    <= latch_sp;
4466
                                          when "01" =>
4467
                                  left_ctrl  <= iy_left;
4468
                   ix_ctrl    <= latch_ix;
4469
                   iy_ctrl    <= load_iy;
4470
                   up_ctrl    <= latch_up;
4471
                   sp_ctrl    <= latch_sp;
4472
                                          when "10" =>
4473
                                  left_ctrl  <= up_left;
4474
                   ix_ctrl    <= latch_ix;
4475
                   iy_ctrl    <= latch_iy;
4476
                   up_ctrl    <= load_up;
4477
                   sp_ctrl    <= latch_sp;
4478
                                          when others =>
4479
                                          -- when "11" =>
4480
                                  left_ctrl  <= sp_left;
4481
                   ix_ctrl    <= latch_ix;
4482
                   iy_ctrl    <= latch_iy;
4483
                   up_ctrl    <= latch_up;
4484
                   sp_ctrl    <= load_sp;
4485
                                          end case;
4486
                                     right_ctrl <= one_right;
4487
                                     alu_ctrl   <= alu_sub16;
4488
                 cc_ctrl    <= latch_cc;
4489
                 ea_ctrl    <= load_ea;
4490
                                          --
4491
                 md_ctrl    <= latch_md;
4492
                 addr_ctrl  <= idle_ad;
4493
                 pc_ctrl    <= latch_pc;
4494
                                          --
4495
                                          st_ctrl      <= pull_st;
4496
                                          return_state <= fetch_state;
4497
                                          next_state   <= saved_state;
4498
 
4499
                                        when "0011" =>     -- ,--R
4500
                                     case md(6 downto 5) is
4501
                                          when "00" =>
4502
                                  left_ctrl  <= ix_left;
4503
                   ix_ctrl    <= load_ix;
4504
                   iy_ctrl    <= latch_iy;
4505
                   up_ctrl    <= latch_up;
4506
                   sp_ctrl    <= latch_sp;
4507
                                          when "01" =>
4508
                                  left_ctrl  <= iy_left;
4509
                   ix_ctrl    <= latch_ix;
4510
                   iy_ctrl    <= load_iy;
4511
                   up_ctrl    <= latch_up;
4512
                   sp_ctrl    <= latch_sp;
4513
                                          when "10" =>
4514
                                  left_ctrl  <= up_left;
4515
                   ix_ctrl    <= latch_ix;
4516
                   iy_ctrl    <= latch_iy;
4517
                   up_ctrl    <= load_up;
4518
                   sp_ctrl    <= latch_sp;
4519
                                          when others =>
4520
                                          -- when "11" =>
4521
                                  left_ctrl  <= sp_left;
4522
                   ix_ctrl    <= latch_ix;
4523
                   iy_ctrl    <= latch_iy;
4524
                   up_ctrl    <= latch_up;
4525
                   sp_ctrl    <= load_sp;
4526
                                          end case;
4527
                                     right_ctrl <= two_right;
4528
                                     alu_ctrl   <= alu_sub16;
4529
                 cc_ctrl    <= latch_cc;
4530
                 ea_ctrl    <= load_ea;
4531
                                          --
4532
                 md_ctrl    <= latch_md;
4533
                 addr_ctrl  <= idle_ad;
4534
                 pc_ctrl    <= latch_pc;
4535
                                          --
4536
                                          if md(4) = '0' then
4537
                                            st_ctrl      <= pull_st;
4538
                                            return_state <= fetch_state;
4539
                                            next_state   <= saved_state;
4540
                                          else
4541
                                            st_ctrl      <= idle_st;
4542
                                            return_state <= fetch_state;
4543
                                            next_state   <= indirect_state;
4544
                                          end if;
4545
 
4546
                                        when "0100" =>     -- ,R (zero offset)
4547
                 ix_ctrl    <= latch_ix;
4548
                 iy_ctrl    <= latch_iy;
4549
                 up_ctrl    <= latch_up;
4550
                 sp_ctrl    <= latch_sp;
4551
                                     case md(6 downto 5) is
4552
                                          when "00" =>
4553
                                  left_ctrl  <= ix_left;
4554
                                          when "01" =>
4555
                                  left_ctrl  <= iy_left;
4556
                                          when "10" =>
4557
                                  left_ctrl  <= up_left;
4558
                                          when others =>
4559
                                          -- when "11" =>
4560
                                  left_ctrl  <= sp_left;
4561
                                          end case;
4562
                                     right_ctrl <= zero_right;
4563
                                     alu_ctrl   <= alu_st16;
4564
                 cc_ctrl    <= latch_cc;
4565
                 ea_ctrl    <= load_ea;
4566
                                          --
4567
                 md_ctrl    <= latch_md;
4568
                 addr_ctrl  <= idle_ad;
4569
                 pc_ctrl    <= latch_pc;
4570
                                          --
4571
                                          if md(4) = '0' then
4572
                                            st_ctrl      <= pull_st;
4573
                                            return_state <= fetch_state;
4574
                                            next_state   <= saved_state;
4575
                                          else
4576
                                            st_ctrl      <= idle_st;
4577
                                            return_state <= fetch_state;
4578
                                            next_state   <= indirect_state;
4579
                                          end if;
4580
 
4581
                                        when "0101" =>     -- ACCB,R
4582
                 ix_ctrl    <= latch_ix;
4583
                 iy_ctrl    <= latch_iy;
4584
                 up_ctrl    <= latch_up;
4585
                 sp_ctrl    <= latch_sp;
4586
                                     case md(6 downto 5) is
4587
                                          when "00" =>
4588
                                  left_ctrl  <= ix_left;
4589
                                          when "01" =>
4590
                                  left_ctrl  <= iy_left;
4591
                                          when "10" =>
4592
                                  left_ctrl  <= up_left;
4593
                                          when others =>
4594
                                          -- when "11" =>
4595
                                  left_ctrl  <= sp_left;
4596
                                          end case;
4597
                                     right_ctrl <= accb_right;
4598
                                     alu_ctrl   <= alu_add16;
4599
                 cc_ctrl    <= latch_cc;
4600
                 ea_ctrl    <= load_ea;
4601
                                          --
4602
                 md_ctrl    <= latch_md;
4603
                 addr_ctrl  <= idle_ad;
4604
                 pc_ctrl    <= latch_pc;
4605
                                          --
4606
                                          if md(4) = '0' then
4607
                                            st_ctrl      <= pull_st;
4608
                                            return_state <= fetch_state;
4609
                                            next_state   <= saved_state;
4610
                                          else
4611
                                            st_ctrl      <= idle_st;
4612
                                            return_state <= fetch_state;
4613
                                            next_state   <= indirect_state;
4614
                                          end if;
4615
 
4616
                                        when "0110" =>     -- ACCA,R
4617
                 ix_ctrl    <= latch_ix;
4618
                 iy_ctrl    <= latch_iy;
4619
                 up_ctrl    <= latch_up;
4620
                 sp_ctrl    <= latch_sp;
4621
                                     case md(6 downto 5) is
4622
                                          when "00" =>
4623
                                  left_ctrl  <= ix_left;
4624
                                          when "01" =>
4625
                                  left_ctrl  <= iy_left;
4626
                                          when "10" =>
4627
                                  left_ctrl  <= up_left;
4628
                                          when others =>
4629
                                          -- when "11" =>
4630
                                  left_ctrl  <= sp_left;
4631
                                          end case;
4632
                                     right_ctrl <= acca_right;
4633
                                     alu_ctrl   <= alu_add16;
4634
                 cc_ctrl    <= latch_cc;
4635
                 ea_ctrl    <= load_ea;
4636
                                          --
4637
                 md_ctrl    <= latch_md;
4638
                 addr_ctrl  <= idle_ad;
4639
                 pc_ctrl    <= latch_pc;
4640
                                          --
4641
                                          if md(4) = '0' then
4642
                                            st_ctrl      <= pull_st;
4643
                                            return_state <= fetch_state;
4644
                                            next_state   <= saved_state;
4645
                                          else
4646
                                            st_ctrl      <= idle_st;
4647
                                            return_state <= fetch_state;
4648
                                            next_state   <= indirect_state;
4649
                                          end if;
4650
 
4651
                                        when "0111" =>     -- undefined
4652
                 ix_ctrl    <= latch_ix;
4653
                 iy_ctrl    <= latch_iy;
4654
                 up_ctrl    <= latch_up;
4655
                 sp_ctrl    <= latch_sp;
4656
                                     case md(6 downto 5) is
4657
                                          when "00" =>
4658
                                  left_ctrl  <= ix_left;
4659
                                          when "01" =>
4660
                                  left_ctrl  <= iy_left;
4661
                                          when "10" =>
4662
                                  left_ctrl  <= up_left;
4663
                                          when others =>
4664
                                          -- when "11" =>
4665
                                  left_ctrl  <= sp_left;
4666
                                          end case;
4667
                                     right_ctrl <= zero_right;
4668
                                     alu_ctrl   <= alu_nop;
4669
                 cc_ctrl    <= latch_cc;
4670
                 ea_ctrl    <= latch_ea;
4671
                                          --
4672
                 md_ctrl    <= latch_md;
4673
                 addr_ctrl  <= idle_ad;
4674
                 pc_ctrl    <= latch_pc;
4675
                                          --
4676
                                          if md(4) = '0' then
4677
                                            st_ctrl      <= pull_st;
4678
                                            return_state <= fetch_state;
4679
                                            next_state   <= saved_state;
4680
                                          else
4681
                                            st_ctrl      <= idle_st;
4682
                                            return_state <= fetch_state;
4683
                                            next_state   <= indirect_state;
4684
                                          end if;
4685
 
4686
                                        when "1000" =>     -- offset8,R
4687
                 ix_ctrl    <= latch_ix;
4688
                 iy_ctrl    <= latch_iy;
4689
                 up_ctrl    <= latch_up;
4690
                 sp_ctrl    <= latch_sp;
4691
                                          --
4692
                                left_ctrl  <= pc_left;
4693
                                     right_ctrl <= zero_right;
4694
                                     alu_ctrl   <= alu_nop;
4695
                 cc_ctrl    <= latch_cc;
4696
                 ea_ctrl    <= latch_ea;
4697
                                          --
4698
                 md_ctrl    <= fetch_first_md; -- pick up 8 bit offset
4699
                 addr_ctrl  <= fetch_ad;
4700
                 pc_ctrl    <= incr_pc;
4701
                                          --
4702
                                          st_ctrl      <= idle_st;
4703
                                          return_state <= fetch_state;
4704
                 next_state   <= index8_state;
4705
 
4706
                                        when "1001" =>     -- offset16,R
4707
                 ix_ctrl    <= latch_ix;
4708
                 iy_ctrl    <= latch_iy;
4709
                 up_ctrl    <= latch_up;
4710
                 sp_ctrl    <= latch_sp;
4711
                                          --
4712
                                left_ctrl  <= pc_left;
4713
                                     right_ctrl <= zero_right;
4714
                                     alu_ctrl   <= alu_nop;
4715
                 cc_ctrl    <= latch_cc;
4716
                                          ea_ctrl    <= latch_ea;
4717
                                          --
4718
                 md_ctrl    <= fetch_first_md; -- pick up first byte of 16 bit offset
4719
                 addr_ctrl  <= fetch_ad;
4720
                 pc_ctrl    <= incr_pc;
4721
                                          --
4722
                                          st_ctrl      <= idle_st;
4723
                                          return_state <= fetch_state;
4724
                 next_state   <= index16_state;
4725
 
4726
                                        when "1010" =>     -- undefined
4727
                 ix_ctrl    <= latch_ix;
4728
                 iy_ctrl    <= latch_iy;
4729
                 up_ctrl    <= latch_up;
4730
                 sp_ctrl    <= latch_sp;
4731
                                     case md(6 downto 5) is
4732
                                          when "00" =>
4733
                                  left_ctrl  <= ix_left;
4734
                                          when "01" =>
4735
                                  left_ctrl  <= iy_left;
4736
                                          when "10" =>
4737
                                  left_ctrl  <= up_left;
4738
                                          when others =>
4739
                                          -- when "11" =>
4740
                                  left_ctrl  <= sp_left;
4741
                                          end case;
4742
                                     right_ctrl <= zero_right;
4743
                                     alu_ctrl   <= alu_nop;
4744
                 cc_ctrl    <= latch_cc;
4745
                 ea_ctrl    <= latch_ea;
4746
                                          --
4747
                 md_ctrl    <= latch_md;
4748
                 addr_ctrl  <= idle_ad;
4749
                 pc_ctrl    <= latch_pc;
4750
                                          --
4751
                                          if md(4) = '0' then
4752
                                            st_ctrl      <= pull_st;
4753
                                            return_state <= fetch_state;
4754
                                            next_state   <= saved_state;
4755
                                          else
4756
                                            st_ctrl      <= idle_st;
4757
                                            return_state <= fetch_state;
4758
                                            next_state   <= indirect_state;
4759
                                          end if;
4760
 
4761
                                        when "1011" =>     -- ACCD,R
4762
                 ix_ctrl    <= latch_ix;
4763
                 iy_ctrl    <= latch_iy;
4764
                 up_ctrl    <= latch_up;
4765
                 sp_ctrl    <= latch_sp;
4766
                                     case md(6 downto 5) is
4767
                                          when "00" =>
4768
                                  left_ctrl  <= ix_left;
4769
                                          when "01" =>
4770
                                  left_ctrl  <= iy_left;
4771
                                          when "10" =>
4772
                                  left_ctrl  <= up_left;
4773
                                          when others =>
4774
                                          -- when "11" =>
4775
                                  left_ctrl  <= sp_left;
4776
                                          end case;
4777
                                     right_ctrl <= accd_right;
4778
                                     alu_ctrl   <= alu_add16;
4779
                 cc_ctrl    <= latch_cc;
4780
                 ea_ctrl    <= load_ea;
4781
                                          --
4782
                 md_ctrl    <= latch_md;
4783
                 addr_ctrl  <= idle_ad;
4784
                 pc_ctrl    <= latch_pc;
4785
                                          --
4786
                                          if md(4) = '0' then
4787
                                            st_ctrl      <= pull_st;
4788
                                            return_state <= fetch_state;
4789
                                            next_state   <= saved_state;
4790
                                          else
4791
                                            st_ctrl      <= idle_st;
4792
                                            return_state <= fetch_state;
4793
                                            next_state   <= indirect_state;
4794
                                          end if;
4795
 
4796
                                        when "1100" =>     -- offset8,PC
4797
                 ix_ctrl    <= latch_ix;
4798
                 iy_ctrl    <= latch_iy;
4799
                 up_ctrl    <= latch_up;
4800
                 sp_ctrl    <= latch_sp;
4801
                                          --
4802
                                left_ctrl  <= pc_left;
4803
                                     right_ctrl <= zero_right;
4804
                                     alu_ctrl   <= alu_nop;
4805
                 cc_ctrl    <= latch_cc;
4806
                                          ea_ctrl    <= latch_ea;
4807
                                          -- fetch 8 bit offset
4808
                 md_ctrl    <= fetch_first_md;
4809
                 addr_ctrl  <= fetch_ad;
4810
                 pc_ctrl    <= incr_pc;
4811
                                          --
4812
                                          st_ctrl      <= idle_st;
4813
                                          return_state <= fetch_state;
4814
                 next_state   <= pcrel8_state;
4815
 
4816
                                        when "1101" =>     -- offset16,PC
4817
                 ix_ctrl    <= latch_ix;
4818
                 iy_ctrl    <= latch_iy;
4819
                 up_ctrl    <= latch_up;
4820
                 sp_ctrl    <= latch_sp;
4821
                                          --
4822
                                left_ctrl  <= pc_left;
4823
                                     right_ctrl <= zero_right;
4824
                                     alu_ctrl   <= alu_nop;
4825
                 cc_ctrl    <= latch_cc;
4826
                                          ea_ctrl    <= latch_ea;
4827
                                          -- fetch offset
4828
                 md_ctrl    <= fetch_first_md;
4829
                 addr_ctrl  <= fetch_ad;
4830
                 pc_ctrl    <= incr_pc;
4831
                                          --
4832
                                          st_ctrl      <= idle_st;
4833
                                          return_state <= fetch_state;
4834
                 next_state   <= pcrel16_state;
4835
 
4836
                                        when "1110" =>     -- undefined
4837
                 ix_ctrl    <= latch_ix;
4838
                 iy_ctrl    <= latch_iy;
4839
                 up_ctrl    <= latch_up;
4840
                 sp_ctrl    <= latch_sp;
4841
                                     case md(6 downto 5) is
4842
                                          when "00" =>
4843
                                  left_ctrl  <= ix_left;
4844
                                          when "01" =>
4845
                                  left_ctrl  <= iy_left;
4846
                                          when "10" =>
4847
                                  left_ctrl  <= up_left;
4848
                                          when others =>
4849
                                          -- when "11" =>
4850
                                  left_ctrl  <= sp_left;
4851
                                          end case;
4852
                                     right_ctrl <= zero_right;
4853
                                     alu_ctrl   <= alu_nop;
4854
                 cc_ctrl    <= latch_cc;
4855
                 ea_ctrl    <= load_ea;
4856
                                          --
4857
                 md_ctrl    <= latch_md;
4858
                 addr_ctrl  <= idle_ad;
4859
                 pc_ctrl    <= latch_pc;
4860
                                          --
4861
                                          if md(4) = '0' then
4862
                                            st_ctrl      <= pull_st;
4863
                                            return_state <= fetch_state;
4864
                                            next_state   <= saved_state;
4865
                                          else
4866
                                            st_ctrl      <= idle_st;
4867
                                            return_state <= fetch_state;
4868
                                            next_state   <= indirect_state;
4869
                                          end if;
4870
 
4871
               when others =>
4872
--                      when "1111" =>     -- [,address]
4873
                 ix_ctrl    <= latch_ix;
4874
                 iy_ctrl    <= latch_iy;
4875
                 up_ctrl    <= latch_up;
4876
                 sp_ctrl    <= latch_sp;
4877
                                          -- idle ALU
4878
                                left_ctrl  <= pc_left;
4879
                                     right_ctrl <= zero_right;
4880
                                     alu_ctrl   <= alu_nop;
4881
                 cc_ctrl    <= latch_cc;
4882
                 ea_ctrl    <= latch_ea;
4883
                                          -- advance PC to pick up address
4884
                 md_ctrl    <= fetch_first_md;
4885
                 addr_ctrl  <= fetch_ad;
4886
                                          pc_ctrl    <= incr_pc;
4887
                                          --
4888
                                          st_ctrl      <= idle_st;
4889
                                          return_state <= fetch_state;
4890
                 next_state   <= indexaddr_state;
4891
                                        end case;
4892
                                 end if;
4893
 
4894
                          -- load index register with ea plus one
4895
                          when postincr1_state =>
4896
                            op_ctrl    <= latch_op;
4897
             pre_ctrl   <= latch_pre;
4898
             acca_ctrl  <= latch_acca;
4899
             accb_ctrl  <= latch_accb;
4900
             cc_ctrl    <= latch_cc;
4901
             dp_ctrl    <= latch_dp;
4902
             iv_ctrl    <= latch_iv;
4903
                                 nmi_ctrl   <= latch_nmi;
4904
             pc_ctrl    <= latch_pc;
4905
             md_ctrl    <= latch_md;
4906
             ea_ctrl    <= latch_ea;
4907
                                 --
4908
                            left_ctrl  <= ea_left;
4909
                            right_ctrl <= one_right;
4910
                            alu_ctrl   <= alu_add16;
4911
                                 case md(6 downto 5) is
4912
                            when "00" =>
4913
               ix_ctrl    <= load_ix;
4914
               iy_ctrl    <= latch_iy;
4915
               up_ctrl    <= latch_up;
4916
               sp_ctrl    <= latch_sp;
4917
                                 when "01" =>
4918
               ix_ctrl    <= latch_ix;
4919
               iy_ctrl    <= load_iy;
4920
               up_ctrl    <= latch_up;
4921
               sp_ctrl    <= latch_sp;
4922
                                 when "10" =>
4923
               ix_ctrl    <= latch_ix;
4924
               iy_ctrl    <= latch_iy;
4925
               up_ctrl    <= load_up;
4926
               sp_ctrl    <= latch_sp;
4927
                                 when others =>
4928
                                 -- when "11" =>
4929
               ix_ctrl    <= latch_ix;
4930
               iy_ctrl    <= latch_iy;
4931
               up_ctrl    <= latch_up;
4932
               sp_ctrl    <= load_sp;
4933
                            end case;
4934
             addr_ctrl  <= idle_ad;
4935
             dout_ctrl  <= md_lo_dout;
4936
                                 -- return to previous state
4937
                            if md(4) = '0' then
4938
                                         st_ctrl      <= pull_st;
4939
                                         return_state <= fetch_state;
4940
                                         next_state   <= saved_state;
4941
                                 else
4942
                                         st_ctrl      <= idle_st;
4943
                                         return_state <= fetch_state;
4944
                                         next_state   <= indirect_state;
4945
                                 end if;
4946
 
4947
                          -- load index register with ea plus two
4948
                          when postincr2_state =>
4949
                            op_ctrl    <= latch_op;
4950
             pre_ctrl   <= latch_pre;
4951
             acca_ctrl  <= latch_acca;
4952
             accb_ctrl  <= latch_accb;
4953
             cc_ctrl    <= latch_cc;
4954
             dp_ctrl    <= latch_dp;
4955
             iv_ctrl    <= latch_iv;
4956
                                 nmi_ctrl   <= latch_nmi;
4957
             pc_ctrl    <= latch_pc;
4958
             md_ctrl    <= latch_md;
4959
             ea_ctrl    <= latch_ea;
4960
                                 -- increment register by two (address)
4961
                            left_ctrl  <= ea_left;
4962
                            right_ctrl <= two_right;
4963
                            alu_ctrl   <= alu_add16;
4964
                                 case md(6 downto 5) is
4965
                            when "00" =>
4966
               ix_ctrl    <= load_ix;
4967
               iy_ctrl    <= latch_iy;
4968
               up_ctrl    <= latch_up;
4969
               sp_ctrl    <= latch_sp;
4970
                                 when "01" =>
4971
               ix_ctrl    <= latch_ix;
4972
               iy_ctrl    <= load_iy;
4973
               up_ctrl    <= latch_up;
4974
               sp_ctrl    <= latch_sp;
4975
                                 when "10" =>
4976
               ix_ctrl    <= latch_ix;
4977
               iy_ctrl    <= latch_iy;
4978
               up_ctrl    <= load_up;
4979
               sp_ctrl    <= latch_sp;
4980
                                 when others =>
4981
                                 -- when "11" =>
4982
               ix_ctrl    <= latch_ix;
4983
               iy_ctrl    <= latch_iy;
4984
               up_ctrl    <= latch_up;
4985
               sp_ctrl    <= load_sp;
4986
                            end case;
4987
             addr_ctrl  <= idle_ad;
4988
             dout_ctrl  <= md_lo_dout;
4989
                                 -- return to previous state
4990
                            if md(4) = '0' then
4991
                                         st_ctrl      <= pull_st;
4992
                                         return_state <= fetch_state;
4993
                                         next_state   <= saved_state;
4994
                                 else
4995
                                         st_ctrl      <= idle_st;
4996
                                         return_state <= fetch_state;
4997
                                         next_state   <= indirect_state;
4998
                                 end if;
4999
           --
5000
                          -- ea = index register + md (8 bit signed offset)
5001
                          -- ea holds post byte
5002
                          --
5003
                          when index8_state =>
5004
                            op_ctrl    <= latch_op;
5005
             pre_ctrl   <= latch_pre;
5006
             acca_ctrl  <= latch_acca;
5007
             accb_ctrl  <= latch_accb;
5008
             cc_ctrl    <= latch_cc;
5009
             dp_ctrl    <= latch_dp;
5010
             ix_ctrl    <= latch_ix;
5011
             iy_ctrl    <= latch_iy;
5012
             up_ctrl    <= latch_up;
5013
             sp_ctrl    <= latch_sp;
5014
             iv_ctrl    <= latch_iv;
5015
                                 nmi_ctrl   <= latch_nmi;
5016
             pc_ctrl    <= latch_pc;
5017
             md_ctrl    <= latch_md;
5018
                                 case ea(6 downto 5) is
5019
                            when "00" =>
5020
                              left_ctrl  <= ix_left;
5021
                            when "01" =>
5022
                              left_ctrl  <= iy_left;
5023
                                 when "10" =>
5024
                              left_ctrl  <= up_left;
5025
                                 when others =>
5026
                                 -- when "11" =>
5027
                              left_ctrl  <= sp_left;
5028
                                 end case;
5029
                                 -- ea = index reg + md
5030
                            right_ctrl <= md_sign8_right;
5031
                            alu_ctrl   <= alu_add16;
5032
             ea_ctrl    <= load_ea;
5033
                                 -- idle bus
5034
             addr_ctrl  <= idle_ad;
5035
             dout_ctrl  <= md_lo_dout;
5036
                                 -- return to previous state
5037
                            if ea(4) = '0' then
5038
                                         st_ctrl      <= pull_st;
5039
                                         return_state <= fetch_state;
5040
                                         next_state   <= saved_state;
5041
                                 else
5042
                                         st_ctrl      <= idle_st;
5043
                                         return_state <= fetch_state;
5044
                                         next_state   <= indirect_state;
5045
                                 end if;
5046
 
5047
                          -- fetch low byte of 16 bit indexed offset
5048
                          when index16_state =>
5049
                            op_ctrl    <= latch_op;
5050
             pre_ctrl   <= latch_pre;
5051
             acca_ctrl  <= latch_acca;
5052
             accb_ctrl  <= latch_accb;
5053
             cc_ctrl    <= latch_cc;
5054
             dp_ctrl    <= latch_dp;
5055
             ix_ctrl    <= latch_ix;
5056
             iy_ctrl    <= latch_iy;
5057
             up_ctrl    <= latch_up;
5058
             sp_ctrl    <= latch_sp;
5059
             iv_ctrl    <= latch_iv;
5060
                                 nmi_ctrl   <= latch_nmi;
5061
                                 -- advance pc
5062
                            left_ctrl  <= pc_left;
5063
                            right_ctrl <= one_right;
5064
                            alu_ctrl   <= alu_add16;
5065
             pc_ctrl    <= incr_pc;
5066
                                 -- fetch low byte
5067
             ea_ctrl    <= latch_ea;
5068
             md_ctrl    <= fetch_next_md;
5069
             addr_ctrl  <= fetch_ad;
5070
             dout_ctrl  <= md_lo_dout;
5071
                                 --
5072
                            st_ctrl      <= idle_st;
5073
                            return_state <= fetch_state;
5074
                                 next_state   <= index16_2_state;
5075
 
5076
                          -- ea = index register + md (16 bit offset)
5077
                          -- ea holds post byte
5078
                          when index16_2_state =>
5079
                            op_ctrl    <= latch_op;
5080
             pre_ctrl   <= latch_pre;
5081
 
5082
             acca_ctrl  <= latch_acca;
5083
             accb_ctrl  <= latch_accb;
5084
             cc_ctrl    <= latch_cc;
5085
             dp_ctrl    <= latch_dp;
5086
             ix_ctrl    <= latch_ix;
5087
             iy_ctrl    <= latch_iy;
5088
             up_ctrl    <= latch_up;
5089
             sp_ctrl    <= latch_sp;
5090
             iv_ctrl    <= latch_iv;
5091
                                 nmi_ctrl   <= latch_nmi;
5092
             pc_ctrl    <= latch_pc;
5093
             md_ctrl    <= latch_md;
5094
                                 case ea(6 downto 5) is
5095
                            when "00" =>
5096
                              left_ctrl  <= ix_left;
5097
                            when "01" =>
5098
                              left_ctrl  <= iy_left;
5099
                                 when "10" =>
5100
                              left_ctrl  <= up_left;
5101
                                 when others =>
5102
                                 -- when "11" =>
5103
                              left_ctrl  <= sp_left;
5104
                                 end case;
5105
                                 -- ea = index reg + md
5106
                            right_ctrl <= md_right;
5107
                            alu_ctrl   <= alu_add16;
5108
             ea_ctrl    <= load_ea;
5109
                                 -- idle bus
5110
             addr_ctrl  <= idle_ad;
5111
             dout_ctrl  <= md_lo_dout;
5112
                                 -- return to previous state
5113
                            if ea(4) = '0' then
5114
                                         st_ctrl      <= pull_st;
5115
                                         return_state <= fetch_state;
5116
                                         next_state   <= saved_state;
5117
                                 else
5118
                                         st_ctrl      <= idle_st;
5119
                                         return_state <= fetch_state;
5120
                                         next_state   <= indirect_state;
5121
                                 end if;
5122
           --
5123
                          -- pc relative with 8 bit signed offest
5124
                          -- md holds signed offset
5125
                          --
5126
                          when pcrel8_state =>
5127
                            op_ctrl    <= latch_op;
5128
             pre_ctrl   <= latch_pre;
5129
             acca_ctrl  <= latch_acca;
5130
             accb_ctrl  <= latch_accb;
5131
             cc_ctrl    <= latch_cc;
5132
             dp_ctrl    <= latch_dp;
5133
             ix_ctrl    <= latch_ix;
5134
             iy_ctrl    <= latch_iy;
5135
             up_ctrl    <= latch_up;
5136
             sp_ctrl    <= latch_sp;
5137
             iv_ctrl    <= latch_iv;
5138
                                 nmi_ctrl   <= latch_nmi;
5139
             pc_ctrl    <= latch_pc;
5140
             md_ctrl    <= latch_md;
5141
                                 -- ea = pc + signed md
5142
                            left_ctrl  <= pc_left;
5143
                            right_ctrl <= md_sign8_right;
5144
                            alu_ctrl   <= alu_add16;
5145
             ea_ctrl    <= load_ea;
5146
                                 -- idle bus
5147
             addr_ctrl  <= idle_ad;
5148
             dout_ctrl  <= md_lo_dout;
5149
                                 -- return to previous state
5150
                            if ea(4) = '0' then
5151
                                         st_ctrl      <= pull_st;
5152
                                         return_state <= fetch_state;
5153
                                         next_state   <= saved_state;
5154
                                 else
5155
                                         st_ctrl      <= idle_st;
5156
                                         return_state <= fetch_state;
5157
                                         next_state   <= indirect_state;
5158
                                 end if;
5159
 
5160
                          -- pc relative addressing with 16 bit offset
5161
                          -- pick up the low byte of the offset in md
5162
                          -- advance the pc
5163
                          when pcrel16_state =>
5164
                            op_ctrl    <= latch_op;
5165
             pre_ctrl   <= latch_pre;
5166
             acca_ctrl  <= latch_acca;
5167
             accb_ctrl  <= latch_accb;
5168
             cc_ctrl    <= latch_cc;
5169
             dp_ctrl    <= latch_dp;
5170
             ix_ctrl    <= latch_ix;
5171
             iy_ctrl    <= latch_iy;
5172
             up_ctrl    <= latch_up;
5173
             sp_ctrl    <= latch_sp;
5174
             iv_ctrl    <= latch_iv;
5175
                                 nmi_ctrl   <= latch_nmi;
5176
             ea_ctrl    <= latch_ea;
5177
                                 -- advance pc
5178
                            left_ctrl  <= pc_left;
5179
                            right_ctrl <= zero_right;
5180
                            alu_ctrl   <= alu_nop;
5181
             pc_ctrl    <= incr_pc;
5182
                                 -- fetch low byte
5183
             ea_ctrl    <= latch_ea;
5184
             md_ctrl    <= fetch_next_md;
5185
             addr_ctrl  <= fetch_ad;
5186
             dout_ctrl  <= md_lo_dout;
5187
                                 --
5188
                                 st_ctrl      <= idle_st;
5189
                                 return_state <= fetch_state;
5190
                                 next_state <= pcrel16_2_state;
5191
 
5192
                          -- pc relative with16 bit signed offest
5193
                          -- md holds signed offset
5194
                          when pcrel16_2_state =>
5195
                            op_ctrl    <= latch_op;
5196
             pre_ctrl   <= latch_pre;
5197
             acca_ctrl  <= latch_acca;
5198
             accb_ctrl  <= latch_accb;
5199
             cc_ctrl    <= latch_cc;
5200
             dp_ctrl    <= latch_dp;
5201
             ix_ctrl    <= latch_ix;
5202
             iy_ctrl    <= latch_iy;
5203
             up_ctrl    <= latch_up;
5204
             sp_ctrl    <= latch_sp;
5205
             iv_ctrl    <= latch_iv;
5206
                                 nmi_ctrl   <= latch_nmi;
5207
             pc_ctrl    <= latch_pc;
5208
                                 -- ea = pc +  md
5209
                            left_ctrl  <= pc_left;
5210
                            right_ctrl <= md_right;
5211
                            alu_ctrl   <= alu_add16;
5212
             ea_ctrl    <= load_ea;
5213
             md_ctrl    <= latch_md;
5214
                                 -- idle bus
5215
             addr_ctrl  <= idle_ad;
5216
             dout_ctrl  <= md_lo_dout;
5217
                                 -- return to previous state
5218
                            if ea(4) = '0' then
5219
                                         st_ctrl      <= pull_st;
5220
                                         return_state <= fetch_state;
5221
                                         next_state   <= saved_state;
5222
                                 else
5223
                                         st_ctrl      <= idle_st;
5224
                                         return_state <= fetch_state;
5225
                                         next_state   <= indirect_state;
5226
                                 end if;
5227
 
5228
                          -- indexed to absolute address
5229
                          -- md holds address
5230
                          -- ea hold indexing mode byte
5231
                          when indexaddr2_state =>
5232
                            op_ctrl    <= latch_op;
5233
             pre_ctrl   <= latch_pre;
5234
             acca_ctrl  <= latch_acca;
5235
             accb_ctrl  <= latch_accb;
5236
             cc_ctrl    <= latch_cc;
5237
             dp_ctrl    <= latch_dp;
5238
             ix_ctrl    <= latch_ix;
5239
             iy_ctrl    <= latch_iy;
5240
             up_ctrl    <= latch_up;
5241
             sp_ctrl    <= latch_sp;
5242
             iv_ctrl    <= latch_iv;
5243
                                 nmi_ctrl   <= latch_nmi;
5244
             pc_ctrl    <= latch_pc;
5245
                                 -- ea = md
5246
                            left_ctrl  <= pc_left;
5247
                            right_ctrl <= md_right;
5248
                            alu_ctrl   <= alu_ld16;
5249
             ea_ctrl    <= load_ea;
5250
             md_ctrl    <= latch_md;
5251
                                 -- idle bus
5252
             addr_ctrl  <= idle_ad;
5253
             dout_ctrl  <= md_lo_dout;
5254
                                 -- return to previous state
5255
                            if ea(4) = '0' then
5256
                                         st_ctrl      <= pull_st;
5257
                                         return_state <= fetch_state;
5258
                                         next_state   <= saved_state;
5259
                                 else
5260
                                         st_ctrl      <= idle_st;
5261
                                         return_state <= fetch_state;
5262
                                         next_state   <= indirect_state;
5263
                                 end if;
5264
 
5265
                          -- indexed to address
5266
                          -- pick up the low byte of the address
5267
                          -- advance the pc
5268
                          when indexaddr_state =>
5269
             acca_ctrl  <= latch_acca;
5270
             accb_ctrl  <= latch_accb;
5271
             cc_ctrl    <= latch_cc;
5272
             dp_ctrl    <= latch_dp;
5273
             ix_ctrl    <= latch_ix;
5274
             iy_ctrl    <= latch_iy;
5275
             up_ctrl    <= latch_up;
5276
             sp_ctrl    <= latch_sp;
5277
             iv_ctrl    <= latch_iv;
5278
                            op_ctrl    <= latch_op;
5279
             pre_ctrl   <= latch_pre;
5280
                                 nmi_ctrl   <= latch_nmi;
5281
             ea_ctrl    <= latch_ea;
5282
                                 -- advance pc
5283
                            left_ctrl  <= pc_left;
5284
                            right_ctrl <= zero_right;
5285
                            alu_ctrl   <= alu_nop;
5286
             pc_ctrl    <= incr_pc;
5287
                                 -- fetch low byte
5288
             md_ctrl    <= fetch_next_md;
5289
             addr_ctrl  <= read_ad;
5290
             dout_ctrl  <= md_lo_dout;
5291
                                 --
5292
                                 st_ctrl      <= idle_st;
5293
                                 return_state <= fetch_state;
5294
                                 next_state   <= indexaddr2_state;
5295
           --
5296
                          -- load md with high byte of indirect address
5297
                          -- pointed to by ea
5298
                          -- increment ea
5299
                          --
5300
                          when indirect_state =>
5301
             acca_ctrl  <= latch_acca;
5302
             accb_ctrl  <= latch_accb;
5303
             cc_ctrl    <= latch_cc;
5304
             dp_ctrl    <= latch_dp;
5305
             ix_ctrl    <= latch_ix;
5306
             iy_ctrl    <= latch_iy;
5307
             up_ctrl    <= latch_up;
5308
             sp_ctrl    <= latch_sp;
5309
             iv_ctrl    <= latch_iv;
5310
                            op_ctrl    <= latch_op;
5311
             pre_ctrl   <= latch_pre;
5312
                                 nmi_ctrl   <= latch_nmi;
5313
             pc_ctrl    <= latch_pc;
5314
                                 -- increment ea
5315
                            left_ctrl  <= ea_left;
5316
                            right_ctrl <= one_right;
5317
                            alu_ctrl   <= alu_add16;
5318
             ea_ctrl    <= load_ea;
5319
                                 -- fetch high byte
5320
             md_ctrl    <= fetch_first_md;
5321
             addr_ctrl  <= read_ad;
5322
             dout_ctrl  <= md_lo_dout;
5323
                                 --
5324
                                 st_ctrl      <= idle_st;
5325
                                 return_state <= fetch_state;
5326
                                 next_state <= indirect2_state;
5327
           --
5328
                          -- load md with low byte of indirect address
5329
                          -- pointed to by ea
5330
                          -- ea has previously been incremented
5331
                          --
5332
                          when indirect2_state =>
5333
             acca_ctrl  <= latch_acca;
5334
             accb_ctrl  <= latch_accb;
5335
             cc_ctrl    <= latch_cc;
5336
             dp_ctrl    <= latch_dp;
5337
             ix_ctrl    <= latch_ix;
5338
             iy_ctrl    <= latch_iy;
5339
             up_ctrl    <= latch_up;
5340
             sp_ctrl    <= latch_sp;
5341
             iv_ctrl    <= latch_iv;
5342
                            op_ctrl    <= latch_op;
5343
             pre_ctrl   <= latch_pre;
5344
                                 nmi_ctrl   <= latch_nmi;
5345
             pc_ctrl    <= latch_pc;
5346
                                 -- idle ea
5347
                            left_ctrl  <= ea_left;
5348
                            right_ctrl <= zero_right;
5349
                            alu_ctrl   <= alu_nop;
5350
             ea_ctrl    <= latch_ea;
5351
                                 -- fetch high byte
5352
             md_ctrl    <= fetch_next_md;
5353
             addr_ctrl  <= read_ad;
5354
             dout_ctrl  <= md_lo_dout;
5355
                                 --
5356
                                 st_ctrl      <= idle_st;
5357
                                 return_state <= fetch_state;
5358
                                 next_state <= indirect3_state;
5359
                          --
5360
                          -- complete idirect addressing
5361
                          -- by loading ea with md
5362
                          --
5363
                          when indirect3_state =>
5364
             acca_ctrl  <= latch_acca;
5365
             accb_ctrl  <= latch_accb;
5366
             cc_ctrl    <= latch_cc;
5367
             dp_ctrl    <= latch_dp;
5368
             ix_ctrl    <= latch_ix;
5369
             iy_ctrl    <= latch_iy;
5370
             up_ctrl    <= latch_up;
5371
             sp_ctrl    <= latch_sp;
5372
             iv_ctrl    <= latch_iv;
5373
                            op_ctrl    <= latch_op;
5374
             pre_ctrl   <= latch_pre;
5375
                                 nmi_ctrl   <= latch_nmi;
5376
             pc_ctrl    <= latch_pc;
5377
                                 -- load ea with md
5378
                            left_ctrl  <= ea_left;
5379
                            right_ctrl <= md_right;
5380
                            alu_ctrl   <= alu_ld16;
5381
             ea_ctrl    <= load_ea;
5382
                                 -- idle cycle
5383
             md_ctrl    <= latch_md;
5384
             addr_ctrl  <= idle_ad;
5385
             dout_ctrl  <= md_lo_dout;
5386
                                 -- return to previous state
5387
                                 st_ctrl      <= pull_st;
5388
                                 return_state <= fetch_state;
5389
                                 next_state   <= saved_state;
5390
 
5391
           --
5392
                          -- ea holds the low byte of the absolute address
5393
                          -- Move ea low byte into ea high byte
5394
                          -- load new ea low byte to for absolute 16 bit address
5395
                          -- advance the program counter
5396
                          --
5397
                          when extended_state => -- fetch ea low byte
5398
               acca_ctrl  <= latch_acca;
5399
               accb_ctrl  <= latch_accb;
5400
               ix_ctrl    <= latch_ix;
5401
               iy_ctrl    <= latch_iy;
5402
               up_ctrl    <= latch_up;
5403
               sp_ctrl    <= latch_sp;
5404
               md_ctrl    <= latch_md;
5405
               iv_ctrl    <= latch_iv;
5406
               dp_ctrl    <= latch_dp;
5407
                              op_ctrl    <= latch_op;
5408
               pre_ctrl   <= latch_pre;
5409
                                   nmi_ctrl   <= latch_nmi;
5410
                                        -- increment pc
5411
               left_ctrl  <= pc_left;
5412
               right_ctrl <= zero_right;
5413
               alu_ctrl   <= alu_nop;
5414
               cc_ctrl    <= latch_cc;
5415
               pc_ctrl    <= incr_pc;
5416
                                        -- fetch next effective address bytes
5417
                                        ea_ctrl    <= fetch_next_ea;
5418
               addr_ctrl  <= fetch_ad;
5419
                                        dout_ctrl  <= md_lo_dout;
5420
                                   -- return to previous state
5421
                                   st_ctrl      <= pull_st;
5422
                                   return_state <= fetch_state;
5423
                                   next_state   <= saved_state;
5424
 
5425
                                when lea_state => -- here on load effective address
5426
                              op_ctrl    <= latch_op;
5427
               cc_ctrl    <= latch_cc;
5428
               acca_ctrl  <= latch_acca;
5429
               accb_ctrl  <= latch_accb;
5430
               dp_ctrl    <= latch_dp;
5431
               iv_ctrl    <= latch_iv;
5432
               pre_ctrl   <= latch_pre;
5433
                                   nmi_ctrl   <= latch_nmi;
5434
               md_ctrl    <= latch_md;
5435
               ea_ctrl    <= latch_ea;
5436
                                        pc_ctrl    <= latch_pc;
5437
                                        -- load index register with effective address
5438
               left_ctrl  <= pc_left;
5439
                                        right_ctrl <= ea_right;
5440
                                   alu_ctrl   <= alu_ld16;
5441
                                        case op_code(3 downto 0) is
5442
                                        when "0000" => -- leax
5443
                   ix_ctrl    <= load_ix;
5444
                   iy_ctrl    <= latch_iy;
5445
                   up_ctrl    <= latch_up;
5446
                   sp_ctrl    <= latch_sp;
5447
                                        when "0001" => -- leay
5448
                   ix_ctrl    <= latch_ix;
5449
                   iy_ctrl    <= load_iy;
5450
                   up_ctrl    <= latch_up;
5451
                   sp_ctrl    <= latch_sp;
5452
                                        when "0010" => -- leas
5453
                   ix_ctrl    <= latch_ix;
5454
                   iy_ctrl    <= latch_iy;
5455
                   up_ctrl    <= latch_up;
5456
                   sp_ctrl    <= load_sp;
5457
                                        when "0011" => -- leau
5458
                   ix_ctrl    <= latch_ix;
5459
                   iy_ctrl    <= latch_iy;
5460
                   up_ctrl    <= load_up;
5461
                   sp_ctrl    <= latch_sp;
5462
                                        when others =>
5463
                   ix_ctrl    <= latch_ix;
5464
                   iy_ctrl    <= latch_iy;
5465
                   up_ctrl    <= latch_up;
5466
                   sp_ctrl    <= latch_sp;
5467
                                        end case;
5468
                                        -- idle the bus
5469
               addr_ctrl  <= idle_ad;
5470
               dout_ctrl  <= md_lo_dout;
5471
                                        --
5472
                                        st_ctrl      <= idle_st;
5473
                                        return_state <= fetch_state;
5474
               next_state   <= fetch_state;
5475
 
5476
                                --
5477
                                -- jump to subroutine
5478
                                -- (sp)=pc_lo
5479
                                -- sp=sp-1
5480
                                -- call push_return_hi_state to save hi pc
5481
                                -- return to jmp_state
5482
                                --
5483
                                when jsr_state =>
5484
               acca_ctrl  <= latch_acca;
5485
               accb_ctrl  <= latch_accb;
5486
               cc_ctrl    <= latch_cc;
5487
               dp_ctrl    <= latch_dp;
5488
               ix_ctrl    <= latch_ix;
5489
               iy_ctrl    <= latch_iy;
5490
               up_ctrl    <= latch_up;
5491
               iv_ctrl    <= latch_iv;
5492
                              op_ctrl    <= latch_op;
5493
               pre_ctrl   <= latch_pre;
5494
                                   nmi_ctrl   <= latch_nmi;
5495
               md_ctrl    <= latch_md;
5496
               ea_ctrl    <= latch_ea;
5497
                                        pc_ctrl    <= latch_pc;
5498
                                        -- decrement sp
5499
               left_ctrl  <= sp_left;
5500
                                        right_ctrl <= one_right;
5501
                                   alu_ctrl   <= alu_sub16;
5502
               sp_ctrl    <= load_sp;
5503
                                        -- write pc lo byte
5504
               addr_ctrl  <= pushs_ad;
5505
               dout_ctrl  <= pc_lo_dout;
5506
                                        -- call second half of push_return_state
5507
                                        st_ctrl      <= push_st;
5508
                                        return_state <= jmp_state;
5509
               next_state   <= push_return_hi_state;
5510
 
5511
                                --
5512
                                -- Load pc with ea
5513
                                -- (JMP)
5514
                                --
5515
                                when jmp_state =>
5516
               acca_ctrl  <= latch_acca;
5517
               accb_ctrl  <= latch_accb;
5518
               cc_ctrl    <= latch_cc;
5519
               dp_ctrl    <= latch_dp;
5520
               ix_ctrl    <= latch_ix;
5521
               iy_ctrl    <= latch_iy;
5522
               up_ctrl    <= latch_up;
5523
               sp_ctrl    <= latch_sp;
5524
               iv_ctrl    <= latch_iv;
5525
                              op_ctrl    <= latch_op;
5526
               pre_ctrl   <= latch_pre;
5527
                                   nmi_ctrl   <= latch_nmi;
5528
               md_ctrl    <= latch_md;
5529
               ea_ctrl    <= latch_ea;
5530
                                        -- load PC with effective address
5531
               left_ctrl  <= pc_left;
5532
                                        right_ctrl <= ea_right;
5533
                                   alu_ctrl   <= alu_ld16;
5534
                                        pc_ctrl    <= load_pc;
5535
                                        -- idle the bus
5536
               addr_ctrl  <= idle_ad;
5537
               dout_ctrl  <= md_lo_dout;
5538
                                        --
5539
                                        st_ctrl      <= idle_st;
5540
                                        return_state <= fetch_state;
5541
               next_state   <= fetch_state;
5542
 
5543
                                --
5544
                                -- long branch or branch to subroutine
5545
                                -- pick up next md byte
5546
                                -- md_hi = md_lo
5547
                                -- md_lo = (pc)
5548
                                -- pc=pc+1
5549
                                -- if a lbsr push return address
5550
                                -- continue to sbranch_state
5551
                                -- to evaluate conditional branches
5552
                                --
5553
                                when lbranch_state =>
5554
               acca_ctrl  <= latch_acca;
5555
               accb_ctrl  <= latch_accb;
5556
               cc_ctrl    <= latch_cc;
5557
               dp_ctrl    <= latch_dp;
5558
               ix_ctrl    <= latch_ix;
5559
               iy_ctrl    <= latch_iy;
5560
               up_ctrl    <= latch_up;
5561
               sp_ctrl    <= latch_sp;
5562
               iv_ctrl    <= latch_iv;
5563
                              op_ctrl    <= latch_op;
5564
               pre_ctrl   <= latch_pre;
5565
                                   nmi_ctrl   <= latch_nmi;
5566
               ea_ctrl    <= latch_ea;
5567
                                        --
5568
               left_ctrl  <= pc_left;
5569
                                        right_ctrl <= ea_right;
5570
                                   alu_ctrl   <= alu_ld16;
5571
                                        pc_ctrl    <= incr_pc;
5572
                                        -- fetch the next byte into md_lo
5573
               md_ctrl    <= fetch_next_md;
5574
               addr_ctrl  <= fetch_ad;
5575
               dout_ctrl  <= md_lo_dout;
5576
                                        -- if lbsr - push return address
5577
                                        -- then continue on to short branch
5578
                                        if op_code = "00010111" then
5579
                                          st_ctrl      <= push_st;
5580
                                          return_state <= sbranch_state;
5581
                 next_state   <= push_return_lo_state;
5582
                                        else
5583
                                          st_ctrl      <= idle_st;
5584
                                          return_state <= fetch_state;
5585
                 next_state   <= sbranch_state;
5586
                                        end if;
5587
 
5588
                                 --
5589
                                 -- here to execute conditional branch
5590
                                 -- short conditional branch md = signed 8 bit offset
5591
                                 -- long branch md = 16 bit offset
5592
                                 -- 
5593
                  when sbranch_state =>
5594
               acca_ctrl  <= latch_acca;
5595
               accb_ctrl  <= latch_accb;
5596
               cc_ctrl    <= latch_cc;
5597
               dp_ctrl    <= latch_dp;
5598
               ix_ctrl    <= latch_ix;
5599
               iy_ctrl    <= latch_iy;
5600
               up_ctrl    <= latch_up;
5601
               sp_ctrl    <= latch_sp;
5602
               iv_ctrl    <= latch_iv;
5603
                              op_ctrl    <= latch_op;
5604
               pre_ctrl   <= latch_pre;
5605
                                   nmi_ctrl   <= latch_nmi;
5606
               ea_ctrl    <= latch_ea;
5607
               md_ctrl    <= latch_md;
5608
                                        --
5609
               left_ctrl  <= pc_left;
5610
                                        right_ctrl <= md_right;
5611
                                   alu_ctrl   <= alu_add16;
5612
                                        --
5613
               addr_ctrl  <= idle_ad;
5614
               dout_ctrl  <= md_lo_dout;
5615
                                        --
5616
                                   st_ctrl      <= idle_st;
5617
                                   return_state <= fetch_state;
5618
                                        next_state   <= fetch_state;
5619
                              if op_code(7 downto 4) = "0010" then -- conditional branch
5620
                 case op_code(3 downto 0) is
5621
                           when "0000" => -- bra
5622
                                            cond_true := (1 = 1);
5623
                           when "0001" => -- brn
5624
                                            cond_true := (1 = 0);
5625
                           when "0010" => -- bhi
5626
                                            cond_true := ((cc(CBIT) or cc(ZBIT)) = '0');
5627
                           when "0011" => -- bls
5628
                                            cond_true := ((cc(CBIT) or cc(ZBIT)) = '1');
5629
                           when "0100" => -- bcc/bhs
5630
                                            cond_true := (cc(CBIT) = '0');
5631
                           when "0101" => -- bcs/blo
5632
                                            cond_true := (cc(CBIT) = '1');
5633
                           when "0110" => -- bne
5634
                             cond_true := (cc(ZBIT) = '0');
5635
                           when "0111" => -- beq
5636
                                            cond_true := (cc(ZBIT) = '1');
5637
                           when "1000" => -- bvc
5638
                                            cond_true := (cc(VBIT) = '0');
5639
                           when "1001" => -- bvs
5640
                                            cond_true := (cc(VBIT) = '1');
5641
                           when "1010" => -- bpl
5642
                                            cond_true := (cc(NBIT) = '0');
5643
                           when "1011" => -- bmi
5644
                                            cond_true := (cc(NBIT) = '1');
5645
                           when "1100" => -- bge
5646
                                            cond_true := ((cc(NBIT) xor cc(VBIT)) = '0');
5647
                           when "1101" => -- blt
5648
                                            cond_true := ((cc(NBIT) xor cc(VBIT)) = '1');
5649
                           when "1110" => -- bgt
5650
                                            cond_true := ((cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '0');
5651
                           when "1111" => -- ble
5652
                                            cond_true := ((cc(ZBIT) or (cc(NBIT) xor cc(VBIT))) = '1');
5653
                           when others =>
5654
                   cond_true := (1 = 1);
5655
                           end case;
5656
                                        else
5657
                                          cond_true := (1 = 1); -- lbra, lbsr, bsr
5658
                                   end if;
5659
                                        if cond_true then
5660
                                          pc_ctrl    <= load_pc;
5661
                                        else
5662
                                          pc_ctrl    <= latch_pc;
5663
               end if;
5664
 
5665
                                 --
5666
                                 -- push return address onto the S stack
5667
                                 --
5668
                                 -- (sp) = pc_lo
5669
                                 -- sp = sp - 1
5670
                                 --
5671
                                 when push_return_lo_state =>
5672
                                     -- default
5673
                 acca_ctrl  <= latch_acca;
5674
                 accb_ctrl  <= latch_accb;
5675
                 ix_ctrl    <= latch_ix;
5676
                 iy_ctrl    <= latch_iy;
5677
                 up_ctrl    <= latch_up;
5678
                 md_ctrl    <= latch_md;
5679
                 iv_ctrl    <= latch_iv;
5680
                 dp_ctrl    <= latch_dp;
5681
                                op_ctrl    <= latch_op;
5682
                 pre_ctrl   <= latch_pre;
5683
                                     nmi_ctrl   <= latch_nmi;
5684
                 ea_ctrl    <= latch_ea;
5685
                                          -- decrement the sp
5686
                 left_ctrl  <= sp_left;
5687
                 right_ctrl <= one_right;
5688
                 alu_ctrl   <= alu_sub16;
5689
                 cc_ctrl    <= latch_cc;
5690
                 sp_ctrl    <= load_sp;
5691
                 -- write PC low
5692
                 pc_ctrl    <= latch_pc;
5693
                 addr_ctrl  <= pushs_ad;
5694
                 dout_ctrl  <= pc_lo_dout;
5695
                                          --
5696
                                          st_ctrl      <= idle_st;
5697
                                          return_state <= fetch_state;
5698
                 next_state   <= push_return_hi_state;
5699
 
5700
                                --
5701
                                -- push program counter hi byte onto the stack
5702
                                -- (sp) = pc_hi
5703
                                -- sp = sp
5704
                                -- return to originating state
5705
                                --
5706
                                when push_return_hi_state =>
5707
                                     -- default
5708
                 acca_ctrl  <= latch_acca;
5709
                 accb_ctrl  <= latch_accb;
5710
                 ix_ctrl    <= latch_ix;
5711
                 iy_ctrl    <= latch_iy;
5712
                 up_ctrl    <= latch_up;
5713
                 md_ctrl    <= latch_md;
5714
                 iv_ctrl    <= latch_iv;
5715
                 dp_ctrl    <= latch_dp;
5716
                                op_ctrl    <= latch_op;
5717
                 pre_ctrl   <= latch_pre;
5718
                                     nmi_ctrl   <= latch_nmi;
5719
                 ea_ctrl    <= latch_ea;
5720
                                          -- idle the SP
5721
                 left_ctrl  <= sp_left;
5722
                 right_ctrl <= one_right;
5723
                 alu_ctrl   <= alu_sub16;
5724
                 cc_ctrl    <= latch_cc;
5725
                 sp_ctrl    <= latch_sp;
5726
                                          -- write pc hi bytes
5727
                                          pc_ctrl    <= latch_pc;
5728
                 addr_ctrl  <= pushs_ad;
5729
                 dout_ctrl  <= pc_hi_dout;
5730
                                          --
5731
                                          st_ctrl      <= pull_st;
5732
                                          return_state <= fetch_state;
5733
                 next_state   <= saved_state;
5734
 
5735
                                 when pull_return_hi_state =>
5736
                                     -- default
5737
                 acca_ctrl  <= latch_acca;
5738
                 accb_ctrl  <= latch_accb;
5739
                 ix_ctrl    <= latch_ix;
5740
                 iy_ctrl    <= latch_iy;
5741
                 up_ctrl    <= latch_up;
5742
                 md_ctrl    <= latch_md;
5743
                 iv_ctrl    <= latch_iv;
5744
                 dp_ctrl    <= latch_dp;
5745
                                op_ctrl    <= latch_op;
5746
                 pre_ctrl   <= latch_pre;
5747
                                     nmi_ctrl   <= latch_nmi;
5748
                 ea_ctrl    <= latch_ea;
5749
                                          -- increment the sp
5750
                 left_ctrl  <= sp_left;
5751
                 right_ctrl <= one_right;
5752
                 alu_ctrl   <= alu_add16;
5753
                 cc_ctrl    <= latch_cc;
5754
                 sp_ctrl    <= load_sp;
5755
                 -- read pc hi
5756
                                          pc_ctrl    <= pull_hi_pc;
5757
                 addr_ctrl  <= pulls_ad;
5758
                 dout_ctrl  <= pc_hi_dout;
5759
                                          --
5760
                                          st_ctrl      <= idle_st;
5761
                                          return_state <= fetch_state;
5762
                 next_state   <= pull_return_lo_state;
5763
 
5764
                                when pull_return_lo_state =>
5765
                                     -- default
5766
                 acca_ctrl  <= latch_acca;
5767
                 accb_ctrl  <= latch_accb;
5768
                 ix_ctrl    <= latch_ix;
5769
                 iy_ctrl    <= latch_iy;
5770
                 up_ctrl    <= latch_up;
5771
                 md_ctrl    <= latch_md;
5772
                 iv_ctrl    <= latch_iv;
5773
                 dp_ctrl    <= latch_dp;
5774
                                op_ctrl    <= latch_op;
5775
                 pre_ctrl   <= latch_pre;
5776
                                     nmi_ctrl   <= latch_nmi;
5777
                 ea_ctrl    <= latch_ea;
5778
                                          -- increment the SP
5779
                 left_ctrl  <= sp_left;
5780
                 right_ctrl <= one_right;
5781
                 alu_ctrl   <= alu_add16;
5782
                 cc_ctrl    <= latch_cc;
5783
                 sp_ctrl    <= load_sp;
5784
                                          -- read pc low
5785
                                          pc_ctrl    <= pull_lo_pc;
5786
                 addr_ctrl  <= pulls_ad;
5787
                 dout_ctrl  <= pc_lo_dout;
5788
                                          --
5789
                                          st_ctrl      <= pull_st;
5790
                                          return_state <= fetch_state;
5791
                 next_state   <= saved_state;
5792
 
5793
                                 when andcc_state =>
5794
                                     -- default
5795
                 acca_ctrl  <= latch_acca;
5796
                 accb_ctrl  <= latch_accb;
5797
                 ix_ctrl    <= latch_ix;
5798
                 iy_ctrl    <= latch_iy;
5799
                 up_ctrl    <= latch_up;
5800
                 sp_ctrl    <= latch_sp;
5801
                 pc_ctrl    <= latch_pc;
5802
                 iv_ctrl    <= latch_iv;
5803
                 dp_ctrl    <= latch_dp;
5804
                                op_ctrl    <= latch_op;
5805
                 pre_ctrl   <= latch_pre;
5806
                                     nmi_ctrl   <= latch_nmi;
5807
                 ea_ctrl    <= latch_ea;
5808
                 md_ctrl    <= latch_md;
5809
                                          -- AND CC with md
5810
                 left_ctrl  <= md_left;
5811
                 right_ctrl <= zero_right;
5812
                 alu_ctrl   <= alu_andcc;
5813
                 cc_ctrl    <= load_cc;
5814
                                          -- idle bus
5815
                 addr_ctrl  <= idle_ad;
5816
                 dout_ctrl  <= md_lo_dout;
5817
                                          --
5818
                                          st_ctrl      <= pull_st;
5819
                                          return_state <= fetch_state;
5820
                                     next_state   <= saved_state;
5821
 
5822
                                 when orcc_state =>
5823
                                     -- default
5824
                 acca_ctrl  <= latch_acca;
5825
                 accb_ctrl  <= latch_accb;
5826
                 ix_ctrl    <= latch_ix;
5827
                 iy_ctrl    <= latch_iy;
5828
                 up_ctrl    <= latch_up;
5829
                 sp_ctrl    <= latch_sp;
5830
                 pc_ctrl    <= latch_pc;
5831
                 iv_ctrl    <= latch_iv;
5832
                 dp_ctrl    <= latch_dp;
5833
                                op_ctrl    <= latch_op;
5834
                 pre_ctrl   <= latch_pre;
5835
                                     nmi_ctrl   <= latch_nmi;
5836
                 ea_ctrl    <= latch_ea;
5837
                 md_ctrl    <= latch_md;
5838
                                          -- OR CC with md
5839
                 left_ctrl  <= md_left;
5840
                 right_ctrl <= zero_right;
5841
                 alu_ctrl   <= alu_orcc;
5842
                 cc_ctrl    <= load_cc;
5843
                                          -- idle bus
5844
                 addr_ctrl  <= idle_ad;
5845
                 dout_ctrl  <= md_lo_dout;
5846
                                          --
5847
                                          st_ctrl      <= pull_st;
5848
                                          return_state <= fetch_state;
5849
                                     next_state   <= saved_state;
5850
 
5851
                                 when tfr_state =>
5852
                                     -- default
5853
                 iv_ctrl    <= latch_iv;
5854
                                op_ctrl    <= latch_op;
5855
                 pre_ctrl   <= latch_pre;
5856
                                     nmi_ctrl   <= latch_nmi;
5857
                 ea_ctrl    <= latch_ea;
5858
                 md_ctrl    <= latch_md;
5859
                                          -- select source register
5860
                                          case md(7 downto 4) is
5861
                                          when "0000" =>
5862
                                            left_ctrl <= accd_left;
5863
                                          when "0001" =>
5864
                                            left_ctrl <= ix_left;
5865
                                          when "0010" =>
5866
                                            left_ctrl <= iy_left;
5867
                                          when "0011" =>
5868
                                            left_ctrl <= up_left;
5869
                                          when "0100" =>
5870
                                            left_ctrl <= sp_left;
5871
                                          when "0101" =>
5872
                                            left_ctrl <= pc_left;
5873
                                          when "1000" =>
5874
                                            left_ctrl <= acca_left;
5875
                                          when "1001" =>
5876
                                            left_ctrl <= accb_left;
5877
                                          when "1010" =>
5878
                                            left_ctrl <= cc_left;
5879
                                          when "1011" =>
5880
                                            left_ctrl <= dp_left;
5881
                                          when others =>
5882
                   left_ctrl  <= md_left;
5883
                                          end case;
5884
                 right_ctrl <= zero_right;
5885
                 alu_ctrl   <= alu_tfr;
5886
                                          -- select destination register
5887
                                          case md(3 downto 0) is
5888
                                          when "0000" => -- accd
5889
                   ix_ctrl    <= latch_ix;
5890
                   iy_ctrl    <= latch_iy;
5891
                   up_ctrl    <= latch_up;
5892
                   sp_ctrl    <= latch_sp;
5893
                   pc_ctrl    <= latch_pc;
5894
                   acca_ctrl  <= load_hi_acca;
5895
                   accb_ctrl  <= load_accb;
5896
                   cc_ctrl    <= latch_cc;
5897
                   dp_ctrl    <= latch_dp;
5898
                                          when "0001" => -- ix
5899
                   ix_ctrl    <= load_ix;
5900
                   iy_ctrl    <= latch_iy;
5901
                   up_ctrl    <= latch_up;
5902
                   sp_ctrl    <= latch_sp;
5903
                   pc_ctrl    <= latch_pc;
5904
                   acca_ctrl  <= latch_acca;
5905
                   accb_ctrl  <= latch_accb;
5906
                   cc_ctrl    <= latch_cc;
5907
                   dp_ctrl    <= latch_dp;
5908
                                          when "0010" => -- iy
5909
                   ix_ctrl    <= latch_ix;
5910
                   iy_ctrl    <= load_iy;
5911
                   up_ctrl    <= latch_up;
5912
                   sp_ctrl    <= latch_sp;
5913
                   pc_ctrl    <= latch_pc;
5914
                   acca_ctrl  <= latch_acca;
5915
                   accb_ctrl  <= latch_accb;
5916
                   cc_ctrl    <= latch_cc;
5917
                   dp_ctrl    <= latch_dp;
5918
                                          when "0011" => -- up
5919
                   ix_ctrl    <= latch_ix;
5920
                   iy_ctrl    <= latch_iy;
5921
                   up_ctrl    <= load_up;
5922
                   sp_ctrl    <= latch_sp;
5923
                   pc_ctrl    <= latch_pc;
5924
                   acca_ctrl  <= latch_acca;
5925
                   accb_ctrl  <= latch_accb;
5926
                   cc_ctrl    <= latch_cc;
5927
                   dp_ctrl    <= latch_dp;
5928
                                          when "0100" => -- sp
5929
                   ix_ctrl    <= latch_ix;
5930
                   iy_ctrl    <= latch_iy;
5931
                   up_ctrl    <= latch_up;
5932
                   sp_ctrl    <= load_sp;
5933
                   pc_ctrl    <= latch_pc;
5934
                   acca_ctrl  <= latch_acca;
5935
                   accb_ctrl  <= latch_accb;
5936
                   cc_ctrl    <= latch_cc;
5937
                   dp_ctrl    <= latch_dp;
5938
                                          when "0101" => -- pc
5939
                   ix_ctrl    <= latch_ix;
5940
                   iy_ctrl    <= latch_iy;
5941
                   up_ctrl    <= latch_up;
5942
                   sp_ctrl    <= latch_sp;
5943
                   pc_ctrl    <= load_pc;
5944
                   acca_ctrl  <= latch_acca;
5945
                   accb_ctrl  <= latch_accb;
5946
                   cc_ctrl    <= latch_cc;
5947
                   dp_ctrl    <= latch_dp;
5948
                                          when "1000" => -- acca
5949
                   ix_ctrl    <= latch_ix;
5950
                   iy_ctrl    <= latch_iy;
5951
                   up_ctrl    <= latch_up;
5952
                   sp_ctrl    <= latch_sp;
5953
                   pc_ctrl    <= latch_pc;
5954
                   acca_ctrl  <= load_acca;
5955
                   accb_ctrl  <= latch_accb;
5956
                   cc_ctrl    <= latch_cc;
5957
                   dp_ctrl    <= latch_dp;
5958
                                          when "1001" => -- accb
5959
                   ix_ctrl    <= latch_ix;
5960
                   iy_ctrl    <= latch_iy;
5961
                   up_ctrl    <= latch_up;
5962
                   sp_ctrl    <= latch_sp;
5963
                   pc_ctrl    <= latch_pc;
5964
                   acca_ctrl  <= latch_acca;
5965
                   accb_ctrl  <= load_accb;
5966
                   cc_ctrl    <= latch_cc;
5967
                   dp_ctrl    <= latch_dp;
5968
                                          when "1010" => -- cc
5969
                   ix_ctrl    <= latch_ix;
5970
                   iy_ctrl    <= latch_iy;
5971
                   up_ctrl    <= latch_up;
5972
                   sp_ctrl    <= latch_sp;
5973
                   pc_ctrl    <= latch_pc;
5974
                   acca_ctrl  <= latch_acca;
5975
                   accb_ctrl  <= latch_accb;
5976
                   cc_ctrl    <= load_cc;
5977
                   dp_ctrl    <= latch_dp;
5978
                                          when "1011" => --dp
5979
                   ix_ctrl    <= latch_ix;
5980
                   iy_ctrl    <= latch_iy;
5981
                   up_ctrl    <= latch_up;
5982
                   sp_ctrl    <= latch_sp;
5983
                   pc_ctrl    <= latch_pc;
5984
                   acca_ctrl  <= latch_acca;
5985
                   accb_ctrl  <= latch_accb;
5986
                   cc_ctrl    <= latch_cc;
5987
                   dp_ctrl    <= load_dp;
5988
                                          when others =>
5989
                   ix_ctrl    <= latch_ix;
5990
                   iy_ctrl    <= latch_iy;
5991
                   up_ctrl    <= latch_up;
5992
                   sp_ctrl    <= latch_sp;
5993
                   pc_ctrl    <= latch_pc;
5994
                   acca_ctrl  <= latch_acca;
5995
                   accb_ctrl  <= latch_accb;
5996
                   cc_ctrl    <= latch_cc;
5997
                   dp_ctrl    <= latch_dp;
5998
                                          end case;
5999
                                          -- idle bus
6000
                 addr_ctrl  <= idle_ad;
6001
                 dout_ctrl  <= md_lo_dout;
6002
                                          --
6003
                                          st_ctrl      <= pull_st;
6004
                                          return_state <= fetch_state;
6005
                                     next_state   <= saved_state;
6006
 
6007
                                 when exg_state =>
6008
                                     -- default
6009
                 iv_ctrl    <= latch_iv;
6010
                                op_ctrl    <= latch_op;
6011
                 pre_ctrl   <= latch_pre;
6012
                                     nmi_ctrl   <= latch_nmi;
6013
                 md_ctrl    <= latch_md;
6014
                                          -- save destination register
6015
                                          case md(3 downto 0) is
6016
                                          when "0000" =>
6017
                                            left_ctrl <= accd_left;
6018
                                          when "0001" =>
6019
                                            left_ctrl <= ix_left;
6020
                                          when "0010" =>
6021
                                            left_ctrl <= iy_left;
6022
                                          when "0011" =>
6023
                                            left_ctrl <= up_left;
6024
                                          when "0100" =>
6025
                                            left_ctrl <= sp_left;
6026
                                          when "0101" =>
6027
                                            left_ctrl <= pc_left;
6028
                                          when "1000" =>
6029
                                            left_ctrl <= acca_left;
6030
                                          when "1001" =>
6031
                                            left_ctrl <= accb_left;
6032
                                          when "1010" =>
6033
                                            left_ctrl <= cc_left;
6034
                                          when "1011" =>
6035
                                            left_ctrl <= dp_left;
6036
                                          when others =>
6037
                   left_ctrl  <= md_left;
6038
                                          end case;
6039
                 right_ctrl <= zero_right;
6040
                 alu_ctrl   <= alu_tfr;
6041
                 ea_ctrl    <= load_ea;
6042
 
6043
                 ix_ctrl    <= latch_ix;
6044
                 iy_ctrl    <= latch_iy;
6045
                 up_ctrl    <= latch_up;
6046
                 sp_ctrl    <= latch_sp;
6047
                 pc_ctrl    <= latch_pc;
6048
                 acca_ctrl  <= latch_acca;
6049
                 accb_ctrl  <= latch_accb;
6050
                 cc_ctrl    <= latch_cc;
6051
                 dp_ctrl    <= latch_dp;
6052
                                          -- idle bus
6053
                 addr_ctrl  <= idle_ad;
6054
                 dout_ctrl  <= md_lo_dout;
6055
                                          -- call tranfer microcode
6056
                                          st_ctrl      <= push_st;
6057
                                          return_state <= exg1_state;
6058
                                     next_state   <= tfr_state;
6059
 
6060
                                 when exg1_state =>
6061
                                     -- default
6062
                 iv_ctrl    <= latch_iv;
6063
                                op_ctrl    <= latch_op;
6064
                 pre_ctrl   <= latch_pre;
6065
                                     nmi_ctrl   <= latch_nmi;
6066
                 ea_ctrl    <= latch_ea;
6067
                 md_ctrl    <= latch_md;
6068
                                          -- restore destination
6069
                 left_ctrl  <= ea_left;
6070
                 right_ctrl <= zero_right;
6071
                 alu_ctrl   <= alu_tfr;
6072
                                          -- save as source register
6073
                                          case md(7 downto 4) is
6074
                                          when "0000" => -- accd
6075
                   ix_ctrl    <= latch_ix;
6076
                   iy_ctrl    <= latch_iy;
6077
                   up_ctrl    <= latch_up;
6078
                   sp_ctrl    <= latch_sp;
6079
                   pc_ctrl    <= latch_pc;
6080
                   acca_ctrl  <= load_hi_acca;
6081
                   accb_ctrl  <= load_accb;
6082
                   cc_ctrl    <= latch_cc;
6083
                   dp_ctrl    <= latch_dp;
6084
                                          when "0001" => -- ix
6085
                   ix_ctrl    <= load_ix;
6086
                   iy_ctrl    <= latch_iy;
6087
                   up_ctrl    <= latch_up;
6088
                   sp_ctrl    <= latch_sp;
6089
                   pc_ctrl    <= latch_pc;
6090
                   acca_ctrl  <= latch_acca;
6091
                   accb_ctrl  <= latch_accb;
6092
                   cc_ctrl    <= latch_cc;
6093
                   dp_ctrl    <= latch_dp;
6094
                                          when "0010" => -- iy
6095
                   ix_ctrl    <= latch_ix;
6096
                   iy_ctrl    <= load_iy;
6097
                   up_ctrl    <= latch_up;
6098
                   sp_ctrl    <= latch_sp;
6099
                   pc_ctrl    <= latch_pc;
6100
                   acca_ctrl  <= latch_acca;
6101
                   accb_ctrl  <= latch_accb;
6102
                   cc_ctrl    <= latch_cc;
6103
                   dp_ctrl    <= latch_dp;
6104
                                          when "0011" => -- up
6105
                   ix_ctrl    <= latch_ix;
6106
                   iy_ctrl    <= latch_iy;
6107
                   up_ctrl    <= load_up;
6108
                   sp_ctrl    <= latch_sp;
6109
                   pc_ctrl    <= latch_pc;
6110
                   acca_ctrl  <= latch_acca;
6111
                   accb_ctrl  <= latch_accb;
6112
                   cc_ctrl    <= latch_cc;
6113
                   dp_ctrl    <= latch_dp;
6114
                                          when "0100" => -- sp
6115
                   ix_ctrl    <= latch_ix;
6116
                   iy_ctrl    <= latch_iy;
6117
                   up_ctrl    <= latch_up;
6118
                   sp_ctrl    <= load_sp;
6119
                   pc_ctrl    <= latch_pc;
6120
                   acca_ctrl  <= latch_acca;
6121
                   accb_ctrl  <= latch_accb;
6122
                   cc_ctrl    <= latch_cc;
6123
                   dp_ctrl    <= latch_dp;
6124
                                          when "0101" => -- pc
6125
                   ix_ctrl    <= latch_ix;
6126
                   iy_ctrl    <= latch_iy;
6127
                   up_ctrl    <= latch_up;
6128
                   sp_ctrl    <= latch_sp;
6129
                   pc_ctrl    <= load_pc;
6130
                   acca_ctrl  <= latch_acca;
6131
                   accb_ctrl  <= latch_accb;
6132
                   cc_ctrl    <= latch_cc;
6133
                   dp_ctrl    <= latch_dp;
6134
                                          when "1000" => -- acca
6135
                   ix_ctrl    <= latch_ix;
6136
                   iy_ctrl    <= latch_iy;
6137
                   up_ctrl    <= latch_up;
6138
                   sp_ctrl    <= latch_sp;
6139
                   pc_ctrl    <= latch_pc;
6140
                   acca_ctrl  <= load_acca;
6141
                   accb_ctrl  <= latch_accb;
6142
                   cc_ctrl    <= latch_cc;
6143
                   dp_ctrl    <= latch_dp;
6144
                                          when "1001" => -- accb
6145
                   ix_ctrl    <= latch_ix;
6146
                   iy_ctrl    <= latch_iy;
6147
                   up_ctrl    <= latch_up;
6148
                   sp_ctrl    <= latch_sp;
6149
                   pc_ctrl    <= latch_pc;
6150
                   acca_ctrl  <= latch_acca;
6151
                   accb_ctrl  <= load_accb;
6152
                   cc_ctrl    <= latch_cc;
6153
                   dp_ctrl    <= latch_dp;
6154
                                          when "1010" => -- cc
6155
                   acca_ctrl  <= latch_acca;
6156
                   accb_ctrl  <= latch_accb;
6157
                   ix_ctrl    <= latch_ix;
6158
                   iy_ctrl    <= latch_iy;
6159
                   up_ctrl    <= latch_up;
6160
                   sp_ctrl    <= latch_sp;
6161
                   pc_ctrl    <= latch_pc;
6162
                   acca_ctrl  <= latch_acca;
6163
                   accb_ctrl  <= latch_accb;
6164
                   cc_ctrl    <= load_cc;
6165
                   dp_ctrl    <= latch_dp;
6166
                                          when "1011" => --dp
6167
                   acca_ctrl  <= latch_acca;
6168
                   accb_ctrl  <= latch_accb;
6169
                   ix_ctrl    <= latch_ix;
6170
                   iy_ctrl    <= latch_iy;
6171
                   up_ctrl    <= latch_up;
6172
                   sp_ctrl    <= latch_sp;
6173
                   pc_ctrl    <= latch_pc;
6174
                   acca_ctrl  <= latch_acca;
6175
                   accb_ctrl  <= latch_accb;
6176
                   cc_ctrl    <= latch_cc;
6177
                   dp_ctrl    <= load_dp;
6178
                                          when others =>
6179
                   acca_ctrl  <= latch_acca;
6180
                   accb_ctrl  <= latch_accb;
6181
                   ix_ctrl    <= latch_ix;
6182
                   iy_ctrl    <= latch_iy;
6183
                   up_ctrl    <= latch_up;
6184
                   sp_ctrl    <= latch_sp;
6185
                   pc_ctrl    <= latch_pc;
6186
                   acca_ctrl  <= latch_acca;
6187
                   accb_ctrl  <= latch_accb;
6188
                   cc_ctrl    <= latch_cc;
6189
                   dp_ctrl    <= latch_dp;
6190
                                          end case;
6191
                                          -- idle bus
6192
                 addr_ctrl  <= idle_ad;
6193
                 dout_ctrl  <= md_lo_dout;
6194
                                          --
6195
                                          st_ctrl      <= idle_st;
6196
                                          return_state <= fetch_state;
6197
                                     next_state   <= fetch_state;
6198
 
6199
                                 when mul_state =>
6200
                                     -- default
6201
                 acca_ctrl  <= latch_acca;
6202
                 accb_ctrl  <= latch_accb;
6203
                 ix_ctrl    <= latch_ix;
6204
                 iy_ctrl    <= latch_iy;
6205
                 up_ctrl    <= latch_up;
6206
                 sp_ctrl    <= latch_sp;
6207
                 pc_ctrl    <= latch_pc;
6208
                 iv_ctrl    <= latch_iv;
6209
                 dp_ctrl    <= latch_dp;
6210
                                op_ctrl    <= latch_op;
6211
                 pre_ctrl   <= latch_pre;
6212
                                     nmi_ctrl   <= latch_nmi;
6213
                 ea_ctrl    <= latch_ea;
6214
                                          -- move acca to md
6215
                 left_ctrl  <= acca_left;
6216
                 right_ctrl <= zero_right;
6217
                 alu_ctrl   <= alu_st16;
6218
                 cc_ctrl    <= latch_cc;
6219
                 md_ctrl    <= load_md;
6220
                                          -- idle bus
6221
                 addr_ctrl  <= idle_ad;
6222
                 dout_ctrl  <= md_lo_dout;
6223
                                          --
6224
                                          st_ctrl      <= idle_st;
6225
                                          return_state <= fetch_state;
6226
                                     next_state   <= mulea_state;
6227
 
6228
                                 when mulea_state =>
6229
                                     -- default
6230
                 acca_ctrl  <= latch_acca;
6231
                 accb_ctrl  <= latch_accb;
6232
                 ix_ctrl    <= latch_ix;
6233
                 iy_ctrl    <= latch_iy;
6234
                 up_ctrl    <= latch_up;
6235
                 sp_ctrl    <= latch_sp;
6236
                 pc_ctrl    <= latch_pc;
6237
                 iv_ctrl    <= latch_iv;
6238
                 dp_ctrl    <= latch_dp;
6239
                                op_ctrl    <= latch_op;
6240
                 pre_ctrl   <= latch_pre;
6241
                                     nmi_ctrl   <= latch_nmi;
6242
                 md_ctrl    <= latch_md;
6243
                                          -- move accb to ea
6244
                 left_ctrl  <= accb_left;
6245
                 right_ctrl <= zero_right;
6246
                 alu_ctrl   <= alu_st16;
6247
                 cc_ctrl    <= latch_cc;
6248
                 ea_ctrl    <= load_ea;
6249
                                          -- idle bus
6250
                 addr_ctrl  <= idle_ad;
6251
                 dout_ctrl  <= md_lo_dout;
6252
                                          --
6253
                                          st_ctrl      <= idle_st;
6254
                                          return_state <= fetch_state;
6255
                                     next_state   <= muld_state;
6256
 
6257
                                 when muld_state =>
6258
                                     -- default
6259
                 ix_ctrl    <= latch_ix;
6260
                 iy_ctrl    <= latch_iy;
6261
                 up_ctrl    <= latch_up;
6262
                 sp_ctrl    <= latch_sp;
6263
                 pc_ctrl    <= latch_pc;
6264
                 iv_ctrl    <= latch_iv;
6265
                 dp_ctrl    <= latch_dp;
6266
                                op_ctrl    <= latch_op;
6267
                 pre_ctrl   <= latch_pre;
6268
                                     nmi_ctrl   <= latch_nmi;
6269
                 ea_ctrl    <= latch_ea;
6270
                 md_ctrl    <= latch_md;
6271
                                          -- clear accd
6272
                 left_ctrl  <= acca_left;
6273
                 right_ctrl <= zero_right;
6274
                 alu_ctrl   <= alu_ld8;
6275
                 cc_ctrl    <= latch_cc;
6276
                 acca_ctrl  <= load_hi_acca;
6277
                 accb_ctrl  <= load_accb;
6278
                                          -- idle bus
6279
                 addr_ctrl  <= idle_ad;
6280
                 dout_ctrl  <= md_lo_dout;
6281
                                          --
6282
                                          st_ctrl      <= idle_st;
6283
                                          return_state <= fetch_state;
6284
                                     next_state   <= mul0_state;
6285
 
6286
                                 when mul0_state =>
6287
                                     -- default
6288
                 ix_ctrl    <= latch_ix;
6289
                 iy_ctrl    <= latch_iy;
6290
                 up_ctrl    <= latch_up;
6291
                 sp_ctrl    <= latch_sp;
6292
                 pc_ctrl    <= latch_pc;
6293
                 iv_ctrl    <= latch_iv;
6294
                 dp_ctrl    <= latch_dp;
6295
                                op_ctrl    <= latch_op;
6296
                 pre_ctrl   <= latch_pre;
6297
                                     nmi_ctrl   <= latch_nmi;
6298
                 ea_ctrl    <= latch_ea;
6299
                                          -- if bit 0 of ea set, add accd to md
6300
                 left_ctrl  <= accd_left;
6301
                 right_ctrl <= md_right;
6302
                 alu_ctrl   <= alu_add16;
6303
                                          if ea(0) = '1' then
6304
                   cc_ctrl    <= load_cc;
6305
                   acca_ctrl  <= load_hi_acca;
6306
                   accb_ctrl  <= load_accb;
6307
                                          else
6308
                   cc_ctrl    <= latch_cc;
6309
                   acca_ctrl  <= latch_acca;
6310
                   accb_ctrl  <= latch_accb;
6311
                                          end if;
6312
                 md_ctrl    <= shiftl_md;
6313
                                          -- idle bus
6314
                 addr_ctrl  <= idle_ad;
6315
                 dout_ctrl  <= md_lo_dout;
6316
                                          --
6317
                                          st_ctrl      <= idle_st;
6318
                                          return_state <= fetch_state;
6319
                                     next_state   <= mul1_state;
6320
 
6321
                                 when mul1_state =>
6322
                                     -- default
6323
                 ix_ctrl    <= latch_ix;
6324
                 iy_ctrl    <= latch_iy;
6325
                 up_ctrl    <= latch_up;
6326
                 sp_ctrl    <= latch_sp;
6327
                 pc_ctrl    <= latch_pc;
6328
                 iv_ctrl    <= latch_iv;
6329
                 dp_ctrl    <= latch_dp;
6330
                                op_ctrl    <= latch_op;
6331
                 pre_ctrl   <= latch_pre;
6332
                                     nmi_ctrl   <= latch_nmi;
6333
                 ea_ctrl    <= latch_ea;
6334
                                          -- if bit 1 of ea set, add accd to md
6335
                 left_ctrl  <= accd_left;
6336
                 right_ctrl <= md_right;
6337
                 alu_ctrl   <= alu_add16;
6338
                                          if ea(1) = '1' then
6339
                   cc_ctrl    <= load_cc;
6340
                   acca_ctrl  <= load_hi_acca;
6341
                   accb_ctrl  <= load_accb;
6342
                                          else
6343
                   cc_ctrl    <= latch_cc;
6344
                   acca_ctrl  <= latch_acca;
6345
                   accb_ctrl  <= latch_accb;
6346
                                          end if;
6347
                 md_ctrl    <= shiftl_md;
6348
                                          -- idle bus
6349
                 addr_ctrl  <= idle_ad;
6350
                 dout_ctrl  <= md_lo_dout;
6351
                                          --
6352
                                          st_ctrl      <= idle_st;
6353
                                          return_state <= fetch_state;
6354
                                     next_state   <= mul2_state;
6355
 
6356
                                 when mul2_state =>
6357
                                     -- default
6358
                 ix_ctrl    <= latch_ix;
6359
                 iy_ctrl    <= latch_iy;
6360
                 up_ctrl    <= latch_up;
6361
                 sp_ctrl    <= latch_sp;
6362
                 pc_ctrl    <= latch_pc;
6363
                 iv_ctrl    <= latch_iv;
6364
                 dp_ctrl    <= latch_dp;
6365
                                op_ctrl    <= latch_op;
6366
                 pre_ctrl   <= latch_pre;
6367
                                     nmi_ctrl   <= latch_nmi;
6368
                 ea_ctrl    <= latch_ea;
6369
                                          -- if bit 2 of ea set, add accd to md
6370
                 left_ctrl  <= accd_left;
6371
                 right_ctrl <= md_right;
6372
                 alu_ctrl   <= alu_add16;
6373
                                          if ea(2) = '1' then
6374
                   cc_ctrl    <= load_cc;
6375
                   acca_ctrl  <= load_hi_acca;
6376
                   accb_ctrl  <= load_accb;
6377
                                          else
6378
                   cc_ctrl    <= latch_cc;
6379
                   acca_ctrl  <= latch_acca;
6380
                   accb_ctrl  <= latch_accb;
6381
                                          end if;
6382
                 md_ctrl    <= shiftl_md;
6383
                                          -- idle bus
6384
                 addr_ctrl  <= idle_ad;
6385
                 dout_ctrl  <= md_lo_dout;
6386
                                          --
6387
                                          st_ctrl      <= idle_st;
6388
                                          return_state <= fetch_state;
6389
                                     next_state   <= mul3_state;
6390
 
6391
                                 when mul3_state =>
6392
                                     -- default
6393
                 ix_ctrl    <= latch_ix;
6394
                 iy_ctrl    <= latch_iy;
6395
                 up_ctrl    <= latch_up;
6396
                 sp_ctrl    <= latch_sp;
6397
                 pc_ctrl    <= latch_pc;
6398
                 iv_ctrl    <= latch_iv;
6399
                 dp_ctrl    <= latch_dp;
6400
                                op_ctrl    <= latch_op;
6401
                 pre_ctrl   <= latch_pre;
6402
                                     nmi_ctrl   <= latch_nmi;
6403
                 ea_ctrl    <= latch_ea;
6404
                                          -- if bit 3 of ea set, add accd to md
6405
                 left_ctrl  <= accd_left;
6406
                 right_ctrl <= md_right;
6407
                 alu_ctrl   <= alu_add16;
6408
                                          if ea(3) = '1' then
6409
                   cc_ctrl    <= load_cc;
6410
                   acca_ctrl  <= load_hi_acca;
6411
                   accb_ctrl  <= load_accb;
6412
                                          else
6413
                   cc_ctrl    <= latch_cc;
6414
                   acca_ctrl  <= latch_acca;
6415
                   accb_ctrl  <= latch_accb;
6416
                                          end if;
6417
                 md_ctrl    <= shiftl_md;
6418
                                          -- idle bus
6419
                 addr_ctrl  <= idle_ad;
6420
                 dout_ctrl  <= md_lo_dout;
6421
                                          --
6422
                                          st_ctrl      <= idle_st;
6423
                                          return_state <= fetch_state;
6424
                                     next_state   <= mul4_state;
6425
 
6426
                                 when mul4_state =>
6427
                                     -- default
6428
                 ix_ctrl    <= latch_ix;
6429
                 iy_ctrl    <= latch_iy;
6430
                 up_ctrl    <= latch_up;
6431
                 sp_ctrl    <= latch_sp;
6432
                 pc_ctrl    <= latch_pc;
6433
                 iv_ctrl    <= latch_iv;
6434
                 dp_ctrl    <= latch_dp;
6435
                                op_ctrl    <= latch_op;
6436
                                     nmi_ctrl   <= latch_nmi;
6437
                 pre_ctrl   <= latch_pre;
6438
                 ea_ctrl    <= latch_ea;
6439
                                          -- if bit 4 of ea set, add accd to md
6440
                 left_ctrl  <= accd_left;
6441
                 right_ctrl <= md_right;
6442
                 alu_ctrl   <= alu_add16;
6443
                                          if ea(4) = '1' then
6444
                   cc_ctrl    <= load_cc;
6445
                   acca_ctrl  <= load_hi_acca;
6446
                   accb_ctrl  <= load_accb;
6447
                                          else
6448
                   cc_ctrl    <= latch_cc;
6449
                   acca_ctrl  <= latch_acca;
6450
                   accb_ctrl  <= latch_accb;
6451
                                          end if;
6452
                 md_ctrl    <= shiftl_md;
6453
                                          -- idle bus
6454
                 addr_ctrl  <= idle_ad;
6455
                 dout_ctrl  <= md_lo_dout;
6456
                                          --
6457
                                          st_ctrl      <= idle_st;
6458
                                          return_state <= fetch_state;
6459
                                     next_state   <= mul5_state;
6460
 
6461
                                 when mul5_state =>
6462
                                     -- default
6463
                 ix_ctrl    <= latch_ix;
6464
                 iy_ctrl    <= latch_iy;
6465
                 up_ctrl    <= latch_up;
6466
                 sp_ctrl    <= latch_sp;
6467
                 pc_ctrl    <= latch_pc;
6468
                 iv_ctrl    <= latch_iv;
6469
                 dp_ctrl    <= latch_dp;
6470
                                op_ctrl    <= latch_op;
6471
                 pre_ctrl   <= latch_pre;
6472
                                     nmi_ctrl   <= latch_nmi;
6473
                 ea_ctrl    <= latch_ea;
6474
                                          -- if bit 5 of ea set, add accd to md
6475
                 left_ctrl  <= accd_left;
6476
                 right_ctrl <= md_right;
6477
                 alu_ctrl   <= alu_add16;
6478
                                          if ea(5) = '1' then
6479
                   cc_ctrl    <= load_cc;
6480
                   acca_ctrl  <= load_hi_acca;
6481
                   accb_ctrl  <= load_accb;
6482
                                          else
6483
                   cc_ctrl    <= latch_cc;
6484
                   acca_ctrl  <= latch_acca;
6485
                   accb_ctrl  <= latch_accb;
6486
                                          end if;
6487
                 md_ctrl    <= shiftl_md;
6488
                                          -- idle bus
6489
                 addr_ctrl  <= idle_ad;
6490
                 dout_ctrl  <= md_lo_dout;
6491
                                          --
6492
                                          st_ctrl      <= idle_st;
6493
                                          return_state <= fetch_state;
6494
                                     next_state   <= mul6_state;
6495
 
6496
                                 when mul6_state =>
6497
                                     -- default
6498
                 ix_ctrl    <= latch_ix;
6499
                 iy_ctrl    <= latch_iy;
6500
                 up_ctrl    <= latch_up;
6501
                 sp_ctrl    <= latch_sp;
6502
                 pc_ctrl    <= latch_pc;
6503
                 iv_ctrl    <= latch_iv;
6504
                 dp_ctrl    <= latch_dp;
6505
                                op_ctrl    <= latch_op;
6506
                 pre_ctrl   <= latch_pre;
6507
                                     nmi_ctrl   <= latch_nmi;
6508
                 ea_ctrl    <= latch_ea;
6509
                                          -- if bit 6 of ea set, add accd to md
6510
                 left_ctrl  <= accd_left;
6511
                 right_ctrl <= md_right;
6512
                 alu_ctrl   <= alu_add16;
6513
                                          if ea(6) = '1' then
6514
                   cc_ctrl    <= load_cc;
6515
                   acca_ctrl  <= load_hi_acca;
6516
                   accb_ctrl  <= load_accb;
6517
                                          else
6518
                   cc_ctrl    <= latch_cc;
6519
                   acca_ctrl  <= latch_acca;
6520
                   accb_ctrl  <= latch_accb;
6521
                                          end if;
6522
                 md_ctrl    <= shiftl_md;
6523
                                          -- idle bus
6524
                 addr_ctrl  <= idle_ad;
6525
                 dout_ctrl  <= md_lo_dout;
6526
                                          --
6527
                                          st_ctrl      <= idle_st;
6528
                                          return_state <= fetch_state;
6529
                                     next_state   <= mul7_state;
6530
 
6531
                                 when mul7_state =>
6532
                                     -- default
6533
                 ix_ctrl    <= latch_ix;
6534
                 iy_ctrl    <= latch_iy;
6535
                 up_ctrl    <= latch_up;
6536
                 sp_ctrl    <= latch_sp;
6537
                 pc_ctrl    <= latch_pc;
6538
                 iv_ctrl    <= latch_iv;
6539
                 dp_ctrl    <= latch_dp;
6540
                                op_ctrl    <= latch_op;
6541
                 pre_ctrl   <= latch_pre;
6542
                                     nmi_ctrl   <= latch_nmi;
6543
                 ea_ctrl    <= latch_ea;
6544
                                          -- if bit 7 of ea set, add accd to md
6545
                 left_ctrl  <= accd_left;
6546
                 right_ctrl <= md_right;
6547
                 alu_ctrl   <= alu_add16;
6548
                                          if ea(7) = '1' then
6549
                   cc_ctrl    <= load_cc;
6550
                   acca_ctrl  <= load_hi_acca;
6551
                   accb_ctrl  <= load_accb;
6552
                                          else
6553
                   cc_ctrl    <= latch_cc;
6554
                   acca_ctrl  <= latch_acca;
6555
                   accb_ctrl  <= latch_accb;
6556
                                          end if;
6557
                 md_ctrl    <= shiftl_md;
6558
                                          -- idle bus
6559
                 addr_ctrl  <= idle_ad;
6560
                 dout_ctrl  <= md_lo_dout;
6561
                                          --
6562
                                          st_ctrl      <= idle_st;
6563
                                          return_state <= fetch_state;
6564
                                     next_state   <= fetch_state;
6565
 
6566
                          --
6567
                          -- Enter here on pushs
6568
                          -- ea holds post byte
6569
                          --
6570
                          when pshs_state =>
6571
                                 -- default
6572
             cc_ctrl    <= latch_cc;
6573
             acca_ctrl  <= latch_acca;
6574
             accb_ctrl  <= latch_accb;
6575
             dp_ctrl    <= latch_dp;
6576
             ix_ctrl    <= latch_ix;
6577
             iy_ctrl    <= latch_iy;
6578
             up_ctrl    <= latch_up;
6579
             pc_ctrl    <= latch_pc;
6580
             md_ctrl    <= latch_md;
6581
             iv_ctrl    <= latch_iv;
6582
             dp_ctrl    <= latch_dp;
6583
                            op_ctrl    <= latch_op;
6584
             pre_ctrl   <= latch_pre;
6585
                                 nmi_ctrl   <= latch_nmi;
6586
             ea_ctrl    <= latch_ea;
6587
             -- decrement sp if any registers to be pushed
6588
             left_ctrl  <= sp_left;
6589
             right_ctrl <= one_right;
6590
             alu_ctrl   <= alu_sub16;
6591
                                 if ea(7 downto 0) = "00000000" then
6592
               sp_ctrl    <= latch_sp;
6593
                                 else
6594
               sp_ctrl    <= load_sp;
6595
                                 end if;
6596
                                 -- write idle bus
6597
             addr_ctrl  <= idle_ad;
6598
                            dout_ctrl  <= md_lo_dout;
6599
                                 --
6600
                                 st_ctrl      <= idle_st;
6601
                                 return_state <= fetch_state;
6602
                                 if ea(7) = '1' then
6603
               next_state <= pshs_pcl_state;
6604
                                 elsif ea(6) = '1' then
6605
               next_state <= pshs_upl_state;
6606
                                 elsif ea(5) = '1' then
6607
                                   next_state <= pshs_iyl_state;
6608
                                 elsif ea(4) = '1' then
6609
                                   next_state <= pshs_ixl_state;
6610
                                 elsif ea(3) = '1' then
6611
                                   next_state <= pshs_dp_state;
6612
                                 elsif ea(2) = '1' then
6613
                                   next_state <= pshs_accb_state;
6614
                                 elsif ea(1) = '1' then
6615
                                   next_state <= pshs_acca_state;
6616
                                 elsif ea(0) = '1' then
6617
                                   next_state <= pshs_cc_state;
6618
                                 else
6619
                                   next_state <= fetch_state;
6620
                                 end if;
6621
 
6622
                          when pshs_pcl_state =>
6623
                                 -- default
6624
             cc_ctrl    <= latch_cc;
6625
             acca_ctrl  <= latch_acca;
6626
             accb_ctrl  <= latch_accb;
6627
             dp_ctrl    <= latch_dp;
6628
             ix_ctrl    <= latch_ix;
6629
             iy_ctrl    <= latch_iy;
6630
             up_ctrl    <= latch_up;
6631
             pc_ctrl    <= latch_pc;
6632
             md_ctrl    <= latch_md;
6633
             iv_ctrl    <= latch_iv;
6634
             dp_ctrl    <= latch_dp;
6635
                            op_ctrl    <= latch_op;
6636
             pre_ctrl   <= latch_pre;
6637
                                 nmi_ctrl   <= latch_nmi;
6638
             ea_ctrl    <= latch_ea;
6639
             -- decrement sp
6640
             left_ctrl  <= sp_left;
6641
             right_ctrl <= one_right;
6642
             alu_ctrl   <= alu_sub16;
6643
             sp_ctrl    <= load_sp;
6644
                                 -- write pc low
6645
             addr_ctrl  <= pushs_ad;
6646
                            dout_ctrl  <= pc_lo_dout;
6647
                                 --
6648
                                 st_ctrl      <= idle_st;
6649
                                 return_state <= fetch_state;
6650
             next_state   <= pshs_pch_state;
6651
 
6652
                          when pshs_pch_state =>
6653
             cc_ctrl    <= latch_cc;
6654
             acca_ctrl  <= latch_acca;
6655
             accb_ctrl  <= latch_accb;
6656
             dp_ctrl    <= latch_dp;
6657
             ix_ctrl    <= latch_ix;
6658
             iy_ctrl    <= latch_iy;
6659
             up_ctrl    <= latch_up;
6660
             pc_ctrl    <= latch_pc;
6661
             md_ctrl    <= latch_md;
6662
             iv_ctrl    <= latch_iv;
6663
             dp_ctrl    <= latch_dp;
6664
                            op_ctrl    <= latch_op;
6665
             pre_ctrl   <= latch_pre;
6666
                                 nmi_ctrl   <= latch_nmi;
6667
             ea_ctrl    <= latch_ea;
6668
             -- decrement sp
6669
             left_ctrl  <= sp_left;
6670
             right_ctrl <= one_right;
6671
             alu_ctrl   <= alu_sub16;
6672
                                 if ea(6 downto 0) = "0000000" then
6673
               sp_ctrl    <= latch_sp;
6674
                                 else
6675
               sp_ctrl    <= load_sp;
6676
                                 end if;
6677
                                 -- write pc hi
6678
             addr_ctrl  <= pushs_ad;
6679
                            dout_ctrl  <= pc_hi_dout;
6680
                                 --
6681
                                 st_ctrl      <= idle_st;
6682
                                 return_state <= fetch_state;
6683
                                 if ea(6) = '1' then
6684
               next_state <= pshs_upl_state;
6685
                                 elsif ea(5) = '1' then
6686
                                   next_state <= pshs_iyl_state;
6687
                                 elsif ea(4) = '1' then
6688
                                   next_state <= pshs_ixl_state;
6689
                                 elsif ea(3) = '1' then
6690
                                   next_state <= pshs_dp_state;
6691
                                 elsif ea(2) = '1' then
6692
                                   next_state <= pshs_accb_state;
6693
                                 elsif ea(1) = '1' then
6694
                                   next_state <= pshs_acca_state;
6695
                                 elsif ea(0) = '1' then
6696
                                   next_state <= pshs_cc_state;
6697
                                 else
6698
                                   next_state <= fetch_state;
6699
                                 end if;
6700
 
6701
 
6702
                          when pshs_upl_state =>
6703
                                 -- default
6704
             cc_ctrl    <= latch_cc;
6705
             acca_ctrl  <= latch_acca;
6706
             accb_ctrl  <= latch_accb;
6707
             dp_ctrl    <= latch_dp;
6708
             ix_ctrl    <= latch_ix;
6709
             iy_ctrl    <= latch_iy;
6710
             up_ctrl    <= latch_up;
6711
             pc_ctrl    <= latch_pc;
6712
             md_ctrl    <= latch_md;
6713
             iv_ctrl    <= latch_iv;
6714
                            op_ctrl    <= latch_op;
6715
             pre_ctrl   <= latch_pre;
6716
                                 nmi_ctrl   <= latch_nmi;
6717
             ea_ctrl    <= latch_ea;
6718
             -- decrement sp
6719
             left_ctrl  <= sp_left;
6720
             right_ctrl <= one_right;
6721
             alu_ctrl   <= alu_sub16;
6722
             sp_ctrl    <= load_sp;
6723
                                 -- write pc low
6724
             addr_ctrl  <= pushs_ad;
6725
                            dout_ctrl  <= up_lo_dout;
6726
                                 --
6727
                                 st_ctrl      <= idle_st;
6728
                                 return_state <= fetch_state;
6729
             next_state   <= pshs_uph_state;
6730
 
6731
                          when pshs_uph_state =>
6732
             cc_ctrl    <= latch_cc;
6733
             acca_ctrl  <= latch_acca;
6734
             accb_ctrl  <= latch_accb;
6735
             dp_ctrl    <= latch_dp;
6736
             ix_ctrl    <= latch_ix;
6737
             iy_ctrl    <= latch_iy;
6738
             up_ctrl    <= latch_up;
6739
             pc_ctrl    <= latch_pc;
6740
             md_ctrl    <= latch_md;
6741
             iv_ctrl    <= latch_iv;
6742
                            op_ctrl    <= latch_op;
6743
             pre_ctrl   <= latch_pre;
6744
                                 nmi_ctrl   <= latch_nmi;
6745
             ea_ctrl    <= latch_ea;
6746
             -- decrement sp
6747
             left_ctrl  <= sp_left;
6748
             right_ctrl <= one_right;
6749
             alu_ctrl   <= alu_sub16;
6750
                                 if ea(5 downto 0) = "000000" then
6751
               sp_ctrl    <= latch_sp;
6752
                                 else
6753
               sp_ctrl    <= load_sp;
6754
                                 end if;
6755
                                 -- write pc hi
6756
             addr_ctrl  <= pushs_ad;
6757
                            dout_ctrl  <= up_hi_dout;
6758
                                 --
6759
                                 st_ctrl      <= idle_st;
6760
                                 return_state <= fetch_state;
6761
                                 if ea(5) = '1' then
6762
                                   next_state   <= pshs_iyl_state;
6763
                                 elsif ea(4) = '1' then
6764
                                   next_state   <= pshs_ixl_state;
6765
                                 elsif ea(3) = '1' then
6766
                                   next_state   <= pshs_dp_state;
6767
                                 elsif ea(2) = '1' then
6768
                                   next_state   <= pshs_accb_state;
6769
                                 elsif ea(1) = '1' then
6770
                                   next_state   <= pshs_acca_state;
6771
                                 elsif ea(0) = '1' then
6772
                                   next_state   <= pshs_cc_state;
6773
                                 else
6774
                                   next_state   <= fetch_state;
6775
                                 end if;
6776
 
6777
                          when pshs_iyl_state =>
6778
                                 -- default
6779
             cc_ctrl    <= latch_cc;
6780
             acca_ctrl  <= latch_acca;
6781
             accb_ctrl  <= latch_accb;
6782
             dp_ctrl    <= latch_dp;
6783
             ix_ctrl    <= latch_ix;
6784
             iy_ctrl    <= latch_iy;
6785
             up_ctrl    <= latch_up;
6786
             pc_ctrl    <= latch_pc;
6787
             md_ctrl    <= latch_md;
6788
             iv_ctrl    <= latch_iv;
6789
                            op_ctrl    <= latch_op;
6790
             pre_ctrl   <= latch_pre;
6791
                                 nmi_ctrl   <= latch_nmi;
6792
             ea_ctrl    <= latch_ea;
6793
             -- decrement sp
6794
             left_ctrl  <= sp_left;
6795
             right_ctrl <= one_right;
6796
             alu_ctrl   <= alu_sub16;
6797
             sp_ctrl    <= load_sp;
6798
                                 -- write iy low
6799
             addr_ctrl  <= pushs_ad;
6800
                            dout_ctrl  <= iy_lo_dout;
6801
                                 --
6802
                                 st_ctrl      <= idle_st;
6803
                                 return_state <= fetch_state;
6804
             next_state   <= pshs_iyh_state;
6805
 
6806
                          when pshs_iyh_state =>
6807
                                 -- default registers
6808
             cc_ctrl    <= latch_cc;
6809
             acca_ctrl  <= latch_acca;
6810
             accb_ctrl  <= latch_accb;
6811
             dp_ctrl    <= latch_dp;
6812
             ix_ctrl    <= latch_ix;
6813
             iy_ctrl    <= latch_iy;
6814
             up_ctrl    <= latch_up;
6815
             pc_ctrl    <= latch_pc;
6816
             md_ctrl    <= latch_md;
6817
             iv_ctrl    <= latch_iv;
6818
                            op_ctrl    <= latch_op;
6819
             pre_ctrl   <= latch_pre;
6820
                                 nmi_ctrl   <= latch_nmi;
6821
             ea_ctrl    <= latch_ea;
6822
             -- decrement sp
6823
             left_ctrl  <= sp_left;
6824
             right_ctrl <= one_right;
6825
             alu_ctrl   <= alu_sub16;
6826
                                 if ea(4 downto 0) = "00000" then
6827
               sp_ctrl    <= latch_sp;
6828
                                 else
6829
               sp_ctrl    <= load_sp;
6830
                                 end if;
6831
                                 -- write iy hi
6832
             addr_ctrl  <= pushs_ad;
6833
                            dout_ctrl  <= iy_hi_dout;
6834
                                 --
6835
                                 st_ctrl      <= idle_st;
6836
                                 return_state <= fetch_state;
6837
                                 if ea(4) = '1' then
6838
                                   next_state   <= pshs_ixl_state;
6839
                                 elsif ea(3) = '1' then
6840
                                   next_state   <= pshs_dp_state;
6841
                                 elsif ea(2) = '1' then
6842
                                   next_state   <= pshs_accb_state;
6843
                                 elsif ea(1) = '1' then
6844
                                   next_state   <= pshs_acca_state;
6845
                                 elsif ea(0) = '1' then
6846
                                   next_state   <= pshs_cc_state;
6847
                                 else
6848
                                   next_state   <= fetch_state;
6849
                                 end if;
6850
 
6851
                          when pshs_ixl_state =>
6852
                                 -- default
6853
             cc_ctrl    <= latch_cc;
6854
             acca_ctrl  <= latch_acca;
6855
             accb_ctrl  <= latch_accb;
6856
             dp_ctrl    <= latch_dp;
6857
             ix_ctrl    <= latch_ix;
6858
             iy_ctrl    <= latch_iy;
6859
             up_ctrl    <= latch_up;
6860
             pc_ctrl    <= latch_pc;
6861
             md_ctrl    <= latch_md;
6862
             iv_ctrl    <= latch_iv;
6863
                            op_ctrl    <= latch_op;
6864
             pre_ctrl   <= latch_pre;
6865
                                 nmi_ctrl   <= latch_nmi;
6866
             ea_ctrl    <= latch_ea;
6867
             -- decrement sp
6868
             left_ctrl  <= sp_left;
6869
             right_ctrl <= one_right;
6870
             alu_ctrl   <= alu_sub16;
6871
             sp_ctrl    <= load_sp;
6872
                                 -- write ix low
6873
             addr_ctrl  <= pushs_ad;
6874
                            dout_ctrl  <= ix_lo_dout;
6875
                                 --
6876
                                 st_ctrl      <= idle_st;
6877
                                 return_state <= fetch_state;
6878
             next_state   <= pshs_ixh_state;
6879
 
6880
                          when pshs_ixh_state =>
6881
                                 -- default registers
6882
             cc_ctrl    <= latch_cc;
6883
             acca_ctrl  <= latch_acca;
6884
             accb_ctrl  <= latch_accb;
6885
             dp_ctrl    <= latch_dp;
6886
             ix_ctrl    <= latch_ix;
6887
             iy_ctrl    <= latch_iy;
6888
             up_ctrl    <= latch_up;
6889
             pc_ctrl    <= latch_pc;
6890
             md_ctrl    <= latch_md;
6891
             iv_ctrl    <= latch_iv;
6892
                            op_ctrl    <= latch_op;
6893
             pre_ctrl   <= latch_pre;
6894
                                 nmi_ctrl   <= latch_nmi;
6895
             ea_ctrl    <= latch_ea;
6896
             -- decrement sp
6897
             left_ctrl  <= sp_left;
6898
             right_ctrl <= one_right;
6899
             alu_ctrl   <= alu_sub16;
6900
                                 if ea(3 downto 0) = "0000" then
6901
               sp_ctrl    <= latch_sp;
6902
                                 else
6903
               sp_ctrl    <= load_sp;
6904
                                 end if;
6905
                                 -- write ix hi
6906
             addr_ctrl  <= pushs_ad;
6907
                            dout_ctrl  <= ix_hi_dout;
6908
                                 --
6909
                                 st_ctrl      <= idle_st;
6910
                                 return_state <= fetch_state;
6911
                                 if ea(3) = '1' then
6912
                                   next_state   <= pshs_dp_state;
6913
                                 elsif ea(2) = '1' then
6914
                                   next_state   <= pshs_accb_state;
6915
                                 elsif ea(1) = '1' then
6916
                                   next_state   <= pshs_acca_state;
6917
                                 elsif ea(0) = '1' then
6918
                                   next_state   <= pshs_cc_state;
6919
                                 else
6920
                                   next_state   <= fetch_state;
6921
                                 end if;
6922
 
6923
                          when pshs_dp_state =>
6924
                                 -- default registers
6925
             cc_ctrl    <= latch_cc;
6926
             acca_ctrl  <= latch_acca;
6927
             accb_ctrl  <= latch_accb;
6928
             dp_ctrl    <= latch_dp;
6929
             ix_ctrl    <= latch_ix;
6930
             iy_ctrl    <= latch_iy;
6931
             up_ctrl    <= latch_up;
6932
             pc_ctrl    <= latch_pc;
6933
             md_ctrl    <= latch_md;
6934
             iv_ctrl    <= latch_iv;
6935
                            op_ctrl    <= latch_op;
6936
             pre_ctrl   <= latch_pre;
6937
                                 nmi_ctrl   <= latch_nmi;
6938
             ea_ctrl    <= latch_ea;
6939
             -- decrement sp
6940
             left_ctrl  <= sp_left;
6941
             right_ctrl <= one_right;
6942
             alu_ctrl   <= alu_sub16;
6943
                                 if ea(2 downto 0) = "000" then
6944
               sp_ctrl    <= latch_sp;
6945
                                 else
6946
               sp_ctrl    <= load_sp;
6947
                                 end if;
6948
                                 -- write dp
6949
             addr_ctrl  <= pushs_ad;
6950
                            dout_ctrl  <= dp_dout;
6951
                                 --
6952
                                 st_ctrl      <= idle_st;
6953
                                 return_state <= fetch_state;
6954
                                 if ea(2) = '1' then
6955
                                   next_state   <= pshs_accb_state;
6956
                                 elsif ea(1) = '1' then
6957
                                   next_state   <= pshs_acca_state;
6958
                                 elsif ea(0) = '1' then
6959
                                   next_state   <= pshs_cc_state;
6960
                                 else
6961
                                   next_state   <= fetch_state;
6962
                                 end if;
6963
 
6964
                          when pshs_accb_state =>
6965
                                 -- default registers
6966
             cc_ctrl    <= latch_cc;
6967
             acca_ctrl  <= latch_acca;
6968
             accb_ctrl  <= latch_accb;
6969
             dp_ctrl    <= latch_dp;
6970
             ix_ctrl    <= latch_ix;
6971
             iy_ctrl    <= latch_iy;
6972
             up_ctrl    <= latch_up;
6973
             pc_ctrl    <= latch_pc;
6974
             md_ctrl    <= latch_md;
6975
             iv_ctrl    <= latch_iv;
6976
                            op_ctrl    <= latch_op;
6977
             pre_ctrl   <= latch_pre;
6978
                                 nmi_ctrl   <= latch_nmi;
6979
             ea_ctrl    <= latch_ea;
6980
             -- decrement sp
6981
             left_ctrl  <= sp_left;
6982
             right_ctrl <= one_right;
6983
             alu_ctrl   <= alu_sub16;
6984
                                 if ea(1 downto 0) = "00" then
6985
               sp_ctrl    <= latch_sp;
6986
                                 else
6987
               sp_ctrl    <= load_sp;
6988
                                 end if;
6989
                                 -- write accb
6990
             addr_ctrl  <= pushs_ad;
6991
                            dout_ctrl  <= accb_dout;
6992
                                 --
6993
                                 st_ctrl      <= idle_st;
6994
                                 return_state <= fetch_state;
6995
                                 if ea(1) = '1' then
6996
                                   next_state   <= pshs_acca_state;
6997
                                 elsif ea(0) = '1' then
6998
                                   next_state   <= pshs_cc_state;
6999
                                 else
7000
                                   next_state   <= fetch_state;
7001
                                 end if;
7002
 
7003
                          when pshs_acca_state =>
7004
                                 -- default registers
7005
             cc_ctrl    <= latch_cc;
7006
             acca_ctrl  <= latch_acca;
7007
             accb_ctrl  <= latch_accb;
7008
                                 dp_ctrl    <= latch_dp;
7009
             ix_ctrl    <= latch_ix;
7010
             iy_ctrl    <= latch_iy;
7011
             up_ctrl    <= latch_up;
7012
             pc_ctrl    <= latch_pc;
7013
             md_ctrl    <= latch_md;
7014
             iv_ctrl    <= latch_iv;
7015
                            op_ctrl    <= latch_op;
7016
             pre_ctrl   <= latch_pre;
7017
                                 nmi_ctrl   <= latch_nmi;
7018
             ea_ctrl    <= latch_ea;
7019
             -- decrement sp
7020
             left_ctrl  <= sp_left;
7021
             right_ctrl <= one_right;
7022
             alu_ctrl   <= alu_sub16;
7023
                                 if ea(0) = '1' then
7024
               sp_ctrl    <= load_sp;
7025
                                 else
7026
               sp_ctrl    <= latch_sp;
7027
                                 end if;
7028
                                 -- write acca
7029
             addr_ctrl  <= pushs_ad;
7030
                            dout_ctrl  <= acca_dout;
7031
                                 --
7032
                                 st_ctrl      <= idle_st;
7033
                                 return_state <= fetch_state;
7034
                                 if ea(0) = '1' then
7035
                                   next_state   <= pshs_cc_state;
7036
                                 else
7037
                                   next_state   <= fetch_state;
7038
                                 end if;
7039
 
7040
                          when pshs_cc_state =>
7041
                                 -- default registers
7042
             cc_ctrl    <= latch_cc;
7043
             acca_ctrl  <= latch_acca;
7044
             accb_ctrl  <= latch_accb;
7045
                                 dp_ctrl    <= latch_dp;
7046
             ix_ctrl    <= latch_ix;
7047
             iy_ctrl    <= latch_iy;
7048
             up_ctrl    <= latch_up;
7049
             pc_ctrl    <= latch_pc;
7050
             md_ctrl    <= latch_md;
7051
             iv_ctrl    <= latch_iv;
7052
                            op_ctrl    <= latch_op;
7053
             pre_ctrl   <= latch_pre;
7054
                                 nmi_ctrl   <= latch_nmi;
7055
             ea_ctrl    <= latch_ea;
7056
             -- idle sp
7057
             left_ctrl  <= sp_left;
7058
             right_ctrl <= one_right;
7059
             alu_ctrl   <= alu_nop;
7060
             sp_ctrl    <= latch_sp;
7061
                                 -- write cc
7062
             addr_ctrl  <= pushs_ad;
7063
                            dout_ctrl  <= cc_dout;
7064
                                 --
7065
                                 st_ctrl      <= idle_st;
7066
                                 return_state <= fetch_state;
7067
             next_state   <= fetch_state;
7068
 
7069
                          --
7070
                          -- enter here on PULS
7071
                          -- ea hold register mask
7072
                          --
7073
                          when puls_state =>
7074
                                 -- default registers
7075
             cc_ctrl    <= latch_cc;
7076
             acca_ctrl  <= latch_acca;
7077
             accb_ctrl  <= latch_accb;
7078
                                 dp_ctrl    <= latch_dp;
7079
             ix_ctrl    <= latch_ix;
7080
             iy_ctrl    <= latch_iy;
7081
             up_ctrl    <= latch_up;
7082
             pc_ctrl    <= latch_pc;
7083
             md_ctrl    <= latch_md;
7084
             iv_ctrl    <= latch_iv;
7085
                            op_ctrl    <= latch_op;
7086
             pre_ctrl   <= latch_pre;
7087
                                 nmi_ctrl   <= latch_nmi;
7088
             ea_ctrl    <= latch_ea;
7089
                                 -- idle SP
7090
             left_ctrl  <= sp_left;
7091
             right_ctrl <= one_right;
7092
             alu_ctrl   <= alu_add16;
7093
             sp_ctrl    <= latch_sp;
7094
                                 -- idle bus
7095
             addr_ctrl  <= idle_ad;
7096
             dout_ctrl  <= md_lo_dout;
7097
                                 --
7098
                                 st_ctrl      <= idle_st;
7099
                                 return_state <= fetch_state;
7100
                                 if ea(0) = '1' then
7101
                                   next_state <= puls_cc_state;
7102
                                 elsif ea(1) = '1' then
7103
                                   next_state <= puls_acca_state;
7104
                                 elsif ea(2) = '1' then
7105
                                   next_state <= puls_accb_state;
7106
                                 elsif ea(3) = '1' then
7107
                                   next_state <= puls_dp_state;
7108
                                 elsif ea(4) = '1' then
7109
                                   next_state <= puls_ixh_state;
7110
                                 elsif ea(5) = '1' then
7111
                                   next_state <= puls_iyh_state;
7112
                                 elsif ea(6) = '1' then
7113
               next_state <= puls_uph_state;
7114
                                 elsif ea(7) = '1' then
7115
               next_state <= puls_pch_state;
7116
                                 else
7117
                                   next_state <= fetch_state;
7118
                                 end if;
7119
 
7120
                          when puls_cc_state =>
7121
                                 -- default registers
7122
             acca_ctrl  <= latch_acca;
7123
             accb_ctrl  <= latch_accb;
7124
                                 dp_ctrl    <= latch_dp;
7125
             ix_ctrl    <= latch_ix;
7126
             iy_ctrl    <= latch_iy;
7127
             up_ctrl    <= latch_up;
7128
             pc_ctrl    <= latch_pc;
7129
             md_ctrl    <= latch_md;
7130
             iv_ctrl    <= latch_iv;
7131
                            op_ctrl    <= latch_op;
7132
             pre_ctrl   <= latch_pre;
7133
                                 nmi_ctrl   <= latch_nmi;
7134
             ea_ctrl    <= latch_ea;
7135
                                 -- Increment SP
7136
             left_ctrl  <= sp_left;
7137
             right_ctrl <= one_right;
7138
             alu_ctrl   <= alu_add16;
7139
             sp_ctrl    <= load_sp;
7140
                                 -- read cc
7141
             cc_ctrl    <= pull_cc;
7142
             addr_ctrl  <= pulls_ad;
7143
             dout_ctrl  <= cc_dout;
7144
                                 --
7145
                                 st_ctrl      <= idle_st;
7146
                                 return_state <= fetch_state;
7147
                                 if ea(1) = '1' then
7148
                                   next_state <= puls_acca_state;
7149
                                 elsif ea(2) = '1' then
7150
                                   next_state <= puls_accb_state;
7151
                                 elsif ea(3) = '1' then
7152
                                   next_state <= puls_dp_state;
7153
                                 elsif ea(4) = '1' then
7154
                                   next_state <= puls_ixh_state;
7155
                                 elsif ea(5) = '1' then
7156
                                   next_state <= puls_iyh_state;
7157
                                 elsif ea(6) = '1' then
7158
               next_state <= puls_uph_state;
7159
                                 elsif ea(7) = '1' then
7160
               next_state <= puls_pch_state;
7161
                                 else
7162
                                   next_state <= fetch_state;
7163
                                 end if;
7164
 
7165
                          when puls_acca_state =>
7166
                                 -- default registers
7167
             cc_ctrl    <= latch_cc;
7168
             accb_ctrl  <= latch_accb;
7169
                                 dp_ctrl    <= latch_dp;
7170
             ix_ctrl    <= latch_ix;
7171
             iy_ctrl    <= latch_iy;
7172
             up_ctrl    <= latch_up;
7173
             pc_ctrl    <= latch_pc;
7174
             md_ctrl    <= latch_md;
7175
             iv_ctrl    <= latch_iv;
7176
                            op_ctrl    <= latch_op;
7177
             pre_ctrl   <= latch_pre;
7178
                                 nmi_ctrl   <= latch_nmi;
7179
             ea_ctrl    <= latch_ea;
7180
                                 -- Increment SP
7181
             left_ctrl  <= sp_left;
7182
             right_ctrl <= one_right;
7183
             alu_ctrl   <= alu_add16;
7184
             sp_ctrl    <= load_sp;
7185
                                 -- read acca
7186
                                 acca_ctrl  <= pull_acca;
7187
             addr_ctrl  <= pulls_ad;
7188
             dout_ctrl  <= acca_dout;
7189
                                 --
7190
                                 st_ctrl      <= idle_st;
7191
                                 return_state <= fetch_state;
7192
                                 if ea(2) = '1' then
7193
                                   next_state <= puls_accb_state;
7194
                                 elsif ea(3) = '1' then
7195
                                   next_state <= puls_dp_state;
7196
                                 elsif ea(4) = '1' then
7197
                                   next_state <= puls_ixh_state;
7198
                                 elsif ea(5) = '1' then
7199
                                   next_state <= puls_iyh_state;
7200
                                 elsif ea(6) = '1' then
7201
               next_state <= puls_uph_state;
7202
                                 elsif ea(7) = '1' then
7203
               next_state <= puls_pch_state;
7204
                                 else
7205
                                   next_state <= fetch_state;
7206
                                 end if;
7207
 
7208
                          when puls_accb_state =>
7209
                                 -- default
7210
             cc_ctrl    <= latch_cc;
7211
             acca_ctrl  <= latch_acca;
7212
                                 dp_ctrl    <= latch_dp;
7213
             ix_ctrl    <= latch_ix;
7214
             iy_ctrl    <= latch_iy;
7215
             up_ctrl    <= latch_up;
7216
             pc_ctrl    <= latch_pc;
7217
             md_ctrl    <= latch_md;
7218
             iv_ctrl    <= latch_iv;
7219
                            op_ctrl    <= latch_op;
7220
             pre_ctrl   <= latch_pre;
7221
                                 nmi_ctrl   <= latch_nmi;
7222
             ea_ctrl    <= latch_ea;
7223
                                 -- Increment SP
7224
             left_ctrl  <= sp_left;
7225
             right_ctrl <= one_right;
7226
             alu_ctrl   <= alu_add16;
7227
             sp_ctrl    <= load_sp;
7228
                                 -- read accb
7229
                                 accb_ctrl  <= pull_accb;
7230
             addr_ctrl  <= pulls_ad;
7231
             dout_ctrl  <= accb_dout;
7232
                                 --
7233
                                 st_ctrl      <= idle_st;
7234
                                 return_state <= fetch_state;
7235
                                 if ea(3) = '1' then
7236
                                   next_state <= puls_dp_state;
7237
                                 elsif ea(4) = '1' then
7238
                                   next_state <= puls_ixh_state;
7239
                                 elsif ea(5) = '1' then
7240
                                   next_state <= puls_iyh_state;
7241
                                 elsif ea(6) = '1' then
7242
               next_state <= puls_uph_state;
7243
                                 elsif ea(7) = '1' then
7244
               next_state <= puls_pch_state;
7245
                                 else
7246
                                   next_state <= fetch_state;
7247
                                 end if;
7248
 
7249
                          when puls_dp_state =>
7250
                                 -- default
7251
             cc_ctrl    <= latch_cc;
7252
             acca_ctrl  <= latch_acca;
7253
             accb_ctrl  <= latch_accb;
7254
             ix_ctrl    <= latch_ix;
7255
             iy_ctrl    <= latch_iy;
7256
             up_ctrl    <= latch_up;
7257
             pc_ctrl    <= latch_pc;
7258
             md_ctrl    <= latch_md;
7259
             iv_ctrl    <= latch_iv;
7260
                            op_ctrl    <= latch_op;
7261
             pre_ctrl   <= latch_pre;
7262
                                 nmi_ctrl   <= latch_nmi;
7263
             ea_ctrl    <= latch_ea;
7264
                                 -- idle sp
7265
             left_ctrl  <= sp_left;
7266
             right_ctrl <= one_right;
7267
             alu_ctrl   <= alu_add16;
7268
             sp_ctrl    <= load_sp;
7269
                                 -- read dp
7270
                                 dp_ctrl    <= pull_dp;
7271
             addr_ctrl  <= pulls_ad;
7272
             dout_ctrl  <= dp_dout;
7273
                                 --
7274
                                 st_ctrl      <= idle_st;
7275
                                 return_state <= fetch_state;
7276
                                 if ea(4) = '1' then
7277
                                   next_state <= puls_ixh_state;
7278
                                 elsif ea(5) = '1' then
7279
                                   next_state <= puls_iyh_state;
7280
                                 elsif ea(6) = '1' then
7281
               next_state <= puls_uph_state;
7282
                                 elsif ea(7) = '1' then
7283
               next_state <= puls_pch_state;
7284
                                 else
7285
                                   next_state <= fetch_state;
7286
                                 end if;
7287
 
7288
                          when puls_ixh_state =>
7289
                                 -- default
7290
             cc_ctrl    <= latch_cc;
7291
             acca_ctrl  <= latch_acca;
7292
             accb_ctrl  <= latch_accb;
7293
                                 dp_ctrl    <= latch_dp;
7294
             iy_ctrl    <= latch_iy;
7295
             up_ctrl    <= latch_up;
7296
             pc_ctrl    <= latch_pc;
7297
             md_ctrl    <= latch_md;
7298
             iv_ctrl    <= latch_iv;
7299
                            op_ctrl    <= latch_op;
7300
             pre_ctrl   <= latch_pre;
7301
                                 nmi_ctrl   <= latch_nmi;
7302
             ea_ctrl    <= latch_ea;
7303
             -- increment sp
7304
             left_ctrl  <= sp_left;
7305
             right_ctrl <= one_right;
7306
             alu_ctrl   <= alu_add16;
7307
             sp_ctrl    <= load_sp;
7308
                                 -- pull ix hi
7309
                                 ix_ctrl    <= pull_hi_ix;
7310
             addr_ctrl  <= pulls_ad;
7311
             dout_ctrl  <= ix_hi_dout;
7312
                                 --
7313
                                 st_ctrl      <= idle_st;
7314
                                 return_state <= fetch_state;
7315
             next_state   <= puls_ixl_state;
7316
 
7317
                          when puls_ixl_state =>
7318
                                 -- default
7319
             cc_ctrl    <= latch_cc;
7320
             acca_ctrl  <= latch_acca;
7321
             accb_ctrl  <= latch_accb;
7322
                                 dp_ctrl    <= latch_dp;
7323
             iy_ctrl    <= latch_iy;
7324
             up_ctrl    <= latch_up;
7325
             pc_ctrl    <= latch_pc;
7326
             md_ctrl    <= latch_md;
7327
             iv_ctrl    <= latch_iv;
7328
                            op_ctrl    <= latch_op;
7329
             pre_ctrl   <= latch_pre;
7330
                                 nmi_ctrl   <= latch_nmi;
7331
             ea_ctrl    <= latch_ea;
7332
                                 -- idle sp
7333
             left_ctrl  <= sp_left;
7334
             right_ctrl <= one_right;
7335
             alu_ctrl   <= alu_add16;
7336
             sp_ctrl    <= load_sp;
7337
                                 -- read ix low
7338
                                 ix_ctrl    <= pull_lo_ix;
7339
             addr_ctrl  <= pulls_ad;
7340
             dout_ctrl  <= ix_lo_dout;
7341
                                 --
7342
                                 st_ctrl      <= idle_st;
7343
                                 return_state <= fetch_state;
7344
                                 if ea(5) = '1' then
7345
                                   next_state <= puls_iyh_state;
7346
                                 elsif ea(6) = '1' then
7347
               next_state <= puls_uph_state;
7348
                                 elsif ea(7) = '1' then
7349
               next_state <= puls_pch_state;
7350
                                 else
7351
                                   next_state <= fetch_state;
7352
                                 end if;
7353
 
7354
                          when puls_iyh_state =>
7355
                                 -- default
7356
             cc_ctrl    <= latch_cc;
7357
             acca_ctrl  <= latch_acca;
7358
             accb_ctrl  <= latch_accb;
7359
                                 dp_ctrl    <= latch_dp;
7360
             ix_ctrl    <= latch_ix;
7361
             up_ctrl    <= latch_up;
7362
             pc_ctrl    <= latch_pc;
7363
             md_ctrl    <= latch_md;
7364
             iv_ctrl    <= latch_iv;
7365
                            op_ctrl    <= latch_op;
7366
             pre_ctrl   <= latch_pre;
7367
                                 nmi_ctrl   <= latch_nmi;
7368
             ea_ctrl    <= latch_ea;
7369
             -- increment sp
7370
             left_ctrl  <= sp_left;
7371
             right_ctrl <= one_right;
7372
             alu_ctrl   <= alu_add16;
7373
             sp_ctrl    <= load_sp;
7374
                                 -- pull iy hi
7375
                                 iy_ctrl    <= pull_hi_iy;
7376
             addr_ctrl  <= pulls_ad;
7377
             dout_ctrl  <= iy_hi_dout;
7378
                                 --
7379
                                 st_ctrl      <= idle_st;
7380
                                 return_state <= fetch_state;
7381
             next_state   <= puls_iyl_state;
7382
 
7383
                          when puls_iyl_state =>
7384
                                 -- default
7385
             cc_ctrl    <= latch_cc;
7386
             acca_ctrl  <= latch_acca;
7387
             accb_ctrl  <= latch_accb;
7388
                                 dp_ctrl    <= latch_dp;
7389
             ix_ctrl    <= latch_ix;
7390
             up_ctrl    <= latch_up;
7391
             pc_ctrl    <= latch_pc;
7392
             md_ctrl    <= latch_md;
7393
             iv_ctrl    <= latch_iv;
7394
                            op_ctrl    <= latch_op;
7395
             pre_ctrl   <= latch_pre;
7396
                                 nmi_ctrl   <= latch_nmi;
7397
             ea_ctrl    <= latch_ea;
7398
             -- increment sp
7399
             left_ctrl  <= sp_left;
7400
             right_ctrl <= one_right;
7401
             alu_ctrl   <= alu_add16;
7402
             sp_ctrl    <= load_sp;
7403
                                 -- read iy low
7404
                                 iy_ctrl    <= pull_lo_iy;
7405
             addr_ctrl  <= pulls_ad;
7406
             dout_ctrl  <= iy_lo_dout;
7407
                                 --
7408
                                 st_ctrl      <= idle_st;
7409
                                 return_state <= fetch_state;
7410
                                 if ea(6) = '1' then
7411
               next_state <= puls_uph_state;
7412
                                 elsif ea(7) = '1' then
7413
               next_state <= puls_pch_state;
7414
                                 else
7415
                                   next_state <= fetch_state;
7416
                                 end if;
7417
 
7418
                          when puls_uph_state =>
7419
                                 -- default
7420
             cc_ctrl    <= latch_cc;
7421
             acca_ctrl  <= latch_acca;
7422
             accb_ctrl  <= latch_accb;
7423
                                 dp_ctrl    <= latch_dp;
7424
             ix_ctrl    <= latch_ix;
7425
             iy_ctrl    <= latch_iy;
7426
             pc_ctrl    <= latch_pc;
7427
             md_ctrl    <= latch_md;
7428
             iv_ctrl    <= latch_iv;
7429
                            op_ctrl    <= latch_op;
7430
             pre_ctrl   <= latch_pre;
7431
                                 nmi_ctrl   <= latch_nmi;
7432
             ea_ctrl    <= latch_ea;
7433
             -- increment sp
7434
             left_ctrl  <= sp_left;
7435
             right_ctrl <= one_right;
7436
             alu_ctrl   <= alu_add16;
7437
             sp_ctrl    <= load_sp;
7438
                                 -- pull up hi
7439
                                 up_ctrl    <= pull_hi_up;
7440
             addr_ctrl  <= pulls_ad;
7441
             dout_ctrl  <= up_hi_dout;
7442
                                 --
7443
                                 st_ctrl      <= idle_st;
7444
                                 return_state <= fetch_state;
7445
             next_state   <= puls_upl_state;
7446
 
7447
                          when puls_upl_state =>
7448
                                 -- default
7449
             cc_ctrl    <= latch_cc;
7450
             acca_ctrl  <= latch_acca;
7451
             accb_ctrl  <= latch_accb;
7452
                                 dp_ctrl    <= latch_dp;
7453
             ix_ctrl    <= latch_ix;
7454
             iy_ctrl    <= latch_iy;
7455
             pc_ctrl    <= latch_pc;
7456
             md_ctrl    <= latch_md;
7457
             iv_ctrl    <= latch_iv;
7458
                            op_ctrl    <= latch_op;
7459
             pre_ctrl   <= latch_pre;
7460
                                 nmi_ctrl   <= latch_nmi;
7461
             ea_ctrl    <= latch_ea;
7462
                                 -- increment sp
7463
             left_ctrl  <= sp_left;
7464
             right_ctrl <= one_right;
7465
             alu_ctrl   <= alu_add16;
7466
             sp_ctrl    <= load_sp;
7467
                                 -- read up low
7468
                                 up_ctrl    <= pull_lo_up;
7469
             addr_ctrl  <= pulls_ad;
7470
             dout_ctrl  <= up_lo_dout;
7471
                                 --
7472
                                 st_ctrl      <= idle_st;
7473
                                 return_state <= fetch_state;
7474
                                 if ea(7) = '1' then
7475
               next_state <= puls_pch_state;
7476
                                 else
7477
                                   next_state <= fetch_state;
7478
                                 end if;
7479
 
7480
                          when puls_pch_state =>
7481
                                 -- default
7482
             cc_ctrl    <= latch_cc;
7483
             acca_ctrl  <= latch_acca;
7484
             accb_ctrl  <= latch_accb;
7485
                                 dp_ctrl    <= latch_dp;
7486
             ix_ctrl    <= latch_ix;
7487
             iy_ctrl    <= latch_iy;
7488
             up_ctrl    <= latch_up;
7489
             md_ctrl    <= latch_md;
7490
             iv_ctrl    <= latch_iv;
7491
                            op_ctrl    <= latch_op;
7492
             pre_ctrl   <= latch_pre;
7493
                                 nmi_ctrl   <= latch_nmi;
7494
             ea_ctrl    <= latch_ea;
7495
             -- increment sp
7496
             left_ctrl  <= sp_left;
7497
             right_ctrl <= one_right;
7498
             alu_ctrl   <= alu_add16;
7499
             sp_ctrl    <= load_sp;
7500
                                 -- pull pc hi
7501
                                 pc_ctrl    <= pull_hi_pc;
7502
             addr_ctrl  <= pulls_ad;
7503
             dout_ctrl  <= pc_hi_dout;
7504
                                 --
7505
                                 st_ctrl      <= idle_st;
7506
                                 return_state <= fetch_state;
7507
             next_state   <= puls_pcl_state;
7508
 
7509
                          when puls_pcl_state =>
7510
                                 -- default
7511
             cc_ctrl    <= latch_cc;
7512
             acca_ctrl  <= latch_acca;
7513
             accb_ctrl  <= latch_accb;
7514
                                 dp_ctrl    <= latch_dp;
7515
             ix_ctrl    <= latch_ix;
7516
             iy_ctrl    <= latch_iy;
7517
             up_ctrl    <= latch_up;
7518
             md_ctrl    <= latch_md;
7519
             iv_ctrl    <= latch_iv;
7520
                            op_ctrl    <= latch_op;
7521
             pre_ctrl   <= latch_pre;
7522
                                 nmi_ctrl   <= latch_nmi;
7523
             ea_ctrl    <= latch_ea;
7524
                                 -- increment sp
7525
             left_ctrl  <= sp_left;
7526
             right_ctrl <= one_right;
7527
             alu_ctrl   <= alu_add16;
7528
             sp_ctrl    <= load_sp;
7529
                                 -- read pc low
7530
                                 pc_ctrl    <= pull_lo_pc;
7531
             addr_ctrl  <= pulls_ad;
7532
             dout_ctrl  <= pc_lo_dout;
7533
                                 --
7534
                                 st_ctrl      <= idle_st;
7535
                                 return_state <= fetch_state;
7536
             next_state   <= fetch_state;
7537
 
7538
                          --
7539
                          -- Enter here on pshu
7540
                          -- ea holds post byte
7541
                          --
7542
                          when pshu_state =>
7543
                                 -- default
7544
             cc_ctrl    <= latch_cc;
7545
             acca_ctrl  <= latch_acca;
7546
             accb_ctrl  <= latch_accb;
7547
             dp_ctrl    <= latch_dp;
7548
             ix_ctrl    <= latch_ix;
7549
             iy_ctrl    <= latch_iy;
7550
             sp_ctrl    <= latch_sp;
7551
             pc_ctrl    <= latch_pc;
7552
             md_ctrl    <= latch_md;
7553
             iv_ctrl    <= latch_iv;
7554
             dp_ctrl    <= latch_dp;
7555
                            op_ctrl    <= latch_op;
7556
             pre_ctrl   <= latch_pre;
7557
                                 nmi_ctrl   <= latch_nmi;
7558
             ea_ctrl    <= latch_ea;
7559
             -- decrement sp if any registers to be pushed
7560
             left_ctrl  <= sp_left;
7561
             right_ctrl <= one_right;
7562
             alu_ctrl   <= alu_sub16;
7563
                                 if ea(7 downto 0) = "00000000" then
7564
               up_ctrl    <= latch_up;
7565
                                 else
7566
               up_ctrl    <= load_up;
7567
                                 end if;
7568
                                 -- write idle bus
7569
             addr_ctrl  <= idle_ad;
7570
                            dout_ctrl  <= md_lo_dout;
7571
                                 --
7572
                                 st_ctrl      <= idle_st;
7573
                                 return_state <= fetch_state;
7574
                                 if ea(7) = '1' then
7575
               next_state   <= pshu_pcl_state;
7576
                                 elsif ea(6) = '1' then
7577
               next_state   <= pshu_spl_state;
7578
                                 elsif ea(5) = '1' then
7579
                                   next_state   <= pshu_iyl_state;
7580
                                 elsif ea(4) = '1' then
7581
                                   next_state   <= pshu_ixl_state;
7582
                                 elsif ea(3) = '1' then
7583
                                   next_state   <= pshu_dp_state;
7584
                                 elsif ea(2) = '1' then
7585
                                   next_state   <= pshu_accb_state;
7586
                                 elsif ea(1) = '1' then
7587
                                   next_state   <= pshu_acca_state;
7588
                                 elsif ea(0) = '1' then
7589
                                   next_state   <= pshu_cc_state;
7590
                                 else
7591
                                   next_state   <= fetch_state;
7592
                                 end if;
7593
                          --
7594
                          -- push PC onto U stack
7595
                          --
7596
                          when pshu_pcl_state =>
7597
                                 -- default
7598
             cc_ctrl    <= latch_cc;
7599
             acca_ctrl  <= latch_acca;
7600
             accb_ctrl  <= latch_accb;
7601
                                 dp_ctrl    <= latch_dp;
7602
             ix_ctrl    <= latch_ix;
7603
             iy_ctrl    <= latch_iy;
7604
             sp_ctrl    <= latch_sp;
7605
             pc_ctrl    <= latch_pc;
7606
             md_ctrl    <= latch_md;
7607
             iv_ctrl    <= latch_iv;
7608
                            op_ctrl    <= latch_op;
7609
             pre_ctrl   <= latch_pre;
7610
                                 nmi_ctrl   <= latch_nmi;
7611
             ea_ctrl    <= latch_ea;
7612
             -- decrement sp
7613
             left_ctrl  <= up_left;
7614
             right_ctrl <= one_right;
7615
             alu_ctrl   <= alu_sub16;
7616
             up_ctrl    <= load_up;
7617
                                 -- write pc low
7618
             addr_ctrl  <= pushs_ad;
7619
                            dout_ctrl  <= pc_lo_dout;
7620
                                 --
7621
                                 st_ctrl      <= idle_st;
7622
                                 return_state <= fetch_state;
7623
             next_state   <= pshu_pch_state;
7624
 
7625
                          when pshu_pch_state =>
7626
             cc_ctrl    <= latch_cc;
7627
             acca_ctrl  <= latch_acca;
7628
             accb_ctrl  <= latch_accb;
7629
                                 dp_ctrl    <= latch_dp;
7630
             ix_ctrl    <= latch_ix;
7631
             iy_ctrl    <= latch_iy;
7632
             sp_ctrl    <= latch_sp;
7633
             pc_ctrl    <= latch_pc;
7634
             md_ctrl    <= latch_md;
7635
             iv_ctrl    <= latch_iv;
7636
                            op_ctrl    <= latch_op;
7637
             pre_ctrl   <= latch_pre;
7638
                                 nmi_ctrl   <= latch_nmi;
7639
             ea_ctrl    <= latch_ea;
7640
             -- decrement sp
7641
             left_ctrl  <= up_left;
7642
             right_ctrl <= one_right;
7643
             alu_ctrl   <= alu_sub16;
7644
                                 if ea(6 downto 0) = "0000000" then
7645
               up_ctrl    <= latch_up;
7646
                                 else
7647
               up_ctrl    <= load_up;
7648
                                 end if;
7649
                                 -- write pc hi
7650
             addr_ctrl  <= pushu_ad;
7651
                            dout_ctrl  <= pc_hi_dout;
7652
                                 --
7653
                                 st_ctrl      <= idle_st;
7654
                                 return_state <= fetch_state;
7655
                                 if ea(6) = '1' then
7656
               next_state   <= pshu_spl_state;
7657
                                 elsif ea(5) = '1' then
7658
                                   next_state   <= pshu_iyl_state;
7659
                                 elsif ea(4) = '1' then
7660
                                   next_state   <= pshu_ixl_state;
7661
                                 elsif ea(3) = '1' then
7662
                                   next_state   <= pshu_dp_state;
7663
                                 elsif ea(2) = '1' then
7664
                                   next_state   <= pshu_accb_state;
7665
                                 elsif ea(1) = '1' then
7666
                                   next_state   <= pshu_acca_state;
7667
                                 elsif ea(0) = '1' then
7668
                                   next_state   <= pshu_cc_state;
7669
                                 else
7670
                                   next_state   <= fetch_state;
7671
                                 end if;
7672
 
7673
                          when pshu_spl_state =>
7674
                                 -- default
7675
             cc_ctrl    <= latch_cc;
7676
             acca_ctrl  <= latch_acca;
7677
             accb_ctrl  <= latch_accb;
7678
                                 dp_ctrl    <= latch_dp;
7679
             ix_ctrl    <= latch_ix;
7680
             iy_ctrl    <= latch_iy;
7681
             sp_ctrl    <= latch_sp;
7682
             pc_ctrl    <= latch_pc;
7683
             md_ctrl    <= latch_md;
7684
             iv_ctrl    <= latch_iv;
7685
                            op_ctrl    <= latch_op;
7686
             pre_ctrl   <= latch_pre;
7687
                                 nmi_ctrl   <= latch_nmi;
7688
             ea_ctrl    <= latch_ea;
7689
             -- decrement sp
7690
             left_ctrl  <= up_left;
7691
             right_ctrl <= one_right;
7692
             alu_ctrl   <= alu_sub16;
7693
             up_ctrl    <= load_up;
7694
                                 -- write pc low
7695
             addr_ctrl  <= pushu_ad;
7696
                            dout_ctrl  <= sp_lo_dout;
7697
                                 --
7698
                                 st_ctrl      <= idle_st;
7699
                                 return_state <= fetch_state;
7700
             next_state   <= pshu_sph_state;
7701
 
7702
                          when pshu_sph_state =>
7703
             cc_ctrl    <= latch_cc;
7704
             acca_ctrl  <= latch_acca;
7705
             accb_ctrl  <= latch_accb;
7706
                                 dp_ctrl    <= latch_dp;
7707
             ix_ctrl    <= latch_ix;
7708
             iy_ctrl    <= latch_iy;
7709
             sp_ctrl    <= latch_sp;
7710
             pc_ctrl    <= latch_pc;
7711
             md_ctrl    <= latch_md;
7712
             iv_ctrl    <= latch_iv;
7713
                            op_ctrl    <= latch_op;
7714
             pre_ctrl   <= latch_pre;
7715
                                 nmi_ctrl   <= latch_nmi;
7716
             ea_ctrl    <= latch_ea;
7717
             -- decrement sp
7718
             left_ctrl  <= up_left;
7719
             right_ctrl <= one_right;
7720
             alu_ctrl   <= alu_sub16;
7721
                                 if ea(5 downto 0) = "000000" then
7722
               up_ctrl    <= latch_up;
7723
                                 else
7724
               up_ctrl    <= load_up;
7725
                                 end if;
7726
                                 -- write sp hi
7727
             addr_ctrl  <= pushu_ad;
7728
                            dout_ctrl  <= sp_hi_dout;
7729
                                 --
7730
                                 st_ctrl      <= idle_st;
7731
                                 return_state <= fetch_state;
7732
                                 if ea(5) = '1' then
7733
                                   next_state   <= pshu_iyl_state;
7734
                                 elsif ea(4) = '1' then
7735
                                   next_state   <= pshu_ixl_state;
7736
                                 elsif ea(3) = '1' then
7737
                                   next_state   <= pshu_dp_state;
7738
                                 elsif ea(2) = '1' then
7739
                                   next_state   <= pshu_accb_state;
7740
                                 elsif ea(1) = '1' then
7741
                                   next_state   <= pshu_acca_state;
7742
                                 elsif ea(0) = '1' then
7743
                                   next_state   <= pshu_cc_state;
7744
                                 else
7745
                                   next_state   <= fetch_state;
7746
                                 end if;
7747
 
7748
                          when pshu_iyl_state =>
7749
                                 -- default
7750
             cc_ctrl    <= latch_cc;
7751
             acca_ctrl  <= latch_acca;
7752
             accb_ctrl  <= latch_accb;
7753
                                 dp_ctrl    <= latch_dp;
7754
             ix_ctrl    <= latch_ix;
7755
             iy_ctrl    <= latch_iy;
7756
             sp_ctrl    <= latch_sp;
7757
             pc_ctrl    <= latch_pc;
7758
             md_ctrl    <= latch_md;
7759
             iv_ctrl    <= latch_iv;
7760
                            op_ctrl    <= latch_op;
7761
             pre_ctrl   <= latch_pre;
7762
                                 nmi_ctrl   <= latch_nmi;
7763
             ea_ctrl    <= latch_ea;
7764
             -- decrement sp
7765
             left_ctrl  <= up_left;
7766
             right_ctrl <= one_right;
7767
             alu_ctrl   <= alu_sub16;
7768
             up_ctrl    <= load_up;
7769
                                 -- write iy low
7770
             addr_ctrl  <= pushu_ad;
7771
                            dout_ctrl  <= iy_lo_dout;
7772
                                 --
7773
                                 st_ctrl      <= idle_st;
7774
                                 return_state <= fetch_state;
7775
             next_state   <= pshu_iyh_state;
7776
 
7777
                          when pshu_iyh_state =>
7778
                                 -- default registers
7779
             cc_ctrl    <= latch_cc;
7780
             acca_ctrl  <= latch_acca;
7781
             accb_ctrl  <= latch_accb;
7782
                                 dp_ctrl    <= latch_dp;
7783
             ix_ctrl    <= latch_ix;
7784
             iy_ctrl    <= latch_iy;
7785
             sp_ctrl    <= latch_sp;
7786
             pc_ctrl    <= latch_pc;
7787
             md_ctrl    <= latch_md;
7788
             iv_ctrl    <= latch_iv;
7789
                            op_ctrl    <= latch_op;
7790
             pre_ctrl   <= latch_pre;
7791
                                 nmi_ctrl   <= latch_nmi;
7792
             ea_ctrl    <= latch_ea;
7793
             -- decrement sp
7794
             left_ctrl  <= up_left;
7795
             right_ctrl <= one_right;
7796
             alu_ctrl   <= alu_sub16;
7797
                                 if ea(4 downto 0) = "00000" then
7798
               up_ctrl    <= latch_up;
7799
                                 else
7800
               up_ctrl    <= load_up;
7801
                                 end if;
7802
                                 -- write iy hi
7803
             addr_ctrl  <= pushu_ad;
7804
                            dout_ctrl  <= iy_hi_dout;
7805
                                 --
7806
                                 st_ctrl      <= idle_st;
7807
                                 return_state <= fetch_state;
7808
                                 if ea(4) = '1' then
7809
                                   next_state   <= pshu_ixl_state;
7810
                                 elsif ea(3) = '1' then
7811
                                   next_state   <= pshu_dp_state;
7812
                                 elsif ea(2) = '1' then
7813
                                   next_state   <= pshu_accb_state;
7814
                                 elsif ea(1) = '1' then
7815
                                   next_state   <= pshu_acca_state;
7816
                                 elsif ea(0) = '1' then
7817
                                   next_state   <= pshu_cc_state;
7818
                                 else
7819
                                   next_state   <= fetch_state;
7820
                                 end if;
7821
 
7822
                          when pshu_ixl_state =>
7823
                                 -- default
7824
             cc_ctrl    <= latch_cc;
7825
             acca_ctrl  <= latch_acca;
7826
             accb_ctrl  <= latch_accb;
7827
                                 dp_ctrl    <= latch_dp;
7828
             ix_ctrl    <= latch_ix;
7829
             iy_ctrl    <= latch_iy;
7830
             sp_ctrl    <= latch_sp;
7831
             pc_ctrl    <= latch_pc;
7832
             md_ctrl    <= latch_md;
7833
             iv_ctrl    <= latch_iv;
7834
                            op_ctrl    <= latch_op;
7835
             pre_ctrl   <= latch_pre;
7836
                                 nmi_ctrl   <= latch_nmi;
7837
             ea_ctrl    <= latch_ea;
7838
             -- decrement sp
7839
             left_ctrl  <= up_left;
7840
             right_ctrl <= one_right;
7841
             alu_ctrl   <= alu_sub16;
7842
             up_ctrl    <= load_up;
7843
                                 -- write ix low
7844
             addr_ctrl  <= pushu_ad;
7845
                            dout_ctrl  <= ix_lo_dout;
7846
                                 --
7847
                                 st_ctrl      <= idle_st;
7848
                                 return_state <= fetch_state;
7849
             next_state   <= pshu_ixh_state;
7850
 
7851
                          when pshu_ixh_state =>
7852
                                 -- default registers
7853
             cc_ctrl    <= latch_cc;
7854
             acca_ctrl  <= latch_acca;
7855
             accb_ctrl  <= latch_accb;
7856
                                 dp_ctrl    <= latch_dp;
7857
             ix_ctrl    <= latch_ix;
7858
             iy_ctrl    <= latch_iy;
7859
             sp_ctrl    <= latch_sp;
7860
             pc_ctrl    <= latch_pc;
7861
             md_ctrl    <= latch_md;
7862
             iv_ctrl    <= latch_iv;
7863
                            op_ctrl    <= latch_op;
7864
             pre_ctrl   <= latch_pre;
7865
                                 nmi_ctrl   <= latch_nmi;
7866
             ea_ctrl    <= latch_ea;
7867
             -- decrement sp
7868
             left_ctrl  <= up_left;
7869
             right_ctrl <= one_right;
7870
             alu_ctrl   <= alu_sub16;
7871
                                 if ea(3 downto 0) = "0000" then
7872
               up_ctrl    <= latch_up;
7873
                                 else
7874
               up_ctrl    <= load_up;
7875
                                 end if;
7876
                                 -- write ix hi
7877
             addr_ctrl  <= pushu_ad;
7878
                            dout_ctrl  <= ix_hi_dout;
7879
                                 --
7880
                                 st_ctrl      <= idle_st;
7881
                                 return_state <= fetch_state;
7882
                                 if ea(3) = '1' then
7883
                                   next_state   <= pshu_dp_state;
7884
                                 elsif ea(2) = '1' then
7885
                                   next_state   <= pshu_accb_state;
7886
                                 elsif ea(1) = '1' then
7887
                                   next_state   <= pshu_acca_state;
7888
                                 elsif ea(0) = '1' then
7889
                                   next_state   <= pshu_cc_state;
7890
                                 else
7891
                                   next_state   <= fetch_state;
7892
                                 end if;
7893
 
7894
                          when pshu_dp_state =>
7895
                                 -- default registers
7896
             cc_ctrl    <= latch_cc;
7897
             acca_ctrl  <= latch_acca;
7898
             accb_ctrl  <= latch_accb;
7899
                                 dp_ctrl    <= latch_dp;
7900
             ix_ctrl    <= latch_ix;
7901
             iy_ctrl    <= latch_iy;
7902
             sp_ctrl    <= latch_sp;
7903
             pc_ctrl    <= latch_pc;
7904
             md_ctrl    <= latch_md;
7905
             iv_ctrl    <= latch_iv;
7906
                            op_ctrl    <= latch_op;
7907
             pre_ctrl   <= latch_pre;
7908
                                 nmi_ctrl   <= latch_nmi;
7909
             ea_ctrl    <= latch_ea;
7910
             -- decrement sp
7911
             left_ctrl  <= up_left;
7912
             right_ctrl <= one_right;
7913
             alu_ctrl   <= alu_sub16;
7914
                                 if ea(2 downto 0) = "000" then
7915
               up_ctrl    <= latch_up;
7916
                                 else
7917
               up_ctrl    <= load_up;
7918
                                 end if;
7919
                                 -- write accb
7920
             addr_ctrl  <= pushu_ad;
7921
                            dout_ctrl  <= dp_dout;
7922
                                 --
7923
                                 st_ctrl      <= idle_st;
7924
                                 return_state <= fetch_state;
7925
                                 if ea(2) = '1' then
7926
                                   next_state   <= pshu_accb_state;
7927
                                 elsif ea(1) = '1' then
7928
                                   next_state   <= pshu_acca_state;
7929
                                 elsif ea(0) = '1' then
7930
                                   next_state   <= pshu_cc_state;
7931
                                 else
7932
                                   next_state   <= fetch_state;
7933
                                 end if;
7934
 
7935
                          when pshu_accb_state =>
7936
                                 -- default registers
7937
             cc_ctrl    <= latch_cc;
7938
             acca_ctrl  <= latch_acca;
7939
             accb_ctrl  <= latch_accb;
7940
                                 dp_ctrl    <= latch_dp;
7941
             ix_ctrl    <= latch_ix;
7942
             iy_ctrl    <= latch_iy;
7943
             sp_ctrl    <= latch_sp;
7944
             pc_ctrl    <= latch_pc;
7945
             md_ctrl    <= latch_md;
7946
             iv_ctrl    <= latch_iv;
7947
                            op_ctrl    <= latch_op;
7948
             pre_ctrl   <= latch_pre;
7949
                                 nmi_ctrl   <= latch_nmi;
7950
             ea_ctrl    <= latch_ea;
7951
             -- decrement up
7952
             left_ctrl  <= up_left;
7953
             right_ctrl <= one_right;
7954
             alu_ctrl   <= alu_sub16;
7955
                                 if ea(1 downto 0) = "00" then
7956
               up_ctrl    <= latch_up;
7957
                                 else
7958
               up_ctrl    <= load_up;
7959
                                 end if;
7960
                                 -- write accb
7961
             addr_ctrl  <= pushu_ad;
7962
                            dout_ctrl  <= accb_dout;
7963
                                 --
7964
                                 st_ctrl      <= idle_st;
7965
                                 return_state <= fetch_state;
7966
                                 if ea(1) = '1' then
7967
                                   next_state   <= pshu_acca_state;
7968
                                 elsif ea(0) = '1' then
7969
                                   next_state   <= pshu_cc_state;
7970
                                 else
7971
                                   next_state   <= fetch_state;
7972
                                 end if;
7973
 
7974
                          when pshu_acca_state =>
7975
                                 -- default registers
7976
             cc_ctrl    <= latch_cc;
7977
             acca_ctrl  <= latch_acca;
7978
             accb_ctrl  <= latch_accb;
7979
                                 dp_ctrl    <= latch_dp;
7980
             ix_ctrl    <= latch_ix;
7981
             iy_ctrl    <= latch_iy;
7982
             sp_ctrl    <= latch_sp;
7983
             pc_ctrl    <= latch_pc;
7984
             md_ctrl    <= latch_md;
7985
             iv_ctrl    <= latch_iv;
7986
                            op_ctrl    <= latch_op;
7987
             pre_ctrl   <= latch_pre;
7988
                                 nmi_ctrl   <= latch_nmi;
7989
             ea_ctrl    <= latch_ea;
7990
             -- decrement sp
7991
             left_ctrl  <= up_left;
7992
             right_ctrl <= one_right;
7993
             alu_ctrl   <= alu_sub16;
7994
                                 if ea(0) = '0' then
7995
               up_ctrl    <= latch_up;
7996
                                 else
7997
               up_ctrl    <= load_up;
7998
                                 end if;
7999
                                 -- write acca
8000
             addr_ctrl  <= pushu_ad;
8001
                            dout_ctrl  <= acca_dout;
8002
                                 --
8003
                                 st_ctrl      <= idle_st;
8004
                                 return_state <= fetch_state;
8005
                                 if ea(0) = '1' then
8006
                                   next_state   <= pshu_cc_state;
8007
                                 else
8008
                                   next_state   <= fetch_state;
8009
                                 end if;
8010
 
8011
                          when pshu_cc_state =>
8012
                                 -- default registers
8013
             acca_ctrl  <= latch_acca;
8014
             accb_ctrl  <= latch_accb;
8015
                                 dp_ctrl    <= latch_dp;
8016
             ix_ctrl    <= latch_ix;
8017
             iy_ctrl    <= latch_iy;
8018
             sp_ctrl    <= latch_sp;
8019
             pc_ctrl    <= latch_pc;
8020
             md_ctrl    <= latch_md;
8021
             iv_ctrl    <= latch_iv;
8022
                            op_ctrl    <= latch_op;
8023
             pre_ctrl   <= latch_pre;
8024
                                 nmi_ctrl   <= latch_nmi;
8025
             ea_ctrl    <= latch_ea;
8026
             -- idle sp
8027
             left_ctrl  <= up_left;
8028
             right_ctrl <= one_right;
8029
             cc_ctrl    <= latch_cc;
8030
             alu_ctrl   <= alu_nop;
8031
             up_ctrl    <= latch_up;
8032
                                 -- write cc
8033
             addr_ctrl  <= pushu_ad;
8034
                            dout_ctrl  <= cc_dout;
8035
                                 --
8036
                                 st_ctrl      <= idle_st;
8037
                                 return_state <= fetch_state;
8038
             next_state   <= fetch_state;
8039
 
8040
                          --
8041
                          -- enter here on PULU
8042
                          -- ea hold register mask
8043
                          --
8044
                          when pulu_state =>
8045
                                 -- default registers
8046
             cc_ctrl    <= latch_cc;
8047
             acca_ctrl  <= latch_acca;
8048
             accb_ctrl  <= latch_accb;
8049
                                 dp_ctrl    <= latch_dp;
8050
             ix_ctrl    <= latch_ix;
8051
             iy_ctrl    <= latch_iy;
8052
             sp_ctrl    <= latch_sp;
8053
             pc_ctrl    <= latch_pc;
8054
             md_ctrl    <= latch_md;
8055
             iv_ctrl    <= latch_iv;
8056
                            op_ctrl    <= latch_op;
8057
             pre_ctrl   <= latch_pre;
8058
                                 nmi_ctrl   <= latch_nmi;
8059
             ea_ctrl    <= latch_ea;
8060
                                 -- idle UP
8061
             left_ctrl  <= up_left;
8062
             right_ctrl <= one_right;
8063
             alu_ctrl   <= alu_add16;
8064
             up_ctrl    <= latch_up;
8065
                                 -- idle bus
8066
             addr_ctrl  <= idle_ad;
8067
             dout_ctrl  <= md_lo_dout;
8068
                                 --
8069
                                 st_ctrl      <= idle_st;
8070
                                 return_state <= fetch_state;
8071
                                 if ea(0) = '1' then
8072
                                   next_state <= pulu_cc_state;
8073
                                 elsif ea(1) = '1' then
8074
                                   next_state <= pulu_acca_state;
8075
                                 elsif ea(2) = '1' then
8076
                                   next_state <= pulu_accb_state;
8077
                                 elsif ea(3) = '1' then
8078
                                   next_state <= pulu_dp_state;
8079
                                 elsif ea(4) = '1' then
8080
                                   next_state <= pulu_ixh_state;
8081
                                 elsif ea(5) = '1' then
8082
                                   next_state <= pulu_iyh_state;
8083
                                 elsif ea(6) = '1' then
8084
               next_state <= pulu_sph_state;
8085
                                 elsif ea(7) = '1' then
8086
               next_state <= pulu_pch_state;
8087
                                 else
8088
                                   next_state <= fetch_state;
8089
                                 end if;
8090
 
8091
                          when pulu_cc_state =>
8092
                                 -- default registers
8093
             acca_ctrl  <= latch_acca;
8094
             accb_ctrl  <= latch_accb;
8095
                                 dp_ctrl    <= latch_dp;
8096
             ix_ctrl    <= latch_ix;
8097
             iy_ctrl    <= latch_iy;
8098
             sp_ctrl    <= latch_sp;
8099
             pc_ctrl    <= latch_pc;
8100
             md_ctrl    <= latch_md;
8101
             iv_ctrl    <= latch_iv;
8102
                            op_ctrl    <= latch_op;
8103
             pre_ctrl   <= latch_pre;
8104
                                 nmi_ctrl   <= latch_nmi;
8105
             ea_ctrl    <= latch_ea;
8106
                                 -- increment up
8107
             left_ctrl  <= up_left;
8108
             right_ctrl <= one_right;
8109
             alu_ctrl   <= alu_add16;
8110
             up_ctrl    <= load_up;
8111
                                 -- read cc
8112
             cc_ctrl    <= pull_cc;
8113
             addr_ctrl  <= pullu_ad;
8114
             dout_ctrl  <= cc_dout;
8115
                                 --
8116
                                 st_ctrl      <= idle_st;
8117
                                 return_state <= fetch_state;
8118
                                 if ea(1) = '1' then
8119
                                   next_state <= pulu_acca_state;
8120
                                 elsif ea(2) = '1' then
8121
                                   next_state <= pulu_accb_state;
8122
                                 elsif ea(3) = '1' then
8123
                                   next_state <= pulu_dp_state;
8124
                                 elsif ea(4) = '1' then
8125
                                   next_state <= pulu_ixh_state;
8126
                                 elsif ea(5) = '1' then
8127
                                   next_state <= pulu_iyh_state;
8128
                                 elsif ea(6) = '1' then
8129
               next_state <= pulu_sph_state;
8130
                                 elsif ea(7) = '1' then
8131
               next_state <= pulu_pch_state;
8132
                                 else
8133
                                   next_state <= fetch_state;
8134
                                 end if;
8135
 
8136
                          when pulu_acca_state =>
8137
                                 -- default registers
8138
             cc_ctrl    <= latch_cc;
8139
             accb_ctrl  <= latch_accb;
8140
                                 dp_ctrl    <= latch_dp;
8141
             ix_ctrl    <= latch_ix;
8142
             iy_ctrl    <= latch_iy;
8143
             sp_ctrl    <= latch_sp;
8144
             pc_ctrl    <= latch_pc;
8145
             md_ctrl    <= latch_md;
8146
             iv_ctrl    <= latch_iv;
8147
                            op_ctrl    <= latch_op;
8148
             pre_ctrl   <= latch_pre;
8149
                                 nmi_ctrl   <= latch_nmi;
8150
             ea_ctrl    <= latch_ea;
8151
                                 -- increment up
8152
             left_ctrl  <= up_left;
8153
             right_ctrl <= one_right;
8154
             alu_ctrl   <= alu_add16;
8155
             up_ctrl    <= load_up;
8156
                                 -- read acca
8157
                                 acca_ctrl  <= pull_acca;
8158
             addr_ctrl  <= pullu_ad;
8159
             dout_ctrl  <= acca_dout;
8160
                                 --
8161
                                 st_ctrl      <= idle_st;
8162
                                 return_state <= fetch_state;
8163
                                 if ea(2) = '1' then
8164
                                   next_state <= pulu_accb_state;
8165
                                 elsif ea(3) = '1' then
8166
                                   next_state <= pulu_dp_state;
8167
                                 elsif ea(4) = '1' then
8168
                                   next_state <= pulu_ixh_state;
8169
                                 elsif ea(5) = '1' then
8170
                                   next_state <= pulu_iyh_state;
8171
                                 elsif ea(6) = '1' then
8172
               next_state <= pulu_sph_state;
8173
                                 elsif ea(7) = '1' then
8174
               next_state <= pulu_pch_state;
8175
                                 else
8176
                                   next_state <= fetch_state;
8177
                                 end if;
8178
 
8179
                          when pulu_accb_state =>
8180
                                 -- default
8181
             cc_ctrl    <= latch_cc;
8182
             acca_ctrl  <= latch_acca;
8183
                                 dp_ctrl    <= latch_dp;
8184
             ix_ctrl    <= latch_ix;
8185
             iy_ctrl    <= latch_iy;
8186
             sp_ctrl    <= latch_sp;
8187
             pc_ctrl    <= latch_pc;
8188
             md_ctrl    <= latch_md;
8189
             iv_ctrl    <= latch_iv;
8190
                            op_ctrl    <= latch_op;
8191
             pre_ctrl   <= latch_pre;
8192
                                 nmi_ctrl   <= latch_nmi;
8193
             ea_ctrl    <= latch_ea;
8194
                                 -- increment up
8195
             left_ctrl  <= up_left;
8196
             right_ctrl <= one_right;
8197
             alu_ctrl   <= alu_add16;
8198
             up_ctrl    <= load_up;
8199
                                 -- read accb
8200
                                 accb_ctrl  <= pull_accb;
8201
             addr_ctrl  <= pullu_ad;
8202
             dout_ctrl  <= accb_dout;
8203
                                 --
8204
                                 st_ctrl      <= idle_st;
8205
                                 return_state <= fetch_state;
8206
                                 if ea(3) = '1' then
8207
                                   next_state <= pulu_dp_state;
8208
                                 elsif ea(4) = '1' then
8209
                                   next_state <= pulu_ixh_state;
8210
                                 elsif ea(5) = '1' then
8211
                                   next_state <= pulu_iyh_state;
8212
                                 elsif ea(6) = '1' then
8213
               next_state <= pulu_sph_state;
8214
                                 elsif ea(7) = '1' then
8215
               next_state <= pulu_pch_state;
8216
                                 else
8217
                                   next_state <= fetch_state;
8218
                                 end if;
8219
 
8220
                          when pulu_dp_state =>
8221
                                 -- default
8222
             cc_ctrl    <= latch_cc;
8223
             acca_ctrl  <= latch_acca;
8224
             accb_ctrl  <= latch_accb;
8225
             ix_ctrl    <= latch_ix;
8226
             iy_ctrl    <= latch_iy;
8227
             sp_ctrl    <= latch_sp;
8228
             pc_ctrl    <= latch_pc;
8229
             md_ctrl    <= latch_md;
8230
             iv_ctrl    <= latch_iv;
8231
                            op_ctrl    <= latch_op;
8232
             pre_ctrl   <= latch_pre;
8233
                                 nmi_ctrl   <= latch_nmi;
8234
             ea_ctrl    <= latch_ea;
8235
                                 -- increment up
8236
             left_ctrl  <= up_left;
8237
             right_ctrl <= one_right;
8238
             alu_ctrl   <= alu_add16;
8239
             up_ctrl    <= load_up;
8240
                                 -- read dp
8241
                                 dp_ctrl    <= pull_dp;
8242
             addr_ctrl  <= pullu_ad;
8243
             dout_ctrl  <= dp_dout;
8244
                                 --
8245
                                 st_ctrl      <= idle_st;
8246
                                 return_state <= fetch_state;
8247
                                 if ea(4) = '1' then
8248
                                   next_state <= pulu_ixh_state;
8249
                                 elsif ea(5) = '1' then
8250
                                   next_state <= pulu_iyh_state;
8251
                                 elsif ea(6) = '1' then
8252
               next_state <= pulu_sph_state;
8253
                                 elsif ea(7) = '1' then
8254
               next_state <= pulu_pch_state;
8255
                                 else
8256
                                   next_state <= fetch_state;
8257
                                 end if;
8258
 
8259
                          when pulu_ixh_state =>
8260
                                 -- default
8261
             cc_ctrl    <= latch_cc;
8262
             acca_ctrl  <= latch_acca;
8263
             accb_ctrl  <= latch_accb;
8264
                                 dp_ctrl    <= latch_dp;
8265
             iy_ctrl    <= latch_iy;
8266
             sp_ctrl    <= latch_sp;
8267
             pc_ctrl    <= latch_pc;
8268
             md_ctrl    <= latch_md;
8269
             iv_ctrl    <= latch_iv;
8270
                            op_ctrl    <= latch_op;
8271
             pre_ctrl   <= latch_pre;
8272
                                 nmi_ctrl   <= latch_nmi;
8273
             ea_ctrl    <= latch_ea;
8274
             -- increment up
8275
             left_ctrl  <= up_left;
8276
             right_ctrl <= one_right;
8277
             alu_ctrl   <= alu_add16;
8278
             up_ctrl    <= load_up;
8279
                                 -- pull ix hi
8280
                                 ix_ctrl    <= pull_hi_ix;
8281
             addr_ctrl  <= pullu_ad;
8282
             dout_ctrl  <= ix_hi_dout;
8283
                                 --
8284
                                 st_ctrl      <= idle_st;
8285
                                 return_state <= fetch_state;
8286
             next_state   <= pulu_ixl_state;
8287
 
8288
                          when pulu_ixl_state =>
8289
                                 -- default
8290
             cc_ctrl    <= latch_cc;
8291
             acca_ctrl  <= latch_acca;
8292
             accb_ctrl  <= latch_accb;
8293
                                 dp_ctrl    <= latch_dp;
8294
             iy_ctrl    <= latch_iy;
8295
             sp_ctrl    <= latch_sp;
8296
             pc_ctrl    <= latch_pc;
8297
             md_ctrl    <= latch_md;
8298
             iv_ctrl    <= latch_iv;
8299
                            op_ctrl    <= latch_op;
8300
             pre_ctrl   <= latch_pre;
8301
                                 nmi_ctrl   <= latch_nmi;
8302
             ea_ctrl    <= latch_ea;
8303
                                 -- increment up
8304
             left_ctrl  <= up_left;
8305
             right_ctrl <= one_right;
8306
             alu_ctrl   <= alu_add16;
8307
             up_ctrl    <= load_up;
8308
                                 -- read ix low
8309
                                 ix_ctrl    <= pull_lo_ix;
8310
             addr_ctrl  <= pullu_ad;
8311
             dout_ctrl  <= ix_lo_dout;
8312
                                 --
8313
                                 st_ctrl      <= idle_st;
8314
                                 return_state <= fetch_state;
8315
                                 if ea(5) = '1' then
8316
                                   next_state <= pulu_iyh_state;
8317
                                 elsif ea(6) = '1' then
8318
               next_state <= pulu_sph_state;
8319
                                 elsif ea(7) = '1' then
8320
               next_state <= pulu_pch_state;
8321
                                 else
8322
                                   next_state <= fetch_state;
8323
                                 end if;
8324
 
8325
                          when pulu_iyh_state =>
8326
                                 -- default
8327
             cc_ctrl    <= latch_cc;
8328
             acca_ctrl  <= latch_acca;
8329
             accb_ctrl  <= latch_accb;
8330
                                 dp_ctrl    <= latch_dp;
8331
             ix_ctrl    <= latch_ix;
8332
             sp_ctrl    <= latch_sp;
8333
             pc_ctrl    <= latch_pc;
8334
             md_ctrl    <= latch_md;
8335
             iv_ctrl    <= latch_iv;
8336
                            op_ctrl    <= latch_op;
8337
             pre_ctrl   <= latch_pre;
8338
                                 nmi_ctrl   <= latch_nmi;
8339
             ea_ctrl    <= latch_ea;
8340
             -- increment up
8341
             left_ctrl  <= up_left;
8342
             right_ctrl <= one_right;
8343
             alu_ctrl   <= alu_add16;
8344
             up_ctrl    <= load_up;
8345
                                 -- pull iy hi
8346
                                 iy_ctrl    <= pull_hi_iy;
8347
             addr_ctrl  <= pullu_ad;
8348
             dout_ctrl  <= iy_hi_dout;
8349
                                 --
8350
                                 st_ctrl      <= idle_st;
8351
                                 return_state <= fetch_state;
8352
             next_state   <= pulu_iyl_state;
8353
 
8354
                          when pulu_iyl_state =>
8355
                                 -- default
8356
             cc_ctrl    <= latch_cc;
8357
             acca_ctrl  <= latch_acca;
8358
             accb_ctrl  <= latch_accb;
8359
                                 dp_ctrl    <= latch_dp;
8360
             ix_ctrl    <= latch_ix;
8361
             sp_ctrl    <= latch_sp;
8362
             pc_ctrl    <= latch_pc;
8363
             md_ctrl    <= latch_md;
8364
             iv_ctrl    <= latch_iv;
8365
                            op_ctrl    <= latch_op;
8366
             pre_ctrl   <= latch_pre;
8367
                                 nmi_ctrl   <= latch_nmi;
8368
             ea_ctrl    <= latch_ea;
8369
             -- increment up
8370
             left_ctrl  <= up_left;
8371
             right_ctrl <= one_right;
8372
             alu_ctrl   <= alu_add16;
8373
             up_ctrl    <= load_up;
8374
                                 -- read iy low
8375
                                 iy_ctrl    <= pull_lo_iy;
8376
             addr_ctrl  <= pullu_ad;
8377
             dout_ctrl  <= iy_lo_dout;
8378
                                 --
8379
                                 st_ctrl      <= idle_st;
8380
                                 return_state <= fetch_state;
8381
                                 if ea(6) = '1' then
8382
               next_state <= pulu_sph_state;
8383
                                 elsif ea(7) = '1' then
8384
               next_state <= pulu_pch_state;
8385
                                 else
8386
                                   next_state <= fetch_state;
8387
                                 end if;
8388
 
8389
                          when pulu_sph_state =>
8390
                                 -- default
8391
             cc_ctrl    <= latch_cc;
8392
             acca_ctrl  <= latch_acca;
8393
             accb_ctrl  <= latch_accb;
8394
                                 dp_ctrl    <= latch_dp;
8395
             ix_ctrl    <= latch_ix;
8396
             iy_ctrl    <= latch_iy;
8397
             pc_ctrl    <= latch_pc;
8398
             md_ctrl    <= latch_md;
8399
             iv_ctrl    <= latch_iv;
8400
                            op_ctrl    <= latch_op;
8401
             pre_ctrl   <= latch_pre;
8402
                                 nmi_ctrl   <= latch_nmi;
8403
             ea_ctrl    <= latch_ea;
8404
             -- increment up
8405
             left_ctrl  <= up_left;
8406
             right_ctrl <= one_right;
8407
             alu_ctrl   <= alu_add16;
8408
             up_ctrl    <= load_up;
8409
                                 -- pull sp hi
8410
                                 sp_ctrl    <= pull_hi_sp;
8411
             addr_ctrl  <= pullu_ad;
8412
             dout_ctrl  <= up_hi_dout;
8413
                                 --
8414
                                 st_ctrl      <= idle_st;
8415
                                 return_state <= fetch_state;
8416
             next_state   <= pulu_spl_state;
8417
 
8418
                          when pulu_spl_state =>
8419
                                 -- default
8420
             cc_ctrl    <= latch_cc;
8421
             acca_ctrl  <= latch_acca;
8422
             accb_ctrl  <= latch_accb;
8423
                                 dp_ctrl    <= latch_dp;
8424
             ix_ctrl    <= latch_ix;
8425
             iy_ctrl    <= latch_iy;
8426
             pc_ctrl    <= latch_pc;
8427
             md_ctrl    <= latch_md;
8428
             iv_ctrl    <= latch_iv;
8429
                            op_ctrl    <= latch_op;
8430
             pre_ctrl   <= latch_pre;
8431
                                 nmi_ctrl   <= latch_nmi;
8432
             ea_ctrl    <= latch_ea;
8433
                                 -- increment up
8434
             left_ctrl  <= up_left;
8435
             right_ctrl <= one_right;
8436
             alu_ctrl   <= alu_add16;
8437
             up_ctrl    <= load_up;
8438
                                 -- read sp low
8439
                                 sp_ctrl    <= pull_lo_sp;
8440
             addr_ctrl  <= pullu_ad;
8441
             dout_ctrl  <= up_lo_dout;
8442
                                 --
8443
                                 st_ctrl      <= idle_st;
8444
                                 return_state <= fetch_state;
8445
                                 if ea(7) = '1' then
8446
               next_state <= pulu_pch_state;
8447
                                 else
8448
                                   next_state <= fetch_state;
8449
                                 end if;
8450
 
8451
                          when pulu_pch_state =>
8452
                                 -- default
8453
             cc_ctrl    <= latch_cc;
8454
             acca_ctrl  <= latch_acca;
8455
             accb_ctrl  <= latch_accb;
8456
                                 dp_ctrl    <= latch_dp;
8457
             ix_ctrl    <= latch_ix;
8458
             iy_ctrl    <= latch_iy;
8459
             sp_ctrl    <= latch_sp;
8460
             md_ctrl    <= latch_md;
8461
             iv_ctrl    <= latch_iv;
8462
                            op_ctrl    <= latch_op;
8463
             pre_ctrl   <= latch_pre;
8464
                                 nmi_ctrl   <= latch_nmi;
8465
             ea_ctrl    <= latch_ea;
8466
             -- increment up
8467
             left_ctrl  <= up_left;
8468
             right_ctrl <= one_right;
8469
             alu_ctrl   <= alu_add16;
8470
             up_ctrl    <= load_up;
8471
                                 -- pull pc hi
8472
                                 pc_ctrl    <= pull_hi_pc;
8473
             addr_ctrl  <= pullu_ad;
8474
             dout_ctrl  <= pc_hi_dout;
8475
                                 --
8476
                                 st_ctrl      <= idle_st;
8477
                                 return_state <= fetch_state;
8478
             next_state   <= pulu_pcl_state;
8479
 
8480
                          when pulu_pcl_state =>
8481
                                 -- default
8482
             cc_ctrl    <= latch_cc;
8483
             acca_ctrl  <= latch_acca;
8484
             accb_ctrl  <= latch_accb;
8485
                                 dp_ctrl    <= latch_dp;
8486
             ix_ctrl    <= latch_ix;
8487
             iy_ctrl    <= latch_iy;
8488
             sp_ctrl    <= latch_sp;
8489
             md_ctrl    <= latch_md;
8490
             iv_ctrl    <= latch_iv;
8491
                            op_ctrl    <= latch_op;
8492
             pre_ctrl   <= latch_pre;
8493
                                 nmi_ctrl   <= latch_nmi;
8494
             ea_ctrl    <= latch_ea;
8495
                                 -- increment up
8496
             left_ctrl  <= up_left;
8497
             right_ctrl <= one_right;
8498
             alu_ctrl   <= alu_add16;
8499
             up_ctrl    <= load_up;
8500
                                 -- read pc low
8501
                                 pc_ctrl    <= pull_lo_pc;
8502
             addr_ctrl  <= pullu_ad;
8503
             dout_ctrl  <= pc_lo_dout;
8504
                                 --
8505
                                 st_ctrl      <= idle_st;
8506
                                 return_state <= fetch_state;
8507
             next_state   <= fetch_state;
8508
 
8509
                          when rti_cc_state =>
8510
                                 -- default registers
8511
             acca_ctrl  <= latch_acca;
8512
             accb_ctrl  <= latch_accb;
8513
                                 dp_ctrl    <= latch_dp;
8514
             ix_ctrl    <= latch_ix;
8515
             iy_ctrl    <= latch_iy;
8516
             up_ctrl    <= latch_up;
8517
             pc_ctrl    <= latch_pc;
8518
             md_ctrl    <= latch_md;
8519
             iv_ctrl    <= latch_iv;
8520
                            op_ctrl    <= latch_op;
8521
             pre_ctrl   <= latch_pre;
8522
                                 nmi_ctrl   <= latch_nmi;
8523
             ea_ctrl    <= latch_ea;
8524
                                 -- increment sp
8525
             left_ctrl  <= sp_left;
8526
             right_ctrl <= one_right;
8527
             alu_ctrl   <= alu_add16;
8528
             sp_ctrl    <= load_sp;
8529
                                 -- read cc
8530
             cc_ctrl    <= pull_cc;
8531
             addr_ctrl  <= pulls_ad;
8532
             dout_ctrl  <= cc_dout;
8533
                                 --
8534
                                 st_ctrl      <= idle_st;
8535
                                 return_state <= fetch_state;
8536
                                 --
8537
                                 -- CC is clocked at the end of this cycle
8538
                                 -- so this test tests the current state
8539
                                 -- of the condition codes, not the popped value
8540
                                 -- Mind you, the Entire flag is set before
8541
                                 -- the registers are pushed, so it should not matter
8542
                                 --
8543
                                 if cc(EBIT) = '1' then
8544
               next_state   <= rti_acca_state;
8545
                                 else
8546
               next_state   <= rti_pch_state;
8547
                                 end if;
8548
 
8549
                          when rti_acca_state =>
8550
                                 -- default registers
8551
             cc_ctrl    <= latch_cc;
8552
             accb_ctrl  <= latch_accb;
8553
                                 dp_ctrl    <= latch_dp;
8554
             ix_ctrl    <= latch_ix;
8555
             iy_ctrl    <= latch_iy;
8556
             up_ctrl    <= latch_up;
8557
             pc_ctrl    <= latch_pc;
8558
             md_ctrl    <= latch_md;
8559
             iv_ctrl    <= latch_iv;
8560
                            op_ctrl    <= latch_op;
8561
             pre_ctrl   <= latch_pre;
8562
                                 nmi_ctrl   <= latch_nmi;
8563
             ea_ctrl    <= latch_ea;
8564
                                 -- increment sp
8565
             left_ctrl  <= sp_left;
8566
             right_ctrl <= one_right;
8567
             alu_ctrl   <= alu_add16;
8568
             sp_ctrl    <= load_sp;
8569
                                 -- read acca
8570
                                 acca_ctrl  <= pull_acca;
8571
             addr_ctrl  <= pulls_ad;
8572
             dout_ctrl  <= acca_dout;
8573
                                 --
8574
                                 st_ctrl      <= idle_st;
8575
                                 return_state <= fetch_state;
8576
             next_state   <= rti_accb_state;
8577
 
8578
                          when rti_accb_state =>
8579
                                 -- default registers
8580
             cc_ctrl    <= latch_cc;
8581
             acca_ctrl  <= latch_acca;
8582
                                 dp_ctrl    <= latch_dp;
8583
             ix_ctrl    <= latch_ix;
8584
             iy_ctrl    <= latch_iy;
8585
             up_ctrl    <= latch_up;
8586
             pc_ctrl    <= latch_pc;
8587
             md_ctrl    <= latch_md;
8588
             iv_ctrl    <= latch_iv;
8589
                            op_ctrl    <= latch_op;
8590
             pre_ctrl   <= latch_pre;
8591
                                 nmi_ctrl   <= latch_nmi;
8592
             ea_ctrl    <= latch_ea;
8593
                                 -- increment sp
8594
             left_ctrl  <= sp_left;
8595
             right_ctrl <= one_right;
8596
             alu_ctrl   <= alu_add16;
8597
             sp_ctrl    <= load_sp;
8598
                                 -- read accb
8599
                                 accb_ctrl  <= pull_accb;
8600
             addr_ctrl  <= pulls_ad;
8601
             dout_ctrl  <= accb_dout;
8602
                                 --
8603
                                 st_ctrl      <= idle_st;
8604
                                 return_state <= fetch_state;
8605
             next_state   <= rti_dp_state;
8606
 
8607
                          when rti_dp_state =>
8608
                                 -- default registers
8609
             cc_ctrl    <= latch_cc;
8610
             acca_ctrl  <= latch_acca;
8611
                                 accb_ctrl  <= latch_accb;
8612
             ix_ctrl    <= latch_ix;
8613
             iy_ctrl    <= latch_iy;
8614
             up_ctrl    <= latch_up;
8615
             pc_ctrl    <= latch_pc;
8616
             md_ctrl    <= latch_md;
8617
             iv_ctrl    <= latch_iv;
8618
                            op_ctrl    <= latch_op;
8619
             pre_ctrl   <= latch_pre;
8620
                                 nmi_ctrl   <= latch_nmi;
8621
             ea_ctrl    <= latch_ea;
8622
                                 -- increment sp
8623
             left_ctrl  <= sp_left;
8624
             right_ctrl <= one_right;
8625
             alu_ctrl   <= alu_add16;
8626
             sp_ctrl    <= load_sp;
8627
                                 -- read dp
8628
                                 dp_ctrl    <= pull_dp;
8629
             addr_ctrl  <= pulls_ad;
8630
             dout_ctrl  <= dp_dout;
8631
                                 --
8632
                                 st_ctrl      <= idle_st;
8633
                                 return_state <= fetch_state;
8634
             next_state   <= rti_ixh_state;
8635
 
8636
                          when rti_ixh_state =>
8637
                                 -- default
8638
             cc_ctrl    <= latch_cc;
8639
             acca_ctrl  <= latch_acca;
8640
             accb_ctrl  <= latch_accb;
8641
                                 dp_ctrl    <= latch_dp;
8642
             iy_ctrl    <= latch_iy;
8643
             up_ctrl    <= latch_up;
8644
             pc_ctrl    <= latch_pc;
8645
             md_ctrl    <= latch_md;
8646
             iv_ctrl    <= latch_iv;
8647
                            op_ctrl    <= latch_op;
8648
             pre_ctrl   <= latch_pre;
8649
                                 nmi_ctrl   <= latch_nmi;
8650
             ea_ctrl    <= latch_ea;
8651
                                 -- increment sp
8652
             left_ctrl  <= sp_left;
8653
             right_ctrl <= one_right;
8654
             alu_ctrl   <= alu_add16;
8655
             sp_ctrl    <= load_sp;
8656
                                 -- read ix hi
8657
                                 ix_ctrl    <= pull_hi_ix;
8658
             addr_ctrl  <= pulls_ad;
8659
             dout_ctrl  <= ix_hi_dout;
8660
                                 --
8661
                                 st_ctrl      <= idle_st;
8662
                                 return_state <= fetch_state;
8663
             next_state   <= rti_ixl_state;
8664
 
8665
                          when rti_ixl_state =>
8666
                                 -- default
8667
             cc_ctrl    <= latch_cc;
8668
             acca_ctrl  <= latch_acca;
8669
             accb_ctrl  <= latch_accb;
8670
                                 dp_ctrl    <= latch_dp;
8671
             iy_ctrl    <= latch_iy;
8672
             up_ctrl    <= latch_up;
8673
             pc_ctrl    <= latch_pc;
8674
             md_ctrl    <= latch_md;
8675
             iv_ctrl    <= latch_iv;
8676
                            op_ctrl    <= latch_op;
8677
             pre_ctrl   <= latch_pre;
8678
                                 nmi_ctrl   <= latch_nmi;
8679
             ea_ctrl    <= latch_ea;
8680
                                 -- increment sp
8681
             left_ctrl  <= sp_left;
8682
             right_ctrl <= one_right;
8683
             alu_ctrl   <= alu_add16;
8684
             sp_ctrl    <= load_sp;
8685
                                 -- read ix low
8686
                                 ix_ctrl    <= pull_lo_ix;
8687
             addr_ctrl  <= pulls_ad;
8688
             dout_ctrl  <= ix_lo_dout;
8689
                                 --
8690
                                 st_ctrl      <= idle_st;
8691
                                 return_state <= fetch_state;
8692
             next_state   <= rti_iyh_state;
8693
 
8694
                          when rti_iyh_state =>
8695
                                 -- default
8696
             cc_ctrl    <= latch_cc;
8697
             acca_ctrl  <= latch_acca;
8698
             accb_ctrl  <= latch_accb;
8699
                                 dp_ctrl    <= latch_dp;
8700
             ix_ctrl    <= latch_ix;
8701
             up_ctrl    <= latch_up;
8702
             pc_ctrl    <= latch_pc;
8703
             md_ctrl    <= latch_md;
8704
             iv_ctrl    <= latch_iv;
8705
                            op_ctrl    <= latch_op;
8706
             pre_ctrl   <= latch_pre;
8707
                                 nmi_ctrl   <= latch_nmi;
8708
             ea_ctrl    <= latch_ea;
8709
                                 -- increment sp
8710
             left_ctrl  <= sp_left;
8711
             right_ctrl <= one_right;
8712
             alu_ctrl   <= alu_add16;
8713
             sp_ctrl    <= load_sp;
8714
                                 -- read iy hi
8715
                                 iy_ctrl    <= pull_hi_iy;
8716
             addr_ctrl  <= pulls_ad;
8717
             dout_ctrl  <= iy_hi_dout;
8718
                                 --
8719
                                 st_ctrl      <= idle_st;
8720
                                 return_state <= fetch_state;
8721
             next_state   <= rti_iyl_state;
8722
 
8723
                          when rti_iyl_state =>
8724
                                 -- default
8725
             cc_ctrl    <= latch_cc;
8726
             acca_ctrl  <= latch_acca;
8727
             accb_ctrl  <= latch_accb;
8728
                                 dp_ctrl    <= latch_dp;
8729
             ix_ctrl    <= latch_ix;
8730
             up_ctrl    <= latch_up;
8731
             pc_ctrl    <= latch_pc;
8732
             md_ctrl    <= latch_md;
8733
             iv_ctrl    <= latch_iv;
8734
                            op_ctrl    <= latch_op;
8735
             pre_ctrl   <= latch_pre;
8736
                                 nmi_ctrl   <= latch_nmi;
8737
             ea_ctrl    <= latch_ea;
8738
                                 -- increment sp
8739
             left_ctrl  <= sp_left;
8740
             right_ctrl <= one_right;
8741
             alu_ctrl   <= alu_add16;
8742
             sp_ctrl    <= load_sp;
8743
                                 -- read iy low
8744
                                 iy_ctrl    <= pull_lo_iy;
8745
             addr_ctrl  <= pulls_ad;
8746
             dout_ctrl  <= iy_lo_dout;
8747
                                 --
8748
                                 st_ctrl      <= idle_st;
8749
                                 return_state <= fetch_state;
8750
             next_state   <= rti_uph_state;
8751
 
8752
 
8753
                          when rti_uph_state =>
8754
                                 -- default
8755
             cc_ctrl    <= latch_cc;
8756
             acca_ctrl  <= latch_acca;
8757
             accb_ctrl  <= latch_accb;
8758
                                 dp_ctrl    <= latch_dp;
8759
             ix_ctrl    <= latch_ix;
8760
             iy_ctrl    <= latch_iy;
8761
             pc_ctrl    <= latch_pc;
8762
             md_ctrl    <= latch_md;
8763
             iv_ctrl    <= latch_iv;
8764
                            op_ctrl    <= latch_op;
8765
             pre_ctrl   <= latch_pre;
8766
                                 nmi_ctrl   <= latch_nmi;
8767
             ea_ctrl    <= latch_ea;
8768
                                 -- increment sp
8769
             left_ctrl  <= sp_left;
8770
             right_ctrl <= one_right;
8771
             alu_ctrl   <= alu_add16;
8772
             sp_ctrl    <= load_sp;
8773
                                 -- read up hi
8774
                                 up_ctrl    <= pull_hi_up;
8775
             addr_ctrl  <= pulls_ad;
8776
             dout_ctrl  <= up_hi_dout;
8777
                                 --
8778
                                 st_ctrl      <= idle_st;
8779
                                 return_state <= fetch_state;
8780
             next_state   <= rti_upl_state;
8781
 
8782
                          when rti_upl_state =>
8783
                                 -- default
8784
             cc_ctrl    <= latch_cc;
8785
             acca_ctrl  <= latch_acca;
8786
             accb_ctrl  <= latch_accb;
8787
                                 dp_ctrl    <= latch_dp;
8788
             iy_ctrl    <= latch_iy;
8789
                                 ix_ctrl    <= latch_ix;
8790
             pc_ctrl    <= latch_pc;
8791
             md_ctrl    <= latch_md;
8792
             iv_ctrl    <= latch_iv;
8793
                            op_ctrl    <= latch_op;
8794
             pre_ctrl   <= latch_pre;
8795
                                 nmi_ctrl   <= latch_nmi;
8796
             ea_ctrl    <= latch_ea;
8797
                                 -- increment sp
8798
             left_ctrl  <= sp_left;
8799
             right_ctrl <= one_right;
8800
             alu_ctrl   <= alu_add16;
8801
             sp_ctrl    <= load_sp;
8802
                                 -- read up low
8803
             up_ctrl    <= pull_lo_up;
8804
             addr_ctrl  <= pulls_ad;
8805
             dout_ctrl  <= up_lo_dout;
8806
                                 --
8807
                                 st_ctrl      <= idle_st;
8808
                                 return_state <= fetch_state;
8809
             next_state   <= rti_pch_state;
8810
 
8811
                          when rti_pch_state =>
8812
                                 -- default
8813
             cc_ctrl    <= latch_cc;
8814
             acca_ctrl  <= latch_acca;
8815
             accb_ctrl  <= latch_accb;
8816
                                 dp_ctrl    <= latch_dp;
8817
             ix_ctrl    <= latch_ix;
8818
             iy_ctrl    <= latch_iy;
8819
             up_ctrl    <= latch_up;
8820
             pc_ctrl    <= latch_pc;
8821
             md_ctrl    <= latch_md;
8822
             iv_ctrl    <= latch_iv;
8823
                            op_ctrl    <= latch_op;
8824
             pre_ctrl   <= latch_pre;
8825
                                 nmi_ctrl   <= latch_nmi;
8826
             ea_ctrl    <= latch_ea;
8827
                  -- increment sp
8828
             left_ctrl  <= sp_left;
8829
             right_ctrl <= one_right;
8830
             alu_ctrl   <= alu_add16;
8831
             sp_ctrl    <= load_sp;
8832
                                 -- pull pc hi
8833
                                 pc_ctrl    <= pull_hi_pc;
8834
             addr_ctrl  <= pulls_ad;
8835
             dout_ctrl  <= pc_hi_dout;
8836
                                 --
8837
                                 st_ctrl      <= idle_st;
8838
                                 return_state <= fetch_state;
8839
             next_state   <= rti_pcl_state;
8840
 
8841
                          when rti_pcl_state =>
8842
                                 -- default
8843
             cc_ctrl    <= latch_cc;
8844
             acca_ctrl  <= latch_acca;
8845
             accb_ctrl  <= latch_accb;
8846
                                 dp_ctrl    <= latch_dp;
8847
             ix_ctrl    <= latch_ix;
8848
             iy_ctrl    <= latch_iy;
8849
             up_ctrl    <= latch_up;
8850
             md_ctrl    <= latch_md;
8851
             iv_ctrl    <= latch_iv;
8852
                            op_ctrl    <= latch_op;
8853
             pre_ctrl   <= latch_pre;
8854
                                 nmi_ctrl   <= latch_nmi;
8855
             ea_ctrl    <= latch_ea;
8856
                                 -- increment sp
8857
             left_ctrl  <= sp_left;
8858
             right_ctrl <= one_right;
8859
             alu_ctrl   <= alu_add16;
8860
             sp_ctrl    <= load_sp;
8861
                  -- pull pc low
8862
                                 pc_ctrl    <= pull_lo_pc;
8863
             addr_ctrl  <= pulls_ad;
8864
             dout_ctrl  <= pc_lo_dout;
8865
                                 --
8866
                                 st_ctrl      <= idle_st;
8867
                                 return_state <= fetch_state;
8868
             next_state   <= fetch_state;
8869
 
8870
                          --
8871
                          -- here on IRQ, NMI or FIRQ interrupt
8872
                          -- pre decrement the sp
8873
                          --
8874
                          when int_decr_state =>
8875
                                 -- default
8876
             cc_ctrl    <= latch_cc;
8877
             acca_ctrl  <= latch_acca;
8878
             accb_ctrl  <= latch_accb;
8879
                                 dp_ctrl    <= latch_dp;
8880
             ix_ctrl    <= latch_ix;
8881
             iy_ctrl    <= latch_iy;
8882
             up_ctrl    <= latch_up;
8883
             pc_ctrl    <= latch_pc;
8884
             md_ctrl    <= latch_md;
8885
             iv_ctrl    <= latch_iv;
8886
                            op_ctrl    <= latch_op;
8887
             pre_ctrl   <= latch_pre;
8888
                                 nmi_ctrl   <= latch_nmi;
8889
             ea_ctrl    <= latch_ea;
8890
             -- decrement sp
8891
             left_ctrl  <= sp_left;
8892
             right_ctrl <= one_right;
8893
             alu_ctrl   <= alu_sub16;
8894
             sp_ctrl    <= load_sp;
8895
                                 -- idle bus
8896
             addr_ctrl  <= idle_ad;
8897
                            dout_ctrl  <= pc_lo_dout;
8898
                                 --
8899
                                 st_ctrl      <= idle_st;
8900
                                 return_state <= fetch_state;
8901
             next_state   <= int_entire_state;
8902
 
8903
                          --
8904
                          -- set Entire Flag on SWI, SWI2, SWI3 and CWAI, IRQ and NMI
8905
                          -- clear Entire Flag on FIRQ
8906
                          -- before stacking all registers
8907
                          --
8908
                          when int_entire_state =>
8909
                                 -- default
8910
             acca_ctrl  <= latch_acca;
8911
             accb_ctrl  <= latch_accb;
8912
                                 dp_ctrl    <= latch_dp;
8913
             ix_ctrl    <= latch_ix;
8914
             iy_ctrl    <= latch_iy;
8915
             up_ctrl    <= latch_up;
8916
             sp_ctrl    <= latch_sp;
8917
             pc_ctrl    <= latch_pc;
8918
             md_ctrl    <= latch_md;
8919
             iv_ctrl    <= latch_iv;
8920
                            op_ctrl    <= latch_op;
8921
             pre_ctrl   <= latch_pre;
8922
                                 nmi_ctrl   <= latch_nmi;
8923
             ea_ctrl    <= latch_ea;
8924
                                 --
8925
             left_ctrl  <= sp_left;
8926
             right_ctrl <= zero_right;
8927
                                 if iv = FIRQ_VEC then
8928
               -- clear entire flag
8929
               alu_ctrl   <= alu_cle;
8930
                                 else
8931
               -- set entire flag
8932
               alu_ctrl   <= alu_see;
8933
                                 end if;
8934
             cc_ctrl    <= load_cc;
8935
                                 -- idle bus
8936
             addr_ctrl  <= idle_ad;
8937
                            dout_ctrl  <= pc_lo_dout;
8938
                                 --
8939
                                 st_ctrl      <= idle_st;
8940
                                 return_state <= fetch_state;
8941
             next_state   <= int_pcl_state;
8942
 
8943
                          when int_pcl_state =>
8944
                                 -- default
8945
             cc_ctrl    <= latch_cc;
8946
             acca_ctrl  <= latch_acca;
8947
             accb_ctrl  <= latch_accb;
8948
                                 dp_ctrl    <= latch_dp;
8949
             ix_ctrl    <= latch_ix;
8950
             iy_ctrl    <= latch_iy;
8951
             up_ctrl    <= latch_up;
8952
             pc_ctrl    <= latch_pc;
8953
             md_ctrl    <= latch_md;
8954
             iv_ctrl    <= latch_iv;
8955
                            op_ctrl    <= latch_op;
8956
             pre_ctrl   <= latch_pre;
8957
                                 nmi_ctrl   <= latch_nmi;
8958
             ea_ctrl    <= latch_ea;
8959
             -- decrement sp
8960
             left_ctrl  <= sp_left;
8961
             right_ctrl <= one_right;
8962
             alu_ctrl   <= alu_sub16;
8963
             sp_ctrl    <= load_sp;
8964
                                 -- write pc low
8965
             addr_ctrl  <= pushs_ad;
8966
                            dout_ctrl  <= pc_lo_dout;
8967
                                 --
8968
                                 st_ctrl      <= idle_st;
8969
                                 return_state <= fetch_state;
8970
             next_state   <= int_pch_state;
8971
 
8972
                          when int_pch_state =>
8973
                                 -- default
8974
             cc_ctrl    <= latch_cc;
8975
             acca_ctrl  <= latch_acca;
8976
             accb_ctrl  <= latch_accb;
8977
                                 dp_ctrl    <= latch_dp;
8978
             ix_ctrl    <= latch_ix;
8979
             iy_ctrl    <= latch_iy;
8980
             up_ctrl    <= latch_up;
8981
             pc_ctrl    <= latch_pc;
8982
             md_ctrl    <= latch_md;
8983
             iv_ctrl    <= latch_iv;
8984
                            op_ctrl    <= latch_op;
8985
             pre_ctrl   <= latch_pre;
8986
                                 nmi_ctrl   <= latch_nmi;
8987
             ea_ctrl    <= latch_ea;
8988
             -- decrement sp
8989
             left_ctrl  <= sp_left;
8990
             right_ctrl <= one_right;
8991
             alu_ctrl   <= alu_sub16;
8992
             sp_ctrl    <= load_sp;
8993
                                 -- write pc hi
8994
             addr_ctrl  <= pushs_ad;
8995
                            dout_ctrl  <= pc_hi_dout;
8996
                                 --
8997
                                 st_ctrl      <= idle_st;
8998
                                 return_state <= fetch_state;
8999
                                 if cc(EBIT) = '1' then
9000
               next_state   <= int_upl_state;
9001
                                 else
9002
               next_state   <= int_cc_state;
9003
                                 end if;
9004
 
9005
                          when int_upl_state =>
9006
                                 -- default
9007
             cc_ctrl    <= latch_cc;
9008
             acca_ctrl  <= latch_acca;
9009
             accb_ctrl  <= latch_accb;
9010
                                 dp_ctrl    <= latch_dp;
9011
             ix_ctrl    <= latch_ix;
9012
             iy_ctrl    <= latch_iy;
9013
             up_ctrl    <= latch_up;
9014
             pc_ctrl    <= latch_pc;
9015
             md_ctrl    <= latch_md;
9016
             iv_ctrl    <= latch_iv;
9017
                            op_ctrl    <= latch_op;
9018
             pre_ctrl   <= latch_pre;
9019
                                 nmi_ctrl   <= latch_nmi;
9020
             ea_ctrl    <= latch_ea;
9021
             -- decrement sp
9022
             left_ctrl  <= sp_left;
9023
             right_ctrl <= one_right;
9024
             alu_ctrl   <= alu_sub16;
9025
             sp_ctrl    <= load_sp;
9026
                                 -- write up low
9027
             addr_ctrl  <= pushs_ad;
9028
                            dout_ctrl  <= up_lo_dout;
9029
                                 --
9030
                                 st_ctrl      <= idle_st;
9031
                                 return_state <= fetch_state;
9032
             next_state   <= int_uph_state;
9033
 
9034
                          when int_uph_state =>
9035
                                 -- default
9036
             cc_ctrl    <= latch_cc;
9037
             acca_ctrl  <= latch_acca;
9038
             accb_ctrl  <= latch_accb;
9039
                                 dp_ctrl    <= latch_dp;
9040
             ix_ctrl    <= latch_ix;
9041
             iy_ctrl    <= latch_iy;
9042
             up_ctrl    <= latch_up;
9043
             pc_ctrl    <= latch_pc;
9044
             md_ctrl    <= latch_md;
9045
             iv_ctrl    <= latch_iv;
9046
                            op_ctrl    <= latch_op;
9047
             pre_ctrl   <= latch_pre;
9048
                                 nmi_ctrl   <= latch_nmi;
9049
             ea_ctrl    <= latch_ea;
9050
             -- decrement sp
9051
             left_ctrl  <= sp_left;
9052
             right_ctrl <= one_right;
9053
             alu_ctrl   <= alu_sub16;
9054
             sp_ctrl    <= load_sp;
9055
                                 -- write ix hi
9056
             addr_ctrl  <= pushs_ad;
9057
                            dout_ctrl  <= up_hi_dout;
9058
                                 --
9059
                                 st_ctrl      <= idle_st;
9060
                                 return_state <= fetch_state;
9061
             next_state   <= int_iyl_state;
9062
 
9063
                          when int_iyl_state =>
9064
                                 -- default
9065
             cc_ctrl    <= latch_cc;
9066
             acca_ctrl  <= latch_acca;
9067
             accb_ctrl  <= latch_accb;
9068
                                 dp_ctrl    <= latch_dp;
9069
             ix_ctrl    <= latch_ix;
9070
             iy_ctrl    <= latch_iy;
9071
             up_ctrl    <= latch_up;
9072
             pc_ctrl    <= latch_pc;
9073
             md_ctrl    <= latch_md;
9074
             iv_ctrl    <= latch_iv;
9075
                            op_ctrl    <= latch_op;
9076
             pre_ctrl   <= latch_pre;
9077
                                 nmi_ctrl   <= latch_nmi;
9078
             ea_ctrl    <= latch_ea;
9079
             -- decrement sp
9080
             left_ctrl  <= sp_left;
9081
             right_ctrl <= one_right;
9082
             alu_ctrl   <= alu_sub16;
9083
             sp_ctrl    <= load_sp;
9084
                                 -- write ix low
9085
             addr_ctrl  <= pushs_ad;
9086
                            dout_ctrl  <= iy_lo_dout;
9087
                                 --
9088
                                 st_ctrl      <= idle_st;
9089
                                 return_state <= fetch_state;
9090
             next_state   <= int_iyh_state;
9091
 
9092
                          when int_iyh_state =>
9093
                                 -- default
9094
             cc_ctrl    <= latch_cc;
9095
             acca_ctrl  <= latch_acca;
9096
             accb_ctrl  <= latch_accb;
9097
                                 dp_ctrl    <= latch_dp;
9098
             ix_ctrl    <= latch_ix;
9099
             iy_ctrl    <= latch_iy;
9100
             up_ctrl    <= latch_up;
9101
             pc_ctrl    <= latch_pc;
9102
             md_ctrl    <= latch_md;
9103
             iv_ctrl    <= latch_iv;
9104
                            op_ctrl    <= latch_op;
9105
             pre_ctrl   <= latch_pre;
9106
                                 nmi_ctrl   <= latch_nmi;
9107
             ea_ctrl    <= latch_ea;
9108
             -- decrement sp
9109
             left_ctrl  <= sp_left;
9110
             right_ctrl <= one_right;
9111
             alu_ctrl   <= alu_sub16;
9112
             sp_ctrl    <= load_sp;
9113
                                 -- write ix hi
9114
             addr_ctrl  <= pushs_ad;
9115
                            dout_ctrl  <= iy_hi_dout;
9116
                                 --
9117
                                 st_ctrl      <= idle_st;
9118
                                 return_state <= fetch_state;
9119
             next_state   <= int_ixl_state;
9120
 
9121
                          when int_ixl_state =>
9122
                                 -- default
9123
             cc_ctrl    <= latch_cc;
9124
             acca_ctrl  <= latch_acca;
9125
             accb_ctrl  <= latch_accb;
9126
                                 dp_ctrl    <= latch_dp;
9127
             ix_ctrl    <= latch_ix;
9128
             iy_ctrl    <= latch_iy;
9129
             up_ctrl    <= latch_up;
9130
             pc_ctrl    <= latch_pc;
9131
             md_ctrl    <= latch_md;
9132
             iv_ctrl    <= latch_iv;
9133
                            op_ctrl    <= latch_op;
9134
             pre_ctrl   <= latch_pre;
9135
                                 nmi_ctrl   <= latch_nmi;
9136
             ea_ctrl    <= latch_ea;
9137
             -- decrement sp
9138
             left_ctrl  <= sp_left;
9139
             right_ctrl <= one_right;
9140
             alu_ctrl   <= alu_sub16;
9141
             sp_ctrl    <= load_sp;
9142
                                 -- write ix low
9143
             addr_ctrl  <= pushs_ad;
9144
                            dout_ctrl  <= ix_lo_dout;
9145
                                 --
9146
                                 st_ctrl      <= idle_st;
9147
                                 return_state <= fetch_state;
9148
             next_state   <= int_ixh_state;
9149
 
9150
                          when int_ixh_state =>
9151
                                 -- default
9152
             cc_ctrl    <= latch_cc;
9153
             acca_ctrl  <= latch_acca;
9154
             accb_ctrl  <= latch_accb;
9155
                                 dp_ctrl    <= latch_dp;
9156
             ix_ctrl    <= latch_ix;
9157
             iy_ctrl    <= latch_iy;
9158
             up_ctrl    <= latch_up;
9159
             pc_ctrl    <= latch_pc;
9160
             md_ctrl    <= latch_md;
9161
             iv_ctrl    <= latch_iv;
9162
                            op_ctrl    <= latch_op;
9163
             pre_ctrl   <= latch_pre;
9164
                                 nmi_ctrl   <= latch_nmi;
9165
             ea_ctrl    <= latch_ea;
9166
             -- decrement sp
9167
             left_ctrl  <= sp_left;
9168
             right_ctrl <= one_right;
9169
             alu_ctrl   <= alu_sub16;
9170
             sp_ctrl    <= load_sp;
9171
                                 -- write ix hi
9172
             addr_ctrl  <= pushs_ad;
9173
                            dout_ctrl  <= ix_hi_dout;
9174
                                 --
9175
                                 st_ctrl      <= idle_st;
9176
                                 return_state <= fetch_state;
9177
             next_state   <= int_dp_state;
9178
 
9179
                          when int_dp_state =>
9180
                                 -- default
9181
             cc_ctrl    <= latch_cc;
9182
             acca_ctrl  <= latch_acca;
9183
             accb_ctrl  <= latch_accb;
9184
                                 dp_ctrl    <= latch_dp;
9185
             ix_ctrl    <= latch_ix;
9186
             iy_ctrl    <= latch_iy;
9187
             up_ctrl    <= latch_up;
9188
             pc_ctrl    <= latch_pc;
9189
             md_ctrl    <= latch_md;
9190
             iv_ctrl    <= latch_iv;
9191
                            op_ctrl    <= latch_op;
9192
             pre_ctrl   <= latch_pre;
9193
                                 nmi_ctrl   <= latch_nmi;
9194
             ea_ctrl    <= latch_ea;
9195
             -- decrement sp
9196
             left_ctrl  <= sp_left;
9197
             right_ctrl <= one_right;
9198
             alu_ctrl   <= alu_sub16;
9199
             sp_ctrl    <= load_sp;
9200
                                 -- write accb
9201
             addr_ctrl  <= pushs_ad;
9202
                            dout_ctrl  <= dp_dout;
9203
                                 --
9204
                                 st_ctrl      <= idle_st;
9205
                                 return_state <= fetch_state;
9206
             next_state   <= int_accb_state;
9207
 
9208
                          when int_accb_state =>
9209
                                 -- default
9210
             cc_ctrl    <= latch_cc;
9211
             acca_ctrl  <= latch_acca;
9212
             accb_ctrl  <= latch_accb;
9213
                                 dp_ctrl    <= latch_dp;
9214
             ix_ctrl    <= latch_ix;
9215
             iy_ctrl    <= latch_iy;
9216
             up_ctrl    <= latch_up;
9217
             pc_ctrl    <= latch_pc;
9218
             md_ctrl    <= latch_md;
9219
             iv_ctrl    <= latch_iv;
9220
                            op_ctrl    <= latch_op;
9221
             pre_ctrl   <= latch_pre;
9222
                                 nmi_ctrl   <= latch_nmi;
9223
             ea_ctrl    <= latch_ea;
9224
             -- decrement sp
9225
             left_ctrl  <= sp_left;
9226
             right_ctrl <= one_right;
9227
             alu_ctrl   <= alu_sub16;
9228
             sp_ctrl    <= load_sp;
9229
                                 -- write accb
9230
             addr_ctrl  <= pushs_ad;
9231
                            dout_ctrl  <= accb_dout;
9232
                                 --
9233
                                 st_ctrl      <= idle_st;
9234
                                 return_state <= fetch_state;
9235
             next_state   <= int_acca_state;
9236
 
9237
                          when int_acca_state =>
9238
                                 -- default
9239
             cc_ctrl    <= latch_cc;
9240
             acca_ctrl  <= latch_acca;
9241
             accb_ctrl  <= latch_accb;
9242
                                 dp_ctrl    <= latch_dp;
9243
             ix_ctrl    <= latch_ix;
9244
             iy_ctrl    <= latch_iy;
9245
             up_ctrl    <= latch_up;
9246
             pc_ctrl    <= latch_pc;
9247
             md_ctrl    <= latch_md;
9248
             iv_ctrl    <= latch_iv;
9249
                            op_ctrl    <= latch_op;
9250
             pre_ctrl   <= latch_pre;
9251
                                 nmi_ctrl   <= latch_nmi;
9252
             ea_ctrl    <= latch_ea;
9253
             -- decrement sp
9254
             left_ctrl  <= sp_left;
9255
             right_ctrl <= one_right;
9256
             alu_ctrl   <= alu_sub16;
9257
             sp_ctrl    <= load_sp;
9258
                                 -- write acca
9259
             addr_ctrl  <= pushs_ad;
9260
                            dout_ctrl  <= acca_dout;
9261
                                 --
9262
                                 st_ctrl      <= idle_st;
9263
                                 return_state <= fetch_state;
9264
             next_state   <= int_cc_state;
9265
 
9266
                          when int_cc_state =>
9267
                                 -- default
9268
             cc_ctrl    <= latch_cc;
9269
             acca_ctrl  <= latch_acca;
9270
             accb_ctrl  <= latch_accb;
9271
                                 dp_ctrl    <= latch_dp;
9272
             ix_ctrl    <= latch_ix;
9273
             iy_ctrl    <= latch_iy;
9274
             up_ctrl    <= latch_up;
9275
             pc_ctrl    <= latch_pc;
9276
             md_ctrl    <= latch_md;
9277
                            op_ctrl    <= latch_op;
9278
             pre_ctrl   <= latch_pre;
9279
                                 nmi_ctrl   <= latch_nmi;
9280
             iv_ctrl    <= latch_iv;
9281
             ea_ctrl    <= latch_ea;
9282
             -- idle sp
9283
             left_ctrl  <= sp_left;
9284
             right_ctrl <= zero_right;
9285
             alu_ctrl   <= alu_nop;
9286
             sp_ctrl    <= latch_sp;
9287
                                 -- write cc
9288
             addr_ctrl  <= pushs_ad;
9289
                            dout_ctrl  <= cc_dout;
9290
                                 nmi_ctrl   <= latch_nmi;
9291
                                 --
9292
                                 st_ctrl      <= idle_st;
9293
                                 return_state <= fetch_state;
9294
                                 case iv is
9295
                                 when NMI_VEC =>
9296
                              next_state <= int_mask_state;
9297
                                 when SWI_VEC =>
9298
                              next_state <= int_mask_state;
9299
                                 when IRQ_VEC =>
9300
                              next_state <= int_mask_state;
9301
                                 when SWI2_VEC =>
9302
                    next_state <= vect_hi_state;
9303
                                 when FIRQ_VEC =>
9304
                              next_state <= int_mask_state;
9305
                                 when SWI3_VEC =>
9306
                    next_state <= vect_hi_state;
9307
                                 when others =>
9308
                                   if op_code = "00111100" then -- CWAI
9309
                                          next_state <= int_cwai_state;
9310
                                        else
9311
                      next_state <= rti_state;
9312
                                        end if;
9313
                                 end case;
9314
 
9315
                          --
9316
                          -- wait here for an inteerupt
9317
                          --
9318
                          when int_cwai_state =>
9319
                                 -- default
9320
             acca_ctrl  <= latch_acca;
9321
             accb_ctrl  <= latch_accb;
9322
                                 dp_ctrl    <= latch_dp;
9323
             ix_ctrl    <= latch_ix;
9324
             iy_ctrl    <= latch_iy;
9325
             up_ctrl    <= latch_up;
9326
             pc_ctrl    <= latch_pc;
9327
             md_ctrl    <= latch_md;
9328
                            op_ctrl    <= latch_op;
9329
             pre_ctrl   <= latch_pre;
9330
             ea_ctrl    <= latch_ea;
9331
             --
9332
             left_ctrl  <= sp_left;
9333
             right_ctrl <= one_right;
9334
             alu_ctrl   <= alu_nop;
9335
             cc_ctrl    <= latch_cc;
9336
             sp_ctrl    <= latch_sp;
9337
                                 -- idle bus
9338
             addr_ctrl  <= idle_ad;
9339
                            dout_ctrl  <= cc_dout;
9340
                                 --
9341
                                 st_ctrl    <= idle_st;
9342
                                 return_state <= fetch_state;
9343
                                 --
9344
                            if (nmi_req = '1') and (nmi_ack='0') then
9345
                                        iv_ctrl    <= nmi_iv;
9346
                                   nmi_ctrl   <= set_nmi;
9347
                              next_state <= vect_hi_state;
9348
                            else
9349
                                   --
9350
                                        -- nmi request is not cleared until nmi input goes low
9351
                                        --
9352
                                   if (nmi_req = '0') and (nmi_ack='1') then
9353
                                     nmi_ctrl <= reset_nmi;
9354
                                        else
9355
                                          nmi_ctrl <= latch_nmi;
9356
                                        end if;
9357
                                        --
9358
                                        -- IRQ is level sensitive
9359
                                        --
9360
                                   if (irq = '1') and (cc(IBIT) = '0') then
9361
                                          iv_ctrl    <= irq_iv;
9362
                                next_state <= int_mask_state;
9363
               elsif (firq = '1') and (cc(FBIT) = '0') then
9364
                                          --
9365
                                          -- FIRQ is level sensitive
9366
                                          --
9367
                                          iv_ctrl    <= firq_iv;
9368
                                next_state <= int_mask_state;
9369
               else
9370
                 iv_ctrl    <= latch_iv;
9371
                      next_state <= int_cwai_state;
9372
                                        end if;
9373
                                 end if;
9374
 
9375
                          when int_mask_state =>
9376
                                 -- default
9377
             acca_ctrl  <= latch_acca;
9378
             accb_ctrl  <= latch_accb;
9379
                                 dp_ctrl    <= latch_dp;
9380
             ix_ctrl    <= latch_ix;
9381
             iy_ctrl    <= latch_iy;
9382
             up_ctrl    <= latch_up;
9383
             pc_ctrl    <= latch_pc;
9384
             md_ctrl    <= latch_md;
9385
             iv_ctrl    <= latch_iv;
9386
                            op_ctrl    <= latch_op;
9387
             pre_ctrl   <= latch_pre;
9388
                                 nmi_ctrl   <= latch_nmi;
9389
             ea_ctrl    <= latch_ea;
9390
                                 -- Mask IRQ and FIRQ
9391
             left_ctrl  <= sp_left;
9392
             right_ctrl <= zero_right;
9393
                                 --
9394
                                 -- FIRQ can interrupt an IRQ service routine
9395
                                 --
9396
                                 if iv = IRQ_VEC then
9397
                                   alu_ctrl   <= alu_sei;
9398
                                 else
9399
                              alu_ctrl   <= alu_seif;
9400
                                 end if;
9401
                                 cc_ctrl    <= load_cc;
9402
             sp_ctrl    <= latch_sp;
9403
                                 -- idle bus cycle
9404
             addr_ctrl  <= idle_ad;
9405
             dout_ctrl  <= md_lo_dout;
9406
                                 --
9407
                                 st_ctrl      <= idle_st;
9408
                                 return_state <= fetch_state;
9409
             next_state   <= vect_hi_state;
9410
 
9411
                          when sync_state =>
9412
             cc_ctrl    <= latch_cc;
9413
             acca_ctrl  <= latch_acca;
9414
             accb_ctrl  <= latch_accb;
9415
                                 dp_ctrl    <= latch_dp;
9416
             ix_ctrl    <= latch_ix;
9417
             iy_ctrl    <= latch_iy;
9418
             up_ctrl    <= latch_up;
9419
             sp_ctrl    <= latch_sp;
9420
             pc_ctrl    <= latch_pc;
9421
             md_ctrl    <= latch_md;
9422
                            op_ctrl    <= latch_op;
9423
             pre_ctrl   <= latch_pre;
9424
             ea_ctrl    <= latch_ea;
9425
             --
9426
             left_ctrl  <= pc_left;
9427
             right_ctrl <= one_right;
9428
             alu_ctrl   <= alu_nop;
9429
                                 -- idle bus
9430
             addr_ctrl  <= idle_ad;
9431
                            dout_ctrl  <= cc_dout;
9432
                                 --
9433
                                 st_ctrl    <= idle_st;
9434
                                 return_state <= fetch_state;
9435
                                 --
9436
                            if (nmi_req = '1') and (nmi_ack='0') then
9437
                                        iv_ctrl    <= nmi_iv;
9438
                                   nmi_ctrl   <= set_nmi;
9439
                              next_state <= fetch_state;
9440
                            else
9441
                                   --
9442
                                        -- nmi request is not cleared until nmi input goes low
9443
                                        --
9444
                                   if (nmi_req = '0') and (nmi_ack='1') then
9445
                                     nmi_ctrl <= reset_nmi;
9446
                                        else
9447
                                          nmi_ctrl <= latch_nmi;
9448
                                        end if;
9449
                                        --
9450
                                        -- IRQ is level sensitive
9451
                                        --
9452
                                   if (irq = '1') and (cc(IBIT) = '0') then
9453
                                          iv_ctrl    <= irq_iv;
9454
                                next_state <= fetch_state;
9455
               elsif (firq = '1') and (cc(FBIT) = '0') then
9456
                                          --
9457
                                          -- FIRQ is level sensitive
9458
                                          --
9459
                                          iv_ctrl    <= firq_iv;
9460
                                next_state <= fetch_state;
9461
               else
9462
                 iv_ctrl    <= latch_iv;
9463
                      next_state <= sync_state;
9464
                                        end if;
9465
                                 end if;
9466
 
9467
 
9468
                          when halt_state =>
9469
                                 -- default
9470
                                 cc_ctrl    <= latch_cc;
9471
             acca_ctrl  <= latch_acca;
9472
             accb_ctrl  <= latch_accb;
9473
                                 dp_ctrl    <= latch_dp;
9474
             ix_ctrl    <= latch_ix;
9475
             iy_ctrl    <= latch_iy;
9476
             up_ctrl    <= latch_up;
9477
             pc_ctrl    <= latch_pc;
9478
             md_ctrl    <= latch_md;
9479
             iv_ctrl    <= latch_iv;
9480
                            op_ctrl    <= latch_op;
9481
             pre_ctrl   <= latch_pre;
9482
                                 nmi_ctrl   <= latch_nmi;
9483
             ea_ctrl    <= latch_ea;
9484
                                 -- idle ALU
9485
             left_ctrl  <= acca_left;
9486
             right_ctrl <= zero_right;
9487
                            alu_ctrl   <= alu_nop;
9488
             sp_ctrl    <= latch_sp;
9489
                                 -- idle bus cycle
9490
             addr_ctrl  <= idle_ad;
9491
             dout_ctrl  <= md_lo_dout;
9492
                                 --
9493
                                 if halt <= '1' then
9494
                                   st_ctrl      <= idle_st;
9495
                                   return_state <= fetch_state;
9496
               next_state   <= halt_state;
9497
                                 else
9498
                                   st_ctrl      <= pull_st;
9499
                                   return_state <= fetch_state;
9500
                                   next_state   <= saved_state;
9501
                                 end if;
9502
 
9503
                          when others => -- halt on undefine states
9504
                                 -- default
9505
             cc_ctrl    <= latch_cc;
9506
             acca_ctrl  <= latch_acca;
9507
             accb_ctrl  <= latch_accb;
9508
                                 dp_ctrl    <= latch_dp;
9509
             ix_ctrl    <= latch_ix;
9510
             iy_ctrl    <= latch_iy;
9511
             up_ctrl    <= latch_up;
9512
             sp_ctrl    <= latch_sp;
9513
             pc_ctrl    <= latch_pc;
9514
             md_ctrl    <= latch_md;
9515
             iv_ctrl    <= latch_iv;
9516
                            op_ctrl    <= latch_op;
9517
             pre_ctrl   <= latch_pre;
9518
                                 nmi_ctrl   <= latch_nmi;
9519
             ea_ctrl    <= latch_ea;
9520
                                 -- do nothing in ALU
9521
             left_ctrl  <= acca_left;
9522
             right_ctrl <= zero_right;
9523
             alu_ctrl   <= alu_nop;
9524
                                 -- idle bus cycle
9525
             addr_ctrl  <= idle_ad;
9526
             dout_ctrl  <= md_lo_dout;
9527
                                 --
9528
                                 st_ctrl    <= idle_st;
9529
                                 return_state <= fetch_state;
9530
                            next_state <= error_state;
9531
                  end case;
9532
end process;
9533
 
9534
end CPU_ARCH;
9535
 

powered by: WebSVN 2.1.0

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