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

Subversion Repositories System09

[/] [System09/] [rev_86/] [rtl/] [VHDL/] [cpu09.vhd] - Blame information for rev 19

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

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

powered by: WebSVN 2.1.0

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