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

Subversion Repositories mc6803

[/] [mc6803/] [trunk/] [6801_core.sv] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 Dukov
module cpu01(
2
                input logic clk,
3
                input logic rst,
4
                output logic rw,
5
                output logic vma,
6
                output logic[15:0]address,
7
                input logic[7:0] data_in,
8
                output logic[7:0] data_out,
9
                input logic hold,
10
                input logic halt,
11
                input logic irq,
12
                input logic nmi,
13
                input logic irq_icf,
14
                input logic irq_ocf,
15
                input logic irq_tof,
16
                input logic irq_sci,
17
                output logic[15:0] test_alu,
18
                output logic[7:0] test_cc
19
                );
20
localparam SBIT = 7;
21
localparam XBIT = 6;
22
localparam HBIT = 5;
23
localparam IBIT = 4;
24
localparam NBIT = 3;
25
localparam ZBIT = 2;
26
localparam VBIT = 1;
27
localparam CBIT = 0;
28
 
29
typedef enum logic[5:0] {reset_state, fetch_state, decode_state,
30
                       extended_state, indexed_state, read8_state, read16_state, immediate16_state,
31
                            write8_state, write16_state,
32
                                                     execute_state, halt_state, error_state,
33
                                                     mul_state, mulea_state, muld_state,
34
                                                     mul0_state, mul1_state, mul2_state, mul3_state,
35
                                                     mul4_state, mul5_state, mul6_state, mul7_state,
36
                                                          jmp_state, jsr_state, jsr1_state,
37
                                                     branch_state, bsr_state, bsr1_state,
38
                                                          rts_hi_state, rts_lo_state,
39
                                                          int_pcl_state, int_pch_state,
40
                                                     int_ixl_state, int_ixh_state,
41
                                                     int_cc_state, int_acca_state, int_accb_state,
42
                                                     int_wai_state, int_mask_state,
43
                                                     rti_state, rti_cc_state, rti_acca_state, rti_accb_state,
44
                                                     rti_ixl_state, rti_ixh_state,
45
                                                     rti_pcl_state, rti_pch_state,
46
                                                          pula_state, psha_state, pulb_state, pshb_state,
47
                                                     pulx_lo_state, pulx_hi_state, pshx_lo_state, pshx_hi_state,
48
                                                          vect_lo_state, vect_hi_state } state_type;
49
typedef enum logic[5:0] {idle_ad, fetch_ad, read_ad, write_ad, push_ad, pull_ad, int_hi_ad, int_lo_ad } addr_type;
50
typedef enum logic[5:0] {md_lo_dout, md_hi_dout, acca_dout, accb_dout, ix_lo_dout, ix_hi_dout, cc_dout, pc_lo_dout, pc_hi_dout} dout_type;
51
typedef enum logic[2:0] {reset_op, fetch_op, latch_op } op_type;
52
typedef enum logic[5:0] {reset_acca, load_acca, load_hi_acca, pull_acca, latch_acca } acca_type;
53
typedef enum logic[5:0] {reset_accb, load_accb, pull_accb, latch_accb } accb_type;
54
typedef enum logic[5:0] {reset_cc, load_cc, pull_cc, latch_cc } cc_type;
55
typedef enum logic[5:0] {reset_ix, load_ix, pull_lo_ix, pull_hi_ix, latch_ix } ix_type;
56
typedef enum logic[5:0] {reset_sp, latch_sp, load_sp } sp_type;
57
typedef enum logic[5:0] {reset_pc, latch_pc, load_ea_pc, add_ea_pc, pull_lo_pc, pull_hi_pc, inc_pc } pc_type;
58
typedef enum logic[5:0] {reset_md, latch_md, load_md, fetch_first_md, fetch_next_md, shiftl_md } md_type;
59
typedef enum logic[5:0] {reset_ea, latch_ea, add_ix_ea, load_accb_ea, inc_ea, fetch_first_ea, fetch_next_ea } ea_type;
60
typedef enum logic[5:0] {reset_iv, latch_iv, swi_iv, nmi_iv, irq_iv, icf_iv, ocf_iv, tof_iv, sci_iv } iv_type;
61
typedef enum logic[5:0] {reset_nmi, set_nmi, latch_nmi } nmi_type;
62
typedef enum logic[5:0] {acca_left, accb_left, accd_left, md_left, ix_left, sp_left } left_type;
63
typedef enum logic[5:0] {md_right, zero_right, plus_one_right, accb_right } right_type;
64
typedef enum logic[5:0] {alu_add8, alu_sub8, alu_add16, alu_sub16, alu_adc, alu_sbc,
65
                       alu_and, alu_ora, alu_eor,
66
                       alu_tst, alu_inc, alu_dec, alu_clr, alu_neg, alu_com,
67
                                                          alu_inx, alu_dex,
68
                                                     alu_lsr16, alu_lsl16,
69
                                                     alu_ror8, alu_rol8,
70
                                                     alu_asr8, alu_asl8, alu_lsr8,
71
                                                     alu_sei, alu_cli, alu_sec, alu_clc, alu_sev, alu_clv, alu_tpa, alu_tap,
72
                                                     alu_ld8, alu_st8, alu_ld16, alu_st16, alu_nop, alu_daa } alu_type;
73
 
74
logic[7:0] op_code;
75
logic[7:0] acca;
76
logic[7:0] accb;
77
logic[7:0] cc;
78
logic[7:0] cc_out;
79
logic[15:0] xreg;
80
logic[15:0] sp;
81
logic[15:0] ea;
82
logic[15:0] pc;
83
logic[15:0] md;
84
logic[15:0] left;
85
logic[15:0] right;
86
logic[15:0] out_alu;
87
logic[2:0] iv;
88
logic nmi_req;
89
logic nmi_ack;
90
 
91
state_type state;
92
state_type next_state;
93
pc_type pc_ctrl;
94
ea_type ea_ctrl;
95
op_type op_ctrl;
96
md_type md_ctrl;
97
acca_type acca_ctrl;
98
accb_type accb_ctrl;
99
ix_type ix_ctrl;
100
cc_type cc_ctrl;
101
sp_type sp_ctrl;
102
iv_type iv_ctrl;
103
left_type left_ctrl;
104
right_type right_ctrl;
105
alu_type alu_ctrl;
106
addr_type addr_ctrl;
107
dout_type dout_ctrl;
108
nmi_type nmi_ctrl;
109
 
110
////////////////////////////////////
111
////
112
//// Address bus multiplexer
113
////
114
////////////////////////////////////
115
 
116
always_comb
117
begin
118
  case(addr_ctrl)
119
        idle_ad:
120
        begin
121
           address = 16'b1111111111111111;
122
                vma     = 1'b0;
123
                rw      = 1'b1;
124
        end
125
    fetch_ad:
126
         begin
127
           address = pc;
128
                vma     = 1'b1;
129
                rw      = 1'b1;
130
        end
131
         read_ad:
132
         begin
133
           address = ea;
134
                vma     = 1'b1;
135
                rw      = 1'b1;
136
        end
137
    write_ad:
138
         begin
139
           address = ea;
140
                vma     = 1'b1;
141
                rw      = 1'b0;
142
        end
143
         push_ad:
144
         begin
145
           address = sp;
146
                vma     = 1'b1;
147
                rw      = 1'b0;
148
        end
149
    pull_ad:
150
         begin
151
           address = sp;
152
                vma     = 1'b1;
153
                rw      = 1'b1;
154
        end
155
         int_hi_ad:
156
         begin
157
           address = {12'b111111111111, iv, 1'b0};
158
                vma     = 1'b1;
159
                rw      = 1'b1;
160
        end
161
    int_lo_ad:
162
         begin
163
           address = {12'b111111111111, iv, 1'b1};
164
                vma     = 1'b1;
165
                rw      = 1'b1;
166
        end
167
         default:
168
         begin
169
           address = 16'b1111111111111111;
170
                vma     = 1'b0;
171
                rw      = 1'b1;
172
        end
173
  endcase
174
end
175
 
176
//////////////////////////////////
177
////
178
//// Data Bus output
179
////
180
//////////////////////////////////
181
always_comb
182
begin
183
    case (dout_ctrl)
184
         md_hi_dout: //// alu output
185
           data_out = md[15:8];
186
         md_lo_dout:
187
           data_out = md[7:0];
188
         acca_dout: //// accumulator a
189
           data_out = acca;
190
         accb_dout: //// accumulator b
191
           data_out = accb;
192
         ix_lo_dout: //// index reg
193
           data_out = xreg[7:0];
194
         ix_hi_dout: //// index reg
195
           data_out = xreg[15:8];
196
         cc_dout: //// condition codes
197
           data_out = cc;
198
         pc_lo_dout: //// low order pc
199
           data_out = pc[7:0];
200
         pc_hi_dout: //// high order pc
201
           data_out = pc[15:8];
202
         default:
203
           data_out = 8'b00000000;
204
    endcase
205
end
206
 
207
 
208
////////////////////////////////////
209
////
210
//// Program Counter Control
211
////
212
////////////////////////////////////
213
 
214
logic[15:0] tempof;
215
logic[15:0] temppc;
216
always_comb
217
begin
218
  case (pc_ctrl)
219
  add_ea_pc:
220
  begin
221
         if (ea[7] == 0)
222
           tempof = {8'b00000000, ea[7:0]};
223
    else
224
                tempof = {8'b11111111, ea[7:0]};
225
        end
226
  inc_pc:
227
         tempof = 16'b0000000000000001;
228
  default:
229
    tempof = 16'b0000000000000000;
230
  endcase
231
 
232
  case (pc_ctrl)
233
  reset_pc:
234
         temppc = 16'b1111111111111110;
235
  load_ea_pc:
236
         temppc = ea;
237
  pull_lo_pc:
238
  begin
239
         temppc[7:0] = data_in;
240
         temppc[15:8] = pc[15:8];
241
        end
242
  pull_hi_pc:
243
  begin
244
         temppc[7:0] = pc[7:0];
245
         temppc[15:8] = data_in;
246
        end
247
  default:
248
    temppc = pc;
249
  endcase
250
end
251
 
252
always_ff @(posedge clk)
253
begin
254
    if (hold == 1'b1)
255
      pc <= pc;
256
    else
257
      pc <= temppc + tempof;
258
end
259
 
260
////////////////////////////////////
261
////
262
//// Effective Address  Control
263
////
264
////////////////////////////////////
265
 
266
logic[15:0] tempind;
267
logic[15:0] tempea;
268
always_comb
269
begin
270
  case (ea_ctrl)
271
  add_ix_ea:
272
         tempind = {8'b00000000, ea[7:0]};
273
  inc_ea:
274
         tempind = 16'b0000000000000001;
275
  default:
276
    tempind = 16'b0000000000000000;
277
  endcase
278
 
279
  case (ea_ctrl)
280
  reset_ea:
281
         tempea = 16'b0000000000000000;
282
  load_accb_ea:
283
         tempea = {8'b00000000, accb[7:0]};
284
  add_ix_ea:
285
         tempea = xreg;
286
  fetch_first_ea:
287
  begin
288
         tempea[7:0] = data_in;
289
         tempea[15:8] = 8'b00000000;
290
        end
291
  fetch_next_ea:
292
  begin
293
         tempea[7:0] = data_in;
294
         tempea[15:8] = ea[7:0];
295
        end
296
  default:
297
    tempea = ea;
298
  endcase
299
end
300
 
301
always_ff @(posedge clk)
302
begin
303
    if (hold == 1'b1)
304
      ea <= ea;
305
    else
306
      ea <= tempea + tempind;
307
end
308
 
309
//////////////////////////////////
310
////
311
//// Accumulator A
312
////
313
//////////////////////////////////
314
always_ff @(posedge clk)
315
begin
316
    if (hold == 1'b1)
317
           acca <= acca;
318
         else
319
    case (acca_ctrl)
320
    reset_acca:
321
           acca <= 8'b00000000;
322
         load_acca:
323
           acca <= out_alu[7:0];
324
         load_hi_acca:
325
           acca <= out_alu[15:8];
326
         pull_acca:
327
           acca <= data_in;
328
         default:
329
//       latch_acca:
330
           acca <= acca;
331
    endcase
332
end
333
 
334
//////////////////////////////////
335
////
336
//// Accumulator B
337
////
338
//////////////////////////////////
339
always_ff @(posedge clk)
340
begin
341
    if (hold == 1'b1)
342
           accb <= accb;
343
         else
344
    case (accb_ctrl)
345
    reset_accb:
346
           accb <= 8'b00000000;
347
         load_accb:
348
           accb <= out_alu[7:0];
349
         pull_accb:
350
           accb <= data_in;
351
         default:
352
//       latch_accb:
353
           accb <= accb;
354
    endcase
355
end
356
 
357
//////////////////////////////////
358
////
359
//// X Index register
360
////
361
//////////////////////////////////
362
always_ff @(posedge clk)
363
begin
364
    if (hold == 1'b1)
365
           xreg <= xreg;
366
         else
367
    case (ix_ctrl)
368
    reset_ix:
369
           xreg <= 16'b0000000000000000;
370
         load_ix:
371
           xreg <= out_alu[15:0];
372
         pull_hi_ix:
373
           xreg[15:8] <= data_in;
374
         pull_lo_ix:
375
           xreg[7:0] <= data_in;
376
         default:
377
//       latch_ix:
378
           xreg <= xreg;
379
    endcase
380
end
381
 
382
//////////////////////////////////
383
////
384
//// stack pointer
385
////
386
//////////////////////////////////
387
always_ff @(posedge clk)
388
begin
389
    if (hold == 1'b1)
390
           sp <= sp;
391
         else
392
    case (sp_ctrl)
393
    reset_sp:
394
           sp <= 16'b0000000000000000;
395
         load_sp:
396
           sp <= out_alu[15:0];
397
         default:
398
//       latch_sp:
399
           sp <= sp;
400
    endcase
401
end
402
 
403
//////////////////////////////////
404
////
405
//// Memory Data
406
////
407
//////////////////////////////////
408
always_ff @(posedge clk)
409
begin
410
    if (hold == 1'b1)
411
           md <= md;
412
         else
413
    case (md_ctrl)
414
    reset_md:
415
           md <= 16'b0000000000000000;
416
         load_md:
417
           md <= out_alu[15:0];
418
         fetch_first_md:
419
         begin
420
           md[15:8] <= 8'b00000000;
421
           md[7:0] <= data_in;
422
        end
423
         fetch_next_md:
424
         begin
425
           md[15:8] <= md[7:0];
426
                md[7:0] <= data_in;
427
        end
428
         shiftl_md:
429
         begin
430
           md[15:1] <= md[14:0];
431
                md[0] <= 1'b0;
432
        end
433
         default:
434
//       latch_md:
435
           md <= md;
436
    endcase
437
end
438
 
439
 
440
////////////////////////////////////
441
////
442
//// Condition Codes
443
////
444
////////////////////////////////////
445
 
446
always_ff @(posedge clk)
447
begin
448
    if (hold == 1'b1)
449
           cc <= cc;
450
         else
451
    case (cc_ctrl)
452
         reset_cc:
453
           cc <= 8'b11000000;
454
         load_cc:
455
           cc <= cc_out;
456
         pull_cc:
457
      cc <= data_in;
458
         default:
459
//  latch_cc:
460
      cc <= cc;
461
    endcase
462
end
463
 
464
////////////////////////////////////
465
////
466
//// interrupt vector
467
////
468
////////////////////////////////////
469
 
470
always_ff @(posedge clk)
471
begin
472
    if (hold == 1'b1)
473
           iv <= iv;
474
         else
475
    case (iv_ctrl)
476
         reset_iv:
477
           iv <= 3'b111;
478
         nmi_iv:
479
      iv <= 3'b110;
480
         swi_iv:
481
      iv <= 3'b101;
482
         irq_iv:
483
      iv <= 3'b100;
484
         icf_iv:
485
           iv <= 3'b011;
486
         ocf_iv:
487
      iv <= 3'b010;
488
         tof_iv:
489
      iv <= 3'b001;
490
         sci_iv:
491
      iv <= 3'b000;
492
         default:
493
           iv <= iv;
494
    endcase
495
end
496
 
497
////////////////////////////////////
498
////
499
//// op code fetch
500
////
501
////////////////////////////////////
502
 
503
always_ff @(posedge clk)
504
begin
505
    if (hold == 1'b1)
506
           op_code <= op_code;
507
         else
508
    case (op_ctrl)
509
         reset_op:
510
           op_code <= 8'b00000001; // nop
511
         fetch_op:
512
      op_code <= data_in;
513
         default:
514
//       latch_op:
515
           op_code <= op_code;
516
    endcase
517
end
518
 
519
////////////////////////////////////
520
////
521
//// Left Mux
522
////
523
////////////////////////////////////
524
 
525
always_comb
526
begin
527
  case (left_ctrl)
528
         acca_left:
529
         begin
530
           left[15:8] = 8'b00000000;
531
                left[7:0]  = acca;
532
        end
533
         accb_left:
534
         begin
535
           left[15:8] = 8'b00000000;
536
                left[7:0]  = accb;
537
        end
538
         accd_left:
539
         begin
540
           left[15:8] = acca;
541
                left[7:0]  = accb;
542
        end
543
         ix_left:
544
           left = xreg;
545
         sp_left:
546
           left = sp;
547
         default:
548
//       md_left:
549
           left = md;
550
    endcase
551
end
552
////////////////////////////////////
553
////
554
//// Right Mux
555
////
556
////////////////////////////////////
557
 
558
always_comb
559
begin
560
  case (right_ctrl)
561
         zero_right:
562
           right = 16'b0000000000000000;
563
         plus_one_right:
564
           right = 16'b0000000000000001;
565
         accb_right:
566
           right = {8'b00000000, accb};
567
         default:
568
//       md_right:
569
           right = md;
570
    endcase
571
end
572
 
573
////////////////////////////////////
574
////
575
//// Arithmetic Logic Unit
576
////
577
////////////////////////////////////
578
 
579
logic valid_lo, valid_hi;
580
logic carry_in;
581
logic[7:0] daa_reg;
582
always_comb
583
begin
584
 
585
  case (alu_ctrl)
586
         alu_adc, alu_sbc,
587
              alu_rol8, alu_ror8:
588
           carry_in = cc[CBIT];
589
         default:
590
           carry_in = 1'b0;
591
  endcase
592
 
593
  valid_lo = (left[3:0] <= 9);
594
  valid_hi = (left[7:4] <= 9);
595
 
596
if (cc[CBIT] == 1'b0)
597
begin
598
        if( cc[HBIT] == 1'b1 )
599
        begin
600
                if (valid_hi)
601
                        daa_reg = 8'b00000110;
602
                else
603
                        daa_reg = 8'b01100110;
604
        end
605
        else
606
        begin
607
                if (valid_lo)
608
                begin
609
                        if (valid_hi)
610
                                daa_reg = 8'b00000000;
611
                        else
612
                                daa_reg = 8'b01100000;
613
                end
614
                else
615
                begin
616
                        if( left[7:4] <= 8 )
617
                                daa_reg = 8'b00000110;
618
                        else
619
                                daa_reg = 8'b01100110;
620
                end
621
        end
622
end
623
else
624
begin
625
        if ( cc[HBIT] == 1'b1 )
626
                daa_reg = 8'b01100110;
627
        else
628
                if (valid_lo)
629
                        daa_reg = 8'b01100000;
630
           else
631
                        daa_reg = 8'b01100110;
632
end
633
 
634
  case (alu_ctrl)
635
         alu_add8, alu_inc, alu_add16, alu_inx, alu_adc:
636
                out_alu = left + right + {15'b000000000000000, carry_in};
637
         alu_sub8, alu_dec, alu_sub16, alu_dex, alu_sbc:
638
           out_alu = left - right - {15'b000000000000000, carry_in};
639
         alu_and:
640
           out_alu   = left & right;   // and/bit
641
         alu_ora:
642
           out_alu   = left | right;    // or
643
         alu_eor:
644
           out_alu   = left ^ right;    // eor/xor
645
         alu_lsl16, alu_asl8, alu_rol8:
646
           out_alu   = {left[14:0], carry_in};  // rol8/asl8/lsl16
647
         alu_lsr16, alu_lsr8:
648
           out_alu   = {carry_in, left[15:1]};  // lsr
649
         alu_ror8:
650
           out_alu   = {8'b00000000, carry_in, left[7:1]};      // ror
651
         alu_asr8:
652
           out_alu   = {8'b00000000, left[7], left[7:1]};       // asr
653
         alu_neg:
654
           out_alu   = right - left;    // neg (right=0)
655
         alu_com:
656
           out_alu   = ~left;
657
         alu_clr, alu_ld8, alu_ld16:
658
           out_alu   = right;            // clr, ld
659 4 Dukov
         alu_st8, alu_tst, alu_st16:
660 2 Dukov
           out_alu   = left;
661
         alu_daa:
662
           out_alu   = left + {8'b00000000, daa_reg};
663
         alu_tpa:
664
           out_alu = {8'b00000000, cc};
665
         default:
666
           out_alu = left; // nop
667
    endcase
668
 
669
         //
670
         // carry bit
671
         //
672
    case (alu_ctrl)
673
         alu_add8, alu_adc:
674
      cc_out[CBIT] = (left[7] & right[7]) | (left[7] & ~out_alu[7]) | (right[7] & ~out_alu[7]);
675
         alu_sub8, alu_sbc:
676 3 Dukov
      cc_out[CBIT] = ((~left[7]) & right[7]) | ((~left[7]) & out_alu[7]) | (right[7] & out_alu[7]);
677 2 Dukov
         alu_add16:
678
      cc_out[CBIT] = (left[15] & right[15]) | (left[15] & ~out_alu[15]) | (right[15] & ~out_alu[15]);
679
         alu_sub16:
680
      cc_out[CBIT] = ((~left[15]) & right[15]) | ((~left[15]) & out_alu[15]) | (right[15] & out_alu[15]);
681
         alu_ror8 , alu_lsr16, alu_lsr8, alu_asr8:
682
           cc_out[CBIT] = left[0];
683
         alu_rol8, alu_asl8:
684
           cc_out[CBIT] = left[7];
685
         alu_lsl16:
686
           cc_out[CBIT] = left[15];
687
         alu_com:
688
           cc_out[CBIT] = 1'b1;
689
         alu_neg, alu_clr:
690
           cc_out[CBIT] = out_alu[7] | out_alu[6] | out_alu[5] | out_alu[4] | out_alu[3] | out_alu[2] | out_alu[1] | out_alu[0];
691
    alu_daa:
692
                begin
693
                        if ( daa_reg[7:4] == 4'b0110 )
694
                                cc_out[CBIT] = 1'b1;
695
                        else
696
                                cc_out[CBIT] = 1'b0;
697
           end
698
         alu_sec:
699
      cc_out[CBIT] = 1'b1;
700 4 Dukov
         alu_clc, alu_tst:
701 2 Dukov
      cc_out[CBIT] = 1'b0;
702
    alu_tap:
703
      cc_out[CBIT] = left[CBIT];
704
         default:
705
      cc_out[CBIT] = cc[CBIT];
706
    endcase
707
         //
708
         // Zero flag
709
         //
710
    case (alu_ctrl)
711
         alu_add8 , alu_sub8 ,
712
              alu_adc , alu_sbc ,
713
              alu_and , alu_ora , alu_eor ,
714
              alu_inc , alu_dec ,
715
                        alu_neg , alu_com , alu_clr ,
716
                        alu_rol8 , alu_ror8 , alu_asr8 , alu_asl8 , alu_lsr8 ,
717 4 Dukov
                   alu_ld8  , alu_st8, alu_tst:
718 2 Dukov
      cc_out[ZBIT] = ~( out_alu[7]  | out_alu[6]  | out_alu[5]  | out_alu[4]  |
719
                                out_alu[3]  | out_alu[2]  | out_alu[1]  | out_alu[0] );
720
         alu_add16, alu_sub16,
721
              alu_lsl16, alu_lsr16,
722
              alu_inx, alu_dex,
723
                   alu_ld16, alu_st16:
724
      cc_out[ZBIT] = ~( out_alu[15] | out_alu[14] | out_alu[13] | out_alu[12] |
725
                                out_alu[11] | out_alu[10] | out_alu[9]  | out_alu[8]  |
726
                                out_alu[7]  | out_alu[6]  | out_alu[5]  | out_alu[4]  |
727
                                out_alu[3]  | out_alu[2]  | out_alu[1]  | out_alu[0] );
728
    alu_tap:
729
      cc_out[ZBIT] = left[ZBIT];
730
         default:
731
      cc_out[ZBIT] = cc[ZBIT];
732
    endcase
733
 
734
    //
735
         // negative flag
736
         //
737
    case (alu_ctrl)
738
         alu_add8, alu_sub8,
739
              alu_adc, alu_sbc,
740
              alu_and, alu_ora, alu_eor,
741
              alu_rol8, alu_ror8, alu_asr8, alu_asl8, alu_lsr8,
742
              alu_inc, alu_dec, alu_neg, alu_com, alu_clr,
743 4 Dukov
                        alu_ld8 , alu_st8, alu_tst:
744 2 Dukov
      cc_out[NBIT] = out_alu[7];
745
         alu_add16, alu_sub16,
746
              alu_lsl16, alu_lsr16,
747
                        alu_ld16, alu_st16:
748
                cc_out[NBIT] = out_alu[15];
749
    alu_tap:
750
      cc_out[NBIT] = left[NBIT];
751
         default:
752
      cc_out[NBIT] = cc[NBIT];
753
    endcase
754
 
755
    //
756
         // Interrupt mask flag
757
    //
758
    case (alu_ctrl)
759
         alu_sei:
760
                cc_out[IBIT] = 1'b1;               // set interrupt mask
761
         alu_cli:
762
                cc_out[IBIT] = 1'b0;               // clear interrupt mask
763
         alu_tap:
764
      cc_out[IBIT] = left[IBIT];
765
         default:
766
                cc_out[IBIT] = cc[IBIT];             // interrupt mask
767
    endcase
768
 
769
    //
770
    // Half Carry flag
771
         //
772
    case (alu_ctrl)
773
         alu_add8, alu_adc:
774
      cc_out[HBIT] = (left[3] & right[3]) |
775
                     (right[3] & ~out_alu[3]) |
776
                      (left[3] & ~out_alu[3]);
777
    alu_tap:
778
      cc_out[HBIT] = left[HBIT];
779
         default:
780
                cc_out[HBIT] = cc[HBIT];
781
    endcase
782
 
783
    //
784
    // Overflow flag
785
         //
786
    case (alu_ctrl)
787
         alu_add8, alu_adc:
788
      cc_out[VBIT] = (left[7]  &      right[7]  & (~out_alu[7])) |
789
                 ((~left[7]) & (~right[7]) &      out_alu[7]);
790
         alu_sub8, alu_sbc:
791
      cc_out[VBIT] = (left[7]  & (~right[7]) & (~out_alu[7])) |
792
                 ((~left[7]) &      right[7]  &      out_alu[7]);
793
         alu_add16:
794
      cc_out[VBIT] = (left[15]  &      right[15]  & (~out_alu[15])) |
795
                 ((~left[15]) & (~right[15]) &      out_alu[15]);
796
         alu_sub16:
797
      cc_out[VBIT] = (left[15]  & (~right[15]) & (~out_alu[15])) |
798
                 ((~left[15]) &      right[15] &       out_alu[15]);
799
         alu_inc:
800
           cc_out[VBIT] = ((~left[7]) & left[6] & left[5] & left[4] &
801
                                      left[3]  & left[2] & left[1] & left[0]);
802
         alu_dec, alu_neg:
803
           cc_out[VBIT] = (left[7]  & (~left[6]) & (~left[5]) & (~left[4]) &
804
                            (~left[3]) & (~left[2]) & (~left[1]) & (~left[0]));
805
         alu_asr8:
806
           cc_out[VBIT] = left[0] ^ left[7];
807
         alu_lsr8, alu_lsr16:
808
           cc_out[VBIT] = left[0];
809
         alu_ror8:
810
      cc_out[VBIT] = left[0] ^ cc[CBIT];
811
    alu_lsl16:
812
      cc_out[VBIT] = left[15] ^ left[14];
813
         alu_rol8, alu_asl8:
814
      cc_out[VBIT] = left[7] ^ left[6];
815
    alu_tap:
816
      cc_out[VBIT] = left[VBIT];
817
         alu_and, alu_ora, alu_eor, alu_com,
818 4 Dukov
              alu_st8, alu_tst, alu_st16, alu_ld8, alu_ld16,
819 2 Dukov
                   alu_clv:
820
      cc_out[VBIT] = 1'b0;
821
    alu_sev:
822
           cc_out[VBIT] = 1'b1;
823
         default:
824
                cc_out[VBIT] = cc[VBIT];
825
    endcase
826
 
827
         case (alu_ctrl)
828
         alu_tap:
829
         begin
830
      cc_out[XBIT] = cc[XBIT] & left[XBIT];
831
      cc_out[SBIT] = left[SBIT];
832
         end
833
         default:
834
         begin
835
      cc_out[XBIT] = cc[XBIT] & left[XBIT];
836
           cc_out[SBIT] = cc[SBIT];
837
         end
838
         endcase
839
 
840
         test_alu = out_alu;
841
         test_cc  = cc_out;
842
end
843
 
844
////////////////////////////////////
845
//
846
// Detect Edge of NMI interrupt
847
//
848
////////////////////////////////////
849
 
850
always_ff @(posedge clk)
851
begin
852
    if (hold == 1'b1)
853
           nmi_req <= nmi_req;
854
         else if (rst==1'b1)
855
           nmi_req <= 1'b0;
856
    else if (nmi==1'b1 && nmi_ack==1'b0)
857
            nmi_req <= 1'b1;
858
         else if (nmi==1'b0 && nmi_ack==1'b1)
859
            nmi_req <= 1'b0;
860
         else
861
            nmi_req <= nmi_req;
862
end
863
 
864
////////////////////////////////////
865
//
866
// Nmi mux
867
//
868
////////////////////////////////////
869
 
870
always_ff @(posedge clk)
871
begin
872
    if (hold == 1'b1)
873
           nmi_ack <= nmi_ack;
874
         else
875
    case (nmi_ctrl)
876
         set_nmi:
877
      nmi_ack <= 1'b1;
878
         reset_nmi:
879
           nmi_ack <= 1'b0;
880
         default:
881
//  when latch_nmi =>
882
           nmi_ack <= nmi_ack;
883
         endcase
884
end
885
 
886
////////////////////////////////////
887
//
888
// state sequencer
889
//
890
////////////////////////////////////
891
always_comb
892
        begin
893
                  case (state)
894
          reset_state:        //  released from reset
895
                         begin
896
                            // reset the registers
897
             op_ctrl    = reset_op;
898
                                 acca_ctrl  = reset_acca;
899
                                 accb_ctrl  = reset_accb;
900
                                 ix_ctrl    = reset_ix;
901
                       sp_ctrl    = reset_sp;
902
                       pc_ctrl    = reset_pc;
903
                            ea_ctrl    = reset_ea;
904
                                 md_ctrl    = reset_md;
905
                                 iv_ctrl    = reset_iv;
906
                                 nmi_ctrl   = reset_nmi;
907
                                 // idle the ALU
908
             left_ctrl  = acca_left;
909
                                 right_ctrl = zero_right;
910
                                 alu_ctrl   = alu_nop;
911
             cc_ctrl    = reset_cc;
912
                                 // idle the bus
913
                                 dout_ctrl  = md_lo_dout;
914
             addr_ctrl  = idle_ad;
915
                       next_state = vect_hi_state;
916
                        end
917
 
918
                         //
919
                         // Jump via interrupt vector
920
                         // iv holds interrupt type
921
                         // fetch PC hi from vector location
922
                         //
923
          vect_hi_state:
924
                         begin
925
                            // default the registers
926
             op_ctrl    = latch_op;
927
                                 nmi_ctrl   = latch_nmi;
928
             acca_ctrl  = latch_acca;
929
             accb_ctrl  = latch_accb;
930
             ix_ctrl    = latch_ix;
931
             sp_ctrl    = latch_sp;
932
             md_ctrl    = latch_md;
933
             ea_ctrl    = latch_ea;
934
             iv_ctrl    = latch_iv;
935
                                 // idle the ALU
936
             left_ctrl  = acca_left;
937
             right_ctrl = zero_right;
938
             alu_ctrl   = alu_nop;
939
             cc_ctrl    = latch_cc;
940
                                 // fetch pc low interrupt vector
941
                       pc_ctrl    = pull_hi_pc;
942
             addr_ctrl  = int_hi_ad;
943
             dout_ctrl  = pc_hi_dout;
944
                       next_state = vect_lo_state;
945
                        end
946
                         //
947
                         // jump via interrupt vector
948
                         // iv holds vector type
949
                         // fetch PC lo from vector location
950
                         //
951
          vect_lo_state:
952
                         begin
953
                            // default the registers
954
             op_ctrl    = latch_op;
955
                                 nmi_ctrl   = latch_nmi;
956
             acca_ctrl  = latch_acca;
957
             accb_ctrl  = latch_accb;
958
             ix_ctrl    = latch_ix;
959
             sp_ctrl    = latch_sp;
960
             md_ctrl    = latch_md;
961
             ea_ctrl    = latch_ea;
962
             iv_ctrl    = latch_iv;
963
                                 // idle the ALU
964
             left_ctrl  = acca_left;
965
             right_ctrl = zero_right;
966
             alu_ctrl   = alu_nop;
967
             cc_ctrl    = latch_cc;
968
                                 // fetch the vector low byte
969
                       pc_ctrl    = pull_lo_pc;
970
             addr_ctrl  = int_lo_ad;
971
             dout_ctrl  = pc_lo_dout;
972
                       next_state = fetch_state;
973
                        end
974
 
975
                         //
976
                         // Here to fetch an instruction
977
                         // PC points to opcode
978
                         // Should service interrupt requests at this point
979
                         // either from the timer
980
                         // or from the external input.
981
                         //
982
          fetch_state:
983
                         begin
984
                              case (op_code[7:4])
985
                                   4'b0000,
986
                         4'b0001,
987
                         4'b0010,  // branch conditional
988
                         4'b0011,
989
                         4'b0100,  // acca single op
990
                         4'b0101,  // accb single op
991
                         4'b0110,  // indexed single op
992
                         4'b0111: // extended single op
993
                                                  begin
994
                                          // idle ALU
995
                 left_ctrl  = acca_left;
996
                                          right_ctrl = zero_right;
997
                                          alu_ctrl   = alu_nop;
998
                                          cc_ctrl    = latch_cc;
999
                 acca_ctrl  = latch_acca;
1000
                 accb_ctrl  = latch_accb;
1001
                 ix_ctrl    = latch_ix;
1002
                 sp_ctrl    = latch_sp;
1003
                                                        end
1004
 
1005
                    4'b1000, // acca immediate
1006
                         4'b1001, // acca direct
1007
                         4'b1010, // acca indexed
1008
                    4'b1011: // acca extended
1009
                                                  begin
1010
                                     case (op_code[3:0])
1011
                                          4'b0000: // suba
1012
                                                begin
1013
                                            left_ctrl   = acca_left;
1014
                                            right_ctrl  = md_right;
1015
                                            alu_ctrl    = alu_sub8;
1016
                                                 cc_ctrl     = load_cc;
1017
                                            acca_ctrl   = load_acca;
1018
                   accb_ctrl   = latch_accb;
1019
                   ix_ctrl     = latch_ix;
1020
                   sp_ctrl     = latch_sp;
1021
                                                 end
1022
                                          4'b0001: // cmpa
1023
                                          begin
1024
                                            left_ctrl   = acca_left;
1025
                                            right_ctrl  = md_right;
1026
                                            alu_ctrl    = alu_sub8;
1027
                                                 cc_ctrl     = load_cc;
1028
                                            acca_ctrl   = latch_acca;
1029
                   accb_ctrl   = latch_accb;
1030
                   ix_ctrl     = latch_ix;
1031
                   sp_ctrl     = latch_sp;
1032
                                                end
1033
                                          4'b0010: // sbca
1034
                                          begin
1035
                                            left_ctrl   = acca_left;
1036
                                            right_ctrl  = md_right;
1037
                                            alu_ctrl    = alu_sbc;
1038
                                                 cc_ctrl     = load_cc;
1039
                                            acca_ctrl   = load_acca;
1040
                   accb_ctrl   = latch_accb;
1041
                   ix_ctrl     = latch_ix;
1042
                   sp_ctrl     = latch_sp;
1043
                                                end
1044
                                          4'b0011: // subd
1045
                                          begin
1046
                                            left_ctrl   = accd_left;
1047
                                            right_ctrl  = md_right;
1048
                                            alu_ctrl    = alu_sub16;
1049
                                                 cc_ctrl     = load_cc;
1050
                                            acca_ctrl   = load_hi_acca;
1051
                                                 accb_ctrl   = load_accb;
1052
                   ix_ctrl     = latch_ix;
1053
                   sp_ctrl     = latch_sp;
1054
                                                end
1055
                                          4'b0100: // anda
1056
                                          begin
1057
                                            left_ctrl   = acca_left;
1058
                                            right_ctrl  = md_right;
1059
                                            alu_ctrl    = alu_and;
1060
                                                 cc_ctrl     = load_cc;
1061
                                            acca_ctrl   = load_acca;
1062
                   accb_ctrl   = latch_accb;
1063
                   ix_ctrl     = latch_ix;
1064
                   sp_ctrl     = latch_sp;
1065
                                                end
1066
                                          4'b0101: // bita
1067
                                          begin
1068
                                            left_ctrl   = acca_left;
1069
                                            right_ctrl  = md_right;
1070
                                            alu_ctrl    = alu_and;
1071
                                                 cc_ctrl     = load_cc;
1072
                                            acca_ctrl   = latch_acca;
1073
                   accb_ctrl   = latch_accb;
1074
                   ix_ctrl     = latch_ix;
1075
                   sp_ctrl     = latch_sp;
1076
                                                end
1077
                                          4'b0110: // ldaa
1078
                                          begin
1079
                                            left_ctrl   = acca_left;
1080
                                            right_ctrl  = md_right;
1081
                                            alu_ctrl    = alu_ld8;
1082
                                                 cc_ctrl     = load_cc;
1083
                                            acca_ctrl   = load_acca;
1084
                   accb_ctrl   = latch_accb;
1085
                   ix_ctrl     = latch_ix;
1086
                   sp_ctrl     = latch_sp;
1087
                                                end
1088
                                          4'b0111: // staa
1089
                                          begin
1090
                                            left_ctrl   = acca_left;
1091
                                            right_ctrl  = md_right;
1092
                                            alu_ctrl    = alu_st8;
1093
                                                 cc_ctrl     = load_cc;
1094
                                            acca_ctrl   = latch_acca;
1095
                   accb_ctrl   = latch_accb;
1096
                   ix_ctrl     = latch_ix;
1097
                   sp_ctrl     = latch_sp;
1098
                                                end
1099
                                          4'b1000: // eora
1100
                                          begin
1101
                                            left_ctrl   = acca_left;
1102
                                            right_ctrl  = md_right;
1103
                                            alu_ctrl    = alu_eor;
1104
                                                 cc_ctrl     = load_cc;
1105
                                            acca_ctrl   = load_acca;
1106
                   accb_ctrl   = latch_accb;
1107
                   ix_ctrl     = latch_ix;
1108
                   sp_ctrl     = latch_sp;
1109
                                                end
1110
                                          4'b1001: // adca
1111
                                          begin
1112
                                            left_ctrl   = acca_left;
1113
                                            right_ctrl  = md_right;
1114
                                            alu_ctrl    = alu_adc;
1115
                                                 cc_ctrl     = load_cc;
1116
                                            acca_ctrl   = load_acca;
1117
                   accb_ctrl   = latch_accb;
1118
                   ix_ctrl     = latch_ix;
1119
                   sp_ctrl     = latch_sp;
1120
                                                end
1121
                                          4'b1010: // oraa
1122
                                          begin
1123
                                            left_ctrl   = acca_left;
1124
                                            right_ctrl  = md_right;
1125
                                            alu_ctrl    = alu_ora;
1126
                                                 cc_ctrl     = load_cc;
1127
                                            acca_ctrl   = load_acca;
1128
                   accb_ctrl   = latch_accb;
1129
                   ix_ctrl     = latch_ix;
1130
                   sp_ctrl     = latch_sp;
1131
                                                end
1132
                                          4'b1011: // adda
1133
                                          begin
1134
                                            left_ctrl   = acca_left;
1135
                                            right_ctrl  = md_right;
1136
                                            alu_ctrl    = alu_add8;
1137
                                                 cc_ctrl     = load_cc;
1138
                                            acca_ctrl   = load_acca;
1139
                   accb_ctrl   = latch_accb;
1140
                   ix_ctrl     = latch_ix;
1141
                   sp_ctrl     = latch_sp;
1142
                                                end
1143
                                          4'b1100: // cpx
1144
                                          begin
1145
                                            left_ctrl   = ix_left;
1146
                                            right_ctrl  = md_right;
1147
                                            alu_ctrl    = alu_sub16;
1148
                                                 cc_ctrl     = load_cc;
1149
                                            acca_ctrl   = latch_acca;
1150
                   accb_ctrl   = latch_accb;
1151
                   ix_ctrl     = latch_ix;
1152
                   sp_ctrl     = latch_sp;
1153
                                                end
1154
                                          4'b1101: // bsr / jsr
1155
                                          begin
1156
                                            left_ctrl   = acca_left;
1157
                                            right_ctrl  = md_right;
1158
                                            alu_ctrl    = alu_nop;
1159
                                                 cc_ctrl     = latch_cc;
1160
                                            acca_ctrl   = latch_acca;
1161
                   accb_ctrl   = latch_accb;
1162
                   ix_ctrl     = latch_ix;
1163
                   sp_ctrl     = latch_sp;
1164
                                                end
1165
                                          4'b1110: // lds
1166
                                          begin
1167
                                            left_ctrl   = sp_left;
1168
                                            right_ctrl  = md_right;
1169
                                            alu_ctrl    = alu_ld16;
1170
                                                 cc_ctrl     = load_cc;
1171
                                            acca_ctrl   = latch_acca;
1172
                   accb_ctrl   = latch_accb;
1173
                   ix_ctrl     = latch_ix;
1174
                                                 sp_ctrl     = load_sp;
1175
                                                end
1176
                                          4'b1111: // sts
1177
                                          begin
1178
                                            left_ctrl   = sp_left;
1179
                                            right_ctrl  = md_right;
1180
                                            alu_ctrl    = alu_st16;
1181
                                                 cc_ctrl     = load_cc;
1182
                                            acca_ctrl   = latch_acca;
1183
                   accb_ctrl   = latch_accb;
1184
                   ix_ctrl     = latch_ix;
1185
                   sp_ctrl     = latch_sp;
1186
                                                end
1187
                                          default:
1188
                                          begin
1189
                                            left_ctrl   = acca_left;
1190
                                            right_ctrl  = md_right;
1191
                                            alu_ctrl    = alu_nop;
1192
                                                 cc_ctrl     = latch_cc;
1193
                                            acca_ctrl   = latch_acca;
1194
                   accb_ctrl   = latch_accb;
1195
                   ix_ctrl     = latch_ix;
1196
                   sp_ctrl     = latch_sp;
1197
                                                end
1198
                                          endcase
1199
                                          end
1200
                    4'b1100, // accb immediate
1201
                         4'b1101, // accb direct
1202
                         4'b1110, // accb indexed
1203
                    4'b1111: // accb extended
1204
                                        begin
1205
                                     case (op_code[3:0])
1206
                                          4'b0000: // subb
1207
                                          begin
1208
                                            left_ctrl   = accb_left;
1209
                                            right_ctrl  = md_right;
1210
                                            alu_ctrl    = alu_sub8;
1211
                                                 cc_ctrl     = load_cc;
1212
                                            acca_ctrl   = latch_acca;
1213
                   accb_ctrl   = load_accb;
1214
                   ix_ctrl     = latch_ix;
1215
                   sp_ctrl     = latch_sp;
1216
                                                end
1217
                                          4'b0001: // cmpb
1218
                                          begin
1219
                                            left_ctrl   = accb_left;
1220
                                            right_ctrl  = md_right;
1221
                                            alu_ctrl    = alu_sub8;
1222
                                                 cc_ctrl     = load_cc;
1223
                                            acca_ctrl   = latch_acca;
1224
                   accb_ctrl   = latch_accb;
1225
                   ix_ctrl     = latch_ix;
1226
                   sp_ctrl     = latch_sp;
1227
                                                end
1228
                                          4'b0010: // sbcb
1229
                                          begin
1230
                                            left_ctrl   = accb_left;
1231
                                            right_ctrl  = md_right;
1232
                                            alu_ctrl    = alu_sbc;
1233
                                                 cc_ctrl     = load_cc;
1234
                                            acca_ctrl   = latch_acca;
1235
                   accb_ctrl   = load_accb;
1236
                   ix_ctrl     = latch_ix;
1237
                   sp_ctrl     = latch_sp;
1238
                                                end
1239
                                          4'b0011: // addd
1240
                                          begin
1241
                                            left_ctrl   = accd_left;
1242
                                            right_ctrl  = md_right;
1243
                                            alu_ctrl    = alu_add16;
1244
                                                 cc_ctrl     = load_cc;
1245
                                            acca_ctrl   = load_hi_acca;
1246
                                                 accb_ctrl   = load_accb;
1247
                   ix_ctrl     = latch_ix;
1248
                   sp_ctrl     = latch_sp;
1249
                                                end
1250
                                          4'b0100: // andb
1251
                                          begin
1252
                                            left_ctrl   = accb_left;
1253
                                            right_ctrl  = md_right;
1254
                                            alu_ctrl    = alu_and;
1255
                                                 cc_ctrl     = load_cc;
1256
                                            acca_ctrl   = latch_acca;
1257
                   accb_ctrl   = load_accb;
1258
                   ix_ctrl     = latch_ix;
1259
                   sp_ctrl     = latch_sp;
1260
                                                end
1261
                                          4'b0101: // bitb
1262
                                          begin
1263
                                            left_ctrl   = accb_left;
1264
                                            right_ctrl  = md_right;
1265
                                            alu_ctrl    = alu_and;
1266
                                                 cc_ctrl     = load_cc;
1267
                                            acca_ctrl   = latch_acca;
1268
                   accb_ctrl   = latch_accb;
1269
                   ix_ctrl     = latch_ix;
1270
                   sp_ctrl     = latch_sp;
1271
                                                end
1272
                                          4'b0110: // ldab
1273
                                          begin
1274
                                            left_ctrl   = accb_left;
1275
                                            right_ctrl  = md_right;
1276
                                            alu_ctrl    = alu_ld8;
1277
                                                 cc_ctrl     = load_cc;
1278
                                            acca_ctrl   = latch_acca;
1279
                   accb_ctrl   = load_accb;
1280
                   ix_ctrl     = latch_ix;
1281
                   sp_ctrl     = latch_sp;
1282
                                                end
1283
                                          4'b0111: // stab
1284
                                          begin
1285
                                            left_ctrl   = accb_left;
1286
                                            right_ctrl  = md_right;
1287
                                            alu_ctrl    = alu_st8;
1288
                                                 cc_ctrl     = load_cc;
1289
                                            acca_ctrl   = latch_acca;
1290
                   accb_ctrl   = latch_accb;
1291
                   ix_ctrl     = latch_ix;
1292
                   sp_ctrl     = latch_sp;
1293
                                                end
1294
                                          4'b1000: // eorb
1295
                                          begin
1296
                                            left_ctrl   = accb_left;
1297
                                            right_ctrl  = md_right;
1298
                                            alu_ctrl    = alu_eor;
1299
                                                 cc_ctrl     = load_cc;
1300
                                            acca_ctrl   = latch_acca;
1301
                   accb_ctrl   = load_accb;
1302
                   ix_ctrl     = latch_ix;
1303
                   sp_ctrl     = latch_sp;
1304
                                                end
1305
                                          4'b1001: // adcb
1306
                                          begin
1307
                                            left_ctrl   = accb_left;
1308
                                            right_ctrl  = md_right;
1309
                                            alu_ctrl    = alu_adc;
1310
                                                 cc_ctrl     = load_cc;
1311
                                            acca_ctrl   = latch_acca;
1312
                   accb_ctrl   = load_accb;
1313
                   ix_ctrl     = latch_ix;
1314
                   sp_ctrl     = latch_sp;
1315
                                                end
1316
                                          4'b1010: // orab
1317
                                          begin
1318
                                            left_ctrl   = accb_left;
1319
                                            right_ctrl  = md_right;
1320
                                            alu_ctrl    = alu_ora;
1321
                                                 cc_ctrl     = load_cc;
1322
                                            acca_ctrl   = latch_acca;
1323
                   accb_ctrl   = load_accb;
1324
                   ix_ctrl     = latch_ix;
1325
                   sp_ctrl     = latch_sp;
1326
                                                end
1327
                                          4'b1011: // addb
1328
                                          begin
1329
                                            left_ctrl   = accb_left;
1330
                                            right_ctrl  = md_right;
1331
                                            alu_ctrl    = alu_add8;
1332
                                                 cc_ctrl     = load_cc;
1333
                                            acca_ctrl   = latch_acca;
1334
                   accb_ctrl   = load_accb;
1335
                   ix_ctrl     = latch_ix;
1336
                   sp_ctrl     = latch_sp;
1337
                                                end
1338
                                          4'b1100: // ldd
1339
                                          begin
1340
                                            left_ctrl   = accd_left;
1341
                                            right_ctrl  = md_right;
1342
                                            alu_ctrl    = alu_ld16;
1343
                                                 cc_ctrl     = load_cc;
1344
                                            acca_ctrl   = load_hi_acca;
1345
                   accb_ctrl   = load_accb;
1346
                   ix_ctrl     = latch_ix;
1347
                   sp_ctrl     = latch_sp;
1348
                                                end
1349
                                          4'b1101: // std
1350
                                          begin
1351
                                            left_ctrl   = accd_left;
1352
                                            right_ctrl  = md_right;
1353
                                            alu_ctrl    = alu_st16;
1354
                                                 cc_ctrl     = load_cc;
1355
                                            acca_ctrl   = latch_acca;
1356
                   accb_ctrl   = latch_accb;
1357
                   ix_ctrl     = latch_ix;
1358
                   sp_ctrl     = latch_sp;
1359
                                                end
1360
                                          4'b1110: // ldx
1361
                                          begin
1362
                                            left_ctrl   = ix_left;
1363
                                            right_ctrl  = md_right;
1364
                                            alu_ctrl    = alu_ld16;
1365
                                                 cc_ctrl     = load_cc;
1366
                                            acca_ctrl   = latch_acca;
1367
                   accb_ctrl   = latch_accb;
1368
                   ix_ctrl     = load_ix;
1369
                                                 sp_ctrl     = latch_sp;
1370
                                                end
1371
                                          4'b1111: // stx
1372
                                          begin
1373
                                            left_ctrl   = ix_left;
1374
                                            right_ctrl  = md_right;
1375
                                            alu_ctrl    = alu_st16;
1376
                                                 cc_ctrl     = load_cc;
1377
                                            acca_ctrl   = latch_acca;
1378
                   accb_ctrl   = latch_accb;
1379
                   ix_ctrl     = latch_ix;
1380
                   sp_ctrl     = latch_sp;
1381
                                                end
1382
                                          default:
1383
                                          begin
1384
                                            left_ctrl   = accb_left;
1385
                                            right_ctrl  = md_right;
1386
                                            alu_ctrl    = alu_nop;
1387
                                                 cc_ctrl     = latch_cc;
1388
                                            acca_ctrl   = latch_acca;
1389
                   accb_ctrl   = latch_accb;
1390
                   ix_ctrl     = latch_ix;
1391
                   sp_ctrl     = latch_sp;
1392
                                                end
1393
                                          endcase
1394
                                        end
1395
                    default:
1396
                                        begin
1397
                                          left_ctrl   = accd_left;
1398
                                          right_ctrl  = md_right;
1399
                                          alu_ctrl    = alu_nop;
1400
                                          cc_ctrl     = latch_cc;
1401
                                          acca_ctrl   = latch_acca;
1402
                 accb_ctrl   = latch_accb;
1403
                 ix_ctrl     = latch_ix;
1404
                 sp_ctrl     = latch_sp;
1405
                                         end
1406
              endcase
1407
             md_ctrl    = latch_md;
1408
                                 // fetch the op code
1409
                            op_ctrl    = fetch_op;
1410
             ea_ctrl    = reset_ea;
1411
             addr_ctrl  = fetch_ad;
1412
             dout_ctrl  = md_lo_dout;
1413
                            iv_ctrl    = latch_iv;
1414
                                if (halt == 1'b1)
1415
                                begin
1416
                                        pc_ctrl    = latch_pc;
1417
                                   nmi_ctrl   = latch_nmi;
1418
                              next_state = halt_state;
1419
                                end
1420
                                // service non maskable interrupts
1421
                           else if (nmi_req == 1'b1 && nmi_ack == 1'b0)
1422
                                begin
1423
               pc_ctrl    = latch_pc;
1424
                                   nmi_ctrl   = set_nmi;
1425
                              next_state = int_pcl_state;
1426
                                end
1427
                                // service maskable interrupts
1428
                           else
1429
                                begin
1430
                                        //
1431
                                        // nmi request is not cleared until nmi input goes low
1432
                                        //
1433
                                   if(nmi_req == 1'b0 && nmi_ack==1'b1)
1434
                                     nmi_ctrl = reset_nmi;
1435
                                        else
1436
                                          nmi_ctrl = latch_nmi;
1437
                                        //
1438
                                        // IRQ is level sensitive
1439
                                        //
1440
                                   if ((irq == 1'b1 || irq_icf == 1'b1 || irq_ocf == 1'b1 || irq_tof == 1'b1 || irq_sci == 1'b1) && cc[IBIT] == 1'b0)
1441
                                        begin
1442
                 pc_ctrl    = latch_pc;
1443
                                next_state = int_pcl_state;
1444
                                        end
1445
               else
1446
                                        begin
1447
                                   // Advance the PC to fetch next instruction byte
1448
                 pc_ctrl    = inc_pc;
1449
                                next_state = decode_state;
1450
                                        end
1451
                                end
1452
                        end
1453
                         //
1454
                         // Here to decode instruction
1455
                         // and fetch next byte of intruction
1456
                         // whether it be necessary or not
1457
                         //
1458
          decode_state:
1459
                         begin
1460
                                 // fetch first byte of address or immediate data
1461
             ea_ctrl    = fetch_first_ea;
1462
             addr_ctrl  = fetch_ad;
1463
             dout_ctrl  = md_lo_dout;
1464
                            op_ctrl    = latch_op;
1465
                                 nmi_ctrl   = latch_nmi;
1466
             iv_ctrl    = latch_iv;
1467
                            case (op_code[7:4])
1468
                                 4'b0000:
1469
                                 begin
1470
                                   md_ctrl    = fetch_first_md;
1471
               sp_ctrl    = latch_sp;
1472
               pc_ctrl    = latch_pc;
1473
                    case (op_code[3:0])
1474
                         4'b0001: // nop
1475
                                        begin
1476
                                          left_ctrl  = accd_left;
1477
                 right_ctrl = zero_right;
1478
                                          alu_ctrl   = alu_nop;
1479
                 cc_ctrl    = latch_cc;
1480
                                          acca_ctrl  = latch_acca;
1481
                                          accb_ctrl  = latch_accb;
1482
                                          ix_ctrl    = latch_ix;
1483
                                         end
1484
                         4'b0100: // lsrd
1485
                                        begin
1486
                                          left_ctrl  = accd_left;
1487
                 right_ctrl = zero_right;
1488
                                          alu_ctrl   = alu_lsr16;
1489
                 cc_ctrl    = load_cc;
1490
                                          acca_ctrl  = load_hi_acca;
1491
                                          accb_ctrl  = load_accb;
1492
                                          ix_ctrl    = latch_ix;
1493
                                         end
1494
                         4'b0101: // lsld
1495
                                        begin
1496
                                          left_ctrl  = accd_left;
1497
                 right_ctrl = zero_right;
1498
                                          alu_ctrl   = alu_lsl16;
1499
                 cc_ctrl    = load_cc;
1500
                                          acca_ctrl  = load_hi_acca;
1501
                                          accb_ctrl  = load_accb;
1502
                                          ix_ctrl    = latch_ix;
1503
                                         end
1504
                         4'b0110: // tap
1505
                                        begin
1506
                                          left_ctrl  = acca_left;
1507
                 right_ctrl = zero_right;
1508
                                          alu_ctrl   = alu_tap;
1509
                 cc_ctrl    = load_cc;
1510
                                          acca_ctrl  = latch_acca;
1511
                                          accb_ctrl  = latch_accb;
1512
                                          ix_ctrl    = latch_ix;
1513
                                         end
1514
                         4'b0111: // tpa
1515
                                        begin
1516
                                          left_ctrl  = acca_left;
1517
                 right_ctrl = zero_right;
1518
                                          alu_ctrl   = alu_tpa;
1519
                 cc_ctrl    = latch_cc;
1520
                                          acca_ctrl  = load_acca;
1521
                                          accb_ctrl  = latch_accb;
1522
                                          ix_ctrl    = latch_ix;
1523
                                         end
1524
                         4'b1000: // inx
1525
                                        begin
1526
                                          left_ctrl  = ix_left;
1527
                      right_ctrl = plus_one_right;
1528
                                          alu_ctrl   = alu_inx;
1529
                 cc_ctrl    = load_cc;
1530
                                          acca_ctrl  = latch_acca;
1531
                                          accb_ctrl  = latch_accb;
1532
                                          ix_ctrl    = load_ix;
1533
                                         end
1534
                         4'b1001: // dex
1535
                                        begin
1536
                                          left_ctrl  = ix_left;
1537
                      right_ctrl = plus_one_right;
1538
                                          alu_ctrl   = alu_dex;
1539
                 cc_ctrl    = load_cc;
1540
                                          acca_ctrl  = latch_acca;
1541
                                          accb_ctrl  = latch_accb;
1542
                                          ix_ctrl    = load_ix;
1543
                                         end
1544
                         4'b1010: // clv
1545
                                        begin
1546
                                          left_ctrl  = acca_left;
1547
                 right_ctrl = zero_right;
1548
                                          alu_ctrl   = alu_clv;
1549
                 cc_ctrl    = load_cc;
1550
                                          acca_ctrl  = latch_acca;
1551
                                          accb_ctrl  = latch_accb;
1552
                                          ix_ctrl    = latch_ix;
1553
                                         end
1554
                         4'b1011: // sev
1555
                                        begin
1556
                                          left_ctrl  = acca_left;
1557
                 right_ctrl = zero_right;
1558
                                          alu_ctrl   = alu_sev;
1559
                 cc_ctrl    = load_cc;
1560
                                          acca_ctrl  = latch_acca;
1561
                                          accb_ctrl  = latch_accb;
1562
                                          ix_ctrl    = latch_ix;
1563
                                         end
1564
                         4'b1100: // clc
1565
                                        begin
1566
                                          left_ctrl  = acca_left;
1567
                 right_ctrl = zero_right;
1568
                                          alu_ctrl   = alu_clc;
1569
                 cc_ctrl    = load_cc;
1570
                                          acca_ctrl  = latch_acca;
1571
                                          accb_ctrl  = latch_accb;
1572
                                          ix_ctrl    = latch_ix;
1573
                                         end
1574
                         4'b1101: // sec
1575
                                        begin
1576
                                          left_ctrl  = acca_left;
1577
                 right_ctrl = zero_right;
1578
                                          alu_ctrl   = alu_sec;
1579
                 cc_ctrl    = load_cc;
1580
                                          acca_ctrl  = latch_acca;
1581
                                          accb_ctrl  = latch_accb;
1582
                                          ix_ctrl    = latch_ix;
1583
                                         end
1584
                         4'b1110: // cli
1585
                                        begin
1586
                                          left_ctrl  = acca_left;
1587
                 right_ctrl = zero_right;
1588
                                          alu_ctrl   = alu_cli;
1589
                 cc_ctrl    = load_cc;
1590
                                          acca_ctrl  = latch_acca;
1591
                                          accb_ctrl  = latch_accb;
1592
                                          ix_ctrl    = latch_ix;
1593
                                         end
1594
                         4'b1111: // sei
1595
                                        begin
1596
                                          left_ctrl  = acca_left;
1597
                 right_ctrl = zero_right;
1598
                                          alu_ctrl   = alu_sei;
1599
                 cc_ctrl    = load_cc;
1600
                                          acca_ctrl  = latch_acca;
1601
                                          accb_ctrl  = latch_accb;
1602
                                          ix_ctrl    = latch_ix;
1603
                                         end
1604
               default:
1605
                                        begin
1606
                                          left_ctrl  = acca_left;
1607
                 right_ctrl = zero_right;
1608
                                          alu_ctrl   = alu_nop;
1609
                 cc_ctrl    = latch_cc;
1610
                                          acca_ctrl  = latch_acca;
1611
                                          accb_ctrl  = latch_accb;
1612
                                          ix_ctrl    = latch_ix;
1613
                                         end
1614
                         endcase
1615
                                        next_state = fetch_state;
1616
                                end
1617
                                 // acca / accb inherent instructions
1618
                  4'b0001:
1619
                                 begin
1620
                                   md_ctrl    = fetch_first_md;
1621
               ix_ctrl    = latch_ix;
1622
               sp_ctrl    = latch_sp;
1623
               pc_ctrl    = latch_pc;
1624
                                        left_ctrl  = acca_left;
1625
                    right_ctrl = accb_right;
1626
                    case (op_code[3:0])
1627
                         4'b0000: // sba
1628
                                        begin
1629
                                          alu_ctrl   = alu_sub8;
1630
                                          cc_ctrl    = load_cc;
1631
                                          acca_ctrl  = load_acca;
1632
                 accb_ctrl  = latch_accb;
1633
                                         end
1634
                         4'b0001: // cba
1635
                                        begin
1636
                                          alu_ctrl   = alu_sub8;
1637
                                          cc_ctrl    = load_cc;
1638
                                          acca_ctrl  = latch_acca;
1639
                 accb_ctrl  = latch_accb;
1640
                                         end
1641
                         4'b0110: // tab
1642
                                        begin
1643
                                          alu_ctrl   = alu_st8;
1644
                                          cc_ctrl    = load_cc;
1645
                                          acca_ctrl  = latch_acca;
1646
                                          accb_ctrl  = load_accb;
1647
                                         end
1648
                         4'b0111: // tba
1649
                                        begin
1650
                                          alu_ctrl   = alu_ld8;
1651
                                          cc_ctrl    = load_cc;
1652
                                          acca_ctrl  = load_acca;
1653
                 accb_ctrl  = latch_accb;
1654
                                         end
1655
                         4'b1001: // daa
1656
                                        begin
1657
                                          alu_ctrl   = alu_daa;
1658
                                          cc_ctrl    = load_cc;
1659
                                          acca_ctrl  = load_acca;
1660
                 accb_ctrl  = latch_accb;
1661
                                         end
1662
                         4'b1011: // aba
1663
                                        begin
1664
                                          alu_ctrl   = alu_add8;
1665
                                          cc_ctrl    = load_cc;
1666
                                          acca_ctrl  = load_acca;
1667
                 accb_ctrl  = latch_accb;
1668
                                         end
1669
                         default:
1670
                                        begin
1671
                                          alu_ctrl   = alu_nop;
1672
                                          cc_ctrl    = latch_cc;
1673
                                          acca_ctrl  = latch_acca;
1674
                 accb_ctrl  = latch_accb;
1675
                                         end
1676
                         endcase
1677
                                        next_state = fetch_state;
1678
                                end
1679
                  4'b0010: // branch conditional
1680
                                 begin
1681
                                   md_ctrl    = fetch_first_md;
1682
                                        acca_ctrl  = latch_acca;
1683
               accb_ctrl  = latch_accb;
1684
               ix_ctrl    = latch_ix;
1685
               sp_ctrl    = latch_sp;
1686
               left_ctrl  = acca_left;
1687
               right_ctrl = zero_right;
1688
               alu_ctrl   = alu_nop;
1689
                                        cc_ctrl    = latch_cc;
1690
                                        // increment the pc
1691
               pc_ctrl    = inc_pc;
1692
               case (op_code[3:0])
1693
                         4'b0000: // bra
1694
                 next_state = branch_state;
1695
                         4'b0001: // brn
1696
                                          next_state = fetch_state;
1697
                         4'b0010: // bhi
1698
                                        begin
1699
                                          if ((cc[CBIT] | cc[ZBIT]) == 1'b0)
1700
                                            next_state = branch_state;
1701
                                          else
1702
                                            next_state = fetch_state;
1703
                                        end
1704
                         4'b0011: // bls
1705
                                        begin
1706
                                          if ((cc[CBIT] | cc[ZBIT]) == 1'b1)
1707
                                            next_state = branch_state;
1708
                                          else
1709
                                            next_state = fetch_state;
1710
                                        end
1711
                         4'b0100: // bcc/bhs
1712
                                        begin
1713
                                          if (cc[CBIT] == 1'b0)
1714
                                            next_state = branch_state;
1715
                                          else
1716
                                            next_state = fetch_state;
1717
                                        end
1718
                         4'b0101: // bcs/blo
1719
                                        begin
1720
                                          if (cc[CBIT] == 1'b1)
1721
                                            next_state = branch_state;
1722
                                          else
1723
                                            next_state = fetch_state;
1724
                                         end
1725
                         4'b0110: // bne
1726
                                        begin
1727
                                          if (cc[ZBIT] == 1'b0)
1728
                                            next_state = branch_state;
1729
                                          else
1730
                                            next_state = fetch_state;
1731
                                         end
1732
                         4'b0111: // beq
1733
                                        begin
1734
                                          if (cc[ZBIT] == 1'b1)
1735
                                            next_state = branch_state;
1736
                                          else
1737
                                            next_state = fetch_state;
1738
                                        end
1739
                         4'b1000: // bvc
1740
                                        begin
1741
                                          if (cc[VBIT] == 1'b0)
1742
                                            next_state = branch_state;
1743
                                          else
1744
                                            next_state = fetch_state;
1745
                                        end
1746
                         4'b1001: // bvs
1747
                                        begin
1748
                                          if (cc[VBIT] == 1'b1)
1749
                                            next_state = branch_state;
1750
                                          else
1751
                                            next_state = fetch_state;
1752
                                        end
1753
                         4'b1010: // bpl
1754
                                        begin
1755
                                          if (cc[NBIT] == 1'b0)
1756
                                            next_state = branch_state;
1757
                                          else
1758
                                            next_state = fetch_state;
1759
                                        end
1760
                         4'b1011: // bmi
1761
                                        begin
1762
                                          if (cc[NBIT] == 1'b1)
1763
                                            next_state = branch_state;
1764
                                          else
1765
                                            next_state = fetch_state;
1766
                                         end
1767
                         4'b1100: // bge
1768
                                        begin
1769
                                          if ((cc[NBIT] ^ cc[VBIT]) == 1'b0)
1770
                                            next_state = branch_state;
1771
                                          else
1772
                                            next_state = fetch_state;
1773
                                        end
1774
                         4'b1101: // blt
1775
                                        begin
1776
                                          if ((cc[NBIT] ^ cc[VBIT]) == 1'b1)
1777
                                            next_state = branch_state;
1778
                                          else
1779
                                            next_state = fetch_state;
1780
                                        end
1781
                         4'b1110: // bgt
1782
                                        begin
1783
                                          if ((cc[ZBIT] | (cc[NBIT] ^ cc[VBIT])) == 1'b0)
1784
                                            next_state = branch_state;
1785
                                          else
1786
                                            next_state = fetch_state;
1787
                                        end
1788
                         4'b1111: // ble
1789
                                        begin
1790
                                          if ((cc[ZBIT] | (cc[NBIT] ^ cc[VBIT])) == 1'b1)
1791
                                            next_state = branch_state;
1792
                                          else
1793
                                            next_state = fetch_state;
1794
                                        end
1795
                         default:
1796
                                          next_state = fetch_state;
1797
                         endcase
1798
                                        end
1799
                                 //
1800
                                 // Single byte stack operators
1801
                                 // Do not advance PC
1802
                                 //
1803
                  4'b0011:
1804
                                 begin
1805
                                   md_ctrl    = fetch_first_md;
1806
                                        acca_ctrl  = latch_acca;
1807
               accb_ctrl  = latch_accb;
1808
               pc_ctrl    = latch_pc;
1809
                    case (op_code[3:0])
1810
                         4'b0000: // tsx
1811
                                        begin
1812
                            left_ctrl  = sp_left;
1813
                            right_ctrl = plus_one_right;
1814
                                                alu_ctrl   = alu_add16;
1815
                                           cc_ctrl    = latch_cc;
1816
                                                ix_ctrl    = load_ix;
1817
                  sp_ctrl    = latch_sp;
1818
                                                next_state = fetch_state;
1819
                                        end
1820
                         4'b0001: // ins
1821
                                        begin
1822
                  left_ctrl  = sp_left;
1823
                  right_ctrl = plus_one_right;
1824
                  alu_ctrl   = alu_add16;
1825
                                           cc_ctrl    = latch_cc;
1826
                                                ix_ctrl    = latch_ix;
1827
                  sp_ctrl    = load_sp;
1828
                                                next_state = fetch_state;
1829
                                        end
1830
                         4'b0010: // pula
1831
                                        begin
1832
                  left_ctrl  = sp_left;
1833
                  right_ctrl = plus_one_right;
1834
                  alu_ctrl   = alu_add16;
1835
                                           cc_ctrl    = latch_cc;
1836
                                                ix_ctrl    = latch_ix;
1837
                  sp_ctrl    = load_sp;
1838
                                                next_state = pula_state;
1839
                                        end
1840
                         4'b0011: // pulb
1841
                                        begin
1842
                  left_ctrl  = sp_left;
1843
                  right_ctrl = plus_one_right;
1844
                  alu_ctrl   = alu_add16;
1845
                                           cc_ctrl    = latch_cc;
1846
                                                ix_ctrl    = latch_ix;
1847
                  sp_ctrl    = load_sp;
1848
                                                next_state = pulb_state;
1849
                                        end
1850
                         4'b0100: // des
1851
                                        begin
1852
                  // decrement sp
1853
                  left_ctrl  = sp_left;
1854
                  right_ctrl = plus_one_right;
1855
                  alu_ctrl   = alu_sub16;
1856
                                           cc_ctrl    = latch_cc;
1857
                                                ix_ctrl    = latch_ix;
1858
                  sp_ctrl    = load_sp;
1859
                                                next_state = fetch_state;
1860
                                        end
1861
                         4'b0101: // txs
1862
                                        begin
1863
                            left_ctrl  = ix_left;
1864
                            right_ctrl = plus_one_right;
1865
                                                alu_ctrl   = alu_sub16;
1866
                                           cc_ctrl    = latch_cc;
1867
                                                ix_ctrl    = latch_ix;
1868
                                                sp_ctrl    = load_sp;
1869
                                                next_state = fetch_state;
1870
                                        end
1871
                         4'b0110: // psha
1872
                                        begin
1873
                            left_ctrl  = sp_left;
1874
                            right_ctrl = zero_right;
1875
                                                alu_ctrl   = alu_nop;
1876
                                           cc_ctrl    = latch_cc;
1877
                                                ix_ctrl    = latch_ix;
1878
                                                sp_ctrl    = latch_sp;
1879
                                                next_state = psha_state;
1880
                                        end
1881
                         4'b0111: // pshb
1882
                                        begin
1883
                            left_ctrl  = sp_left;
1884
                            right_ctrl = zero_right;
1885
                                                alu_ctrl   = alu_nop;
1886
                                           cc_ctrl    = latch_cc;
1887
                                                ix_ctrl    = latch_ix;
1888
                                                sp_ctrl    = latch_sp;
1889
                                                next_state = pshb_state;
1890
                                        end
1891
                         4'b1000: // pulx
1892
                                        begin
1893
                  left_ctrl  = sp_left;
1894
                  right_ctrl = plus_one_right;
1895
                  alu_ctrl   = alu_add16;
1896
                                           cc_ctrl    = latch_cc;
1897
                                                ix_ctrl    = latch_ix;
1898
                  sp_ctrl    = load_sp;
1899
                                                next_state = pulx_hi_state;
1900
                                        end
1901
                         4'b1001: // rts
1902
                                        begin
1903
                  left_ctrl  = sp_left;
1904
                  right_ctrl = plus_one_right;
1905
                  alu_ctrl   = alu_add16;
1906
                                           cc_ctrl    = latch_cc;
1907
                                                ix_ctrl    = latch_ix;
1908
                  sp_ctrl    = load_sp;
1909
                                                next_state = rts_hi_state;
1910
                                        end
1911
                         4'b1010: // abx
1912
                                        begin
1913
                            left_ctrl  = ix_left;
1914
                            right_ctrl = accb_right;
1915
                                                alu_ctrl   = alu_add16;
1916
                                           cc_ctrl    = latch_cc;
1917
                                                ix_ctrl    = load_ix;
1918
                  sp_ctrl    = latch_sp;
1919
                                                next_state = fetch_state;
1920
                                        end
1921
                         4'b1011: // rti
1922
                                        begin
1923
                  left_ctrl  = sp_left;
1924
                  right_ctrl = plus_one_right;
1925
                  alu_ctrl   = alu_add16;
1926
                                           cc_ctrl    = latch_cc;
1927
                                                ix_ctrl    = latch_ix;
1928
                  sp_ctrl    = load_sp;
1929
                                                next_state = rti_cc_state;
1930
                                        end
1931
                         4'b1100: // pshx
1932
                                        begin
1933
                            left_ctrl  = sp_left;
1934
                            right_ctrl = zero_right;
1935
                                                alu_ctrl   = alu_nop;
1936
                                           cc_ctrl    = latch_cc;
1937
                                                ix_ctrl    = latch_ix;
1938
                                                sp_ctrl    = latch_sp;
1939
                                                next_state = pshx_lo_state;
1940
                                        end
1941
                         4'b1101: // mul
1942
                                        begin
1943
                            left_ctrl  = acca_left;
1944
                            right_ctrl = accb_right;
1945
                                                alu_ctrl   = alu_add16;
1946
                                           cc_ctrl    = latch_cc;
1947
                                                ix_ctrl    = latch_ix;
1948
                                                sp_ctrl    = latch_sp;
1949
                                                next_state = mul_state;
1950
                                        end
1951
                         4'b1110: // wai
1952
                                        begin
1953
                            left_ctrl  = sp_left;
1954
                            right_ctrl = zero_right;
1955
                                                alu_ctrl   = alu_nop;
1956
                                           cc_ctrl    = latch_cc;
1957
                                                ix_ctrl    = latch_ix;
1958
                                                sp_ctrl    = latch_sp;
1959
                                                next_state = int_pcl_state;
1960
                                        end
1961
                         4'b1111: // swi
1962
                                        begin
1963
                            left_ctrl  = sp_left;
1964
                            right_ctrl = zero_right;
1965
                                                alu_ctrl   = alu_nop;
1966
                                           cc_ctrl    = latch_cc;
1967
                                                ix_ctrl    = latch_ix;
1968
                                                sp_ctrl    = latch_sp;
1969
                                                next_state = int_pcl_state;
1970
                                        end
1971
                         default:
1972
                                        begin
1973
                            left_ctrl  = sp_left;
1974
                            right_ctrl = zero_right;
1975
                                                alu_ctrl   = alu_nop;
1976
                                           cc_ctrl    = latch_cc;
1977
                                                ix_ctrl    = latch_ix;
1978
                                                sp_ctrl    = latch_sp;
1979
                                                next_state = fetch_state;
1980
                                        end
1981
                         endcase
1982
                                        end
1983
                                 //
1984
                                 // Accumulator A Single operand
1985
                                 // source = Acc A dest = Acc A
1986
                                 // Do not advance PC
1987
                                 //
1988
                  4'b0100: // acca single op
1989
                                 begin
1990
                                   md_ctrl    = fetch_first_md;
1991
               accb_ctrl  = latch_accb;
1992
               pc_ctrl    = latch_pc;
1993
                                   ix_ctrl    = latch_ix;
1994
                                   sp_ctrl    = latch_sp;
1995
                         left_ctrl  = acca_left;
1996
                    case (op_code[3:0])
1997
                         4'b0000: // neg
1998
                                        begin
1999
                                          right_ctrl = zero_right;
2000
                                          alu_ctrl   = alu_neg;
2001
                                          acca_ctrl  = load_acca;
2002
                                          cc_ctrl    = load_cc;
2003
                                         end
2004
                    4'b0011: // com
2005
                                        begin
2006
                           right_ctrl = zero_right;
2007
                                          alu_ctrl   = alu_com;
2008
                                          acca_ctrl  = load_acca;
2009
                                          cc_ctrl    = load_cc;
2010
                                        end
2011
                         4'b0100: // lsr
2012
                                        begin
2013
                           right_ctrl = zero_right;
2014
                                          alu_ctrl   = alu_lsr8;
2015
                                          acca_ctrl  = load_acca;
2016
                                          cc_ctrl    = load_cc;
2017
                                        end
2018
                         4'b0110: // ror
2019
                                        begin
2020
                           right_ctrl = zero_right;
2021
                                          alu_ctrl   = alu_ror8;
2022
                                          acca_ctrl  = load_acca;
2023
                                          cc_ctrl    = load_cc;
2024
                                        end
2025
                         4'b0111: // asr
2026
                                        begin
2027
                           right_ctrl = zero_right;
2028
                                          alu_ctrl   = alu_asr8;
2029
                                          acca_ctrl  = load_acca;
2030
                                          cc_ctrl    = load_cc;
2031
                                        end
2032
                         4'b1000: // asl
2033
                                        begin
2034
                           right_ctrl = zero_right;
2035
                                          alu_ctrl   = alu_asl8;
2036
                                          acca_ctrl  = load_acca;
2037
                                          cc_ctrl    = load_cc;
2038
                                        end
2039
                         4'b1001: // rol
2040
                                        begin
2041
                           right_ctrl = zero_right;
2042
                                          alu_ctrl   = alu_rol8;
2043
                                          acca_ctrl  = load_acca;
2044
                                          cc_ctrl    = load_cc;
2045
                                        end
2046
                         4'b1010: // dec
2047
                                        begin
2048
                           right_ctrl = plus_one_right;
2049
                                          alu_ctrl   = alu_dec;
2050
                                          acca_ctrl  = load_acca;
2051
                                          cc_ctrl    = load_cc;
2052
                                        end
2053
                         4'b1011: // undefined
2054
                                        begin
2055
                           right_ctrl = zero_right;
2056
                                          alu_ctrl   = alu_nop;
2057
                                          acca_ctrl  = latch_acca;
2058
                                          cc_ctrl    = latch_cc;
2059
                                        end
2060
                         4'b1100: // inc
2061
                                        begin
2062
                           right_ctrl = plus_one_right;
2063
                                          alu_ctrl   = alu_inc;
2064
                                          acca_ctrl  = load_acca;
2065
                                          cc_ctrl    = load_cc;
2066
                                        end
2067
                         4'b1101: // tst
2068
                                        begin
2069
                           right_ctrl = zero_right;
2070 4 Dukov
                                          alu_ctrl   = alu_tst;
2071 2 Dukov
                                          acca_ctrl  = latch_acca;
2072
                                          cc_ctrl    = load_cc;
2073
                                        end
2074
                         4'b1110: // jmp
2075
                                        begin
2076
                           right_ctrl = zero_right;
2077
                                          alu_ctrl   = alu_nop;
2078
                                          acca_ctrl  = latch_acca;
2079
                                          cc_ctrl    = latch_cc;
2080
                                        end
2081
                         4'b1111: // clr
2082
                                        begin
2083
                           right_ctrl = zero_right;
2084
                                          alu_ctrl   = alu_clr;
2085
                                          acca_ctrl  = load_acca;
2086
                                          cc_ctrl    = load_cc;
2087
                                        end
2088
                         default:
2089
                                        begin
2090
                           right_ctrl = zero_right;
2091
                                          alu_ctrl   = alu_nop;
2092
                                          acca_ctrl  = latch_acca;
2093
                                          cc_ctrl    = latch_cc;
2094
                                        end
2095
                         endcase
2096
                                   next_state = fetch_state;
2097
                                        end
2098
                                 //
2099
                                 // single operand acc b
2100
                                 // Do not advance PC
2101
                                 //
2102
                  4'b0101:
2103
                                 begin
2104
                                   md_ctrl    = fetch_first_md;
2105
               acca_ctrl  = latch_acca;
2106
               pc_ctrl    = latch_pc;
2107
                                   ix_ctrl    = latch_ix;
2108
                                   sp_ctrl    = latch_sp;
2109
                         left_ctrl  = accb_left;
2110
                    case (op_code[3:0])
2111
                         4'b0000: // neg
2112
                                        begin
2113
                                          right_ctrl = zero_right;
2114
                                          alu_ctrl   = alu_neg;
2115
                                          accb_ctrl  = load_accb;
2116
                                          cc_ctrl    = load_cc;
2117
                                        end
2118
                    4'b0011: // com
2119
                                        begin
2120
                           right_ctrl = zero_right;
2121
                                          alu_ctrl   = alu_com;
2122
                                          accb_ctrl  = load_accb;
2123
                                          cc_ctrl    = load_cc;
2124
                                        end
2125
                         4'b0100: // lsr
2126
                                        begin
2127
                           right_ctrl = zero_right;
2128
                                          alu_ctrl   = alu_lsr8;
2129
                                          accb_ctrl  = load_accb;
2130
                                          cc_ctrl    = load_cc;
2131
                                        end
2132
                         4'b0110: // ror
2133
                                        begin
2134
                           right_ctrl = zero_right;
2135
                                          alu_ctrl   = alu_ror8;
2136
                                          accb_ctrl  = load_accb;
2137
                                          cc_ctrl    = load_cc;
2138
                                        end
2139
                         4'b0111: // asr
2140
                                        begin
2141
                           right_ctrl = zero_right;
2142
                                          alu_ctrl   = alu_asr8;
2143
                                          accb_ctrl  = load_accb;
2144
                                          cc_ctrl    = load_cc;
2145
                                        end
2146
                         4'b1000: // asl
2147
                                        begin
2148
                           right_ctrl = zero_right;
2149
                                          alu_ctrl   = alu_asl8;
2150
                                          accb_ctrl  = load_accb;
2151
                                          cc_ctrl    = load_cc;
2152
                                        end
2153
                         4'b1001: // rol
2154
                                        begin
2155
                           right_ctrl = zero_right;
2156
                                          alu_ctrl   = alu_rol8;
2157
                                          accb_ctrl  = load_accb;
2158
                                          cc_ctrl    = load_cc;
2159
                                        end
2160
                         4'b1010: // dec
2161
                                        begin
2162
                           right_ctrl = plus_one_right;
2163
                                          alu_ctrl   = alu_dec;
2164
                                          accb_ctrl  = load_accb;
2165
                                          cc_ctrl    = load_cc;
2166
                                        end
2167
                         4'b1011: // undefined
2168
                                        begin
2169
                           right_ctrl = zero_right;
2170
                                          alu_ctrl   = alu_nop;
2171
                                          accb_ctrl  = latch_accb;
2172
                                          cc_ctrl    = latch_cc;
2173
                                        end
2174
                         4'b1100: // inc
2175
                                        begin
2176
                           right_ctrl = plus_one_right;
2177
                                          alu_ctrl   = alu_inc;
2178
                                          accb_ctrl  = load_accb;
2179
                                          cc_ctrl    = load_cc;
2180
                                        end
2181
                         4'b1101: // tst
2182
                                        begin
2183
                           right_ctrl = zero_right;
2184 4 Dukov
                                          alu_ctrl   = alu_tst;
2185 2 Dukov
                                          accb_ctrl  = latch_accb;
2186
                                          cc_ctrl    = load_cc;
2187
                                        end
2188
                         4'b1110: // jmp
2189
                                        begin
2190
                           right_ctrl = zero_right;
2191
                                          alu_ctrl   = alu_nop;
2192
                                          accb_ctrl  = latch_accb;
2193
                                          cc_ctrl    = latch_cc;
2194
                                        end
2195
                         4'b1111: // clr
2196
                                        begin
2197
                           right_ctrl = zero_right;
2198
                                          alu_ctrl   = alu_clr;
2199
                                          accb_ctrl  = load_accb;
2200
                                          cc_ctrl    = load_cc;
2201
                                        end
2202
                         default:
2203
                                        begin
2204
                           right_ctrl = zero_right;
2205
                                          alu_ctrl   = alu_nop;
2206
                                          accb_ctrl  = latch_accb;
2207
                                          cc_ctrl    = latch_cc;
2208
                                        end
2209
                         endcase
2210
                                   next_state = fetch_state;
2211
                                        end
2212
                                 //
2213
                                 // Single operand indexed
2214
                                 // Two byte instruction so advance PC
2215
                                 // EA should hold index offset
2216
                                 //
2217
                  4'b0110: // indexed single op
2218
                                 begin
2219
                                   md_ctrl    = fetch_first_md;
2220
               acca_ctrl  = latch_acca;
2221
                                        accb_ctrl  = latch_accb;
2222
                                   ix_ctrl    = latch_ix;
2223
                                   sp_ctrl    = latch_sp;
2224
                                        // increment the pc
2225
               left_ctrl  = acca_left;
2226
               right_ctrl = zero_right;
2227
               alu_ctrl   = alu_nop;
2228
                                        cc_ctrl    = latch_cc;
2229
               pc_ctrl    = inc_pc;
2230
                                   next_state = indexed_state;
2231
                                end
2232
             //
2233
                                 // Single operand extended addressing
2234
                                 // three byte instruction so advance the PC
2235
                                 // Low order EA holds high order address
2236
                                 //
2237
                  4'b0111: // extended single op
2238
                                 begin
2239
                                   md_ctrl    = fetch_first_md;
2240
               acca_ctrl  = latch_acca;
2241
                                        accb_ctrl  = latch_accb;
2242
                                   ix_ctrl    = latch_ix;
2243
                                   sp_ctrl    = latch_sp;
2244
                                        // increment the pc
2245
               left_ctrl  = acca_left;
2246
               right_ctrl = zero_right;
2247
               alu_ctrl   = alu_nop;
2248
                                        cc_ctrl    = latch_cc;
2249
               pc_ctrl    = inc_pc;
2250
                                   next_state = extended_state;
2251
                                end
2252
 
2253
                  4'b1000: // acca immediate
2254
                                 begin
2255
                                   md_ctrl    = fetch_first_md;
2256
               acca_ctrl  = latch_acca;
2257
                                        accb_ctrl  = latch_accb;
2258
                                   ix_ctrl    = latch_ix;
2259
                                   sp_ctrl    = latch_sp;
2260
                                   // increment the pc
2261
               left_ctrl  = acca_left;
2262
               right_ctrl = zero_right;
2263
               alu_ctrl   = alu_nop;
2264
                                        cc_ctrl    = latch_cc;
2265
               pc_ctrl    = inc_pc;
2266
                                        case (op_code[3:0])
2267
               4'b0011, // subdd #
2268
                                             4'b1100, // cpx #
2269
                                             4'b1110: // lds #
2270
                                          next_state = immediate16_state;
2271
                                        4'b1101: // bsr
2272
                                          next_state = bsr_state;
2273
                                        default:
2274
                                     next_state = fetch_state;
2275
               endcase
2276
                                        end
2277
 
2278
                  4'b1001: // acca direct
2279
                                 begin
2280
               acca_ctrl  = latch_acca;
2281
                                        accb_ctrl  = latch_accb;
2282
                                   ix_ctrl    = latch_ix;
2283
                                   sp_ctrl    = latch_sp;
2284
                                        // increment the pc
2285
               pc_ctrl    = inc_pc;
2286
                                        case (op_code[3:0])
2287
                                        4'b0111:  // staa direct
2288
                                        begin
2289
                 left_ctrl  = acca_left;
2290
                 right_ctrl = zero_right;
2291
                 alu_ctrl   = alu_st8;
2292
                                          cc_ctrl    = latch_cc;
2293
                                     md_ctrl    = load_md;
2294
                                     next_state = write8_state;
2295
                                        end
2296
                                        4'b1111: // sts direct
2297
                                        begin
2298
                 left_ctrl  = sp_left;
2299
                 right_ctrl = zero_right;
2300
                 alu_ctrl   = alu_st16;
2301
                                          cc_ctrl    = latch_cc;
2302
                                     md_ctrl    = load_md;
2303
                                     next_state = write16_state;
2304
                                        end
2305
                                        4'b1101: // jsr direct
2306
                                        begin
2307
                 left_ctrl  = acca_left;
2308
                 right_ctrl = zero_right;
2309
                 alu_ctrl   = alu_nop;
2310
                                          cc_ctrl    = latch_cc;
2311
                                     md_ctrl    = fetch_first_md;
2312
                                          next_state = jsr_state;
2313
                                        end
2314
                                        default:
2315
                                        begin
2316
                 left_ctrl  = acca_left;
2317
                 right_ctrl = zero_right;
2318
                 alu_ctrl   = alu_nop;
2319
                                          cc_ctrl    = latch_cc;
2320
                                     md_ctrl    = fetch_first_md;
2321
                                     next_state = read8_state;
2322
                                        end
2323
               endcase
2324
                                        end
2325
 
2326
                  4'b1010: // acca indexed
2327
                                 begin
2328
                                   md_ctrl    = fetch_first_md;
2329
               acca_ctrl  = latch_acca;
2330
                                        accb_ctrl  = latch_accb;
2331
                                   ix_ctrl    = latch_ix;
2332
                                   sp_ctrl    = latch_sp;
2333
                                        // increment the pc
2334
               left_ctrl  = acca_left;
2335
               right_ctrl = zero_right;
2336
               alu_ctrl   = alu_nop;
2337
                                        cc_ctrl    = latch_cc;
2338
               pc_ctrl    = inc_pc;
2339
                                   next_state = indexed_state;
2340
                                end
2341
 
2342
             4'b1011: // acca extended
2343
                                 begin
2344
                                   md_ctrl    = fetch_first_md;
2345
               acca_ctrl  = latch_acca;
2346
                                        accb_ctrl  = latch_accb;
2347
                                   ix_ctrl    = latch_ix;
2348
                                   sp_ctrl    = latch_sp;
2349
                                        // increment the pc
2350
               left_ctrl  = acca_left;
2351
               right_ctrl = zero_right;
2352
               alu_ctrl   = alu_nop;
2353
                                        cc_ctrl    = latch_cc;
2354
               pc_ctrl    = inc_pc;
2355
                                   next_state = extended_state;
2356
                                end
2357
 
2358
                  4'b1100: // accb immediate
2359
                                 begin
2360
                                   md_ctrl    = fetch_first_md;
2361
               acca_ctrl  = latch_acca;
2362
                                        accb_ctrl  = latch_accb;
2363
                                   ix_ctrl    = latch_ix;
2364
                                   sp_ctrl    = latch_sp;
2365
                                        // increment the pc
2366
               left_ctrl  = acca_left;
2367
               right_ctrl = zero_right;
2368
               alu_ctrl   = alu_nop;
2369
                                        cc_ctrl    = latch_cc;
2370
               pc_ctrl    = inc_pc;
2371
                                        case (op_code[3:0])
2372
               4'b0011, // addd #
2373
                                             4'b1100, // ldd #
2374
                                             4'b1110: // ldx #
2375
                                          next_state = immediate16_state;
2376
                                        default:
2377
                                     next_state = fetch_state;
2378
               endcase
2379
                                        end
2380
 
2381
                  4'b1101: // accb direct
2382
                                 begin
2383
               acca_ctrl  = latch_acca;
2384
                                        accb_ctrl  = latch_accb;
2385
                                   ix_ctrl    = latch_ix;
2386
                                   sp_ctrl    = latch_sp;
2387
                                        // increment the pc
2388
               pc_ctrl    = inc_pc;
2389
                                        case (op_code[3:0])
2390
                                        4'b0111:  // stab direct
2391
                                        begin
2392
                 left_ctrl  = accb_left;
2393
                 right_ctrl = zero_right;
2394
                 alu_ctrl   = alu_st8;
2395
                                          cc_ctrl    = latch_cc;
2396
                                     md_ctrl    = load_md;
2397
                                     next_state = write8_state;
2398
                                        end
2399
                                        4'b1101: // std direct
2400
                                        begin
2401
                 left_ctrl  = accd_left;
2402
                 right_ctrl = zero_right;
2403
                 alu_ctrl   = alu_st16;
2404
                                          cc_ctrl    = latch_cc;
2405
                                     md_ctrl    = load_md;
2406
                                          next_state = write16_state;
2407
                                        end
2408
                                        4'b1111: // stx direct
2409
                                        begin
2410
                 left_ctrl  = ix_left;
2411
                 right_ctrl = zero_right;
2412
                 alu_ctrl   = alu_st16;
2413
                                          cc_ctrl    = latch_cc;
2414
                                     md_ctrl    = load_md;
2415
                                     next_state = write16_state;
2416
                                        end
2417
                                        default:
2418
                                        begin
2419
                 left_ctrl  = acca_left;
2420
                 right_ctrl = zero_right;
2421
                 alu_ctrl   = alu_nop;
2422
                                          cc_ctrl    = latch_cc;
2423
                                     md_ctrl    = fetch_first_md;
2424
                                     next_state = read8_state;
2425
                                        end
2426
               endcase
2427
                                        end
2428
 
2429
                  4'b1110: // accb indexed
2430
                                 begin
2431
                                   md_ctrl    = fetch_first_md;
2432
               acca_ctrl  = latch_acca;
2433
                                        accb_ctrl  = latch_accb;
2434
                                   ix_ctrl    = latch_ix;
2435
                                   sp_ctrl    = latch_sp;
2436
                                        // increment the pc
2437
               left_ctrl  = acca_left;
2438
               right_ctrl = zero_right;
2439
               alu_ctrl   = alu_nop;
2440
                                        cc_ctrl    = latch_cc;
2441
               pc_ctrl    = inc_pc;
2442
                                   next_state = indexed_state;
2443
                                end
2444
 
2445
             4'b1111: // accb extended
2446
                                 begin
2447
                                   md_ctrl    = fetch_first_md;
2448
               acca_ctrl  = latch_acca;
2449
                                        accb_ctrl  = latch_accb;
2450
                                   ix_ctrl    = latch_ix;
2451
                                   sp_ctrl    = latch_sp;
2452
                                        // increment the pc
2453
               left_ctrl  = acca_left;
2454
               right_ctrl = zero_right;
2455
               alu_ctrl   = alu_nop;
2456
                                        cc_ctrl    = latch_cc;
2457
               pc_ctrl    = inc_pc;
2458
                                   next_state = extended_state;
2459
                                end
2460
 
2461
                  default:
2462
                                 begin
2463
                                   md_ctrl    = fetch_first_md;
2464
               acca_ctrl  = latch_acca;
2465
                                        accb_ctrl  = latch_accb;
2466
                                   ix_ctrl    = latch_ix;
2467
                                   sp_ctrl    = latch_sp;
2468
                                        // idle the pc
2469
               left_ctrl  = acca_left;
2470
               right_ctrl = zero_right;
2471
               alu_ctrl   = alu_nop;
2472
                                        cc_ctrl    = latch_cc;
2473
               pc_ctrl    = latch_pc;
2474
                         next_state = fetch_state;
2475
                                end
2476
             endcase
2477
                                 end
2478
 
2479
                          immediate16_state:
2480
                          begin
2481
             acca_ctrl  = latch_acca;
2482
             accb_ctrl  = latch_accb;
2483
             ix_ctrl    = latch_ix;
2484
             sp_ctrl    = latch_sp;
2485
                            op_ctrl    = latch_op;
2486
             iv_ctrl    = latch_iv;
2487
                                 nmi_ctrl   = latch_nmi;
2488
             ea_ctrl    = latch_ea;
2489
                                 //ea_ctrl              = fetch_next_ea;        //steve
2490
                                 // increment pc
2491
             left_ctrl  = acca_left;
2492
             right_ctrl = zero_right;
2493
             alu_ctrl   = alu_nop;
2494
             cc_ctrl    = latch_cc;
2495
             pc_ctrl    = inc_pc;
2496
                                 // fetch next immediate byte
2497
                            md_ctrl    = fetch_next_md;
2498
             addr_ctrl  = fetch_ad;
2499
             dout_ctrl  = md_lo_dout;
2500
                                 next_state = fetch_state;
2501
                        end
2502
           //
2503
                          // ea holds 8 bit index offet
2504
                          // calculate the effective memory address
2505
                          // using the alu
2506
                          //
2507
           indexed_state:
2508
                          begin
2509
             acca_ctrl  = latch_acca;
2510
             accb_ctrl  = latch_accb;
2511
             ix_ctrl    = latch_ix;
2512
             sp_ctrl    = latch_sp;
2513
             pc_ctrl    = latch_pc;
2514
             iv_ctrl    = latch_iv;
2515
                            op_ctrl    = latch_op;
2516
                                 nmi_ctrl   = latch_nmi;
2517
                                 // calculate effective address from index reg
2518
             // index offest is not sign extended
2519
             ea_ctrl    = add_ix_ea;
2520
                                 // idle the bus
2521
             addr_ctrl  = idle_ad;
2522
             dout_ctrl  = md_lo_dout;
2523
                                 // work out next state
2524
                                 case (op_code[7:4])
2525
                                 4'b0110: // single op indexed
2526
                                 begin
2527
               md_ctrl    = latch_md;
2528
                              left_ctrl  = acca_left;
2529
                                   right_ctrl = zero_right;
2530
                                   alu_ctrl   = alu_nop;
2531
               cc_ctrl    = latch_cc;
2532
                    case (op_code[3:0])
2533
                         4'b1011: // undefined
2534
                                          next_state = fetch_state;
2535
                         4'b1110: // jmp
2536
                                          next_state = jmp_state;
2537
                         default:
2538
                                          next_state = read8_state;
2539
                         endcase
2540
                                        end
2541
                  4'b1010: // acca indexed
2542
                                 begin
2543
                                   case (op_code[3:0])
2544
                                        4'b0111:  // staa
2545
                                        begin
2546
                                left_ctrl  = acca_left;
2547
                                     right_ctrl = zero_right;
2548
                                     alu_ctrl   = alu_st8;
2549
                 cc_ctrl    = latch_cc;
2550
                 md_ctrl    = load_md;
2551
                                     next_state = write8_state;
2552
                                        end
2553
                                        4'b1101: // jsr
2554
                                        begin
2555
                                left_ctrl  = acca_left;
2556
                                     right_ctrl = zero_right;
2557
                                     alu_ctrl   = alu_nop;
2558
                 cc_ctrl    = latch_cc;
2559
                 md_ctrl    = latch_md;
2560
                                          next_state = jsr_state;
2561
                                        end
2562
                                        4'b1111: // sts
2563
                                        begin
2564
                                left_ctrl  = sp_left;
2565
                                     right_ctrl = zero_right;
2566
                                     alu_ctrl   = alu_st16;
2567
                 cc_ctrl    = latch_cc;
2568
                 md_ctrl    = load_md;
2569
                                     next_state = write16_state;
2570
                                        end
2571
                                        default:
2572
                                        begin
2573
                                left_ctrl  = acca_left;
2574
                                     right_ctrl = zero_right;
2575
                                     alu_ctrl   = alu_nop;
2576
                 cc_ctrl    = latch_cc;
2577
                 md_ctrl    = latch_md;
2578
                                          next_state = read8_state;
2579
                                          end
2580
                                        endcase
2581
                                        end
2582
                  4'b1110: // accb indexed
2583
                                 begin
2584
                                   case (op_code[3:0])
2585
                                        4'b0111:  // stab direct
2586
                                        begin
2587
                                left_ctrl  = accb_left;
2588
                                     right_ctrl = zero_right;
2589
                                     alu_ctrl   = alu_st8;
2590
                 cc_ctrl    = latch_cc;
2591
                 md_ctrl    = load_md;
2592
                                     next_state = write8_state;
2593
                                        end
2594
                                        4'b1101: // std direct
2595
                                        begin
2596
                                left_ctrl  = accd_left;
2597
                                     right_ctrl = zero_right;
2598
                                     alu_ctrl   = alu_st16;
2599
                 cc_ctrl    = latch_cc;
2600
                 md_ctrl    = load_md;
2601
                                          next_state = write16_state;
2602
                                        end
2603
                                        4'b1111: // stx direct
2604
                                        begin
2605
                                left_ctrl  = ix_left;
2606
                                     right_ctrl = zero_right;
2607
                                     alu_ctrl   = alu_st16;
2608
                 cc_ctrl    = latch_cc;
2609
                 md_ctrl    = load_md;
2610
                                     next_state = write16_state;
2611
                                        end
2612
                                        default:
2613
                                        begin
2614
                                left_ctrl  = acca_left;
2615
                                     right_ctrl = zero_right;
2616
                                     alu_ctrl   = alu_nop;
2617
                 cc_ctrl    = latch_cc;
2618
                 md_ctrl    = latch_md;
2619
                                          next_state = read8_state;
2620
                                        end
2621
                                        endcase
2622
                                        end
2623
                            default:
2624
                                 begin
2625
               md_ctrl    = latch_md;
2626
                              left_ctrl  = acca_left;
2627
                                   right_ctrl = zero_right;
2628
                                   alu_ctrl   = alu_nop;
2629
               cc_ctrl    = latch_cc;
2630
                                        next_state = fetch_state;
2631
                                end
2632
                            endcase
2633
                                 end
2634
           //
2635
                          // ea holds the low byte of the absolute address
2636
                          // Move ea low byte into ea high byte
2637
                          // load new ea low byte to for absolute 16 bit address
2638
                          // advance the program counter
2639
                          //
2640
                          extended_state: // fetch ea low byte
2641
                          begin
2642
               acca_ctrl  = latch_acca;
2643
               accb_ctrl  = latch_accb;
2644
               ix_ctrl    = latch_ix;
2645
               sp_ctrl    = latch_sp;
2646
               iv_ctrl    = latch_iv;
2647
                              op_ctrl    = latch_op;
2648
                                   nmi_ctrl   = latch_nmi;
2649
                                        // increment pc
2650
               pc_ctrl    = inc_pc;
2651
                                        // fetch next effective address bytes
2652
                                        ea_ctrl    = fetch_next_ea;
2653
               addr_ctrl  = fetch_ad;
2654
                                        dout_ctrl  = md_lo_dout;
2655
                                        // work out the next state
2656
                                 case (op_code[7:4])
2657
                                 4'b0111: // single op extended
2658
                                 begin
2659
               md_ctrl    = latch_md;
2660
                              left_ctrl  = acca_left;
2661
                                   right_ctrl = zero_right;
2662
                                   alu_ctrl   = alu_nop;
2663
               cc_ctrl    = latch_cc;
2664
                    case (op_code[3:0])
2665
                         4'b1011: // undefined
2666
                                          next_state = fetch_state;
2667
                         4'b1110: // jmp
2668
                                          next_state = jmp_state;
2669
                         default:
2670
                                          next_state = read8_state;
2671
                         endcase
2672
                                end
2673
                  4'b1011: // acca extended
2674
                                   case (op_code[3:0])
2675
                                        4'b0111:  // staa
2676
                                        begin
2677
                                left_ctrl  = acca_left;
2678
                                     right_ctrl = zero_right;
2679
                                     alu_ctrl   = alu_st8;
2680
                 cc_ctrl    = latch_cc;
2681
                 md_ctrl    = load_md;
2682
                                     next_state = write8_state;
2683
                                        end
2684
                                        4'b1101: // jsr
2685
                                        begin
2686
                                left_ctrl  = acca_left;
2687
                                     right_ctrl = zero_right;
2688
                                     alu_ctrl   = alu_nop;
2689
                 cc_ctrl    = latch_cc;
2690
                 md_ctrl    = latch_md;
2691
                                          next_state = jsr_state;
2692
                                        end
2693
                                        4'b1111: // sts
2694
                                        begin
2695
                                left_ctrl  = sp_left;
2696
                                     right_ctrl = zero_right;
2697
                                     alu_ctrl   = alu_st16;
2698
                 cc_ctrl    = latch_cc;
2699
                 md_ctrl    = load_md;
2700
                                     next_state = write16_state;
2701
                                        end
2702
                                        default:
2703
                                        begin
2704
                                left_ctrl  = acca_left;
2705
                                     right_ctrl = zero_right;
2706
                                     alu_ctrl   = alu_nop;
2707
                 cc_ctrl    = latch_cc;
2708
                 md_ctrl    = latch_md;
2709
                                          next_state = read8_state;
2710
                                        end
2711
                                        endcase
2712
                  4'b1111: // accb extended
2713
                                   case (op_code[3:0])
2714
                                        4'b0111:  // stab
2715
                                        begin
2716
                                left_ctrl  = accb_left;
2717
                                     right_ctrl = zero_right;
2718
                                     alu_ctrl   = alu_st8;
2719
                 cc_ctrl    = latch_cc;
2720
                 md_ctrl    = load_md;
2721
                                     next_state = write8_state;
2722
                                        end
2723
                                        4'b1101: // std
2724
                                        begin
2725
                                left_ctrl  = accd_left;
2726
                                     right_ctrl = zero_right;
2727
                                     alu_ctrl   = alu_st16;
2728
                 cc_ctrl    = latch_cc;
2729
                 md_ctrl    = load_md;
2730
                                          next_state = write16_state;
2731
                                        end
2732
                                        4'b1111: // stx
2733
                                        begin
2734
                                left_ctrl  = ix_left;
2735
                                     right_ctrl = zero_right;
2736
                                     alu_ctrl   = alu_st16;
2737
                 cc_ctrl    = latch_cc;
2738
                 md_ctrl    = load_md;
2739
                                     next_state = write16_state;
2740
                                        end
2741
                                        default:
2742
                                        begin
2743
                                left_ctrl  = acca_left;
2744
                                     right_ctrl = zero_right;
2745
                                     alu_ctrl   = alu_nop;
2746
                 cc_ctrl    = latch_cc;
2747
                 md_ctrl    = latch_md;
2748
                                          next_state = read8_state;
2749
                                        end
2750
                                        endcase
2751
                            default:
2752
                                 begin
2753
               md_ctrl    = latch_md;
2754
                              left_ctrl  = acca_left;
2755
                                   right_ctrl = zero_right;
2756
                                   alu_ctrl   = alu_nop;
2757
               cc_ctrl    = latch_cc;
2758
                                        next_state = fetch_state;
2759
                                end
2760
                            endcase
2761
                                 end
2762
           //
2763
                          // here if ea holds low byte (direct page)
2764
                          // can enter here from extended addressing
2765
                          // read memory location
2766
                          // note that reads may be 8 or 16 bits
2767
                          //
2768
                          read8_state: // read data
2769
                          begin
2770
               acca_ctrl  = latch_acca;
2771
               accb_ctrl  = latch_accb;
2772
               ix_ctrl    = latch_ix;
2773
               sp_ctrl    = latch_sp;
2774
               pc_ctrl    = latch_pc;
2775
               iv_ctrl    = latch_iv;
2776
                              op_ctrl    = latch_op;
2777
                                   nmi_ctrl   = latch_nmi;
2778
                                        //
2779
               addr_ctrl  = read_ad;
2780
                                        dout_ctrl  = md_lo_dout;
2781
                                        case (op_code[7:4])
2782
                                          4'b0110, 4'b0111: // single operand
2783
                                          begin
2784
                                              left_ctrl  = acca_left;
2785
                                              right_ctrl = zero_right;
2786
                                              alu_ctrl   = alu_nop;
2787
                     cc_ctrl    = latch_cc;
2788
                                         md_ctrl    = fetch_first_md;
2789
                                              ea_ctrl    = latch_ea;
2790
                                              next_state = execute_state;
2791
                                                end
2792
 
2793
                      4'b1001, 4'b1010, 4'b1011: // acca
2794
                                       case (op_code[3:0])
2795
                                            4'b0011,  // subd
2796
                                                 4'b1110,  // lds
2797
                                                 4'b1100: // cpx
2798
                                                begin
2799
                                              left_ctrl  = acca_left;
2800
                                              right_ctrl = zero_right;
2801
                                              alu_ctrl   = alu_nop;
2802
                     cc_ctrl    = latch_cc;
2803
                                         md_ctrl    = fetch_first_md;
2804
                                         // increment the effective address in case of 16 bit load
2805
                                              ea_ctrl    = inc_ea;
2806
                                              next_state = read16_state;
2807
                                                end
2808
                                            default:
2809
                                                 begin
2810
                                              left_ctrl  = acca_left;
2811
                                              right_ctrl = zero_right;
2812
                                              alu_ctrl   = alu_nop;
2813
                     cc_ctrl    = latch_cc;
2814
                                         md_ctrl    = fetch_first_md;
2815
                                              ea_ctrl    = latch_ea;
2816
                                              next_state = fetch_state;
2817
                                                end
2818
                                            endcase
2819
 
2820
                      4'b1101, 4'b1110, 4'b1111: // accb
2821
                                       case (op_code[3:0])
2822
                                            4'b0011,  // addd
2823
                                                 4'b1100,  // ldd
2824
                                                 4'b1110: // ldx
2825
                                                begin
2826
                                              left_ctrl  = acca_left;
2827
                                              right_ctrl = zero_right;
2828
                                              alu_ctrl   = alu_nop;
2829
                     cc_ctrl    = latch_cc;
2830
                                         md_ctrl    = fetch_first_md;
2831
                                         // increment the effective address in case of 16 bit load
2832
                                              ea_ctrl    = inc_ea;
2833
                                              next_state = read16_state;
2834
                                                end
2835
                                            default:
2836
                                                 begin
2837
                                              left_ctrl  = acca_left;
2838
                                              right_ctrl = zero_right;
2839
                                              alu_ctrl   = alu_nop;
2840
                     cc_ctrl    = latch_cc;
2841
                                         md_ctrl    = fetch_first_md;
2842
                                              ea_ctrl    = latch_ea;
2843
                                              next_state = execute_state;
2844
                                                end
2845
                                            endcase
2846
                                          default:
2847
                                          begin
2848
                                            left_ctrl  = acca_left;
2849
                                            right_ctrl = zero_right;
2850
                                            alu_ctrl   = alu_nop;
2851
                   cc_ctrl    = latch_cc;
2852
                                       md_ctrl    = fetch_first_md;
2853
                                            ea_ctrl    = latch_ea;
2854
                                            next_state = fetch_state;
2855
                                                end
2856
                                          endcase
2857
                                          end
2858
 
2859
                           read16_state: // read second data byte from ea
2860
                                begin
2861
                 // default
2862
                 acca_ctrl  = latch_acca;
2863
                 accb_ctrl  = latch_accb;
2864
                 ix_ctrl    = latch_ix;
2865
                 sp_ctrl    = latch_sp;
2866
                 pc_ctrl    = latch_pc;
2867
                 iv_ctrl    = latch_iv;
2868
                                op_ctrl    = latch_op;
2869
                                     nmi_ctrl   = latch_nmi;
2870
                 left_ctrl  = acca_left;
2871
                 right_ctrl = zero_right;
2872
                 alu_ctrl   = alu_nop;
2873
                 cc_ctrl    = latch_cc;
2874
                                          // idle the effective address
2875
                 ea_ctrl    = latch_ea;
2876
                                          // read the low byte of the 16 bit data
2877
                                     md_ctrl    = fetch_next_md;
2878
                 addr_ctrl  = read_ad;
2879
                 dout_ctrl  = md_lo_dout;
2880
                                          next_state = fetch_state;
2881
                                end
2882
           //
2883
                          // 16 bit Write state
2884
                          // write high byte of ALU output.
2885
                          // EA hold address of memory to write to
2886
                          // Advance the effective address in ALU
2887
                          //
2888
                          write16_state:
2889
                          begin
2890
                                 // default
2891
             acca_ctrl  = latch_acca;
2892
             accb_ctrl  = latch_accb;
2893
             ix_ctrl    = latch_ix;
2894
             sp_ctrl    = latch_sp;
2895
             pc_ctrl    = latch_pc;
2896
             md_ctrl    = latch_md;
2897
             iv_ctrl    = latch_iv;
2898
                            op_ctrl    = latch_op;
2899
                                 nmi_ctrl   = latch_nmi;
2900
                                 // increment the effective address
2901
                                 left_ctrl  = acca_left;
2902
                                 right_ctrl = zero_right;
2903
                                 alu_ctrl   = alu_nop;
2904
             cc_ctrl    = latch_cc;
2905
                            ea_ctrl    = inc_ea;
2906
                                 // write the ALU hi byte to ea
2907
             addr_ctrl  = write_ad;
2908
             dout_ctrl  = md_hi_dout;
2909
                                 next_state = write8_state;
2910
                                end
2911
           //
2912
                          // 8 bit write
2913
                          // Write low 8 bits of ALU output
2914
                          //
2915
                          write8_state:
2916
                          begin
2917
                                 // default registers
2918
             acca_ctrl  = latch_acca;
2919
             accb_ctrl  = latch_accb;
2920
             ix_ctrl    = latch_ix;
2921
             sp_ctrl    = latch_sp;
2922
             pc_ctrl    = latch_pc;
2923
             md_ctrl    = latch_md;
2924
             iv_ctrl    = latch_iv;
2925
                            op_ctrl    = latch_op;
2926
                                 nmi_ctrl   = latch_nmi;
2927
             ea_ctrl    = latch_ea;
2928
                                 // idle the ALU
2929
             left_ctrl  = acca_left;
2930
             right_ctrl = zero_right;
2931
             alu_ctrl   = alu_nop;
2932
             cc_ctrl    = latch_cc;
2933
                                 // write ALU low byte output
2934
             addr_ctrl  = write_ad;
2935
             dout_ctrl  = md_lo_dout;
2936
                                 next_state = fetch_state;
2937
                                end
2938
 
2939
                                jmp_state:
2940
                                begin
2941
                 acca_ctrl  = latch_acca;
2942
                 accb_ctrl  = latch_accb;
2943
                 ix_ctrl    = latch_ix;
2944
                 sp_ctrl    = latch_sp;
2945
                 md_ctrl    = latch_md;
2946
                 iv_ctrl    = latch_iv;
2947
                                op_ctrl    = latch_op;
2948
                                     nmi_ctrl   = latch_nmi;
2949
                 ea_ctrl    = latch_ea;
2950
                                          // load PC with effective address
2951
                 left_ctrl  = acca_left;
2952
                                          right_ctrl = zero_right;
2953
                                     alu_ctrl   = alu_nop;
2954
                 cc_ctrl    = latch_cc;
2955
                                          pc_ctrl    = load_ea_pc;
2956
                                          // idle the bus
2957
                 addr_ctrl  = idle_ad;
2958
                 dout_ctrl  = md_lo_dout;
2959
                 next_state = fetch_state;
2960
                                        end
2961
 
2962
                                jsr_state: // JSR
2963
                                begin
2964
                 acca_ctrl  = latch_acca;
2965
                 accb_ctrl  = latch_accb;
2966
                 ix_ctrl    = latch_ix;
2967
                 sp_ctrl    = latch_sp;
2968
                 pc_ctrl    = latch_pc;
2969
                 md_ctrl    = latch_md;
2970
                 iv_ctrl    = latch_iv;
2971
                                op_ctrl    = latch_op;
2972
                                     nmi_ctrl   = latch_nmi;
2973
                 ea_ctrl    = latch_ea;
2974
                 // decrement sp
2975
                 left_ctrl  = sp_left;
2976
                 right_ctrl = plus_one_right;
2977
                 alu_ctrl   = alu_sub16;
2978
                 cc_ctrl    = latch_cc;
2979
                 sp_ctrl    = load_sp;
2980
                                          // write pc low
2981
                 addr_ctrl  = push_ad;
2982
                                          dout_ctrl  = pc_lo_dout;
2983
                 next_state = jsr1_state;
2984
                                        end
2985
 
2986
                                jsr1_state: // JSR
2987
                                begin
2988
                 acca_ctrl  = latch_acca;
2989
                 accb_ctrl  = latch_accb;
2990
                 ix_ctrl    = latch_ix;
2991
                 pc_ctrl    = latch_pc;
2992
                 md_ctrl    = latch_md;
2993
                 iv_ctrl    = latch_iv;
2994
                                op_ctrl    = latch_op;
2995
                                     nmi_ctrl   = latch_nmi;
2996
                 ea_ctrl    = latch_ea;
2997
                 // decrement sp
2998
                 left_ctrl  = sp_left;
2999
                 right_ctrl = plus_one_right;
3000
                 alu_ctrl   = alu_sub16;
3001
                 cc_ctrl    = latch_cc;
3002
                 sp_ctrl    = load_sp;
3003
                                          // write pc hi
3004
                 addr_ctrl  = push_ad;
3005
                                          dout_ctrl  = pc_hi_dout;
3006
                 next_state = jmp_state;
3007
                                        end
3008
 
3009
                                branch_state: // Bcc
3010
                                begin
3011
                                     // default registers
3012
                 acca_ctrl  = latch_acca;
3013
                 accb_ctrl  = latch_accb;
3014
                 ix_ctrl    = latch_ix;
3015
                 sp_ctrl    = latch_sp;
3016
                 md_ctrl    = latch_md;
3017
                 iv_ctrl    = latch_iv;
3018
                                op_ctrl    = latch_op;
3019
                                     nmi_ctrl   = latch_nmi;
3020
                 ea_ctrl    = latch_ea;
3021
                                          // calculate signed branch
3022
                                          left_ctrl  = acca_left;
3023
                                          right_ctrl = zero_right;
3024
                                     alu_ctrl   = alu_nop;
3025
                 cc_ctrl    = latch_cc;
3026
                                          pc_ctrl    = add_ea_pc;
3027
                                          // idle the bus
3028
                 addr_ctrl  = idle_ad;
3029
                 dout_ctrl  = md_lo_dout;
3030
                 next_state = fetch_state;
3031
                                        end
3032
 
3033
                                bsr_state: // BSR
3034
                                begin
3035
                                     // default
3036
                 acca_ctrl  = latch_acca;
3037
                 accb_ctrl  = latch_accb;
3038
                 ix_ctrl    = latch_ix;
3039
                 pc_ctrl    = latch_pc;
3040
                 md_ctrl    = latch_md;
3041
                 iv_ctrl    = latch_iv;
3042
                                op_ctrl    = latch_op;
3043
                                     nmi_ctrl   = latch_nmi;
3044
                 ea_ctrl    = latch_ea;
3045
                 // decrement sp
3046
                 left_ctrl  = sp_left;
3047
                 right_ctrl = plus_one_right;
3048
                 alu_ctrl   = alu_sub16;
3049
                 cc_ctrl    = latch_cc;
3050
                 sp_ctrl    = load_sp;
3051
                                          // write pc low
3052
                 addr_ctrl  = push_ad;
3053
                                          dout_ctrl  = pc_lo_dout;
3054
                 next_state = bsr1_state;
3055
                                        end
3056
 
3057
                                bsr1_state: // BSR
3058
                                begin
3059
                                     // default registers
3060
                 acca_ctrl  = latch_acca;
3061
                 accb_ctrl  = latch_accb;
3062
                 ix_ctrl    = latch_ix;
3063
                 pc_ctrl    = latch_pc;
3064
                 md_ctrl    = latch_md;
3065
                 iv_ctrl    = latch_iv;
3066
                                op_ctrl    = latch_op;
3067
                                     nmi_ctrl   = latch_nmi;
3068
                 ea_ctrl    = latch_ea;
3069
                 // decrement sp
3070
                 left_ctrl  = sp_left;
3071
                 right_ctrl = plus_one_right;
3072
                 alu_ctrl   = alu_sub16;
3073
                 cc_ctrl    = latch_cc;
3074
                 sp_ctrl    = load_sp;
3075
                                          // write pc hi
3076
                 addr_ctrl  = push_ad;
3077
                                          dout_ctrl  = pc_hi_dout;
3078
                 next_state = branch_state;
3079
                                        end
3080
 
3081
                                 rts_hi_state: // RTS
3082
                                 begin
3083
                                     // default
3084
                 acca_ctrl  = latch_acca;
3085
                 accb_ctrl  = latch_accb;
3086
                 ix_ctrl    = latch_ix;
3087
                 pc_ctrl    = latch_pc;
3088
                 md_ctrl    = latch_md;
3089
                 iv_ctrl    = latch_iv;
3090
                                op_ctrl    = latch_op;
3091
                                     nmi_ctrl   = latch_nmi;
3092
                 ea_ctrl    = latch_ea;
3093
                                          // increment the sp
3094
                 left_ctrl  = sp_left;
3095
                 right_ctrl = plus_one_right;
3096
                 alu_ctrl   = alu_add16;
3097
                 cc_ctrl    = latch_cc;
3098
                 sp_ctrl    = load_sp;
3099
                 // read pc hi
3100
                                          pc_ctrl    = pull_hi_pc;
3101
                 addr_ctrl  = pull_ad;
3102
                 dout_ctrl  = pc_hi_dout;
3103
                 next_state = rts_lo_state;
3104
                                        end
3105
 
3106
                                rts_lo_state: // RTS1
3107
                                begin
3108
                                     // default
3109
                 acca_ctrl  = latch_acca;
3110
                 accb_ctrl  = latch_accb;
3111
                 ix_ctrl    = latch_ix;
3112
                 sp_ctrl    = latch_sp;
3113
                 md_ctrl    = latch_md;
3114
                 iv_ctrl    = latch_iv;
3115
                                op_ctrl    = latch_op;
3116
                                     nmi_ctrl   = latch_nmi;
3117
                 ea_ctrl    = latch_ea;
3118
                                          // idle the ALU
3119
                 left_ctrl  = acca_left;
3120
                 right_ctrl = zero_right;
3121
                 alu_ctrl   = alu_nop;
3122
                 cc_ctrl    = latch_cc;
3123
                                          // read pc low
3124
                                          pc_ctrl    = pull_lo_pc;
3125
                 addr_ctrl  = pull_ad;
3126
                 dout_ctrl  = pc_lo_dout;
3127
                 next_state = fetch_state;
3128
                                        end
3129
 
3130
                                 mul_state:
3131
                                 begin
3132
                                     // default
3133
                 acca_ctrl  = latch_acca;
3134
                 accb_ctrl  = latch_accb;
3135
                 ix_ctrl    = latch_ix;
3136
                 sp_ctrl    = latch_sp;
3137
                 pc_ctrl    = latch_pc;
3138
                 iv_ctrl    = latch_iv;
3139
                                op_ctrl    = latch_op;
3140
                                     nmi_ctrl   = latch_nmi;
3141
                 ea_ctrl    = latch_ea;
3142
                                          // move acca to md
3143
                 left_ctrl  = acca_left;
3144
                 right_ctrl = zero_right;
3145
                 alu_ctrl   = alu_st16;
3146
                 cc_ctrl    = latch_cc;
3147
                 md_ctrl    = load_md;
3148
                                          // idle bus
3149
                 addr_ctrl  = idle_ad;
3150
                 dout_ctrl  = md_lo_dout;
3151
                                     next_state = mulea_state;
3152
                                        end
3153
 
3154
                                 mulea_state:
3155
                                 begin
3156
                                     // default
3157
                 acca_ctrl  = latch_acca;
3158
                 accb_ctrl  = latch_accb;
3159
                 ix_ctrl    = latch_ix;
3160
                 sp_ctrl    = latch_sp;
3161
                 pc_ctrl    = latch_pc;
3162
                 iv_ctrl    = latch_iv;
3163
                                op_ctrl    = latch_op;
3164
                                     nmi_ctrl   = latch_nmi;
3165
                 md_ctrl    = latch_md;
3166
                                          // idle ALU
3167
                 left_ctrl  = acca_left;
3168
                 right_ctrl = zero_right;
3169
                 alu_ctrl   = alu_nop;
3170
                 cc_ctrl    = latch_cc;
3171
                                          // move accb to ea
3172
                 ea_ctrl    = load_accb_ea;
3173
                                          // idle bus
3174
                 addr_ctrl  = idle_ad;
3175
                 dout_ctrl  = md_lo_dout;
3176
                                     next_state = muld_state;
3177
                                        end
3178
 
3179
                                 muld_state:
3180
                                 begin
3181
                                     // default
3182
                 ix_ctrl    = latch_ix;
3183
                 sp_ctrl    = latch_sp;
3184
                 pc_ctrl    = latch_pc;
3185
                 iv_ctrl    = latch_iv;
3186
                                op_ctrl    = latch_op;
3187
                                     nmi_ctrl   = latch_nmi;
3188
                 ea_ctrl    = latch_ea;
3189
                 md_ctrl    = latch_md;
3190
                                          // clear accd
3191
                 left_ctrl  = acca_left;
3192
                 right_ctrl = zero_right;
3193
                 alu_ctrl   = alu_ld8;
3194
                 cc_ctrl    = latch_cc;
3195
                 acca_ctrl  = load_hi_acca;
3196
                 accb_ctrl  = load_accb;
3197
                                          // idle bus
3198
                 addr_ctrl  = idle_ad;
3199
                 dout_ctrl  = md_lo_dout;
3200
                                     next_state = mul0_state;
3201
                                        end
3202
 
3203
                                 mul0_state:
3204
                                 begin
3205
                                     // default
3206
                 ix_ctrl    = latch_ix;
3207
                 sp_ctrl    = latch_sp;
3208
                 pc_ctrl    = latch_pc;
3209
                 iv_ctrl    = latch_iv;
3210
                                op_ctrl    = latch_op;
3211
                                     nmi_ctrl   = latch_nmi;
3212
                 ea_ctrl    = latch_ea;
3213
                                          // if bit 0 of ea set, add accd to md
3214
                 left_ctrl  = accd_left;
3215
                 right_ctrl = md_right;
3216
                 alu_ctrl   = alu_add16;
3217
                                          if (ea[0] == 1'b1)
3218
                                          begin
3219
                   cc_ctrl    = load_cc;
3220
                   acca_ctrl  = load_hi_acca;
3221
                   accb_ctrl  = load_accb;
3222
                                          end
3223
                                          else
3224
                                          begin
3225
                   cc_ctrl    = latch_cc;
3226
                   acca_ctrl  = latch_acca;
3227
                   accb_ctrl  = latch_accb;
3228
                                          end
3229
                 md_ctrl    = shiftl_md;
3230
                                          // idle bus
3231
                 addr_ctrl  = idle_ad;
3232
                 dout_ctrl  = md_lo_dout;
3233
                                     next_state = mul1_state;
3234
                                        end
3235
 
3236
                                 mul1_state:
3237
                                 begin
3238
                                     // default
3239
                 ix_ctrl    = latch_ix;
3240
                 sp_ctrl    = latch_sp;
3241
                 pc_ctrl    = latch_pc;
3242
                 iv_ctrl    = latch_iv;
3243
                                op_ctrl    = latch_op;
3244
                                     nmi_ctrl   = latch_nmi;
3245
                 ea_ctrl    = latch_ea;
3246
                                          // if bit 1 of ea set, add accd to md
3247
                 left_ctrl  = accd_left;
3248
                 right_ctrl = md_right;
3249
                 alu_ctrl   = alu_add16;
3250
                                          if (ea[1] == 1'b1)
3251
                                          begin
3252
                   cc_ctrl    = load_cc;
3253
                   acca_ctrl  = load_hi_acca;
3254
                   accb_ctrl  = load_accb;
3255
                                          end
3256
                                          else
3257
                                          begin
3258
                   cc_ctrl    = latch_cc;
3259
                   acca_ctrl  = latch_acca;
3260
                   accb_ctrl  = latch_accb;
3261
                                          end
3262
                 md_ctrl    = shiftl_md;
3263
                                          // idle bus
3264
                 addr_ctrl  = idle_ad;
3265
                 dout_ctrl  = md_lo_dout;
3266
                                     next_state = mul2_state;
3267
                                        end
3268
 
3269
                                 mul2_state:
3270
                                 begin
3271
                                     // default
3272
                 ix_ctrl    = latch_ix;
3273
                 sp_ctrl    = latch_sp;
3274
                 pc_ctrl    = latch_pc;
3275
                 iv_ctrl    = latch_iv;
3276
                                op_ctrl    = latch_op;
3277
                                     nmi_ctrl   = latch_nmi;
3278
                 ea_ctrl    = latch_ea;
3279
                                          // if bit 2 of ea set, add accd to md
3280
                 left_ctrl  = accd_left;
3281
                 right_ctrl = md_right;
3282
                 alu_ctrl   = alu_add16;
3283
                                          if (ea[2] == 1'b1)
3284
                                          begin
3285
                   cc_ctrl    = load_cc;
3286
                   acca_ctrl  = load_hi_acca;
3287
                   accb_ctrl  = load_accb;
3288
                                          end
3289
                                          else
3290
                                          begin
3291
                   cc_ctrl    = latch_cc;
3292
                   acca_ctrl  = latch_acca;
3293
                   accb_ctrl  = latch_accb;
3294
                                          end
3295
                 md_ctrl    = shiftl_md;
3296
                                          // idle bus
3297
                 addr_ctrl  = idle_ad;
3298
                 dout_ctrl  = md_lo_dout;
3299
                                     next_state = mul3_state;
3300
                                        end
3301
 
3302
                                 mul3_state:
3303
                                 begin
3304
                                     // default
3305
                 ix_ctrl    = latch_ix;
3306
                 sp_ctrl    = latch_sp;
3307
                 pc_ctrl    = latch_pc;
3308
                 iv_ctrl    = latch_iv;
3309
                                op_ctrl    = latch_op;
3310
                                     nmi_ctrl   = latch_nmi;
3311
                 ea_ctrl    = latch_ea;
3312
                                          // if bit 3 of ea set, add accd to md
3313
                 left_ctrl  = accd_left;
3314
                 right_ctrl = md_right;
3315
                 alu_ctrl   = alu_add16;
3316
                                          if (ea[3] == 1'b1)
3317
                                          begin
3318
                   cc_ctrl    = load_cc;
3319
                   acca_ctrl  = load_hi_acca;
3320
                   accb_ctrl  = load_accb;
3321
                                          end
3322
                                          else
3323
                                          begin
3324
                   cc_ctrl    = latch_cc;
3325
                   acca_ctrl  = latch_acca;
3326
                   accb_ctrl  = latch_accb;
3327
                                          end
3328
                 md_ctrl    = shiftl_md;
3329
                                          // idle bus
3330
                 addr_ctrl  = idle_ad;
3331
                 dout_ctrl  = md_lo_dout;
3332
                                     next_state = mul4_state;
3333
                                        end
3334
 
3335
                                 mul4_state:
3336
                                 begin
3337
                                     // default
3338
                 ix_ctrl    = latch_ix;
3339
                 sp_ctrl    = latch_sp;
3340
                 pc_ctrl    = latch_pc;
3341
                 iv_ctrl    = latch_iv;
3342
                                op_ctrl    = latch_op;
3343
                                     nmi_ctrl   = latch_nmi;
3344
                 ea_ctrl    = latch_ea;
3345
                                          // if bit 4 of ea set, add accd to md
3346
                 left_ctrl  = accd_left;
3347
                 right_ctrl = md_right;
3348
                 alu_ctrl   = alu_add16;
3349
                                          if (ea[4] == 1'b1)
3350
                                          begin
3351
                   cc_ctrl    = load_cc;
3352
                   acca_ctrl  = load_hi_acca;
3353
                   accb_ctrl  = load_accb;
3354
                                          end
3355
                                          else
3356
                                          begin
3357
                   cc_ctrl    = latch_cc;
3358
                   acca_ctrl  = latch_acca;
3359
                   accb_ctrl  = latch_accb;
3360
                                          end
3361
                 md_ctrl    = shiftl_md;
3362
                                          // idle bus
3363
                 addr_ctrl  = idle_ad;
3364
                 dout_ctrl  = md_lo_dout;
3365
                                     next_state = mul5_state;
3366
                                        end
3367
 
3368
                                 mul5_state:
3369
                                 begin
3370
                                     // default
3371
                 ix_ctrl    = latch_ix;
3372
                 sp_ctrl    = latch_sp;
3373
                 pc_ctrl    = latch_pc;
3374
                 iv_ctrl    = latch_iv;
3375
                                op_ctrl    = latch_op;
3376
                                     nmi_ctrl   = latch_nmi;
3377
                 ea_ctrl    = latch_ea;
3378
                                          // if bit 5 of ea set, add accd to md
3379
                 left_ctrl  = accd_left;
3380
                 right_ctrl = md_right;
3381
                 alu_ctrl   = alu_add16;
3382
                                          if (ea[5] == 1'b1)
3383
                                          begin
3384
                   cc_ctrl    = load_cc;
3385
                   acca_ctrl  = load_hi_acca;
3386
                   accb_ctrl  = load_accb;
3387
                                          end
3388
                                          else
3389
                                          begin
3390
                   cc_ctrl    = latch_cc;
3391
                   acca_ctrl  = latch_acca;
3392
                   accb_ctrl  = latch_accb;
3393
                                          end
3394
                 md_ctrl    = shiftl_md;
3395
                                          // idle bus
3396
                 addr_ctrl  = idle_ad;
3397
                 dout_ctrl  = md_lo_dout;
3398
                                     next_state = mul6_state;
3399
                                        end
3400
 
3401
                                 mul6_state:
3402
                                 begin
3403
                                     // default
3404
                 ix_ctrl    = latch_ix;
3405
                 sp_ctrl    = latch_sp;
3406
                 pc_ctrl    = latch_pc;
3407
                 iv_ctrl    = latch_iv;
3408
                                op_ctrl    = latch_op;
3409
                                     nmi_ctrl   = latch_nmi;
3410
                 ea_ctrl    = latch_ea;
3411
                                          // if bit 6 of ea set, add accd to md
3412
                 left_ctrl  = accd_left;
3413
                 right_ctrl = md_right;
3414
                 alu_ctrl   = alu_add16;
3415
                                          if (ea[6] == 1'b1)
3416
                                          begin
3417
                   cc_ctrl    = load_cc;
3418
                   acca_ctrl  = load_hi_acca;
3419
                   accb_ctrl  = load_accb;
3420
                                          end
3421
                                          else
3422
                                          begin
3423
                   cc_ctrl    = latch_cc;
3424
                   acca_ctrl  = latch_acca;
3425
                   accb_ctrl  = latch_accb;
3426
                                          end
3427
                 md_ctrl    = shiftl_md;
3428
                                          // idle bus
3429
                 addr_ctrl  = idle_ad;
3430
                 dout_ctrl  = md_lo_dout;
3431
                                     next_state = mul7_state;
3432
                                        end
3433
 
3434
                                 mul7_state:
3435
                                 begin
3436
                                     // default
3437
                 ix_ctrl    = latch_ix;
3438
                 sp_ctrl    = latch_sp;
3439
                 pc_ctrl    = latch_pc;
3440
                 iv_ctrl    = latch_iv;
3441
                                op_ctrl    = latch_op;
3442
                                     nmi_ctrl   = latch_nmi;
3443
                 ea_ctrl    = latch_ea;
3444
                                          // if bit 7 of ea set, add accd to md
3445
                 left_ctrl  = accd_left;
3446
                 right_ctrl = md_right;
3447
                 alu_ctrl   = alu_add16;
3448
                                          if (ea[7] == 1'b1)
3449
                                          begin
3450
                   cc_ctrl    = load_cc;
3451
                   acca_ctrl  = load_hi_acca;
3452
                   accb_ctrl  = load_accb;
3453
                                          end
3454
                                          else
3455
                                          begin
3456
                   cc_ctrl    = latch_cc;
3457
                   acca_ctrl  = latch_acca;
3458
                   accb_ctrl  = latch_accb;
3459
                                          end
3460
                 md_ctrl    = shiftl_md;
3461
                                          // idle bus
3462
                 addr_ctrl  = idle_ad;
3463
                 dout_ctrl  = md_lo_dout;
3464
                                     next_state = fetch_state;
3465
                                        end
3466
 
3467
                            execute_state: // execute single operand instruction
3468
                                 begin
3469
                                   // default
3470
                              op_ctrl    = latch_op;
3471
                                   nmi_ctrl   = latch_nmi;
3472
                              case (op_code[7:4])
3473
                    4'b0110, // indexed single op
3474
                         4'b0111: // extended single op
3475
                                        begin
3476
                 acca_ctrl  = latch_acca;
3477
                 accb_ctrl  = latch_accb;
3478
                 ix_ctrl    = latch_ix;
3479
                 sp_ctrl    = latch_sp;
3480
                 pc_ctrl    = latch_pc;
3481
                 iv_ctrl    = latch_iv;
3482
                 ea_ctrl    = latch_ea;
3483
                                          // idle the bus
3484
                 addr_ctrl  = idle_ad;
3485
                 dout_ctrl  = md_lo_dout;
3486
                      case (op_code[3:0])
3487
                           4'b0000: // neg
3488
                                          begin
3489
                   left_ctrl  = md_left;
3490
                                            right_ctrl = zero_right;
3491
                                            alu_ctrl   = alu_neg;
3492
                                            cc_ctrl    = load_cc;
3493
                                       md_ctrl    = load_md;
3494
                                       next_state = write8_state;
3495
                                        end
3496
                      4'b0011: // com
3497
                                          begin
3498
                   left_ctrl  = md_left;
3499
                             right_ctrl = zero_right;
3500
                                            alu_ctrl   = alu_com;
3501
                                            cc_ctrl    = load_cc;
3502
                                       md_ctrl    = load_md;
3503
                                       next_state = write8_state;
3504
                                                end
3505
                           4'b0100: // lsr
3506
                                          begin
3507
                   left_ctrl  = md_left;
3508
                                                 right_ctrl = zero_right;
3509
                                            alu_ctrl   = alu_lsr8;
3510
                                            cc_ctrl    = load_cc;
3511
                                       md_ctrl    = load_md;
3512
                                       next_state = write8_state;
3513
                                                end
3514
                           4'b0110: // ror
3515
                                          begin
3516
                   left_ctrl  = md_left;
3517
                                                 right_ctrl = zero_right;
3518
                                            alu_ctrl   = alu_ror8;
3519
                                            cc_ctrl    = load_cc;
3520
                                       md_ctrl    = load_md;
3521
                                       next_state = write8_state;
3522
                                                end
3523
                           4'b0111: // asr
3524
                                          begin
3525
                   left_ctrl  = md_left;
3526
                                                 right_ctrl = zero_right;
3527
                                            alu_ctrl   = alu_asr8;
3528
                                            cc_ctrl    = load_cc;
3529
                                       md_ctrl    = load_md;
3530
                                       next_state = write8_state;
3531
                                                end
3532
                           4'b1000: // asl
3533
                                          begin
3534
                   left_ctrl  = md_left;
3535
                                                 right_ctrl = zero_right;
3536
                                            alu_ctrl   = alu_asl8;
3537
                                            cc_ctrl    = load_cc;
3538
                                       md_ctrl    = load_md;
3539
                                       next_state = write8_state;
3540
                                                end
3541
                           4'b1001: // rol
3542
                                          begin
3543
                   left_ctrl  = md_left;
3544
                                                 right_ctrl = zero_right;
3545
                                            alu_ctrl   = alu_rol8;
3546
                                            cc_ctrl    = load_cc;
3547
                                       md_ctrl    = load_md;
3548
                                       next_state = write8_state;
3549
                                                end
3550
                           4'b1010: // dec
3551
                                          begin
3552
                   left_ctrl  = md_left;
3553
                             right_ctrl = plus_one_right;
3554
                                            alu_ctrl   = alu_dec;
3555
                                            cc_ctrl    = load_cc;
3556
                                       md_ctrl    = load_md;
3557
                                       next_state = write8_state;
3558
                                                end
3559
                           4'b1011: // undefined
3560
                                          begin
3561
                   left_ctrl  = md_left;
3562
                                                 right_ctrl = zero_right;
3563
                                            alu_ctrl   = alu_nop;
3564
                                            cc_ctrl    = latch_cc;
3565
                                       md_ctrl    = latch_md;
3566
                                       next_state = fetch_state;
3567
                                                end
3568
                           4'b1100: // inc
3569
                                          begin
3570
                   left_ctrl  = md_left;
3571
                             right_ctrl = plus_one_right;
3572
                                            alu_ctrl   = alu_inc;
3573
                                            cc_ctrl    = load_cc;
3574
                                       md_ctrl    = load_md;
3575
                                       next_state = write8_state;
3576
                                                end
3577
                           4'b1101: // tst
3578
                                          begin
3579
                   left_ctrl  = md_left;
3580
                             right_ctrl = zero_right;
3581 4 Dukov
                                            alu_ctrl   = alu_tst;
3582 2 Dukov
                                            cc_ctrl    = load_cc;
3583
                                       md_ctrl    = latch_md;
3584
                                       next_state = fetch_state;
3585
                                                end
3586
                           4'b1110: // jmp
3587
                                          begin
3588
                   left_ctrl  = md_left;
3589
                                                 right_ctrl = zero_right;
3590
                                            alu_ctrl   = alu_nop;
3591
                                            cc_ctrl    = latch_cc;
3592
                                       md_ctrl    = latch_md;
3593
                                       next_state = fetch_state;
3594
                                                end
3595
                           4'b1111: // clr
3596
                                          begin
3597
                   left_ctrl  = md_left;
3598
                                                 right_ctrl = zero_right;
3599
                                            alu_ctrl   = alu_clr;
3600
                                            cc_ctrl    = load_cc;
3601
                                       md_ctrl    = load_md;
3602
                                       next_state = write8_state;
3603
                                                end
3604
                           default:
3605
                                          begin
3606
                   left_ctrl  = md_left;
3607
                                                 right_ctrl = zero_right;
3608
                                            alu_ctrl   = alu_nop;
3609
                                            cc_ctrl    = latch_cc;
3610
                                       md_ctrl    = latch_md;
3611
                                       next_state = fetch_state;
3612
                                                end
3613
                           endcase
3614
                                          end
3615
 
3616
                    default:
3617
                                        begin
3618
                                          left_ctrl   = accd_left;
3619
                                          right_ctrl  = md_right;
3620
                                          alu_ctrl    = alu_nop;
3621
                                          cc_ctrl     = latch_cc;
3622
                                          acca_ctrl   = latch_acca;
3623
                 accb_ctrl   = latch_accb;
3624
                 ix_ctrl     = latch_ix;
3625
                 sp_ctrl     = latch_sp;
3626
                 pc_ctrl     = latch_pc;
3627
                 md_ctrl     = latch_md;
3628
                 iv_ctrl     = latch_iv;
3629
                 ea_ctrl     = latch_ea;
3630
                                          // idle the bus
3631
                 addr_ctrl  = idle_ad;
3632
                 dout_ctrl  = md_lo_dout;
3633
                           next_state = fetch_state;
3634
                                        end
3635
              endcase
3636
                                  end
3637
 
3638
                          psha_state:
3639
                          begin
3640
                                 // default registers
3641
             acca_ctrl  = latch_acca;
3642
             accb_ctrl  = latch_accb;
3643
             ix_ctrl    = latch_ix;
3644
             pc_ctrl    = latch_pc;
3645
             md_ctrl    = latch_md;
3646
             iv_ctrl    = latch_iv;
3647
                            op_ctrl    = latch_op;
3648
                                 nmi_ctrl   = latch_nmi;
3649
             ea_ctrl    = latch_ea;
3650
             // decrement sp
3651
             left_ctrl  = sp_left;
3652
             right_ctrl = plus_one_right;
3653
             alu_ctrl   = alu_sub16;
3654
             cc_ctrl    = latch_cc;
3655
             sp_ctrl    = load_sp;
3656
                                 // write acca
3657
             addr_ctrl  = push_ad;
3658
                            dout_ctrl  = acca_dout;
3659
             next_state = fetch_state;
3660
                        end
3661
 
3662
                          pula_state:
3663
                          begin
3664
                                 // default registers
3665
             acca_ctrl  = latch_acca;
3666
             accb_ctrl  = latch_accb;
3667
             ix_ctrl    = latch_ix;
3668
             pc_ctrl    = latch_pc;
3669
             md_ctrl    = latch_md;
3670
             iv_ctrl    = latch_iv;
3671
                            op_ctrl    = latch_op;
3672
                                 nmi_ctrl   = latch_nmi;
3673
             ea_ctrl    = latch_ea;
3674
                                 // idle sp
3675
             left_ctrl  = sp_left;
3676
             right_ctrl = zero_right;
3677
             alu_ctrl   = alu_nop;
3678
             cc_ctrl    = latch_cc;
3679
             sp_ctrl    = latch_sp;
3680
                                 // read acca
3681
                                 acca_ctrl  = pull_acca;
3682
             addr_ctrl  = pull_ad;
3683
             dout_ctrl  = acca_dout;
3684
             next_state = fetch_state;
3685
                        end
3686
 
3687
                          pshb_state:
3688
                          begin
3689
                                 // default registers
3690
             acca_ctrl  = latch_acca;
3691
             accb_ctrl  = latch_accb;
3692
             ix_ctrl    = latch_ix;
3693
             pc_ctrl    = latch_pc;
3694
             md_ctrl    = latch_md;
3695
             iv_ctrl    = latch_iv;
3696
                            op_ctrl    = latch_op;
3697
                                 nmi_ctrl   = latch_nmi;
3698
             ea_ctrl    = latch_ea;
3699
             // decrement sp
3700
             left_ctrl  = sp_left;
3701
             right_ctrl = plus_one_right;
3702
             alu_ctrl   = alu_sub16;
3703
             cc_ctrl    = latch_cc;
3704
             sp_ctrl    = load_sp;
3705
                                 // write accb
3706
             addr_ctrl  = push_ad;
3707
                            dout_ctrl  = accb_dout;
3708
             next_state = fetch_state;
3709
                        end
3710
 
3711
                          pulb_state:
3712
                          begin
3713
                                 // default
3714
             acca_ctrl  = latch_acca;
3715
             accb_ctrl  = latch_accb;
3716
             ix_ctrl    = latch_ix;
3717
             pc_ctrl    = latch_pc;
3718
             md_ctrl    = latch_md;
3719
             iv_ctrl    = latch_iv;
3720
                            op_ctrl    = latch_op;
3721
                                 nmi_ctrl   = latch_nmi;
3722
             ea_ctrl    = latch_ea;
3723
                                 // idle sp
3724
             left_ctrl  = sp_left;
3725
             right_ctrl = zero_right;
3726
             alu_ctrl   = alu_nop;
3727
             cc_ctrl    = latch_cc;
3728
             sp_ctrl    = latch_sp;
3729
                                 // read accb
3730
                                 accb_ctrl  = pull_accb;
3731
             addr_ctrl  = pull_ad;
3732
             dout_ctrl  = accb_dout;
3733
             next_state = fetch_state;
3734
                        end
3735
 
3736
                          pshx_lo_state:
3737
                          begin
3738
                                 // default
3739
             acca_ctrl  = latch_acca;
3740
             accb_ctrl  = latch_accb;
3741
             ix_ctrl    = latch_ix;
3742
             sp_ctrl    = latch_sp;
3743
             pc_ctrl    = latch_pc;
3744
             md_ctrl    = latch_md;
3745
             iv_ctrl    = latch_iv;
3746
                            op_ctrl    = latch_op;
3747
                                 nmi_ctrl   = latch_nmi;
3748
             ea_ctrl    = latch_ea;
3749
             // decrement sp
3750
             left_ctrl  = sp_left;
3751
             right_ctrl = plus_one_right;
3752
             alu_ctrl   = alu_sub16;
3753
             cc_ctrl    = latch_cc;
3754
             sp_ctrl    = load_sp;
3755
                                 // write ix low
3756
             addr_ctrl  = push_ad;
3757
                            dout_ctrl  = ix_lo_dout;
3758
             next_state = pshx_hi_state;
3759
                        end
3760
 
3761
                          pshx_hi_state:
3762
                          begin
3763
                                 // default registers
3764
             acca_ctrl  = latch_acca;
3765
             accb_ctrl  = latch_accb;
3766
             ix_ctrl    = latch_ix;
3767
             pc_ctrl    = latch_pc;
3768
             md_ctrl    = latch_md;
3769
             iv_ctrl    = latch_iv;
3770
                            op_ctrl    = latch_op;
3771
                                 nmi_ctrl   = latch_nmi;
3772
             ea_ctrl    = latch_ea;
3773
             // decrement sp
3774
             left_ctrl  = sp_left;
3775
             right_ctrl = plus_one_right;
3776
             alu_ctrl   = alu_sub16;
3777
             cc_ctrl    = latch_cc;
3778
             sp_ctrl    = load_sp;
3779
                                 // write ix hi
3780
             addr_ctrl  = push_ad;
3781
                            dout_ctrl  = ix_hi_dout;
3782
             next_state = fetch_state;
3783
                        end
3784
 
3785
                          pulx_hi_state:
3786
                          begin
3787
                                 // default
3788
             acca_ctrl  = latch_acca;
3789
             accb_ctrl  = latch_accb;
3790
             pc_ctrl    = latch_pc;
3791
             md_ctrl    = latch_md;
3792
             iv_ctrl    = latch_iv;
3793
                            op_ctrl    = latch_op;
3794
                                 nmi_ctrl   = latch_nmi;
3795
             ea_ctrl    = latch_ea;
3796
             // increment sp
3797
             left_ctrl  = sp_left;
3798
             right_ctrl = plus_one_right;
3799
             alu_ctrl   = alu_add16;
3800
             cc_ctrl    = latch_cc;
3801
             sp_ctrl    = load_sp;
3802
                                 // pull ix hi
3803
                                 ix_ctrl    = pull_hi_ix;
3804
             addr_ctrl  = pull_ad;
3805
             dout_ctrl  = ix_hi_dout;
3806
             next_state = pulx_lo_state;
3807
                        end
3808
 
3809
                          pulx_lo_state:
3810
                          begin
3811
                                 // default
3812
             acca_ctrl  = latch_acca;
3813
             accb_ctrl  = latch_accb;
3814
             pc_ctrl    = latch_pc;
3815
             md_ctrl    = latch_md;
3816
             iv_ctrl    = latch_iv;
3817
                            op_ctrl    = latch_op;
3818
                                 nmi_ctrl   = latch_nmi;
3819
             ea_ctrl    = latch_ea;
3820
                                 // idle sp
3821
             left_ctrl  = sp_left;
3822
             right_ctrl = zero_right;
3823
             alu_ctrl   = alu_nop;
3824
             cc_ctrl    = latch_cc;
3825
             sp_ctrl    = latch_sp;
3826
                                 // read ix low
3827
                                 ix_ctrl    = pull_lo_ix;
3828
             addr_ctrl  = pull_ad;
3829
             dout_ctrl  = ix_lo_dout;
3830
             next_state = fetch_state;
3831
                        end
3832
 
3833
           //
3834
                          // return from interrupt
3835
                          // enter here from bogus interrupts
3836
                          //
3837
                          rti_state:
3838
                          begin
3839
                                 // default registers
3840
             acca_ctrl  = latch_acca;
3841
             accb_ctrl  = latch_accb;
3842
             ix_ctrl    = latch_ix;
3843
             pc_ctrl    = latch_pc;
3844
             md_ctrl    = latch_md;
3845
             iv_ctrl    = latch_iv;
3846
                            op_ctrl    = latch_op;
3847
                                 nmi_ctrl   = latch_nmi;
3848
             ea_ctrl    = latch_ea;
3849
                                 // increment sp
3850
             left_ctrl  = sp_left;
3851
             right_ctrl = plus_one_right;
3852
             alu_ctrl   = alu_add16;
3853
             sp_ctrl    = load_sp;
3854
                                 // idle address bus
3855
             cc_ctrl    = latch_cc;
3856
             addr_ctrl  = idle_ad;
3857
             dout_ctrl  = cc_dout;
3858
             next_state = rti_cc_state;
3859
                        end
3860
 
3861
                          rti_cc_state:
3862
                          begin
3863
                                 // default registers
3864
             acca_ctrl  = latch_acca;
3865
             accb_ctrl  = latch_accb;
3866
             ix_ctrl    = latch_ix;
3867
             pc_ctrl    = latch_pc;
3868
             md_ctrl    = latch_md;
3869
             iv_ctrl    = latch_iv;
3870
                            op_ctrl    = latch_op;
3871
                                 nmi_ctrl   = latch_nmi;
3872
             ea_ctrl    = latch_ea;
3873
                                 // increment sp
3874
             left_ctrl  = sp_left;
3875
             right_ctrl = plus_one_right;
3876
             alu_ctrl   = alu_add16;
3877
             sp_ctrl    = load_sp;
3878
                                 // read cc
3879
             cc_ctrl    = pull_cc;
3880
             addr_ctrl  = pull_ad;
3881
             dout_ctrl  = cc_dout;
3882
             next_state = rti_accb_state;
3883
                        end
3884
 
3885
                          rti_accb_state:
3886
                          begin
3887
                                 // default registers
3888
             acca_ctrl  = latch_acca;
3889
             ix_ctrl    = latch_ix;
3890
             pc_ctrl    = latch_pc;
3891
             md_ctrl    = latch_md;
3892
             iv_ctrl    = latch_iv;
3893
                            op_ctrl    = latch_op;
3894
                                 nmi_ctrl   = latch_nmi;
3895
             ea_ctrl    = latch_ea;
3896
                                 // increment sp
3897
             left_ctrl  = sp_left;
3898
             right_ctrl = plus_one_right;
3899
             alu_ctrl   = alu_add16;
3900
             cc_ctrl    = latch_cc;
3901
             sp_ctrl    = load_sp;
3902
                                 // read accb
3903
                                 accb_ctrl  = pull_accb;
3904
             addr_ctrl  = pull_ad;
3905
             dout_ctrl  = accb_dout;
3906
             next_state = rti_acca_state;
3907
                        end
3908
 
3909
                          rti_acca_state:
3910
                          begin
3911
                                 // default registers
3912
             accb_ctrl  = latch_accb;
3913
             ix_ctrl    = latch_ix;
3914
             pc_ctrl    = latch_pc;
3915
             md_ctrl    = latch_md;
3916
             iv_ctrl    = latch_iv;
3917
                            op_ctrl    = latch_op;
3918
                                 nmi_ctrl   = latch_nmi;
3919
             ea_ctrl    = latch_ea;
3920
                                 // increment sp
3921
             left_ctrl  = sp_left;
3922
             right_ctrl = plus_one_right;
3923
             alu_ctrl   = alu_add16;
3924
             cc_ctrl    = latch_cc;
3925
             sp_ctrl    = load_sp;
3926
                                 // read acca
3927
                                 acca_ctrl  = pull_acca;
3928
             addr_ctrl  = pull_ad;
3929
             dout_ctrl  = acca_dout;
3930
             next_state = rti_ixh_state;
3931
                        end
3932
 
3933
                          rti_ixh_state:
3934
                          begin
3935
                                 // default
3936
             acca_ctrl  = latch_acca;
3937
             accb_ctrl  = latch_accb;
3938
             pc_ctrl    = latch_pc;
3939
             md_ctrl    = latch_md;
3940
             iv_ctrl    = latch_iv;
3941
                            op_ctrl    = latch_op;
3942
                                 nmi_ctrl   = latch_nmi;
3943
             ea_ctrl    = latch_ea;
3944
                                 // increment sp
3945
             left_ctrl  = sp_left;
3946
             right_ctrl = plus_one_right;
3947
             alu_ctrl   = alu_add16;
3948
             cc_ctrl    = latch_cc;
3949
             sp_ctrl    = load_sp;
3950
                                 // read ix hi
3951
                                 ix_ctrl    = pull_hi_ix;
3952
             addr_ctrl  = pull_ad;
3953
             dout_ctrl  = ix_hi_dout;
3954
             next_state = rti_ixl_state;
3955
                        end
3956
 
3957
                          rti_ixl_state:
3958
                          begin
3959
                                 // default
3960
             acca_ctrl  = latch_acca;
3961
             accb_ctrl  = latch_accb;
3962
             pc_ctrl    = latch_pc;
3963
             md_ctrl    = latch_md;
3964
             iv_ctrl    = latch_iv;
3965
                            op_ctrl    = latch_op;
3966
                                 nmi_ctrl   = latch_nmi;
3967
             ea_ctrl    = latch_ea;
3968
                                 // increment sp
3969
             left_ctrl  = sp_left;
3970
             right_ctrl = plus_one_right;
3971
             alu_ctrl   = alu_add16;
3972
             cc_ctrl    = latch_cc;
3973
             sp_ctrl    = load_sp;
3974
                                 // read ix low
3975
                                 ix_ctrl    = pull_lo_ix;
3976
             addr_ctrl  = pull_ad;
3977
             dout_ctrl  = ix_lo_dout;
3978
             next_state = rti_pch_state;
3979
                        end
3980
 
3981
                          rti_pch_state:
3982
                          begin
3983
                                 // default
3984
             acca_ctrl  = latch_acca;
3985
             accb_ctrl  = latch_accb;
3986
             ix_ctrl    = latch_ix;
3987
             pc_ctrl    = latch_pc;
3988
             md_ctrl    = latch_md;
3989
             iv_ctrl    = latch_iv;
3990
                            op_ctrl    = latch_op;
3991
                                 nmi_ctrl   = latch_nmi;
3992
             ea_ctrl    = latch_ea;
3993
                  // increment sp
3994
             left_ctrl  = sp_left;
3995
             right_ctrl = plus_one_right;
3996
             alu_ctrl   = alu_add16;
3997
             cc_ctrl    = latch_cc;
3998
             sp_ctrl    = load_sp;
3999
                                 // pull pc hi
4000
                                 pc_ctrl    = pull_hi_pc;
4001
             addr_ctrl  = pull_ad;
4002
             dout_ctrl  = pc_hi_dout;
4003
             next_state = rti_pcl_state;
4004
                        end
4005
 
4006
                          rti_pcl_state:
4007
                          begin
4008
                                 // default
4009
             acca_ctrl  = latch_acca;
4010
             accb_ctrl  = latch_accb;
4011
             ix_ctrl    = latch_ix;
4012
             md_ctrl    = latch_md;
4013
             iv_ctrl    = latch_iv;
4014
                            op_ctrl    = latch_op;
4015
                                 nmi_ctrl   = latch_nmi;
4016
             ea_ctrl    = latch_ea;
4017
                                 // idle sp
4018
             left_ctrl  = sp_left;
4019
             right_ctrl = zero_right;
4020
             alu_ctrl   = alu_nop;
4021
             cc_ctrl    = latch_cc;
4022
             sp_ctrl    = latch_sp;
4023
                  // pull pc low
4024
                                 pc_ctrl    = pull_lo_pc;
4025
             addr_ctrl  = pull_ad;
4026
             dout_ctrl  = pc_lo_dout;
4027
             next_state = fetch_state;
4028
                        end
4029
 
4030
                          //
4031
                          // here on interrupt
4032
                          // iv register hold interrupt type
4033
                          //
4034
                          int_pcl_state:
4035
                          begin
4036
                                 // default
4037
             acca_ctrl  = latch_acca;
4038
             accb_ctrl  = latch_accb;
4039
             ix_ctrl    = latch_ix;
4040
             pc_ctrl    = latch_pc;
4041
             md_ctrl    = latch_md;
4042
             iv_ctrl    = latch_iv;
4043
                            op_ctrl    = latch_op;
4044
                                 nmi_ctrl   = latch_nmi;
4045
             ea_ctrl    = latch_ea;
4046
             // decrement sp
4047
             left_ctrl  = sp_left;
4048
             right_ctrl = plus_one_right;
4049
             alu_ctrl   = alu_sub16;
4050
             cc_ctrl    = latch_cc;
4051
             sp_ctrl    = load_sp;
4052
                                 // write pc low
4053
             addr_ctrl  = push_ad;
4054
                            dout_ctrl  = pc_lo_dout;
4055
             next_state = int_pch_state;
4056
                        end
4057
 
4058
                          int_pch_state:
4059
                          begin
4060
                                 // default
4061
             acca_ctrl  = latch_acca;
4062
             accb_ctrl  = latch_accb;
4063
             ix_ctrl    = latch_ix;
4064
             pc_ctrl    = latch_pc;
4065
             md_ctrl    = latch_md;
4066
             iv_ctrl    = latch_iv;
4067
                            op_ctrl    = latch_op;
4068
                                 nmi_ctrl   = latch_nmi;
4069
             ea_ctrl    = latch_ea;
4070
             // decrement sp
4071
             left_ctrl  = sp_left;
4072
             right_ctrl = plus_one_right;
4073
             alu_ctrl   = alu_sub16;
4074
             cc_ctrl    = latch_cc;
4075
             sp_ctrl    = load_sp;
4076
                                 // write pc hi
4077
             addr_ctrl  = push_ad;
4078
                            dout_ctrl  = pc_hi_dout;
4079
             next_state = int_ixl_state;
4080
                        end
4081
 
4082
                          int_ixl_state:
4083
                          begin
4084
                                 // default
4085
             acca_ctrl  = latch_acca;
4086
             accb_ctrl  = latch_accb;
4087
             ix_ctrl    = latch_ix;
4088
             pc_ctrl    = latch_pc;
4089
             md_ctrl    = latch_md;
4090
             iv_ctrl    = latch_iv;
4091
                            op_ctrl    = latch_op;
4092
                                 nmi_ctrl   = latch_nmi;
4093
             ea_ctrl    = latch_ea;
4094
             // decrement sp
4095
             left_ctrl  = sp_left;
4096
             right_ctrl = plus_one_right;
4097
             alu_ctrl   = alu_sub16;
4098
             cc_ctrl    = latch_cc;
4099
             sp_ctrl    = load_sp;
4100
                                 // write ix low
4101
             addr_ctrl  = push_ad;
4102
                            dout_ctrl  = ix_lo_dout;
4103
             next_state = int_ixh_state;
4104
                        end
4105
 
4106
                          int_ixh_state:
4107
                          begin
4108
                                 // default
4109
             acca_ctrl  = latch_acca;
4110
             accb_ctrl  = latch_accb;
4111
             ix_ctrl    = latch_ix;
4112
             pc_ctrl    = latch_pc;
4113
             md_ctrl    = latch_md;
4114
             iv_ctrl    = latch_iv;
4115
                            op_ctrl    = latch_op;
4116
                                 nmi_ctrl   = latch_nmi;
4117
             ea_ctrl    = latch_ea;
4118
             // decrement sp
4119
             left_ctrl  = sp_left;
4120
             right_ctrl = plus_one_right;
4121
             alu_ctrl   = alu_sub16;
4122
             cc_ctrl    = latch_cc;
4123
             sp_ctrl    = load_sp;
4124
                                 // write ix hi
4125
             addr_ctrl  = push_ad;
4126
                            dout_ctrl  = ix_hi_dout;
4127
             next_state = int_acca_state;
4128
                        end
4129
 
4130
                          int_acca_state:
4131
                          begin
4132
                                 // default
4133
             acca_ctrl  = latch_acca;
4134
             accb_ctrl  = latch_accb;
4135
             ix_ctrl    = latch_ix;
4136
             pc_ctrl    = latch_pc;
4137
             md_ctrl    = latch_md;
4138
             iv_ctrl    = latch_iv;
4139
                            op_ctrl    = latch_op;
4140
                                 nmi_ctrl   = latch_nmi;
4141
             ea_ctrl    = latch_ea;
4142
             // decrement sp
4143
             left_ctrl  = sp_left;
4144
             right_ctrl = plus_one_right;
4145
             alu_ctrl   = alu_sub16;
4146
             cc_ctrl    = latch_cc;
4147
             sp_ctrl    = load_sp;
4148
                                 // write acca
4149
             addr_ctrl  = push_ad;
4150
                            dout_ctrl  = acca_dout;
4151
             next_state = int_accb_state;
4152
                        end
4153
 
4154
 
4155
                          int_accb_state:
4156
                          begin
4157
                                 // default
4158
             acca_ctrl  = latch_acca;
4159
             accb_ctrl  = latch_accb;
4160
             ix_ctrl    = latch_ix;
4161
             pc_ctrl    = latch_pc;
4162
             md_ctrl    = latch_md;
4163
             iv_ctrl    = latch_iv;
4164
                            op_ctrl    = latch_op;
4165
                                 nmi_ctrl   = latch_nmi;
4166
             ea_ctrl    = latch_ea;
4167
             // decrement sp
4168
             left_ctrl  = sp_left;
4169
             right_ctrl = plus_one_right;
4170
             alu_ctrl   = alu_sub16;
4171
             cc_ctrl    = latch_cc;
4172
             sp_ctrl    = load_sp;
4173
                                 // write accb
4174
             addr_ctrl  = push_ad;
4175
                            dout_ctrl  = accb_dout;
4176
             next_state = int_cc_state;
4177
                        end
4178
 
4179
                          int_cc_state:
4180
                          begin
4181
                                 // default
4182
             acca_ctrl  = latch_acca;
4183
             accb_ctrl  = latch_accb;
4184
             ix_ctrl    = latch_ix;
4185
             pc_ctrl    = latch_pc;
4186
             md_ctrl    = latch_md;
4187
                            op_ctrl    = latch_op;
4188
                                 nmi_ctrl   = latch_nmi;
4189
             ea_ctrl    = latch_ea;
4190
             // decrement sp
4191
             left_ctrl  = sp_left;
4192
             right_ctrl = plus_one_right;
4193
             alu_ctrl   = alu_sub16;
4194
             cc_ctrl    = latch_cc;
4195
             sp_ctrl    = load_sp;
4196
                                 // write cc
4197
             addr_ctrl  = push_ad;
4198
                            dout_ctrl  = cc_dout;
4199
                                 nmi_ctrl   = latch_nmi;
4200
                                 //
4201
                                 // nmi is edge triggered
4202
                                 // nmi_req is cleared when nmi goes low.
4203
                                 //
4204
                            if (nmi_req == 1'b1)
4205
                                 begin
4206
                                        iv_ctrl    = nmi_iv;
4207
                              next_state = vect_hi_state;
4208
                                 end
4209
                            else
4210
                                 begin
4211
                                        //
4212
                                        // IRQ is level sensitive
4213
                                        //
4214
                                   if ((irq == 1'b1) & (cc[IBIT] == 1'b0))
4215
                                        begin
4216
                                          iv_ctrl    = irq_iv;
4217
                                next_state = int_mask_state;
4218
                                        end
4219
               else if ((irq_icf == 1'b1) & (cc[IBIT] == 1'b0))
4220
                                        begin
4221
                                          iv_ctrl    = icf_iv;
4222
                                next_state = int_mask_state;
4223
                                        end
4224
               else if ((irq_ocf == 1'b1) & (cc[IBIT] == 1'b0))
4225
                                        begin
4226
                                          iv_ctrl    = ocf_iv;
4227
                                next_state = int_mask_state;
4228
                                        end
4229
               else if ((irq_tof == 1'b1) & (cc[IBIT] == 1'b0))
4230
                                        begin
4231
                                          iv_ctrl    = tof_iv;
4232
                                next_state = int_mask_state;
4233
                                        end
4234
               else if ((irq_sci == 1'b1) & (cc[IBIT] == 1'b0))
4235
                                        begin
4236
                                          iv_ctrl    = sci_iv;
4237
                                next_state = int_mask_state;
4238
                                        end
4239
               else
4240
                                          case (op_code)
4241
                                          8'b00111110: // WAI (wait for interrupt)
4242
                                          begin
4243
                   iv_ctrl    = latch_iv;
4244
                        next_state = int_wai_state;
4245
                                        end
4246
                                          8'b00111111: // SWI (Software interrupt)
4247
                                          begin
4248
                   iv_ctrl    = swi_iv;
4249
                        next_state = vect_hi_state;
4250
                                        end
4251
                                          default: // bogus interrupt (return)
4252
                                          begin
4253
                   iv_ctrl    = latch_iv;
4254
                        next_state = rti_state;
4255
                                        end
4256
                                          endcase
4257
                                 end
4258
                                 end
4259
 
4260
                          int_wai_state:
4261
                          begin
4262
                                 // default
4263
             acca_ctrl  = latch_acca;
4264
             accb_ctrl  = latch_accb;
4265
             ix_ctrl    = latch_ix;
4266
             pc_ctrl    = latch_pc;
4267
             md_ctrl    = latch_md;
4268
                            op_ctrl    = latch_op;
4269
             ea_ctrl    = latch_ea;
4270
             // enable interrupts
4271
             left_ctrl  = sp_left;
4272
             right_ctrl = plus_one_right;
4273
             alu_ctrl   = alu_cli;
4274
             cc_ctrl    = load_cc;
4275
             sp_ctrl    = latch_sp;
4276
                                 // idle bus
4277
             addr_ctrl  = idle_ad;
4278
                            dout_ctrl  = cc_dout;
4279
                            if ((nmi_req == 1'b1) & (nmi_ack==1'b0))
4280
                                 begin
4281
                                        iv_ctrl    = nmi_iv;
4282
                                   nmi_ctrl   = set_nmi;
4283
                              next_state = vect_hi_state;
4284
                                 end
4285
                            else
4286
                                 begin
4287
                                   //
4288
                                        // nmi request is not cleared until nmi input goes low
4289
                                        //
4290
                                   if ((nmi_req == 1'b0) & (nmi_ack==1'b1))
4291
                                     nmi_ctrl = reset_nmi;
4292
                                        else
4293
                                          nmi_ctrl = latch_nmi;
4294
                                        //
4295
                                        // IRQ is level sensitive
4296
                                        //
4297
                                   if ((irq == 1'b1) & (cc[IBIT] == 1'b0))
4298
                                        begin
4299
                                          iv_ctrl    = irq_iv;
4300
                                next_state = int_mask_state;
4301
                                        end
4302
               else if ((irq_icf == 1'b1) & (cc[IBIT] == 1'b0))
4303
                                        begin
4304
                                          iv_ctrl    = icf_iv;
4305
                                next_state = int_mask_state;
4306
                                        end
4307
               else if ((irq_ocf == 1'b1) & (cc[IBIT] == 1'b0))
4308
                                        begin
4309
                                          iv_ctrl    = ocf_iv;
4310
                                next_state = int_mask_state;
4311
                                        end
4312
               else if ((irq_tof == 1'b1) & (cc[IBIT] == 1'b0))
4313
                                        begin
4314
                                          iv_ctrl    = tof_iv;
4315
                                next_state = int_mask_state;
4316
                                        end
4317
               else if ((irq_sci == 1'b1) & (cc[IBIT] == 1'b0))
4318
                                        begin
4319
                                          iv_ctrl    = sci_iv;
4320
                                next_state = int_mask_state;
4321
                                        end
4322
               else
4323
                                        begin
4324
                 iv_ctrl    = latch_iv;
4325
                      next_state = int_wai_state;
4326
                                        end
4327
                                 end
4328
                                 end
4329
 
4330
                          int_mask_state:
4331
                          begin
4332
                                 // default
4333
             acca_ctrl  = latch_acca;
4334
             accb_ctrl  = latch_accb;
4335
             ix_ctrl    = latch_ix;
4336
             pc_ctrl    = latch_pc;
4337
             md_ctrl    = latch_md;
4338
             iv_ctrl    = latch_iv;
4339
                            op_ctrl    = latch_op;
4340
                                 nmi_ctrl   = latch_nmi;
4341
             ea_ctrl    = latch_ea;
4342
                                 // Mask IRQ
4343
             left_ctrl  = sp_left;
4344
             right_ctrl = zero_right;
4345
                            alu_ctrl   = alu_sei;
4346
                                 cc_ctrl    = load_cc;
4347
             sp_ctrl    = latch_sp;
4348
                                 // idle bus cycle
4349
             addr_ctrl  = idle_ad;
4350
             dout_ctrl  = md_lo_dout;
4351
             next_state = vect_hi_state;
4352
                        end
4353
 
4354
                          halt_state: // halt CPU.
4355
                          begin
4356
                                 // default
4357
             acca_ctrl  = latch_acca;
4358
             accb_ctrl  = latch_accb;
4359
             ix_ctrl    = latch_ix;
4360
             sp_ctrl    = latch_sp;
4361
             pc_ctrl    = latch_pc;
4362
             md_ctrl    = latch_md;
4363
             iv_ctrl    = latch_iv;
4364
                            op_ctrl    = latch_op;
4365
                                 nmi_ctrl   = latch_nmi;
4366
             ea_ctrl    = latch_ea;
4367
                                 // do nothing in ALU
4368
             left_ctrl  = acca_left;
4369
             right_ctrl = zero_right;
4370
             alu_ctrl   = alu_nop;
4371
             cc_ctrl    = latch_cc;
4372
                                 // idle bus cycle
4373
             addr_ctrl  = idle_ad;
4374
             dout_ctrl  = md_lo_dout;
4375
                                 if (halt == 1'b1)
4376
                              next_state = halt_state;
4377
                                 else
4378
                                   next_state = fetch_state;
4379
                                 end
4380
 
4381
                          default: // error state halt on undefine states
4382
                          begin
4383
                                 // default
4384
             acca_ctrl  = latch_acca;
4385
             accb_ctrl  = latch_accb;
4386
             ix_ctrl    = latch_ix;
4387
             sp_ctrl    = latch_sp;
4388
             pc_ctrl    = latch_pc;
4389
             md_ctrl    = latch_md;
4390
             iv_ctrl    = latch_iv;
4391
                            op_ctrl    = latch_op;
4392
                                 nmi_ctrl   = latch_nmi;
4393
             ea_ctrl    = latch_ea;
4394
                                 // do nothing in ALU
4395
             left_ctrl  = acca_left;
4396
             right_ctrl = zero_right;
4397
             alu_ctrl   = alu_nop;
4398
             cc_ctrl    = latch_cc;
4399
                                 // idle bus cycle
4400
             addr_ctrl  = idle_ad;
4401
             dout_ctrl  = md_lo_dout;
4402
                                 next_state = error_state;
4403
                        end
4404
                  endcase
4405
end
4406
 
4407
////////////////////////////////
4408
//
4409
// state machine
4410
//
4411
////////////////////////////////
4412
 
4413
always_ff @(posedge clk)
4414
begin
4415
        if (rst == 1'b1)
4416
                state <= reset_state;
4417
        else if (hold == 1'b1)
4418
                state <= state;
4419
        else
4420
                state <= next_state;
4421
end
4422
endmodule

powered by: WebSVN 2.1.0

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