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

Subversion Repositories rf68000

[/] [rf68000/] [trunk/] [rtl/] [cpu/] [rf68000.sv] - Blame information for rev 8

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

Line No. Rev Author Line
1 2 robfinch
`timescale 1ns / 1ps
2
// ============================================================================
3
//        __
4
//   \\__/ o\    (C) 2008-2022  Robert Finch, Waterloo
5
//    \  __ /    All rights reserved.
6
//     \/_//     robfinch@finitron.ca
7
//       ||
8
//
9
//      rf68000.sv
10
//
11
//
12
// BSD 3-Clause License
13
// Redistribution and use in source and binary forms, with or without
14
// modification, are permitted provided that the following conditions are met:
15
//
16
// 1. Redistributions of source code must retain the above copyright notice, this
17
//    list of conditions and the following disclaimer.
18
//
19
// 2. Redistributions in binary form must reproduce the above copyright notice,
20
//    this list of conditions and the following disclaimer in the documentation
21
//    and/or other materials provided with the distribution.
22
//
23
// 3. Neither the name of the copyright holder nor the names of its
24
//    contributors may be used to endorse or promote products derived from
25
//    this software without specific prior written permission.
26
//
27
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
30
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
31
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
33
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
34
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
35
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
//
38
// ============================================================================
39
//
40
// Uncomment the following to optimize for performance. Increases the core size.
41
//`define OPT_PERF    1'b1
42
`define BIG_ENDIAN      1'b1
43
 
44
//`define SUPPORT_RETRY 1'b1
45
`define SUPPORT_MUL     1'b1
46
`define SUPPORT_DIV     1'b1
47
`define SUPPORT_BCD     1'b1
48
//`define SUPPORT_010   1'b1
49
`define SUPPORT_BITPAIRS 1'b1
50
 
51 4 robfinch
`define SUPPORT_DECFLT 1'b1
52
 
53 3 robfinch
//`define HAS_MMU 1'b1
54
 
55 2 robfinch
//`define SUPPORT_TASK  1'b1
56
 
57
//`define SUPPORT_B24   1'b1            // To support 23-bit branch displacements
58
 
59
`define TRUE        1'b1
60
`define FALSE       1'b0
61
`define HIGH        1'b1
62
`define LOW         1'b0
63
 
64
`define RESET_VECTOR    32'h00000400
65
`define CSR_CORENO    32'hFFFFFFE0
66
`define CSR_TICK        32'hFFFFFFE4
67
`define CSR_ICNT                                32'hFFFFFFE8
68
`define CSR_TASK        32'hFFFFFFFC
69
 
70
//`define SSP_VEC       9'd000
71
`define RESET_VEC       9'd001
72
`define BUSERR_VEC      9'd002
73
`define ADDRERR_VEC     9'd003
74
`define ILLEGAL_VEC     9'd004
75
`define DBZ_VEC         9'd005
76
`define CHK_VEC         9'd006
77
`define TRAPV_VEC       9'd007
78
`define PRIV_VEC        9'd008
79
`define TRACE_VEC       9'd009
80
`define LINE10_VEC      9'd010
81
`define LINE15_VEC      9'd011
82
`define UNINITINT_VEC   9'd015
83
// Vectors 24-31 for IRQ's
84
`define SPURIOUS_VEC            9'd024
85
`define IRQ_VEC         9'd024
86
// Vectors 32-46 for TRAPQ instruction
87
`define TRAP_VEC        9'd032
88
`define DISP_VEC                                9'd063
89
`define USER64          9'd064
90
//`define NMI_TRAP        9'h1FE
91
`define RESET_TASK      9'h000
92
 
93
`define LDB             16'b0001_xxx0xx_xxxxxx
94
`define LDH             16'b0010_xxx0xx_xxxxxx
95
`define LDW             16'b0011_xxx0xx_xxxxxx
96
`define STB             16'b0001_xxx1xx_xxxxxx
97
`define STH             16'b0010_xxx1xx_xxxxxx
98
`define STW             16'b0011_xxx1xx_xxxxxx
99
 
100 3 robfinch
// DBcc also for Scc
101 2 robfinch
`define DBRA    8'h50
102
`define DBSR    8'h51
103
`define DBHI    8'h52
104
`define DBLS    8'h53
105
`define DBHS    8'h54
106
`define DBLO    8'h55
107
`define DBNE    8'h56
108
`define DBEQ    8'h57
109
`define DBVC    8'h58
110
`define DBVS    8'h59
111
`define DBPL    8'h5A
112
`define DBMI    8'h5B
113
`define DBGE    8'h5C
114
`define DBLT    8'h5D
115
`define DBGT    8'h5E
116
`define DBLE    8'h5F
117
 
118
`define BRA             8'h60
119
`define BSR             8'h61
120
`define BHI             8'h62
121
`define BLS             8'h63
122
`define BHS             8'h64
123
`define BLO             8'h65
124
`define BNE             8'h66
125
`define BEQ             8'h67
126
`define BVC             8'h68
127
`define BVS             8'h69
128
`define BPL             8'h6A
129
`define BMI             8'h6B
130
`define BGE             8'h6C
131
`define BLT             8'h6D
132
`define BGT             8'h6E
133
`define BLE             8'h6F
134
 
135
// 12000 LUTs / 80MHz
136
// slices
137
// 1600 FF's
138
// 2 MULTS
139
// 8 BRAMs
140
 
141
module rf68000(coreno_i, clken_i, rst_i, rst_o, clk_i, nmi_i, ipl_i, vpa_i,
142
        lock_o, cyc_o, stb_o, ack_i, err_i, rty_i, we_o, sel_o, fc_o,
143
        asid_o, mmus_o, ios_o, iops_o, adr_o, dat_i, dat_o);
144
typedef enum logic [7:0] {
145
        IFETCH = 8'd1,
146
        DECODE,
147
        RETSTATE,
148
        FETCH_BYTE,
149
        FETCH_WORD,
150
        FETCH_LWORD,
151
        FETCH_LWORDa,
152
        STORE_BYTE,
153
        USTORE_BYTE,
154
        // 10
155
        STORE_WORD,
156
        STORE_LWORD,
157
        STORE_LWORDa,
158
 
159
        LFETCH_BYTE,
160
        FETCH_BRDISP,
161
        FETCH_BRDISPa,
162
        FETCH_IMM16,
163
        FETCH_IMM16a,
164
        FETCH_IMM32,
165
        FETCH_IMM32a,
166
 
167
        // 20
168
        FETCH_IMM32b,
169
        JSR,
170
        JMP,
171
        DBRA,
172
 
173
        ADDQ,
174
        ADDQ2,
175
        ADDI,
176
        ADDI2,
177
        ADDI3,
178
        ADDI4,
179
 
180
        // 30
181
        ADD,
182
        ADD1,
183
 
184
        DIV1,
185
        DIV2,
186
 
187
        STORE_IN_DEST,
188
        SHIFT,
189
        SHIFT1,
190
        BIT,
191
        BIT1,
192
        BIT2,
193
 
194
        // 40
195
        RTD1,
196
        RTD2,
197
 
198
        RTE1,
199
        RTE2,
200
        RTE3,
201
        RTE4,
202
        RTE5,
203
        RTE6,
204
        RTE7,
205
        RTE8,
206
 
207
        // 50
208
        RTE9,
209
        RTE10,
210
        RTE11,
211
 
212
        RTS1,
213
        RTS2,
214
 
215
        LINK,
216
        LINK1,
217
        LINK2,
218
        UNLNK,
219
        UNLNK2,
220
 
221
        // 60
222
        JMP_VECTOR,
223
        JMP_VECTOR2,
224
        JMP_VECTOR3,
225
 
226
        NEG,
227
        NEGX,
228
        NEGX1,
229
        NOT,
230
        TAS,
231
        LEA,
232
        LEA2,
233
 
234
        //70
235
        EXG1,
236
 
237
        CMP,
238
        CMP1,
239
        CMPA,
240
        CMPM,
241
        CMPM1,  // defunct
242
 
243
        AND,
244
        AND1,
245
        EOR,
246
        ANDI_CCR,
247
 
248
        // 80
249
        ANDI_CCR2,
250
        ANDI_SR,
251
        ANDI_SRX,
252
        EORI_CCR,
253
        EORI_CCR2,
254
        EORI_SR,
255
        EORI_SRX,
256
        ORI_CCR,
257
        ORI_CCR2,
258
        ORI_SR,
259
 
260
        //90
261
        ORI_SRX,
262
        FETCH_NOP_BYTE,
263
        FETCH_NOP_WORD,
264
        FETCH_NOP_LWORD,
265
        FETCH_IMM8,
266
        FETCH_IMM8a,
267
        FETCH_D32,
268
        FETCH_D32a,
269
        FETCH_D32b,
270
        FETCH_D16,
271
 
272
        //100
273
        FETCH_D16a,
274
        FETCH_NDX,
275
        FETCH_NDXa,
276
 
277
        MOVE2CCR,
278
        MOVE2SR,
279
        MOVE2SRX,
280
 
281
        TRAP,
282
        TRAP3,
283
        TRAP3a,
284
        TRAP3b,
285
 
286
        //110
287
        TRAP4,
288
        TRAP5,
289
        TRAP6,
290
        TRAP7,
291
        TRAP7a,
292
        TRAP8,
293
        TRAP9,
294
        TRAP10,
295
        TRAP20,
296
        TRAP21,
297
 
298
        // 120
299
        TRAP22,
300
        TRAP23,
301
        TRAP24,
302
        TRAP25,
303
        TRAP26,
304
        INTA,
305
 
306
        RETRY,
307
        RETRY2,
308
 
309
        TST,
310
        MUL,
311
 
312
        // 130
313
        MUL1,
314
        STOP,
315
        STOP1,
316
        RESET,
317
        RESET2,
318
        RESET3,
319
        RESET4,
320
        RESET5,
321
        PEA1,
322
        PEA2,
323
 
324
        // 140
325
        PEA3,
326
        BCD,
327
        BCD0,
328
        BCD1,
329
        BCD2,
330
        BCD3,
331
        BCD4,
332
        OR,
333
 
334
        INT,
335
        INT2,
336 4 robfinch
 
337
        // 150
338 2 robfinch
        INT3,
339
        INT4,
340
 
341
        MOVEM_Xn2D,
342
        MOVEM_Xn2D2,
343
        MOVEM_Xn2D3,
344
        MOVEM_Xn2D4,
345
        MOVEM_s2Xn,
346
        MOVEM_s2Xn2,
347
        MOVEM_s2Xn3,
348
 
349
        TASK1,
350
 
351
        // 160
352 4 robfinch
        THREAD2,
353 2 robfinch
        TASK3,
354
        TASK4,
355
 
356
        LDT1,
357
        LDT2,
358
        LDT3,
359
        SDT1,
360
        SDT2,
361
 
362
        SUB,
363
        SUB1,
364 4 robfinch
 
365
        // 170
366 2 robfinch
        MOVEP,
367
        MOVEP1,
368
        MOVEP2,
369
        MOVEP3,
370
        CHK,
371
 
372
        MOVERc2Rn,
373
        MOVERn2Rc,
374
        MOVERn2Rc2,
375
 
376
        MOVES,
377
        MOVES2,
378 4 robfinch
 
379
        // 180
380 2 robfinch
        MOVES3,
381 4 robfinch
 
382 2 robfinch
        ADDX,
383
        ADDX2,
384
        ADDX3,
385
        SUBX,
386
        SUBX2,
387
        SUBX3,
388
 
389
        MULU1,
390
        MULU2,
391
        MULU3,
392 4 robfinch
 
393
        //190
394 2 robfinch
        MULS1,
395
        MULS2,
396
        MULS3,
397
 
398
        BIN2BCD1,
399
        BIN2BCD2,
400
        BCD2BIN1,
401
        BCD2BIN2,
402
        BCD2BIN3,
403
 
404
        IFETCH2,
405 4 robfinch
        FADD,
406 2 robfinch
 
407 4 robfinch
        // 200
408
        FCMP,
409
        FMUL1,
410
        FMUL2,
411
        FDIV1,
412
        FDIV2,
413
        FNEG,
414
        FMOVE,
415
        I2DF1,
416
        I2DF2,
417
        DF2I1,
418
        DF2I2,
419
        FTST,
420
        FBCC,
421
        FSCALE,
422
        FCOPYEXP,
423
 
424
        FETCH_HEXI1,
425
        FETCH_HEXI2,
426
        FETCH_HEXI3,
427
        FETCH_HEXI4,
428 8 robfinch
        FETCH_NOP_HEXI,
429 4 robfinch
        STORE_HEXI1,
430
        STORE_HEXI2,
431
        STORE_HEXI3,
432
        STORE_HEXI4,
433
 
434 8 robfinch
        FMOVEM1,
435
 
436
        FETCH_IMM96,
437
        FETCH_IMM96b,
438
        FETCH_IMM96c,
439
        FETCH_IMM96d,
440
 
441
        CCHK,
442
 
443 2 robfinch
        FSDATA2
444
} state_t;
445
 
446
typedef enum logic [4:0] {
447
        FU_NONE = 5'd0,
448
        FU_MUL,
449
        FU_TST, FU_ADDX, FU_SUBX,
450
        FU_CMP, FU_ADD, FU_SUB, FU_LOGIC, FU_ADDQ, FU_SUBQ,
451
        FU_ADDI, FU_ANDI_CCR, FU_ANDI_SR, FU_EORI_CCR,
452
        FU_ANDI_SRX, FU_EORI_SRX, FU_ORI_SRX, FU_MOVE2SRX,
453
        FU_EORI_SR, FU_ORI_CCR, FU_ORI_SR, FU_MOVE2CCR,
454
        FU_MOVE2SR
455
} flag_update_t;
456
 
457
parameter S = 1'b0;
458
parameter D = 1'b1;
459
 
460
input [31:0] coreno_i;
461
input clken_i;
462
input rst_i;
463
output reg rst_o;
464
input clk_i;
465
input nmi_i;
466
input vpa_i;
467
input [2:0] ipl_i;
468
output lock_o;
469
reg lock_o;
470
output cyc_o;
471
reg cyc_o;
472
output stb_o;
473
reg stb_o;
474
input ack_i;
475
input err_i;
476
input rty_i;
477
output we_o;
478
reg we_o;
479
output [3:0] sel_o;
480
reg [3:0] sel_o;
481
output [2:0] fc_o;
482
reg [2:0] fc_o;
483
output [7:0] asid_o;
484
output mmus_o;
485
output ios_o;
486
output iops_o;
487
output [31:0] adr_o;
488
reg [31:0] adr_o;
489
input [31:0] dat_i;
490
output [31:0] dat_o;
491
reg [31:0] dat_o;
492
 
493 4 robfinch
wire DECFLT = coreno_i==32'd2;
494
 
495 2 robfinch
reg em;                                                 // emulation mode
496
reg [15:0] ir;
497
reg [15:0] ir2;                 // second word for ir
498
reg ext_ir;
499
reg [31:0] icnt;
500
state_t state;
501
state_t rstate;
502
state_t state_stk1;
503
state_t state_stk2;
504
state_t state_stk3;
505
state_t state_stk4;
506 8 robfinch
state_t state_stk5;
507 2 robfinch
state_t sz_state;
508
flag_update_t flag_update;
509
reg [31:0] d0 = 'd0;
510
reg [31:0] d1 = 'd0;
511
reg [31:0] d2 = 'd0;
512
reg [31:0] d3 = 'd0;
513
reg [31:0] d4 = 'd0;
514
reg [31:0] d5 = 'd0;
515
reg [31:0] d6 = 'd0;
516
reg [31:0] d7 = 'd0;
517
reg [31:0] a0 = 'd0;
518
reg [31:0] a1 = 'd0;
519
reg [31:0] a2 = 'd0;
520
reg [31:0] a3 = 'd0;
521
reg [31:0] a4 = 'd0;
522
reg [31:0] a5 = 'd0;
523
reg [31:0] a6 = 'd0;
524
reg [31:0] sp = 'd0;
525 4 robfinch
reg [95:0] fp0 = 'd0;
526
reg [95:0] fp1 = 'd0;
527
reg [95:0] fp2 = 'd0;
528
reg [95:0] fp3 = 'd0;
529
reg [95:0] fp4 = 'd0;
530
reg [95:0] fp5 = 'd0;
531
reg [95:0] fp6 = 'd0;
532
reg [95:0] fp7 = 'd0;
533 2 robfinch
reg [31:0] d0i;
534
reg [31:0] d1i;
535
reg [31:0] d2i;
536
reg [31:0] d3i;
537
reg [31:0] d4i;
538
reg [31:0] d5i;
539
reg [31:0] d6i;
540
reg [31:0] d7i;
541
reg [31:0] a0i;
542
reg [31:0] a1i;
543
reg [31:0] a2i;
544
reg [31:0] a3i;
545
reg [31:0] a4i;
546
reg [31:0] a5i;
547
reg [31:0] a6i;
548
reg [31:0] spi;
549
reg [31:0] flagsi;
550
reg [31:0] pci;
551
wire [31:0] d0o;
552
wire [31:0] d1o;
553
wire [31:0] d2o;
554
wire [31:0] d3o;
555
wire [31:0] d4o;
556
wire [31:0] d5o;
557
wire [31:0] d6o;
558
wire [31:0] d7o;
559
wire [31:0] a0o;
560
wire [31:0] a1o;
561
wire [31:0] a2o;
562
wire [31:0] a3o;
563
wire [31:0] a4o;
564
wire [31:0] a5o;
565
wire [31:0] a6o;
566
wire [31:0] spo;
567
wire [31:0] flagso;
568
wire [31:0] pco;
569
reg cf,vf,nf,zf,xf,sf,tf;
570
reg [2:0] im;
571
reg [2:0] ccr57;
572
reg [1:0] sr1112;
573
reg sr14;
574
wire [15:0] sr = {tf,sr14,sf,sr1112,im,ccr57,xf,nf,zf,vf,cf};
575
wire [31:0] srx = {sr};
576 4 robfinch
reg fnf,fzf,fvf,fnanf;
577
wire finff = fvf;
578
reg [7:0] quotient_bits;
579 6 robfinch
reg [2:0] quotient_bitshi;
580 4 robfinch
reg [7:0] fpexc,fpaexc;
581 6 robfinch
wire [31:0] fpsr = {1'b0,quotient_bitshi,fnf,fzf,fvf,fnanf,quotient_bits,fpexc,fpaexc};
582 2 robfinch
reg [31:0] isr;
583
reg [3:0] ifmt;
584 4 robfinch
reg [7:0] fpcnt;
585 2 robfinch
reg [31:0] pc;
586
reg [31:0] opc;                 // pc for branch references
587 8 robfinch
reg [31:0] fpiar;
588 2 robfinch
reg [31:0] ssp,usp;
589
reg [31:0] disp;
590
reg [31:0] s,d,dd,imm,immx;
591
reg [31:0] bit2test;
592
reg wl;
593
reg ds;
594
reg [5:0] cnt;                          // shift count
595
reg [31:0] ea;                          // effective address
596
reg [31:0] vector;
597
reg [7:0] vecno;
598
reg [3:0] Rt;
599
wire [1:0] sz = ir[7:6];
600
reg dsix;
601
reg [2:0] mmm,mmmx,mmm_save='d0;
602
reg [2:0] rrr,rrrx;
603
reg [3:0] rrrr;
604
wire [2:0] MMM = ir[8:6];
605
wire [2:0] RRR = ir[11:9];
606
wire [2:0] QQQ = ir[11:9];
607
wire [2:0] DDD = ir[11:9];
608
wire [2:0] AAA = ir[11:9];
609 4 robfinch
reg [2:0] FLTSRC;
610
reg [2:0] FLTDST;
611 2 robfinch
reg MMMRRR;
612
wire Anabit;
613
wire [31:0] sp_dec = sp - 32'd2;
614
reg [31:0] rfoAn;
615
always_comb
616
case(rrr)
617
3'd0: rfoAn <= a0;
618
3'd1: rfoAn <= a1;
619
3'd2: rfoAn <= a2;
620
3'd3: rfoAn <= a3;
621
3'd4: rfoAn <= a4;
622
3'd5: rfoAn <= a5;
623
3'd6: rfoAn <= a6;
624
3'd7: rfoAn <= sp;
625
endcase
626
reg [31:0] rfoAna;
627
always_comb
628
case(AAA)
629
3'd0: rfoAna <= a0;
630
3'd1: rfoAna <= a1;
631
3'd2: rfoAna <= a2;
632
3'd3: rfoAna <= a3;
633
3'd4: rfoAna <= a4;
634
3'd5: rfoAna <= a5;
635
3'd6: rfoAna <= a6;
636
3'd7: rfoAna <= sp;
637
endcase
638
//wire [31:0] rfoAn =   rrr==3'b111 ? sp : regfile[{1'b1,rrr}];
639
reg [31:0] rfoDn;
640
always_comb
641
case(DDD)
642
3'd0:   rfoDn <= d0;
643
3'd1:   rfoDn <= d1;
644
3'd2:   rfoDn <= d2;
645
3'd3:   rfoDn <= d3;
646
3'd4:   rfoDn <= d4;
647
3'd5:   rfoDn <= d5;
648
3'd6:   rfoDn <= d6;
649
3'd7:   rfoDn <= d7;
650
endcase
651
reg [31:0] rfoDnn;
652
always_comb
653
case(rrr)
654
3'd0:   rfoDnn <= d0;
655
3'd1:   rfoDnn <= d1;
656
3'd2:   rfoDnn <= d2;
657
3'd3:   rfoDnn <= d3;
658
3'd4:   rfoDnn <= d4;
659
3'd5:   rfoDnn <= d5;
660
3'd6:   rfoDnn <= d6;
661
3'd7:   rfoDnn <= d7;
662
endcase
663
reg [31:0] rfob;
664
always_comb
665
case({mmm[0],rrr})
666
4'd0:   rfob <= d0;
667
4'd1:   rfob <= d1;
668
4'd2:   rfob <= d2;
669
4'd3:   rfob <= d3;
670
4'd4:   rfob <= d4;
671
4'd5:   rfob <= d5;
672
4'd6:   rfob <= d6;
673
4'd7:   rfob <= d7;
674
4'd8:   rfob <= a0;
675
4'd9:   rfob <= a1;
676
4'd10:  rfob <= a2;
677
4'd11:  rfob <= a3;
678
4'd12:  rfob <= a4;
679
4'd13:  rfob <= a5;
680
4'd14:  rfob <= a6;
681
4'd15:  rfob <= sp;
682
endcase
683
reg [31:0] rfoRnn;
684
always_comb
685
case(rrrr)
686
4'd0:   rfoRnn <= d0;
687
4'd1:   rfoRnn <= d1;
688
4'd2:   rfoRnn <= d2;
689
4'd3:   rfoRnn <= d3;
690
4'd4:   rfoRnn <= d4;
691
4'd5:   rfoRnn <= d5;
692
4'd6:   rfoRnn <= d6;
693
4'd7:   rfoRnn <= d7;
694
4'd8:   rfoRnn <= a0;
695
4'd9:   rfoRnn <= a1;
696
4'd10:  rfoRnn <= a2;
697
4'd11:  rfoRnn <= a3;
698
4'd12:  rfoRnn <= a4;
699
4'd13:  rfoRnn <= a5;
700
4'd14:  rfoRnn <= a6;
701
4'd15:  rfoRnn <= sp;
702
endcase
703 4 robfinch
reg [95:0] rfoFpdst, rfoFpsrc;
704
`ifdef SUPPORT_DECFLT
705
always_comb
706
case(FLTDST)
707
3'd0:   rfoFpdst <= fp0;
708
3'd1:   rfoFpdst <= fp1;
709
3'd2:   rfoFpdst <= fp2;
710
3'd3:   rfoFpdst <= fp3;
711
3'd4:   rfoFpdst <= fp4;
712
3'd5:   rfoFpdst <= fp5;
713
3'd6:   rfoFpdst <= fp6;
714
3'd7:   rfoFpdst <= fp7;
715
endcase
716
always_comb
717
case(FLTSRC)
718
3'd0:   rfoFpsrc <= fp0;
719
3'd1:   rfoFpsrc <= fp1;
720
3'd2:   rfoFpsrc <= fp2;
721
3'd3:   rfoFpsrc <= fp3;
722
3'd4:   rfoFpsrc <= fp4;
723
3'd5:   rfoFpsrc <= fp5;
724
3'd6:   rfoFpsrc <= fp6;
725
3'd7:   rfoFpsrc <= fp7;
726
endcase
727
`endif
728 2 robfinch
//wire [31:0] rfoDn = regfile[{1'b0,DDD}];
729
//wire [31:0] rfoAna = AAA==3'b111 ? sp : regfile[{1'b1,AAA}];
730
//wire [31:0] rfob = {mmm[0],rrr}==4'b1111 ? sp : regfile[{mmm[0],rrr}];
731
//wire [31:0] rfoDnn = regfile[{1'b0,rrr}];
732
//wire [31:0] rfoRnn = rrrr==4'b1111 ? sp : regfile[rrrr];
733
wire clk_g;
734
reg rfwrL,rfwrB,rfwrW;
735 4 robfinch
reg rfwrF;
736
reg takb, ftakb;
737 2 robfinch
reg [8:0] resB;
738
reg [16:0] resW;
739
reg [32:0] resL;
740 4 robfinch
reg [95:0] resF;
741
reg [95:0] fps, fpd;
742 2 robfinch
(* USE_DSP = "no" *)
743
reg [32:0] resL1,resL2;
744
reg [32:0] resMS1,resMS2,resMU1,resMU2;
745
reg [31:0] st_data;
746
wire [11:0] bcdaddo,bcdsubo,bcdnego;
747
wire bcdaddoc,bcdsuboc,bcdnegoc;
748
reg [31:0] bad_addr;
749
reg [15:0] mac_cycle_type;
750
reg prev_nmi;
751
reg pe_nmi;
752
reg is_nmi;
753
reg is_irq, is_trace, is_priv, is_illegal;
754
reg is_adr_err;
755
reg is_rst;
756
reg is_bus_err;
757
reg use_dfc, use_sfc;
758
reg [4:0] rst_cnt;
759
reg [2:0] shift_op;
760
reg rtr;
761
reg bsr;
762
reg lea;
763 8 robfinch
reg fsub,fabs;
764 2 robfinch
reg bcdsub, bcdneg;
765 8 robfinch
reg fmovem;
766 2 robfinch
reg [31:0] dati_buf;    // input data from bus error
767
reg [31:0] dato_buf;
768
 
769
// CSR's
770
reg [31:0] tick;        // FF0
771
reg [7:0] asid;         // 003
772
assign asid_o = asid;
773
reg [31:0] vbr;         // 801
774
reg [31:0] sfc;         // 000
775
reg [31:0] dfc;         // 001
776
reg [31:0] apc;
777
reg [7:0] cpl;
778
reg [31:0] tr;
779
reg [31:0] tcba;
780
reg [31:0] mmus, ios, iops;
781 8 robfinch
reg [31:0] canary;
782 3 robfinch
assign mmus_o = adr_o[31:20] == mmus[31:20];
783
assign iops_o = adr_o[31:16] == iops[31:16];
784
assign ios_o  = adr_o[31:20] == ios [31:20];
785 2 robfinch
 
786
wire [16:0] lfsr_o;
787
lfsr17 ulfsr1
788
(
789
        .rst(rst_i),
790
        .clk(clk_g),
791
        .ce(1'b1),
792
        .cyc(1'b0),
793
        .o(lfsr_o)
794
);
795
 
796
/*
797
reg [31:0] cache_tag [0:7];
798
reg [15:0] cache_dat [0:7];
799
 
800
task tPushCache;
801
input [31:0] adr;
802
input [15:0] dat;
803
integer n;
804
begin
805
        for (n = 1; n < 8; n = n + 1) begin
806
                cache_tag[n] <= cache_tag[n-1];
807
                cache_dat[n] <= cache_dat[n-1];
808
        end
809
        cache_tag[0] <= adr;
810
        cache_dat[0] <= dat;
811
end
812
endtask
813
 
814
function fnInCache;
815
input [31:0] adr;
816
integer n;
817
begin
818
        fnInCache = 1'b0;
819
        for (n = 0; n < 8; n = n + 1) begin
820
                if (cache_tag[n]==adr) begin
821
                        fnInCache = 1'b1;
822
        end
823
end
824
endfunction
825
 
826
task tFindInCache;
827
input [31:0] adr;
828
output [15:0] dat;
829
integer n;
830
begin
831
        dat = 16'h4E71; // NOP
832
        for (n = 0; n < 8; n = n + 1) begin
833
                if (cache_tag[n]==adr) begin
834
                        dat = cache_dat[n];
835
                end
836
        end
837
end
838
endtask
839
*/
840
 
841
function [31:0] rbo;
842
input [31:0] w;
843
rbo = {w[7:0],w[15:8],w[23:16],w[31:24]};
844
endfunction
845
 
846
wire [7:0] dbin, sbin;
847
reg [9:0] bcdres;
848
wire dd_done;
849
wire [11:0] bcdreso;
850
BCDToBin ub2b1 (clk_g, d, dbin);
851
BCDToBin ub2b2 (clk_g, s, sbin);
852
 
853
DDBinToBCD #(.WID(10)) udd1
854
(
855
        .rst(rst_i),
856
        .clk(clk_g),
857
        .ld(state==BCD3),
858
        .bin(bcdres),
859
        .bcd(bcdreso),
860
        .done(dd_done)
861
);
862
 
863
reg [31:0] dd32in;
864
wire [39:0] dd32out;
865
wire dd32done;
866
DDBinToBCD #(.WID(32)) udd2
867
(
868
        .rst(rst_i),
869
        .clk(clk_g),
870
        .ld(state==BIN2BCD1),
871
        .bin(dd32in),
872
        .bcd(dd32out),
873
        .done(dd32done)
874
);
875
 
876
/*
877
BCDAdd u1
878
(
879
        .ci(xf),
880
        .a(s[7:0]),
881
        .b(d[7:0]),
882
        .o(bcdaddo),
883
        .c(bcdaddoc)
884
);
885
 
886
 
887
BCDSub u2
888
(
889
        .ci(xf),
890
        .a(d[7:0]),
891
        .b(s[7:0]),
892
        .o(bcdsubo),
893
        .c(bcdsuboc)
894
);
895
 
896
BCDSub u3
897
(
898
        .ci(xf),
899
        .a(8'h00),
900
        .b(d[7:0]),
901
        .o(bcdnego),
902
        .c(bcdnegoc)
903
);
904
*/
905
// These functions take the MSBs of the operands and results and return an
906
// overflow status.
907
 
908
// If the signs of the operands are the same, and the sign of the result does
909
// not match the operands sign.
910
function fnAddOverflow;
911
input r;
912
input a;
913
input b;
914
        fnAddOverflow = (r ^ b) & (1'b1 ^ a ^ b);
915
endfunction
916
 
917
// If the signs of the operands are different and sign of the result does not
918
// match the first operand.
919
function fnSubOverflow;
920
input r;
921
input a;
922
input b;
923
        fnSubOverflow = (r ^ a) & (a ^ b);
924
endfunction
925
 
926
reg divs;
927
wire dvdone;
928
wire dvByZr;
929
wire dvovf;
930
wire [31:0] divq;
931
wire [31:0] divr;
932
 
933
rf68000_divider udiv1
934
(
935
        .rst(rst_i),
936
        .clk(clk_g),
937
        .ld(state==DIV1),
938
        .abort(1'b0),
939
        .sgn(divs),
940
        .sgnus(1'b0),
941
        .a(d),
942
        .b(divs? {{16{s[15]}},s[15:0]}:{16'd0,s[15:0]}),
943
        .qo(divq),
944
        .ro(divr),
945
        .dvByZr(dvByZr),
946
        .ovf(dvovf),
947
        .done(dvdone),
948
        .idle()
949
);
950
 
951 4 robfinch
wire [95:0] dfaddsubo, dfmulo, dfdivo, i2dfo, df2io;
952
wire [95:0] dfscaleo;
953
wire dfmulinf;
954
wire dfmuldone, dfmulover, dfmulunder;
955
wire dfdivdone, dfdivover, dfdivunder;
956
wire [11:0] dfcmpo;
957
wire i2dfdone, df2idone;
958
wire df2iover;
959
//DFP96U fpsu, fpdu;
960
//DFP96 fpdp;
961
 
962
`ifdef SUPPORT_DECFLT
963
 
964
/*
965
assign fpdu.infinity = fpsu.infinity;
966
assign fpdu.nan = fpsu.nan;
967
assign fpdu.snan = fpsu.snan;
968
assign fpdu.qnan = fpsu.qnan;
969
assign fpdu.sign = fpsu.sign;
970
assign fpdu.exp = fpsu.exp;
971
assign fpdu.sig = {4'h1,24{4'h0}};
972
 
973
DFPPack upack1
974
(
975
        .i(fpdu),
976
        .o(fpdp)
977
);
978
 
979
DFPUnpack uunpack1
980
(
981
        .i(fps),
982
        .o(fpsu)
983
);
984
*/
985
 
986
DFPAddsub96nr ufaddsub1
987
(
988
        .clk(clk_g),
989
        .ce(1'b1),
990
        .rm(3'b0),
991
        .op(fsub),
992
        .a(fpd),
993
        .b(fps),
994
        .o(dfaddsubo)
995
);
996
 
997
DFPMultiply96nr udfmul1
998
(
999
        .clk(clk_g),
1000
        .ce(1'b1),
1001
        .ld(state==FMUL1),
1002
        .a(fpd),
1003
        .b(fps),
1004
        .o(dfmulo),
1005
        .rm(3'b000),
1006
        .sign_exe(),
1007
        .inf(dfmulinf),
1008
        .overflow(dfmulover),
1009
        .underflow(dfmulunder),
1010
        .done(dfmuldone)
1011
);
1012
 
1013
DFPDivide96nr udfdiv1
1014
(
1015
        .rst(rst_i),
1016
        .clk(clk_g),
1017
        .ce(1'b1),
1018
        .ld(state==FDIV1),
1019
        .op(1'b0),
1020
        .a(fpd),
1021
        .b(fps),
1022
        .o(dfdivo),
1023
        .rm(3'b000),
1024
        .done(dfdivdone),
1025
        .sign_exe(),
1026
        .inf(),
1027
        .overflow(dfdivover),
1028
        .underflow(dfdivunder)
1029
);
1030
 
1031
DFPCompare96 udfcmp1
1032
(
1033
        .a(fpd),
1034
        .b(fps),
1035
        .o(dfcmpo)
1036
);
1037
 
1038
i2df96 ui2df1
1039
(
1040
        .rst(rst_i),
1041
        .clk(clk_g),
1042
        .ce(1'b1),
1043
        .ld(state==I2DF1),
1044
        .op(1'b0),      // 0=unsigned, 1= signed
1045
        .rm(3'b000),
1046
        .i(fps),
1047
        .o(i2dfo),
1048
        .done(i2dfdone)
1049
);
1050
 
1051
df96Toi udf2i1 (
1052
        .rst(rst_i),
1053
        .clk(clk_g),
1054
        .ce(1'b1),
1055
        .ld(state==DF2I1),
1056
        .op(1'b0),
1057
        .i(fps),
1058
        .o(df2io),
1059
        .overflow(df2iover),
1060
        .done(df2idone)
1061
);
1062
 
1063
DFPScaleb96 udfscale1
1064
(
1065
        .clk(clk_g),
1066
        .ce(1'b1),
1067
        .a(fpd),
1068
        .b(s),
1069
        .o(dfscaleo)
1070
);
1071
 
1072
`endif
1073
 
1074 2 robfinch
always_comb
1075
case(ir[15:8])
1076
`BRA:   takb = 1'b1;
1077
`BSR:   takb = 1'b0;
1078
`BHI:   takb = !cf & !zf;
1079
`BLS:   takb = cf | zf;
1080
`BHS:   takb = !cf;
1081
`BLO:   takb =  cf;
1082
`BNE:   takb = !zf;
1083
`BEQ:   takb =  zf;
1084
`BVC:   takb = !vf;
1085
`BVS:   takb =  vf;
1086
`BPL:   takb = !nf;
1087
`BMI:   takb =  nf;
1088
`BGE:   takb = (nf & vf)|(!nf & !vf);
1089
`BLT:   takb = (nf & !vf)|(!nf & vf);
1090
`BGT:   takb = (nf & vf & !zf)|(!nf & !vf & zf);
1091
`BLE:   takb = zf | (nf & !vf) | (!nf & vf);
1092
`DBRA:  takb = 1'b1;
1093
`DBSR:  takb = 1'b0;
1094
`DBHI:  takb = !cf & !zf;
1095
`DBLS:  takb = cf | zf;
1096
`DBHS:  takb = !cf;
1097
`DBLO:  takb =  cf;
1098
`DBNE:  takb = !zf;
1099
`DBEQ:  takb =  zf;
1100
`DBVC:  takb = !vf;
1101
`DBVS:  takb =  vf;
1102
`DBPL:  takb = !nf;
1103
`DBMI:  takb =  nf;
1104
`DBGE:  takb = ((nf & vf)|(!nf & !vf));
1105
`DBLT:  takb = ((nf & !vf)|(!nf & vf));
1106
`DBGT:  takb = ((nf & vf & !zf)|(!nf & !vf & zf));
1107
`DBLE:  takb = (zf | (nf & !vf) | (!nf & vf));
1108
default:        takb = 1'b1;
1109
endcase
1110
 
1111 4 robfinch
`ifdef SUPPORT_DECFLT
1112
always_comb
1113
case(ir[5:0])
1114
6'b000001:      ftakb =  fzf;   // EQ
1115
6'b001110:      ftakb = !fzf;   // NE
1116
6'b010010:      ftakb = !fnanf && !fzf && !fvf && !fnf; // GT
1117
6'b011101:      ftakb = fnanf || fzf || fnf;    // NGT
1118
6'b010011:      ftakb = fzf || (!fnanf && !fvf && !fnf);        // GE
1119
6'b011100:      ftakb = fnanf || (fnf && !fzf);         // NGE
1120
6'b010100:      ftakb = fnf && (!fnanf && !fvf && !fzf);   // LT
1121
6'b011011:      ftakb = fnanf || (fzf || !fnf); // NLT
1122
6'b010101:      ftakb = fzf || (fnf && !fnanf);   // LE
1123
6'b011010:      ftakb = fnanf || (!fnf && !fvf && !fzf);        // NLE
1124
6'b010110:      ftakb = !fnanf && !fvf && !fzf;        // GL
1125
6'b011001:      ftakb = fnanf || fzf;   // NGL
1126
6'b010111:      ftakb = !fnanf; // GLE
1127
6'b011000:      ftakb = fnanf;  // NGLE
1128
 
1129
6'b000010:      ftakb = !fnanf && !fzf && !fvf && !fnf; // OGT
1130
6'b001101:      ftakb = fnanf || fzf || fnf;    // ULE
1131
6'b000011:      ftakb = fzf || (!fnanf && !fvf && !fnf);        // OGE
1132
6'b001100:      ftakb = fnanf || (fnf && !fzf); // ULT
1133
6'b000100:      ftakb = fnf && (!fnanf && !fvf && !fzf);   // OLT
1134
6'b001011:      ftakb = fnanf || fzf || fnf;    // UGE
1135
6'b000101:      ftakb = fzf || (fnf && !fnanf);   // OLE
1136
6'b001010:      ftakb = fnanf || (!fnf && !fvf && !fzf); // UGT
1137
6'b000110:      ftakb = !fnanf && !fvf && !fzf;        // OGL
1138
6'b001001:      ftakb = fnanf || fzf;   // UEQ
1139
6'b000111:      ftakb = !fnanf;
1140
6'b001000:      ftakb = fnanf;
1141
 
1142
6'b000000:      ftakb = 1'b0;   // F
1143
6'b001111:      ftakb = 1'b1;   // T
1144
6'b010000:      ftakb = 1'b0;   // SF
1145
6'b011111:      ftakb = 1'b1;   // ST
1146
6'b010001:      ftakb = fzf;    // SEQ
1147
6'b011110:      ftakb = !fzf;   // SNE
1148
endcase
1149
`endif
1150
 
1151 2 robfinch
`ifdef BIG_ENDIAN
1152
wire [15:0] iri = pc[1] ? {dat_i[23:16],dat_i[31:24]} : {dat_i[7:0],dat_i[15:8]};
1153
`else
1154
wire [15:0] iri = pc[1] ? dat_i[31:16] : dat_i[15:0];
1155
`endif
1156
 
1157
assign clk_g = clk_i;
1158
 
1159
always_ff @(posedge clk_g)
1160
if (rst_i) begin
1161
        em <= 1'b0;
1162
        lock_o <= 1'b0;
1163
        cyc_o <= 1'b0;
1164
        stb_o <= 1'b0;
1165
        we_o <= 1'b0;
1166
        sel_o <= 4'b0000;
1167
        fc_o <= 3'b000;
1168
        adr_o <= 32'd0;
1169
        dat_o <= 32'd0;
1170
        rfwrB <= 1'b0;
1171
        rfwrW <= 1'b0;
1172
        rfwrL <= 1'b0;
1173 4 robfinch
        rfwrF <= 1'b0;
1174 2 robfinch
        zf <= 1'b0;
1175
        nf <= 1'b0;
1176
        cf <= 1'b0;
1177
        vf <= 1'b0;
1178
        xf <= 1'b0;
1179
        im <= 3'b111;
1180
        sf <= 1'b1;
1181
        tf <= 1'b0;
1182 4 robfinch
        fnanf <= 1'b0;
1183
        fzf <= 1'b0;
1184
        fnf <= 1'b0;
1185
        fvf <= 1'b0;
1186 2 robfinch
        goto (RESET);
1187
        rstate <= RESET;
1188
        prev_nmi <= 1'b0;
1189
        pe_nmi <= 1'b0;
1190
  tick <= 32'd0;
1191
  rst_cnt <= 5'd10;
1192
  rst_o <= 1'b1;
1193
  is_rst <= 1'b1;
1194
        MMMRRR <= 1'b0;
1195
        rtr <= 1'b0;
1196
        bsr <= 1'b0;
1197
        lea <= 1'b0;
1198
        divs <= 1'b0;
1199 4 robfinch
        fsub <= 1'b0;
1200 8 robfinch
        fabs <= 1'b0;
1201 2 robfinch
        bcdsub <= 1'b0;
1202
        bcdneg <= 1'b0;
1203 8 robfinch
        fmovem <= 1'b0;
1204 2 robfinch
        icnt <= 'd0;
1205
        is_bus_err <= 1'b0;
1206
        is_adr_err <= 1'b0;
1207
        is_trace <= 1'b0;
1208
        is_priv <= 1'b0;
1209
        is_illegal <= 1'b0;
1210
        vbr <= 'd0;
1211
        sfc <= 'd0;
1212
        dfc <= 'd0;
1213
        dati_buf <= 'd0;
1214
        dato_buf <= 'd0;
1215
        use_sfc <= 'd0;
1216
        use_dfc <= 'd0;
1217
        ext_ir <= 1'b0;
1218
        ios  <= 32'hFD000000;
1219
        iops <= 32'hFD100000;
1220
        mmus <= 32'hFDC00000;
1221 8 robfinch
        canary <= 'd0;
1222 2 robfinch
end
1223
else begin
1224
 
1225
if (rst_cnt != 5'd0)
1226
    rst_cnt <= rst_cnt - 5'd1;
1227
else
1228
    rst_o <= 1'b0;
1229
 
1230
tick <= tick + 32'd1;
1231
prev_nmi <= nmi_i;
1232
if (nmi_i & !prev_nmi)
1233
        pe_nmi <= 1'b1;
1234
 
1235
// Register file update
1236
rfwrB <= 1'b0;
1237
rfwrW <= 1'b0;
1238
rfwrL <= 1'b0;
1239 4 robfinch
rfwrF <= 1'b0;
1240 2 robfinch
if (rfwrL) begin
1241
  case(Rt)
1242
  4'd0:   d0 <= resL[31:0];
1243
  4'd1:   d1 <= resL[31:0];
1244
  4'd2:   d2 <= resL[31:0];
1245
  4'd3:   d3 <= resL[31:0];
1246
  4'd4:   d4 <= resL[31:0];
1247
  4'd5:   d5 <= resL[31:0];
1248
  4'd6:   d6 <= resL[31:0];
1249
  4'd7:   d7 <= resL[31:0];
1250
  4'd8:   a0 <= resL[31:0];
1251
  4'd9:   a1 <= resL[31:0];
1252
  4'd10:  a2 <= resL[31:0];
1253
  4'd11:  a3 <= resL[31:0];
1254
  4'd12:  a4 <= resL[31:0];
1255
  4'd13:  a5 <= resL[31:0];
1256
  4'd14:  a6 <= resL[31:0];
1257
  4'd15:  sp <= resL[31:0];
1258
  endcase
1259
end
1260
else if (rfwrW) begin
1261
  case(Rt)
1262
  4'd0:   d0[15:0] <= resW[15:0];
1263
  4'd1:   d1[15:0] <= resW[15:0];
1264
  4'd2:   d2[15:0] <= resW[15:0];
1265
  4'd3:   d3[15:0] <= resW[15:0];
1266
  4'd4:   d4[15:0] <= resW[15:0];
1267
  4'd5:   d5[15:0] <= resW[15:0];
1268
  4'd6:   d6[15:0] <= resW[15:0];
1269
  4'd7:   d7[15:0] <= resW[15:0];
1270
  4'd8:   a0 <= {{16{resW[15]}},resW[15:0]};
1271
  4'd9:   a1 <= {{16{resW[15]}},resW[15:0]};
1272
  4'd10:  a2 <= {{16{resW[15]}},resW[15:0]};
1273
  4'd11:  a3 <= {{16{resW[15]}},resW[15:0]};
1274
  4'd12:  a4 <= {{16{resW[15]}},resW[15:0]};
1275
  4'd13:  a5 <= {{16{resW[15]}},resW[15:0]};
1276
  4'd14:  a6 <= {{16{resW[15]}},resW[15:0]};
1277
  4'd15:  sp <= {{16{resW[15]}},resW[15:0]};
1278
  endcase
1279
end
1280
else if (rfwrB)
1281
  case(Rt)
1282
  4'd0:   d0[7:0] <= resB[7:0];
1283
  4'd1:   d1[7:0] <= resB[7:0];
1284
  4'd2:   d2[7:0] <= resB[7:0];
1285
  4'd3:   d3[7:0] <= resB[7:0];
1286
  4'd4:   d4[7:0] <= resB[7:0];
1287
  4'd5:   d5[7:0] <= resB[7:0];
1288
  4'd6:   d6[7:0] <= resB[7:0];
1289
  4'd7:   d7[7:0] <= resB[7:0];
1290
  default:    ;
1291
  endcase
1292 4 robfinch
`ifdef SUPPORT_DECFLT
1293
 if (rfwrF && DECFLT)
1294
        case(Rt)
1295
        4'd0:   fp0 <= resF;
1296
        4'd1:   fp1 <= resF;
1297
        4'd2:   fp2 <= resF;
1298
        4'd3:   fp3 <= resF;
1299
        4'd4:   fp4 <= resF;
1300
        4'd5:   fp5 <= resF;
1301
        4'd6:   fp6 <= resF;
1302
        4'd7:   fp7 <= resF;
1303
        default:        ;
1304
        endcase
1305
`endif
1306 2 robfinch
 
1307
case(state)
1308
 
1309
IFETCH:
1310
        begin
1311
                case(flag_update)
1312
                FU_MUL:
1313
                        begin
1314
                                cf <= 1'b0;
1315
                                vf <= 1'b0;
1316
                                nf <= resL[31];
1317
                                zf <= resL[31:0]==32'd0;
1318
                        end
1319
                FU_TST:
1320
                        begin
1321
                                cf <= 1'b0;
1322
                                vf <= 1'b0;
1323
                                case(sz)
1324
                                2'b00:  begin zf <= d[7:0]==8'h00; nf <= d[7]; end
1325
                                2'b01:  begin zf <= d[15:0]==16'h00; nf <= d[15]; end
1326
                                2'b10:  begin zf <= d[31:0]==32'h00; nf <= d[31]; end
1327
                                default:        ;
1328
                                endcase
1329
                        end
1330
                FU_CMP:
1331
                        begin
1332
                                case(sz)
1333
                                2'b00:  begin zf <= resB[ 7:0]== 8'd0; nf <= resB[ 7]; cf <= resB[ 8]; vf <= fnSubOverflow(resB[ 7],d[ 7],s[ 7]); end
1334
                                2'b01:  begin zf <= resW[15:0]==16'd0; nf <= resW[15]; cf <= resW[16]; vf <= fnSubOverflow(resW[15],d[15],s[15]); end
1335
                                2'b10:  begin zf <= resL[31:0]==32'd0; nf <= resL[31]; cf <= resL[32]; vf <= fnSubOverflow(resL[31],d[31],s[31]); end
1336
                                2'b11:  begin zf <= resL[31:0]==32'd0; nf <= resL[31]; cf <= resL[32]; vf <= fnSubOverflow(resL[31],d[31],s[31]); end   // CMPA
1337
                                endcase
1338
                        end
1339
                FU_ADD:
1340
                        begin
1341
                                case(sz)
1342
                                2'b00:
1343
                                        begin
1344
                                                cf <= resB[8];
1345
                                                nf <= resB[7];
1346
                                                zf <= resB[7:0]==8'h00;
1347
                                                vf <= fnAddOverflow(resB[7],dd[7],s[7]);
1348
                                                xf <= resB[8];
1349
                                        end
1350
                                2'b01:
1351
                                        begin
1352
                                                cf <= resW[16];
1353
                                                nf <= resW[15];
1354
                                                zf <= resW[15:0]==16'h0000;
1355
                                                vf <= fnAddOverflow(resW[15],dd[15],s[15]);
1356
                                                xf <= resW[16];
1357
                                        end
1358
                                2'b10:
1359
                                        begin
1360
                                                cf <= resL[32];
1361
                                                nf <= resL[31];
1362
                                                zf <= resL[31:0]==32'h00000000;
1363
                                                vf <= fnAddOverflow(resL[31],dd[31],s[31]);
1364
                                                xf <= resL[32];
1365
                                        end
1366
                                default:        ;
1367
                                endcase
1368
                        end
1369
                FU_ADDX:
1370
                        begin
1371
                                case(sz)
1372
                                2'b00:
1373
                                        begin
1374
                                                cf <= resB[8];
1375
                                                nf <= resB[7];
1376
                                                if (resB[7:0]!=8'h00)
1377
                                                        zf <= 1'b0;
1378
                                                vf <= fnAddOverflow(resB[7],dd[7],s[7]);
1379
                                                xf <= resB[8];
1380
                                        end
1381
                                2'b01:
1382
                                        begin
1383
                                                cf <= resW[16];
1384
                                                nf <= resW[15];
1385
                                                if (resW[15:0]!=16'h00)
1386
                                                        zf <= 1'b0;
1387
                                                vf <= fnAddOverflow(resW[15],dd[15],s[15]);
1388
                                                xf <= resW[16];
1389
                                        end
1390
                                2'b10:
1391
                                        begin
1392
                                                cf <= resL[32];
1393
                                                nf <= resL[31];
1394
                                                if (resL[31:0]!=32'h00)
1395
                                                        zf <= 1'b0;
1396
                                                vf <= fnAddOverflow(resL[31],dd[31],s[31]);
1397
                                                xf <= resL[32];
1398
                                        end
1399
                                default:        ;
1400
                                endcase
1401
                        end
1402
                FU_SUBX:
1403
                        begin
1404
                                case(sz)
1405
                                2'b00:
1406
                                        begin
1407
                                                cf <= resB[8];
1408
                                                nf <= resB[7];
1409
                                                if (resB[7:0]!=8'h00)
1410
                                                        zf <= 1'b0;
1411
                                                vf <= fnSubOverflow(resB[7],dd[7],s[7]);
1412
                                                xf <= resB[8];
1413
                                        end
1414
                                2'b01:
1415
                                        begin
1416
                                                cf <= resW[16];
1417
                                                nf <= resW[15];
1418
                                                if (resW[15:0]!=16'h00)
1419
                                                        zf <= 1'b0;
1420
                                                vf <= fnSubOverflow(resW[15],dd[15],s[15]);
1421
                                                xf <= resW[16];
1422
                                        end
1423
                                2'b10:
1424
                                        begin
1425
                                                cf <= resL[32];
1426
                                                nf <= resL[31];
1427
                                                if (resL[31:0]!=32'h00)
1428
                                                        zf <= 1'b0;
1429
                                                vf <= fnSubOverflow(resL[31],dd[31],s[31]);
1430
                                                xf <= resL[32];
1431
                                        end
1432
                                default:        ;
1433
                                endcase
1434
                        end
1435
                FU_SUB:
1436
                        begin
1437
                                case(sz)
1438
                                2'b00:
1439
                                        begin
1440
                                                cf <= resB[8];
1441
                                                nf <= resB[7];
1442
                                                zf <= resB[7:0]==8'h00;
1443
                                                vf <= fnSubOverflow(resB[7],dd[7],s[7]);
1444
                                                xf <= resB[8];
1445
                                        end
1446
                                2'b01:
1447
                                        begin
1448
                                                cf <= resW[16];
1449
                                                nf <= resW[15];
1450
                                                zf <= resW[15:0]==16'h0000;
1451
                                                vf <= fnSubOverflow(resW[15],dd[15],s[15]);
1452
                                                xf <= resW[16];
1453
                                        end
1454
                                2'b10:
1455
                                        begin
1456
                                                cf <= resL[32];
1457
                                                nf <= resL[31];
1458
                                                zf <= resL[31:0]==32'h00000000;
1459
                                                vf <= fnSubOverflow(resL[31],dd[31],s[31]);
1460
                                                xf <= resL[32];
1461
                                        end
1462
                                default:        ;
1463
                                endcase
1464
                        end
1465
                FU_LOGIC:
1466
                        begin
1467
                                cf <= 1'b0;
1468
                                vf <= 1'b0;
1469
                                case(sz)
1470
                                2'b00:
1471
                                        begin
1472
                                                nf <= resB[7];
1473
                                                zf <= resB[7:0]==8'h00;
1474
                                        end
1475
                                2'b01:
1476
                                        begin
1477
                                                nf <= resW[15];
1478
                                                zf <= resW[15:0]==16'h0000;
1479
                                        end
1480
                                2'b10:
1481
                                        begin
1482
                                                nf <= resL[31];
1483
                                                zf <= resL[31:0]==32'h00000000;
1484
                                        end
1485
                                default:        ;
1486
                                endcase
1487
                        end
1488
                FU_ADDQ:
1489
                        begin
1490
                                case(sz)
1491
                                2'b00:
1492
                                        begin
1493
                                                 xf <= resB[8];
1494
                                                 cf <= resB[8];
1495
                                                 vf <= resB[8]!=resB[7];
1496
                                                vf <= fnAddOverflow(resB[7],dd[7],s[7]);
1497
                                                 //zf <= resB[7:0]==8'd0;
1498
                                                 nf <= resB[7];
1499
                                        end
1500
                                2'b01:
1501
                                        begin
1502
                                                 xf <= resW[16];
1503
                                                 cf <= resW[16];
1504
                                                vf <= fnAddOverflow(resW[15],dd[15],s[15]);
1505
                                                 //vf <= resW[16]!=resW[15];
1506
                                                 zf <= resW[15:0]==16'd0;
1507
                                                 nf <= resW[15];
1508
                                        end
1509
                                2'b10:
1510
                                        begin
1511
                                                 xf <= resL[32];
1512
                                                 cf <= resL[32];
1513
                                                vf <= fnAddOverflow(resL[31],dd[31],s[31]);
1514
                                                // vf <= resL[32]!=resL[31];
1515
                                                 zf <= resL[31:0]==32'd0;
1516
                                                 nf <= resL[31];
1517
                                        end
1518
                                endcase
1519
                        end
1520
                FU_SUBQ:
1521
                        begin
1522
                                case(sz)
1523
                                2'b00:
1524
                                        begin
1525
                                                 xf <= resB[8];
1526
                                                 cf <= resB[8];
1527
                                                 vf <= resB[8]!=resB[7];
1528
                                                vf <= fnSubOverflow(resB[7],dd[7],s[7]);
1529
                                                 //zf <= resB[7:0]==8'd0;
1530
                                                 nf <= resB[7];
1531
                                        end
1532
                                2'b01:
1533
                                        begin
1534
                                                 xf <= resW[16];
1535
                                                 cf <= resW[16];
1536
                                                vf <= fnSubOverflow(resW[15],dd[15],s[15]);
1537
                                                 //vf <= resW[16]!=resW[15];
1538
                                                 zf <= resW[15:0]==16'd0;
1539
                                                 nf <= resW[15];
1540
                                        end
1541
                                2'b10:
1542
                                        begin
1543
                                                 xf <= resL[32];
1544
                                                 cf <= resL[32];
1545
                                                vf <= fnSubOverflow(resL[31],dd[31],s[31]);
1546
                                                // vf <= resL[32]!=resL[31];
1547
                                                 zf <= resL[31:0]==32'd0;
1548
                                                 nf <= resL[31];
1549
                                        end
1550
                                endcase
1551
                        end
1552
                FU_ADDI:
1553
                        begin
1554
                                case(ir[11:8])
1555
                                4'h0,4'h2,4'hA:
1556
                                                begin   // ORI,ANDI,EORI
1557
                                                        cf <= 1'b0;
1558
                                                        vf <= 1'b0;
1559
                                                        case(sz)
1560
                                                        2'b00:  zf <= resB[7:0]==8'h00;
1561
                                                        2'b01:  zf <= resW[15:0]==16'h00;
1562
                                                        2'b10:  zf <= resL[31:0]==32'd0;
1563
                                                        endcase
1564
                                                        case(sz)
1565
                                                        2'b00:  nf <= resB[7];
1566
                                                        2'b01:  nf <= resW[15];
1567
                                                        2'b10:  nf <= resL[31];
1568
                                                        endcase
1569
                                                end
1570
                                4'h4:   // SUBI
1571
                                        begin
1572
                                                case(sz)
1573
                                                2'b00:
1574
                                                        begin
1575
                                                                xf <= resB[8];
1576
                                                                cf <= resB[8];
1577
                                                                vf <= fnSubOverflow(resB[7],dd[7],immx[7]);
1578
                                                                //vf <= resB[8]!=resB[7];
1579
                                                                zf <= resB[7:0]==8'd0;
1580
                                                                nf <= resB[7];
1581
                                                        end
1582
                                                2'b01:
1583
                                                        begin
1584
                                                                xf <= resW[16];
1585
                                                                cf <= resW[16];
1586
                                                                vf <= fnSubOverflow(resW[15],dd[15],immx[15]);
1587
                                                                //vf <= resW[16]!=resW[15];
1588
                                                                zf <= resW[15:0]==16'd0;
1589
                                                                nf <= resW[15];
1590
                                                        end
1591
                                                2'b10:
1592
                                                        begin
1593
                                                                xf <= resL[32];
1594
                                                                cf <= resL[32];
1595
                                                                vf <= fnSubOverflow(resL[31],dd[31],immx[31]);
1596
                                                                //vf <= resL[32]!=resL[31];
1597
                                                                zf <= resL[31:0]==32'd0;
1598
                                                                nf <= resL[31];
1599
                                                        end
1600
                                                endcase
1601
                                        end
1602
                                4'h6:   // ADDI
1603
                                        begin
1604
                                                case(sz)
1605
                                                2'b00:
1606
                                                        begin
1607
                                                                xf <= resB[8];
1608
                                                                cf <= resB[8];
1609
                                                                vf <= fnAddOverflow(resB[7],dd[7],immx[7]);
1610
                                                                //vf <= resB[8]!=resB[7];
1611
                                                                zf <= resB[7:0]==8'd0;
1612
                                                                nf <= resB[7];
1613
                                                        end
1614
                                                2'b01:
1615
                                                        begin
1616
                                                                xf <= resW[16];
1617
                                                                cf <= resW[16];
1618
                                                                vf <= fnAddOverflow(resW[15],dd[15],immx[15]);
1619
                                                                //vf <= resW[16]!=resW[15];
1620
                                                                zf <= resW[15:0]==16'd0;
1621
                                                                nf <= resW[15];
1622
                                                        end
1623
                                                2'b10:
1624
                                                        begin
1625
                                                                xf <= resL[32];
1626
                                                                cf <= resL[32];
1627
                                                                vf <= fnAddOverflow(resL[31],dd[31],immx[31]);
1628
                                                                //vf <= resL[32]!=resL[31];
1629
                                                                zf <= resL[31:0]==32'd0;
1630
                                                                nf <= resL[31];
1631
                                                        end
1632
                                                endcase
1633
                                        end
1634
                                4'hC:   // CMPI
1635
                                        begin
1636
                                                case(sz)
1637
                                                2'b00:
1638
                                                        begin
1639
                                                                cf <= resB[8];
1640
                                                                vf <= fnSubOverflow(resB[7],dd[7],immx[7]);
1641
                                                                zf <= resB[7:0]==8'd0;
1642
                                                                nf <= resB[7];
1643
                                                        end
1644
                                                2'b01:
1645
                                                        begin
1646
                                                                cf <= resW[16];
1647
                                                                vf <= fnSubOverflow(resW[15],dd[15],immx[15]);
1648
                                                                //vf <= resW[16]!=resW[15];
1649
                                                                zf <= resW[15:0]==16'd0;
1650
                                                                nf <= resW[15];
1651
                                                        end
1652
                                                2'b10:
1653
                                                        begin
1654
                                                                cf <= resL[32];
1655
                                                                vf <= fnSubOverflow(resL[31],dd[31],immx[31]);
1656
                                                                //vf <= resL[32]!=resL[31];
1657
                                                                zf <= resL[31:0]==32'd0;
1658
                                                                nf <= resL[31];
1659
                                                        end
1660
                                                endcase
1661
                                        end
1662
                                endcase
1663
                        end
1664
                FU_ANDI_CCR:
1665
                        begin
1666
                                cf <= cf & imm[0];
1667
                                vf <= vf & imm[1];
1668
                                zf <= zf & imm[2];
1669
                                nf <= nf & imm[3];
1670
                                xf <= xf & imm[4];
1671
                        end
1672
                FU_ANDI_SR:
1673
                        begin
1674
                                cf <= cf & imm[0];
1675
                                vf <= vf & imm[1];
1676
                                zf <= zf & imm[2];
1677
                                nf <= nf & imm[3];
1678
                                xf <= xf & imm[4];
1679
                                im[0] <= im[0] & imm[8];
1680
                                im[1] <= im[1] & imm[9];
1681
                                im[2] <= im[2] & imm[10];
1682
                                sf <= sf & imm[13];
1683
                                tf <= tf & imm[15];
1684
                        end
1685
                FU_ANDI_SRX:
1686
                        begin
1687
                                cf <= cf & imm[0];
1688
                                vf <= vf & imm[1];
1689
                                zf <= zf & imm[2];
1690
                                nf <= nf & imm[3];
1691
                                xf <= xf & imm[4];
1692
                                im[0] <= im[0] & imm[8];
1693
                                im[1] <= im[1] & imm[9];
1694
                                im[2] <= im[2] & imm[10];
1695
                                sf <= sf & imm[13];
1696
                                tf <= tf & imm[15];
1697
                        end
1698
                FU_EORI_CCR:
1699
                        begin
1700
                                cf <= cf ^ imm[0];
1701
                                vf <= vf ^ imm[1];
1702
                                zf <= zf ^ imm[2];
1703
                                nf <= nf ^ imm[3];
1704
                                xf <= xf ^ imm[4];
1705
                        end
1706
                FU_EORI_SR:
1707
                        begin
1708
                                cf <= cf ^ imm[0];
1709
                                vf <= vf ^ imm[1];
1710
                                zf <= zf ^ imm[2];
1711
                                nf <= nf ^ imm[3];
1712
                                xf <= xf ^ imm[4];
1713
                                im[0] <= im[0] ^ imm[8];
1714
                                im[1] <= im[1] ^ imm[9];
1715
                                im[2] <= im[2] ^ imm[10];
1716
                                sf <= sf ^ imm[13];
1717
                                tf <= tf ^ imm[15];
1718
                        end
1719
                FU_EORI_SRX:
1720
                        begin
1721
                                cf <= cf ^ imm[0];
1722
                                vf <= vf ^ imm[1];
1723
                                zf <= zf ^ imm[2];
1724
                                nf <= nf ^ imm[3];
1725
                                xf <= xf ^ imm[4];
1726
                                im[0] <= im[0] ^ imm[8];
1727
                                im[1] <= im[1] ^ imm[9];
1728
                                im[2] <= im[2] ^ imm[10];
1729
                                sf <= sf ^ imm[13];
1730
                                tf <= tf ^ imm[15];
1731
                        end
1732
                FU_ORI_CCR:
1733
                        begin
1734
                                cf <= cf | imm[0];
1735
                                vf <= vf | imm[1];
1736
                                zf <= zf | imm[2];
1737
                                nf <= nf | imm[3];
1738
                                xf <= xf | imm[4];
1739
                        end
1740
                FU_ORI_SR:
1741
                        begin
1742
                                cf <= cf | imm[0];
1743
                                vf <= vf | imm[1];
1744
                                zf <= zf | imm[2];
1745
                                nf <= nf | imm[3];
1746
                                xf <= xf | imm[4];
1747
                                im[0] <= im[0] | imm[8];
1748
                                im[1] <= im[1] | imm[9];
1749
                                im[2] <= im[2] | imm[10];
1750
                                sf <= sf | imm[13];
1751
                                tf <= tf | imm[15];
1752
                        end
1753
                FU_ORI_SRX:
1754
                        begin
1755
                                cf <= cf | imm[0];
1756
                                vf <= vf | imm[1];
1757
                                zf <= zf | imm[2];
1758
                                nf <= nf | imm[3];
1759
                                xf <= xf | imm[4];
1760
                                im[0] <= im[0] | imm[8];
1761
                                im[1] <= im[1] | imm[9];
1762
                                im[2] <= im[2] | imm[10];
1763
                                sf <= sf | imm[13];
1764
                                tf <= tf | imm[15];
1765
                        end
1766
                FU_MOVE2CCR:
1767
                        begin
1768
                                cf <= s[0];
1769
                                vf <= s[1];
1770
                                zf <= s[2];
1771
                                nf <= s[3];
1772
                                xf <= s[4];
1773
                                ccr57 <= s[7:5];
1774
                        end
1775
                FU_MOVE2SR:
1776
                        begin
1777
                                cf <= s[0];
1778
                                vf <= s[1];
1779
                                zf <= s[2];
1780
                                nf <= s[3];
1781
                                xf <= s[4];
1782
                                ccr57 <= s[7:5];
1783
                                im[0] <= s[8];
1784
                                im[1] <= s[9];
1785
                                im[2] <= s[10];
1786
                                sr1112 <= s[12:11];
1787
                                sf <= s[13];
1788
                                sr14 <= s[14];
1789
                                tf <= s[15];
1790
                        end
1791
                FU_MOVE2SRX:
1792
                        begin
1793
                                cf <= s[0];
1794
                                vf <= s[1];
1795
                                zf <= s[2];
1796
                                nf <= s[3];
1797
                                xf <= s[4];
1798
                                ccr57 <= s[7:5];
1799
                                im[0] <= s[8];
1800
                                im[1] <= s[9];
1801
                                im[2] <= s[10];
1802
                                sr1112 <= s[12:11];
1803
                                sf <= s[13];
1804
                                sr14 <= s[14];
1805
                                tf <= s[15];
1806
                        end
1807
                default:        ;
1808
                endcase
1809
                flag_update <= FU_NONE;
1810
                MMMRRR <= 1'b0;
1811
                rtr <= 1'b0;
1812
                bsr <= 1'b0;
1813
                lea <= 1'b0;
1814 4 robfinch
                fsub <= 1'b0;
1815 8 robfinch
                fabs <= 1'b0;
1816 2 robfinch
                bcdsub <= 1'b0;
1817
                bcdneg <= 1'b0;
1818 8 robfinch
                fmovem <= 1'b0;
1819 2 robfinch
                is_illegal <= 1'b0;
1820
                use_sfc <= 1'b0;
1821
                use_dfc <= 1'b0;
1822 4 robfinch
                fpcnt <= 'd0;
1823 8 robfinch
                fpiar <= pc;
1824 2 robfinch
                if (!cyc_o) begin
1825
                        is_nmi <= 1'b0;
1826
                        is_irq <= 1'b0;
1827
                        /*
1828
                        if (pe_nmi) begin
1829
                                pe_nmi <= 1'b0;
1830
                                is_nmi <= 1'b1;
1831
                                goto(TRAP);
1832
                        end
1833
                        else
1834
                        */
1835
                        if (ipl_i > im) begin
1836
                                is_irq <= 1'b1;
1837
                                gosub(TRAP);
1838
                        end
1839
                        else if (pc[0]) begin
1840
                                is_adr_err <= 1'b1;
1841
                                gosub(TRAP);
1842
                        end
1843
                        else begin
1844
                                fc_o <= {sf,2'b10};
1845
                                cyc_o <= 1'b1;
1846
                                stb_o <= 1'b1;
1847
                                sel_o <= 4'b1111;
1848
                                adr_o <= pc;
1849 3 robfinch
                                goto (IFETCH);
1850 2 robfinch
                        end
1851
                end
1852
                else if (ack_i) begin
1853
                        cyc_o <= 1'b0;
1854
                        stb_o <= 1'b0;
1855
                        sel_o <= 2'b00;
1856
                        ir <= iri;
1857
                        mmm <= iri[5:3];
1858
                        rrr <= iri[2:0];
1859
                        rrrr <= iri[3:0];
1860
                        gosub (DECODE);
1861
                end
1862
        end
1863
IFETCH2:
1864
        if (!cyc_o) begin
1865
                fc_o <= {sf,2'b10};
1866
                cyc_o <= 1'b1;
1867
                stb_o <= 1'b1;
1868
                sel_o <= 4'b1111;
1869
                adr_o <= pc;
1870 4 robfinch
                ext_ir <= 1'b1;
1871 3 robfinch
                goto (IFETCH2);
1872 2 robfinch
        end
1873
        else if (ack_i) begin
1874
                cyc_o <= 1'b0;
1875
                stb_o <= 1'b0;
1876
                sel_o <= 2'b00;
1877
                ext_ir <= 1'b1;
1878
                ir2 <= iri;
1879 4 robfinch
                FLTSRC <= iri[12:10];
1880
                FLTDST <= iri[ 9: 7];
1881 2 robfinch
                goto (DECODE);
1882
        end
1883
 
1884
//-----------------------------------------------------------------------------
1885
//-----------------------------------------------------------------------------
1886
DECODE:
1887
        begin
1888
                pc <= pc + 4'd2;
1889
                opc <= pc + 4'd2;
1890
                icnt <= icnt + 2'd1;
1891
        case({ext_ir,ir[15:12]})
1892
        5'h0:
1893
                case(ir[11:8])
1894
                4'h0:
1895
                        case(ir[7:0])
1896
                        8'h3C:  state <= ORI_CCR;
1897
                        8'h7C:
1898
                                if (sf)
1899
                                        goto (ORI_SR);
1900
                                else
1901
                                        tPrivilegeViolation();
1902
                        8'hBC:
1903
                                if (sf)
1904
                                        goto (ORI_SRX);
1905
                                else
1906
                                        tPrivilegeViolation();
1907
                        default:        state <= ADDI;  // ORI
1908
                        endcase
1909
                4'h2:
1910
                        case(ir[7:0])
1911
                        8'h3C:  state <= ANDI_CCR;
1912
                        8'h7C:
1913
                                if (sf)
1914
                                        goto (ANDI_SR);
1915
                                else
1916
                                        tPrivilegeViolation();
1917
                        8'hBC:
1918
                                if (sf)
1919
                                        goto (ANDI_SRX);
1920
                                else
1921
                                        tPrivilegeViolation();
1922
                        default:        state <= ADDI;  // ANDI
1923
                        endcase
1924
                4'h4:   state <= ADDI;  // SUBI
1925
                4'h6:   state <= ADDI;  // ADDI
1926
                4'hA:
1927
                        case(ir[7:0])
1928
                        8'h3C:  state <= EORI_CCR;
1929
                        8'h7C:
1930
                                if (sf)
1931
                                        goto (EORI_SR);
1932
                                else
1933
                                        tPrivilegeViolation();
1934
                        8'hBC:
1935
                                if (sf)
1936
                                        goto (EORI_SRX);
1937
                                else
1938
                                        tPrivilegeViolation();
1939
                        default:        state <= ADDI;  // EORI
1940
                        endcase
1941
                4'hC:   state <= ADDI;  // CMPI
1942
`ifdef SUPPORT_010
1943
                4'hE:   // MOVES
1944
                        begin
1945
                                call(FETCH_IMM16,MOVES);
1946
                        end
1947
`endif
1948
                default:
1949
                        if (mmm==3'b001 && ir[8]) begin
1950
                                push(MOVEP);
1951
                                fs_data(3'b101,rrr,FETCH_NOP_WORD,S);
1952
                        end
1953
                        else
1954
                                goto (BIT);
1955
                endcase
1956
//-----------------------------------------------------------------------------
1957
// MOVE.B
1958
//-----------------------------------------------------------------------------
1959
        5'h1:
1960
                begin
1961
                        push(STORE_IN_DEST);
1962
                        fs_data(mmm,rrr,FETCH_BYTE,S);
1963
                end
1964
//-----------------------------------------------------------------------------
1965
// MOVE.L
1966
//-----------------------------------------------------------------------------
1967
  5'h2:
1968
        begin
1969
                        push(STORE_IN_DEST);
1970
        fs_data(mmm,rrr,FETCH_LWORD,S);
1971
    end
1972
//-----------------------------------------------------------------------------
1973
// MOVE.W
1974
//-----------------------------------------------------------------------------
1975
        5'h3:
1976
                begin
1977
                        push(STORE_IN_DEST);
1978
                        fs_data(mmm,rrr,FETCH_WORD,S);
1979
                end
1980
//-----------------------------------------------------------------------------
1981
//-----------------------------------------------------------------------------
1982
        5'h4:
1983
                casez(ir[11:3])
1984
                9'b0000?????:
1985
                        case(sz)
1986
                        2'b00:  begin push(NEGX); fs_data(mmm,rrr,FETCH_BYTE,D); end
1987
                        2'b01:  begin push(NEGX); fs_data(mmm,rrr,FETCH_WORD,D); end
1988
                        2'b10:  begin push(NEGX); fs_data(mmm,rrr,FETCH_LWORD,D); end
1989
                        2'b11:  // MOVE sr,
1990
                                if (sf) begin
1991
                                        d <= sr;
1992
                                        resW <= sr;
1993
                                        fs_data(mmm,rrr,STORE_WORD,S);
1994
                                end
1995
                                else
1996
                                        tPrivilegeViolation();
1997
                        endcase
1998
                9'b000110???:   // MOVE.L srx,
1999
                                if (sf) begin
2000
                                        d <= srx;
2001
                                        resL <= srx;
2002
                                        fs_data(mmm,rrr,STORE_LWORD,S);
2003
                                end
2004
                                else
2005
                                        tPrivilegeViolation();
2006
                9'b0010?????:
2007
                        begin           // 42xx CLR
2008
                                cf <= 1'b0;
2009
                                vf <= 1'b0;
2010
                                zf <= 1'b1;
2011
                                nf <= 1'b0;
2012
                                d <= 'd0;
2013 6 robfinch
                                resB <= 'd0;
2014
                                resW <= 'd0;
2015
                                resL <= 'd0;
2016 2 robfinch
                                case(sz)
2017
                                2'b00:  fs_data(mmm,rrr,STORE_BYTE,D);
2018
                                2'b01:  fs_data(mmm,rrr,STORE_WORD,D);
2019
                                2'b10:  fs_data(mmm,rrr,STORE_LWORD,D);
2020
                                default:        tIllegal();
2021
                                endcase
2022
                        end
2023
                9'b0100?????:
2024
                        casez(sz)
2025
                        2'b00:  begin push(NEG); fs_data(mmm,rrr,FETCH_BYTE,D); end
2026
                        2'b01:  begin push(NEG); fs_data(mmm,rrr,FETCH_WORD,D); end
2027
                        2'b10:  begin push(NEG); fs_data(mmm,rrr,FETCH_LWORD,D); end
2028
                        2'b11:  // MOVE ,ccr
2029
                                begin
2030
                                        flag_update <= FU_MOVE2CCR;
2031
                                        fs_data(mmm,rrr,FETCH_WORD,S);
2032
                                end
2033
                        endcase
2034
                9'b0110?????:
2035
                        case(sz)
2036
                        2'b00:  begin push(NOT); fs_data(mmm,rrr,FETCH_BYTE,D); end
2037
                        2'b01:  begin push(NOT); fs_data(mmm,rrr,FETCH_WORD,D); end
2038
                        2'b10:  begin push(NOT); fs_data(mmm,rrr,FETCH_LWORD,D); end
2039
                        2'b11:
2040
                                if (sf) begin   // MOVE ,sr
2041
                                        flag_update <= FU_MOVE2SR;
2042
                                        fs_data(mmm,rrr,FETCH_WORD,S);
2043
                                end
2044
                                else
2045
                                        tPrivilegeViolation();
2046
                        default:        ;
2047
                        endcase
2048
/*
2049
                9'b0111?????:
2050
                        case(sz)
2051
                        2'b00:  tIllegal();
2052
                        2'b01:  tIllegal();
2053
                        2'b10:  tIllegal();
2054
                        2'b11:
2055
                                if (sf) begin   // MOVE ,srx
2056
                                        flag_update <= FU_MOVE2SRX;
2057
                                        fs_data(mmm,rrr,FETCH_LWORD,S);
2058
                                end
2059
                                else
2060
                                        tPrivilegeViolation();
2061
                        default:        ;
2062
                        endcase
2063
*/
2064
                9'b10001?000:
2065
                        if (ir[6]) begin        // EXT.L
2066
                                cf <= 1'b0;
2067
                                vf <= 1'b0;
2068
                                nf <= rfoRnn[15];
2069
                                zf <= rfoRnn[15:0]==16'h0000;
2070
                                rfwrL <= 1'b1;
2071
                                Rt <= {1'b0,ir[2:0]};
2072
                                resL <= {{16{rfoRnn[15]}},rfoRnn[15:0]};
2073
                                ret();
2074
                        end
2075
                        else begin      // EXT.W
2076
                                cf <= 1'b0;
2077
                                vf <= 1'b0;
2078
                                nf <= rfoRnn[7];
2079
                                zf <= rfoRnn[7:0]==8'h00;
2080
                                rfwrW <= 1'b1;
2081
                                Rt <= {1'b0,ir[2:0]};
2082
                                resW <= {rfoRnn[31:16],{8{rfoRnn[7]}},rfoRnn[7:0]};
2083
                                ret();
2084
                        end
2085
`ifdef SUPPORT_BCD
2086
                9'b100000???:   // NBCD
2087
                        begin
2088
                                bcdneg <= 1'b1;
2089
                                push(BCD1);
2090
                                fs_data(mmm,rrr,FETCH_BYTE,D);
2091
                        end
2092
`endif
2093
                9'b100001000:   // 484x         SWAP
2094
                        begin
2095
                                cf <= 1'b0;
2096
                                vf <= 1'b0;
2097
                                zf <= rfoDnn==32'd0;
2098
                                nf <= rfoDnn[15];
2099
                                resL <= {rfoDnn[15:0],rfoDnn[31:16]};
2100
                                Rt <= {1'b0,rrr};
2101
                                rfwrL <= 1'b1;
2102
                                ret();
2103
                        end
2104
                9'b100001???:   // PEA
2105
                        begin
2106
                                lea <= 1'b1;
2107
                                goto (PEA1);
2108
                        end
2109
                9'b101011111:
2110
                        case(ir[3:0])
2111
                        4'hC:   tIllegal();     // 4AFC Illegal
2112
                        endcase
2113
                9'b1010?????:   // TST / TAS
2114
                        case(sz)
2115
                        2'b00:  begin flag_update <= FU_TST; fs_data(mmm,rrr,FETCH_BYTE,D); end
2116
                        2'b01:  begin flag_update <= FU_TST; fs_data(mmm,rrr,FETCH_WORD,D); end
2117
                        2'b10:  begin flag_update <= FU_TST; fs_data(mmm,rrr,FETCH_LWORD,D); end
2118
                        2'b11:  begin push(TAS); fs_data(mmm,rrr,LFETCH_BYTE,D); end            // TAS
2119
                        endcase
2120
                9'b11100100?:
2121
                        goto (TRAP);
2122
                9'b111001010:
2123
                        goto (LINK);
2124
                9'b111001011:
2125
                        begin           // UNLK
2126
                                sp <= rfoAn;
2127
                                goto (UNLNK);
2128
                        end
2129
                9'b11100110?:
2130
                        if (ir[3]) begin
2131
                                ret();
2132
                                Rt <= {1'b1,rrr};
2133
                                rfwrL <= 1'b1;
2134
                                resL <= usp;
2135
                        end
2136
                        else begin
2137
                                ret();
2138
                                usp <= rfoAn;
2139
                        end
2140
                9'b111001110:   // 4E70 RESET
2141
                        case(ir[2:0])
2142
                        3'b000:
2143
                                if (sf) begin
2144
                                        rst_o <= 1'b1;
2145
                                        rst_cnt <= 5'd10;
2146
                                        ret();
2147
                                end
2148
                                else
2149
                                        tPrivilegeViolation();
2150
                        3'b001: ret();  // NOP
2151
                        3'b010:
2152
                                if (sf)
2153
                                        goto (STOP);
2154
                                else
2155
                                        tPrivilegeViolation();
2156
                        3'b011:
2157
                                if (sf)
2158
                                        goto (RTE1);
2159
                                else
2160
                                        tPrivilegeViolation();
2161
                        3'b101:
2162
                                begin
2163
                                        ea <= sp;
2164
                                        sp <= sp + 4'd4;
2165
                                        ds <= S;
2166
                                        call (FETCH_LWORD,RTS1);
2167
                                end
2168
                        3'b110:
2169
                                if (vf) begin
2170
                        isr <= srx;
2171
                        tf <= 1'b0;
2172
                        sf <= 1'b1;
2173
                            vecno <= `TRAPV_VEC;
2174
                        goto (TRAP3);
2175
                                end
2176
                                else
2177
                                        ret();          // 4E76 TRAPV
2178
                        3'b111:
2179
                                begin
2180
                                        rtr <= 1'b1;
2181
                                        goto (RTE1); // RTR
2182
                                end
2183
                        endcase
2184
                9'b111001111:
2185
                        case(ir[2:0])
2186
                        3'b010:         call(FETCH_IMM16,MOVERc2Rn);
2187
                        3'b011:         call(FETCH_IMM16,MOVERn2Rc);
2188
                        default:        tIllegal();
2189
                        endcase
2190
                9'b111010???:   // JSR
2191
                        begin
2192
                                push(JSR);
2193
                                fs_data(mmm,rrr,FETCH_LWORD,D);
2194
                        end
2195
                9'b111011???:   // JMP
2196
                        begin
2197
                                push(JMP);
2198
                                fs_data(mmm,rrr,FETCH_NOP_LWORD,D);
2199
                        end
2200
                9'b1?001????:
2201
                        if (ir[10])
2202
                                call(FETCH_IMM16,MOVEM_s2Xn);
2203
                        else
2204
                                call(FETCH_IMM16,MOVEM_Xn2D);
2205
                9'b???111???:
2206
                        begin // LEA
2207
                                lea <= 1'b1;    // ToDo: fix this, lea needs to be set one cycle before fs_data is called
2208
                                goto (LEA);
2209
                        end
2210
                9'b???110???:
2211
                        begin   // CHK
2212
                                d <= rfoDn;
2213
                                push(CHK);
2214
                                fs_data(mmm,rrr,FETCH_WORD,S);
2215
                        end
2216
                default:
2217
                        tIllegal();
2218
                endcase
2219
//***           4'hF:   state <= RTD1;  // 4Fxx = rtd
2220
 
2221
//-----------------------------------------------------------------------------
2222
// ADDQ / SUBQ / DBRA / Scc
2223
//-----------------------------------------------------------------------------
2224
        5'h5:
2225
                begin
2226 3 robfinch
                        casez(ir[7:3])
2227 2 robfinch
                        // When optimizing DBRA for performance, the memory access cycle to fetch
2228
                        // the displacement constant is not done, instead the PC is incremented by
2229
                        // two if not doing the DBRA. This is an extra PC increment that increases
2230
                        // the code size. It is slower, but more hardware efficient to just always
2231
                        // fetch the displacement.
2232 3 robfinch
                        5'b11001:                                       // DBRA
2233 2 robfinch
`ifdef OPT_PERF
2234
                                if (~takb) begin
2235
                                        call(FETCH_IMM16,DBRA);
2236
                                end
2237
                                else begin
2238
                                        pc <= pc + 32'd4;       // skip over displacement
2239
                                        ret();
2240
                                end
2241
`else
2242
                                call(FETCH_IMM16,DBRA);
2243
`endif
2244 3 robfinch
                        5'b11???:               // Scc
2245 2 robfinch
                                begin
2246
                                        resL <= {32{takb}};
2247
                                        resW <= {16{takb}};
2248
                                        resB <= {8{takb}};
2249
                                        d <= {32{takb}};
2250
                                        if (mmm==3'b000) begin
2251
                                                rfwrB <= 1'b1;
2252
                                                Rt <= {1'b0,rrr};
2253
                                                ret();
2254
                                        end
2255
                                        else begin
2256
                                                fs_data(mmm,rrr,STORE_BYTE,S);
2257
                                        end
2258
                                end
2259
                        default:
2260
                                begin
2261
                                        case(QQQ)
2262
                                        3'd0:   begin imm <= 32'd8; immx <= 32'd8; end
2263
                                        default:        begin imm <= {29'd0,QQQ}; immx <= {29'd0,QQQ}; end
2264
                                        endcase
2265
                                        case(sz)
2266
                                        2'b00:  begin push(ADDQ); fs_data(mmm,rrr,FETCH_BYTE,D); end
2267
                                        2'b01:  begin push(ADDQ); fs_data(mmm,rrr,FETCH_WORD,D); end
2268
                                        2'b10:  begin push(ADDQ); fs_data(mmm,rrr,FETCH_LWORD,D); end
2269
                                        default:        tIllegal();
2270
                                        endcase
2271
                                end
2272
                        endcase
2273
                end
2274
 
2275
//-----------------------------------------------------------------------------
2276
// Branches
2277
//-----------------------------------------------------------------------------
2278
        5'h6:
2279
                begin
2280
                        opc <= pc + 4'd2;
2281
                        ea <= pc + {{24{ir[7]}},ir[7:1],1'b0} + 4'd2;
2282
                        if (ir[11:0]==12'h100) begin            // 6100 = BSR
2283
                                bsr <= 1'b1;
2284
                                call(FETCH_BRDISP,JSR);
2285
                        end
2286
                        else if (ir[11:8]==4'h1)        // 61xx = BSR
2287
                                goto(JSR);
2288
                        else if (takb) begin
2289
                                // If branch back to self, trap
2290
                          if (ir[7:0]==8'hFE)
2291
                                tBadBranchDisp();
2292
                                else
2293
`ifdef SUPPORT_B24
2294
                                if (ir[7:0]==8'h00 || ir[0]) begin
2295
`else
2296
                                if (ir[7:0]==8'h00) begin
2297
`endif
2298
                                        goto(FETCH_BRDISP);
2299
                                end
2300
                                else begin
2301
                                        pc <= pc + {{24{ir[7]}},ir[7:1],1'b0} + 4'd2;
2302
                                        ret();
2303
                                end
2304
                        end
2305
                        else begin
2306
`ifdef SUPPORT_B24
2307
                                if (ir[7:0]==8'h00 || ir[0])            // skip over long displacement
2308
`else
2309
                                if (ir[7:0]==8'h00)             // skip over long displacement
2310
`endif
2311
                                        pc <= pc + 4'd4;
2312
                                ret();
2313
                        end
2314
                end
2315
 
2316
//-----------------------------------------------------------------------------
2317
// MOVEQ
2318
//-----------------------------------------------------------------------------
2319
        5'h7:
2320
                // MOVEQ only if ir[8]==0, but it is otherwise not used for the 68k.
2321
                // So some decode and fmax is saved by not decoding ir[8]
2322
                //if (ir[8]==1'b0)
2323
                begin
2324
                        vf <= 1'b0;
2325
                        cf <= 1'b0;
2326
                        nf <= ir[7];
2327
                        zf <= ir[7:0]==8'h00;
2328
                        rfwrL <= 1'b1;
2329
                        Rt <= {1'b0,ir[11:9]};
2330
                        resL <= {{24{ir[7]}},ir[7:0]};
2331
                        ret();
2332
                end
2333
//-----------------------------------------------------------------------------
2334
// OR / DIVU / DIVS / SBCD
2335
//-----------------------------------------------------------------------------
2336
        5'h8:
2337
                begin
2338
                        casez(ir[11:0])
2339
`ifdef SUPPORT_DIV
2340
                        12'b????_11??_????:     // DIVU / DIVS
2341
                                begin
2342
                                        divs <= ir[8];
2343
                                        d <= rfoDn;
2344
                                        push(DIV1);
2345
                                        fs_data(mmm,rrr,FETCH_WORD,S);
2346
                                end
2347
`endif
2348
`ifdef SUPPORT_BCD
2349
                        12'b???1_0000_????:     // SBCD
2350
                                begin
2351
                                        bcdsub <= 1'b1;
2352
                                        if (ir[3])
2353
                                                goto (BCD);
2354
                                        else begin
2355
                                                s <= rfoDnn;
2356
                                                d <= rfoDn;
2357
                                                goto (BCD1);
2358
                                        end
2359
                                end
2360
`endif
2361
                        default:
2362
                                begin
2363
                case(sz)
2364
                2'b00:    begin push(OR); fs_data(mmm,rrr,FETCH_BYTE,ir[8]?D:S); end
2365
                2'b01:    begin push(OR); fs_data(mmm,rrr,FETCH_WORD,ir[8]?D:S); end
2366
                2'b10:    begin push(OR); fs_data(mmm,rrr,FETCH_LWORD,ir[8]?D:S); end
2367
                default:        ;       // can't get here, picked off by DIV
2368
                                        endcase
2369
                                end
2370
                        endcase
2371
                end
2372
//-----------------------------------------------------------------------------
2373
// SUB / SUBA / SUBX
2374
//-----------------------------------------------------------------------------
2375
  5'h9:
2376
    begin
2377
      if (ir[8])
2378
        s <= rfoDn;
2379
      else
2380
        d <= rfoDn;
2381
      if (ir[8] && ir[5:4]==2'b00)
2382
                                case(sz)
2383
                                2'b00:
2384
                                        if (ir[3])
2385
                                                goto (SUBX);
2386
                                        else begin
2387
                                                s <= rfoDnn;
2388
                                                d <= rfoDn;
2389
                                                goto (SUBX3);
2390
                                        end
2391
                                2'b01:
2392
                                        if (ir[3])
2393
                                                goto (SUBX);
2394
                                        else begin
2395
                                                s <= rfoDnn;
2396
                                                d <= rfoDn;
2397
                                                goto (SUBX3);
2398
                                        end
2399
                                2'b10:
2400
                                        if (ir[3])
2401
                                                goto (SUBX);
2402
                                        else begin
2403
                                                s <= rfoDnn;
2404
                                                d <= rfoDn;
2405
                                                goto (SUBX3);
2406
                                        end
2407
                                2'b11:
2408
                begin
2409
                        d <= rfoAna;
2410
                        push(SUB);
2411
                        if (ir[8]) fs_data(mmm,rrr,FETCH_LWORD,S);
2412
                        else fs_data(mmm,rrr,FETCH_WORD,S);
2413
                end
2414
                                endcase
2415
      else
2416
              case(sz)
2417
              2'b00:    begin push(SUB); fs_data(mmm,rrr,FETCH_BYTE,ir[8]?D:S); end
2418
              2'b01:    begin push(SUB); fs_data(mmm,rrr,FETCH_WORD,ir[8]?D:S); end
2419
              2'b10:    begin push(SUB); fs_data(mmm,rrr,FETCH_LWORD,ir[8]?D:S); end
2420
              2'b11:
2421
                begin
2422
                        d <= rfoAna;
2423
                        push(SUB);
2424
                        if (ir[8]) fs_data(mmm,rrr,FETCH_LWORD,S);
2425
                        else fs_data(mmm,rrr,FETCH_WORD,S);
2426
                end
2427
              endcase
2428
    end
2429
//-----------------------------------------------------------------------------
2430
//-----------------------------------------------------------------------------
2431
  5'hA:
2432
        if (ir[11:8]==4'h2)
2433
                goto (IFETCH2);
2434
                else begin
2435
                isr <= srx;
2436
                tf <= 1'b0;
2437
                sf <= 1'b1;
2438
        vecno <= `LINE10_VEC;
2439
        goto (TRAP3);
2440
        end
2441
//-----------------------------------------------------------------------------
2442
// CMP / CMPA / CMPM / EOR
2443
//-----------------------------------------------------------------------------
2444
        5'hB:
2445
                begin
2446
                        if (ir[8]) begin        // EOR
2447
                                if (mmm==001)
2448
                                        case(sz)
2449
                                        2'b00:  begin push(CMPM); fs_data(3'b011,rrr,FETCH_BYTE,S); end
2450
                                        2'b01:  begin push(CMPM); fs_data(3'b011,rrr,FETCH_WORD,S); end
2451
                                        2'b10:  begin push(CMPM); fs_data(3'b011,rrr,FETCH_LWORD,S); end
2452
                                        2'b11:  begin d <= rfoAna; push(CMPA); fs_data(mmm,rrr,FETCH_LWORD,S); end      // CMPA
2453
                                        endcase
2454
                                else
2455
                                        case(sz)
2456
                                        2'b00:  begin push(EOR); fs_data(mmm,rrr,FETCH_BYTE,D); end
2457
                                        2'b01:  begin push(EOR); fs_data(mmm,rrr,FETCH_WORD,D); end
2458
                                        2'b10:  begin push(EOR); fs_data(mmm,rrr,FETCH_LWORD,D); end
2459
                                        2'b11:  begin d <= rfoAna; push(CMPA); fs_data(mmm,rrr,FETCH_LWORD,S); end      // CMPA
2460
                                        endcase
2461
                        end
2462
                        else    // CMP
2463
                                case(sz)
2464
                                2'b00:  begin d <= rfoDn; push(CMP); fs_data(mmm,rrr,FETCH_BYTE,S); end
2465
                                2'b01:  begin d <= rfoDn; push(CMP); fs_data(mmm,rrr,FETCH_WORD,S); end
2466
                                2'b10:  begin d <= rfoDn; push(CMP); fs_data(mmm,rrr,FETCH_LWORD,S); end
2467
                                2'b11:  begin d <= rfoAna; push(CMPA); fs_data(mmm,rrr,FETCH_WORD,S); end       // CMPA
2468
                                endcase
2469
                end
2470
//-----------------------------------------------------------------------------
2471
// AND / EXG / MULU / MULS / ABCD
2472
//-----------------------------------------------------------------------------
2473
        5'hC:
2474
                begin
2475
                        casez(ir[11:0])
2476
`ifdef SUPPORT_BCD
2477
                        12'b???1_0000_????:     // ABCD
2478
                                if (ir[3])
2479
                                        goto (BCD);
2480
                                else begin
2481
                                        s <= rfoDnn;
2482
                                        d <= rfoDn;
2483
                                        goto (BCD1);
2484
                                end
2485
`endif
2486
                        12'b????_11??_????:     // MULS / MULU
2487
                                begin
2488
                                        push(ir[8] ? MULS1 : MULU1);
2489
                                        fs_data(mmm,rrr,FETCH_WORD,S);
2490
                                end
2491
                        12'b???1_0100_0???:     // EXG  Dx,Dy
2492
                        begin
2493
                                Rt <= {1'b0,DDD};
2494
                                rfwrL <= 1'b1;
2495
                                resL <= rfoRnn;
2496
                                s <= rfoDn;
2497
                                goto (EXG1);
2498
                        end
2499
                        12'b???1_0100_1???:     // EXG Ax,Ay
2500
                        begin
2501
                                Rt <= {1'b1,AAA};
2502
                                rfwrL <= 1'b1;
2503
                                resL <= rfoRnn;
2504
                                s <= rfoAna;
2505
                                goto (EXG1);
2506
                        end
2507
                        12'b???1_1000_1???:     // EXG Dx,Ay
2508
                        begin
2509
                                Rt <= {1'b0,DDD};
2510
                                rfwrL <= 1'b1;
2511
                                resL <= rfoRnn;
2512
                                s <= rfoDn;
2513
                                goto (EXG1);
2514
                        end
2515
                        default:
2516
                                case(sz)
2517
                                2'b00:  begin push(AND); fs_data(mmm,rrr,FETCH_BYTE,ir[8]?D:S); end
2518
                                2'b01:  begin push(AND); fs_data(mmm,rrr,FETCH_WORD,ir[8]?D:S); end
2519
                                2'b10:  begin push(AND); fs_data(mmm,rrr,FETCH_LWORD,ir[8]?D:S); end
2520
                                default:        ;       // Can't get here, picked off by MUL
2521
                                endcase
2522
                        endcase
2523
                end
2524
 
2525
//-----------------------------------------------------------------------------
2526
// ADD / ADDA / ADDX
2527
//-----------------------------------------------------------------------------
2528
        5'hD:
2529
                begin
2530
                        if (ir[8])
2531
                                s <= rfoDn;
2532
                        else
2533
                                d <= rfoDn;
2534
                        if (ir[8] && ir[5:4]==2'b00)
2535
                                case(sz)
2536
                                2'b00:
2537
                                        if (ir[3])
2538
                                                goto (ADDX);
2539
                                        else begin
2540
                                                s <= rfoDnn;
2541
                                                d <= rfoDn;
2542
                                                goto (ADDX3);
2543
                                        end
2544
                                2'b01:
2545
                                        if (ir[3])
2546
                                                goto (ADDX);
2547
                                        else begin
2548
                                                s <= rfoDnn;
2549
                                                d <= rfoDn;
2550
                                                goto (ADDX3);
2551
                                        end
2552
                                2'b10:
2553
                                        if (ir[3])
2554
                                                goto (ADDX);
2555
                                        else begin
2556
                                                s <= rfoDnn;
2557
                                                d <= rfoDn;
2558
                                                goto (ADDX3);
2559
                                        end
2560
                                2'b11:
2561
                                        begin
2562
                                                d <= rfoAna;
2563
                                                push(ADD);
2564
                                                if (ir[8]) fs_data(mmm,rrr,FETCH_LWORD,S);
2565
                                                else fs_data(mmm,rrr,FETCH_WORD,S);
2566
                                        end
2567
                                endcase
2568
                        else
2569
                                case(sz)
2570
                                2'b00:  begin push(ADD); fs_data(mmm,rrr,FETCH_BYTE,ir[8]?D:S); end
2571
                                2'b01:  begin push(ADD); fs_data(mmm,rrr,FETCH_WORD,ir[8]?D:S); end
2572
                                2'b10:  begin push(ADD); fs_data(mmm,rrr,FETCH_LWORD,ir[8]?D:S); end
2573
                                2'b11:
2574
                                        begin
2575
                                                d <= rfoAna;
2576
                                                push(ADD);
2577
                                                if (ir[8]) fs_data(mmm,rrr,FETCH_LWORD,S);
2578
                                                else fs_data(mmm,rrr,FETCH_WORD,S);
2579
                                        end
2580
                                endcase
2581
                end
2582
//-----------------------------------------------------------------------------
2583
// ASL / LSL / ASR / LSR / ROL / ROR / ROXL / ROXR
2584
//-----------------------------------------------------------------------------
2585
        5'hE:
2586
                begin
2587
                        if (sz==2'b11) begin
2588
                                cnt <= 6'd1;    // memory shifts only by one
2589
                                shift_op <= {ir[8],ir[10:9]};
2590
                                push(SHIFT1);
2591
                                fs_data(mmm,rrr,FETCH_WORD,D);
2592
                        end
2593
                        else begin
2594
                                shift_op <= {ir[8],ir[4:3]};
2595
                                goto (SHIFT1);
2596
                                if (ir[5])
2597
                                        cnt <= rfoDn[5:0];
2598
                                else
2599
                                        cnt <= {2'b0,~|QQQ,QQQ};
2600
                                // Extend by a bit for ASL overflow detection.
2601
                                resL <= {rfoDnn[31],rfoDnn};
2602
                                resB <= {rfoDnn[7],rfoDnn[7:0]};
2603
                                resW <= {rfoDnn[15],rfoDnn[15:0]};
2604
                                d <= rfoDnn;
2605
                        end
2606
                end
2607
//-----------------------------------------------------------------------------
2608
//-----------------------------------------------------------------------------
2609 4 robfinch
//-----------------------------------------------------------------------------
2610
//-----------------------------------------------------------------------------
2611 2 robfinch
  5'hF:
2612 4 robfinch
        if (ir[11:9]==3'b001)
2613
                        if (ir[8:7]==2'b01) begin
2614
                                if (ir[6])
2615
                                        call(FETCH_IMM32,FBCC);
2616
                                else
2617
                                        call(FETCH_IMM16,FBCC);
2618
                        end
2619
                        else
2620
                        goto (IFETCH2);
2621
                else begin
2622 2 robfinch
                isr <= srx;
2623
                tf <= 1'b0;
2624
                sf <= 1'b1;
2625
        vecno <= `LINE15_VEC;
2626
        goto (TRAP3);
2627 4 robfinch
        end
2628 2 robfinch
//-----------------------------------------------------------------------------
2629
//-----------------------------------------------------------------------------
2630
        5'h1A:
2631
                begin
2632
                        ext_ir <= 1'b0;
2633
                        if (ir[11:8]==4'h2) begin
2634
                                case(ir2[15:0])
2635
                                16'h0000:
2636
                                        begin
2637
                                                dd32in <= rfoDnn;
2638
                                                goto (BIN2BCD1);
2639
                                        end
2640
                                16'h0001:
2641
                                        begin
2642
                                                d <= rfoDnn;
2643
                                                goto (BCD2BIN1);
2644
                                        end
2645 8 robfinch
                                16'h0003:
2646
                                        begin
2647
                                                push(CCHK);
2648
                                                fs_data(mmm,rrr,FETCH_LWORD,S);
2649
                                        end
2650 2 robfinch
                                default:        tIllegal();
2651
                                endcase
2652
                        end
2653 4 robfinch
                        else
2654
                                tIllegal();
2655 2 robfinch
                end
2656 4 robfinch
//-----------------------------------------------------------------------------
2657
//-----------------------------------------------------------------------------
2658
`ifdef SUPPORT_DECFLT
2659
        5'h1F:
2660
                begin
2661
                        ext_ir <= 1'b0;
2662
                        if (ir[11:9]==3'b001) begin
2663
                                casez(ir2[15:8])
2664
                                8'h6?,8'h7?:    // FMOVE to memory
2665
                                        begin
2666 8 robfinch
                                                case(ir2[12:10])
2667
                                                3'b000,3'b100,3'b110:
2668
                                                        begin
2669
                                                                fps <= rfoFpdst;
2670
                                                                goto (DF2I1);
2671
                                                        end
2672
                                                3'b011:
2673
                                                        begin
2674
                                                                fpd <= rfoFpdst;
2675
                                                                fs_data(mmm,rrr,STORE_HEXI1,D);
2676
                                                        end
2677
                                                default:
2678
                                                        begin
2679
                                                                fpd <= rfoFpdst;
2680
                                                                fs_data(mmm,rrr,STORE_HEXI1,D);
2681
                                                        end
2682
                                                endcase
2683 4 robfinch
                                        end
2684 6 robfinch
                                8'b10????00:    // PG 4-71
2685
                                        if (ir2[13])
2686
                                                case(ir2[7:0])
2687
                                                8'h00:  // FMOVE
2688
                                                        case(ir2[12:10])
2689 8 robfinch
                                                        3'b001: // FPIAR
2690
                                                                begin
2691
                                                                        d <= fpiar;
2692
                                                                        fs_data(mmm,rrr,STORE_LWORD,D);
2693
                                                                end
2694 6 robfinch
                                                        3'b010: // FPSR
2695
                                                                begin
2696
                                                                        d <= fpsr;
2697
                                                                        fs_data(mmm,rrr,STORE_LWORD,D);
2698
                                                                end
2699
                                                        3'b100: tIllegal();// FPCR
2700
                                                        default:        tIllegal();
2701
                                                        endcase
2702
                                                default:        tIllegal();
2703
                                                endcase
2704
                                        else
2705
                                                tIllegal();
2706 8 robfinch
                                8'b11??????:    // FMOVEM
2707
                                        begin
2708
                                                fmovem <= 1'b1;
2709
                                                if (ir2[11]) begin      // dynamic list?
2710
                                                        rrr <= ir2[6:4];
2711
                                                        goto (FMOVEM1);
2712
                                                end
2713
                                                else begin
2714
                                                        imm <= ir2[7:0];
2715
                                                        if (ir2[13])
2716
                                                                goto(MOVEM_Xn2D);
2717
                                                        else
2718
                                                                goto(MOVEM_s2Xn);
2719
                                                end
2720
                                        end
2721 4 robfinch
                                8'h??:
2722
                                        case(ir2[6:0])
2723
                                        7'b0000000:     // FMOVE
2724
                                                if (ir2[14]) begin      // RM
2725
                                                        push(FMOVE);
2726 8 robfinch
                                                        case(ir2[12:10])
2727
                                                        3'b000: fs_data(mmm,rrr,FETCH_LWORD,S);
2728
                                                        3'b100: fs_data(mmm,rrr,FETCH_WORD,S);
2729
                                                        3'b110: fs_data(mmm,rrr,FETCH_BYTE,S);
2730
                                                        default:        fs_data(mmm,rrr,FETCH_HEXI1,S);
2731
                                                        endcase
2732 4 robfinch
                                                end
2733
                                                else begin
2734
                                                        fps <= rfoFpsrc;
2735
                                                        goto(FMOVE);
2736
                                                end
2737
                                        7'b0100000:     // FDIV
2738
                                                if (ir2[14]) begin      // RM
2739
                                                        fpd <= rfoFpdst;
2740
                                                        push(FDIV1);
2741
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
2742
                                                end
2743
                                                else begin
2744
                                                        fpd <= rfoFpdst;
2745
                                                        fps <= rfoFpsrc;
2746
                                                        goto(FDIV1);
2747
                                                end
2748
                                        7'b0100010:     // FADD
2749
                                                if (ir2[14]) begin      // RM
2750
                                                        fpd <= rfoFpdst;
2751
                                                        push(FADD);
2752
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
2753
                                                end
2754
                                                else begin
2755
                                                        fpd <= rfoFpdst;
2756
                                                        fps <= rfoFpsrc;
2757
                                                        goto(FADD);
2758
                                                end
2759
                                        7'b0100011:     // FMUL
2760
                                                if (ir2[14]) begin      // RM
2761
                                                        fpd <= rfoFpdst;
2762
                                                        push(FMUL1);
2763
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
2764
                                                end
2765
                                                else begin
2766
                                                        fpd <= rfoFpdst;
2767
                                                        fps <= rfoFpsrc;
2768
                                                        goto(FMUL1);
2769
                                                end
2770
                                        7'b0101000:     // FSUB
2771
                                                if (ir2[14]) begin      // RM
2772
                                                        fsub <= 1'b1;
2773
                                                        fpd <= rfoFpdst;
2774
                                                        push(FADD);
2775
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
2776
                                                end
2777
                                                else begin
2778
                                                        fsub <= 1'b1;
2779
                                                        fpd <= rfoFpdst;
2780
                                                        fps <= rfoFpsrc;
2781
                                                        goto(FADD);
2782
                                                end
2783 8 robfinch
                                        7'b0011000:     // FABS
2784
                                                if (ir2[14]) begin      // RM
2785
                                                        fabs <= 1'b1;
2786
                                                        push(FNEG);
2787
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
2788
                                                end
2789
                                                else begin
2790
                                                        fabs <= 1'b1;
2791
                                                        fps <= rfoFpsrc;
2792
                                                        goto(FNEG);
2793
                                                end
2794 4 robfinch
                                        7'b0011010:     // FNEG
2795
                                                if (ir2[14]) begin      // RM
2796
                                                        push(FNEG);
2797
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
2798
                                                end
2799
                                                else begin
2800
                                                        fps <= rfoFpsrc;
2801
                                                        goto(FNEG);
2802
                                                end
2803
                                        7'b0111000:     // FCMP
2804
                                                if (ir2[14]) begin      // RM
2805
                                                        fpd <= rfoFpdst;
2806
                                                        push(FCMP);
2807
                                                        fs_data(mmm,rrr,FETCH_HEXI1,S);
2808
                                                end
2809
                                                else begin
2810
                                                        fpd <= rfoFpdst;
2811
                                                        fps <= rfoFpsrc;
2812
                                                        goto(FCMP);
2813
                                                end
2814
                                        7'b0111010:     // FTST
2815
                                                if (ir2[14]) begin
2816
                                                        push (FTST);
2817 8 robfinch
                                                        case(ir2[12:10])
2818
                                                        3'b000: fs_data(mmm,rrr,FETCH_LWORD,S);
2819
                                                        3'b011: fs_data(mmm,rrr,FETCH_HEXI1,S);
2820
                                                        3'b100: fs_data(mmm,rrr,FETCH_WORD,S);
2821
                                                        3'b110: fs_data(mmm,rrr,FETCH_BYTE,S);
2822
                                                        default:        fs_data(mmm,rrr,FETCH_HEXI1,S);
2823
                                                        endcase
2824 4 robfinch
                                                end
2825
                                                else begin
2826
                                                        fnf <= rfoFpsrc[95];
2827
                                                        fzf <= rfoFpsrc[94:0]=='d0;
2828
                                                        ret();
2829
                                                end
2830
                                        7'b0100110:     // FSCALE
2831
                                                if (ir2[14]) begin      // RM
2832
                                                        fpd <= rfoFpdst;
2833
                                                        push(FSCALE);
2834
                                                        case(ir2[12:10])
2835
                                                        3'b000: fs_data(mmm,rrr,FETCH_LWORD,S);
2836
                                                        3'b100: fs_data(mmm,rrr,FETCH_WORD,S);
2837
                                                        3'b110: fs_data(mmm,rrr,FETCH_BYTE,S);
2838
                                                        default:        fs_data(mmm,rrr,FETCH_LWORD,S);
2839
                                                        endcase
2840
                                                end
2841
                                                else begin
2842
                                                        fpd <= rfoFpdst;
2843 8 robfinch
                                                        fps <= rfoFpsrc;
2844 4 robfinch
                                                        goto(FSCALE);
2845
                                                end
2846
/*
2847
                                        7'b0011011:     // FGETEXP2
2848
                                                begin
2849
                                                        resL <= {18'd0,fpsu.exp};
2850
                                                        rfwrL <= 1'b1;
2851
                                                        Rt <= {1'b0,rrr};
2852
                                                        ret();
2853
                                                end
2854
*/
2855
/*
2856
                                        7'b0011100:     // FCOPY
2857
                                                begin
2858
                                                        fps <= rfoFpsrc;
2859
                                                        goto (FCOPYEXP);
2860
                                                end
2861
*/
2862
                                        default:
2863
                                                tIllegal();
2864
                                        endcase
2865
                                default:
2866
                                        tIllegal();
2867
                                endcase
2868
                        end
2869
                        else
2870
                                tIllegal();
2871
                end
2872
`endif
2873 2 robfinch
        default: tIllegal();
2874
        endcase
2875
        end
2876
 
2877
//-----------------------------------------------------------------------------
2878
//-----------------------------------------------------------------------------
2879
`ifdef SUPPORT_010
2880
MOVES:
2881
        begin
2882
                ir2 <= imm[15:0];
2883
                rrrr <= imm[15:12];
2884
                Rt <= imm[15:12];
2885
                if (imm[11])
2886
                        goto (MOVES2);
2887
                else begin
2888
                        push(MOVES3);
2889
                        use_sfc <= 1'b1;
2890
                        case(sz)
2891
                        2'd0:   fs_data(mmm,rrr,FETCH_BYTE,S);
2892
                        2'd1:   fs_data(mmm,rrr,FETCH_WORD,S);
2893
                        2'd2:   fs_data(mmm,rrr,FETCH_LWORD,S);
2894
                        endcase
2895
                end
2896
        end
2897
MOVES2:
2898
        begin
2899
                d <= rfoRnn;
2900
                use_dfc <= 1'b1;
2901
                case(sz)
2902
                2'd0:   fs_data(mmm,rrr,STORE_BYTE,D);
2903
                2'd1:   fs_data(mmm,rrr,STORE_WORD,D);
2904
                2'd2:   fs_data(mmm,rrr,STORE_LWORD,D);
2905
                default:        tIllegal();
2906
                endcase
2907
        end
2908
MOVES3:
2909
        begin
2910
                case(sz)
2911
                2'd0:
2912
                        begin
2913
                                resB <= s[7:0];
2914
                                rfwrB <= 1'b1;
2915
                        end
2916
                2'd1:
2917
                        begin
2918
                                resW <= s[15:0];
2919
                                rfwrW <= 1'b1;
2920
                        end
2921
                2'd2:
2922
                        begin
2923
                                resL <= s[31:0];
2924
                                rfwrL <= 1'b1;
2925
                        end
2926
                default:        ;
2927
                endcase
2928
                ret();
2929
        end
2930
`endif
2931
 
2932
//-----------------------------------------------------------------------------
2933
// BCD arithmetic
2934
// ABCD / SBCD / NBCD
2935
//-----------------------------------------------------------------------------
2936
`ifdef SUPPORT_BCD
2937
BCD:
2938
        begin
2939
                push(BCD0);
2940
                fs_data(3'b100,rrr,FETCH_BYTE,S);
2941
        end
2942
BCD0:
2943
        begin
2944
                if (ir[3]) begin
2945
                        push(BCD1);
2946
                        fs_data(3'b100,RRR,FETCH_BYTE,D);
2947
                end
2948
                else
2949
                        goto (BCD1);
2950
        end
2951
BCD1:   goto (BCD2);    // clock to convert BCD to binary.
2952
BCD2:
2953
        begin
2954
                if (bcdsub)
2955
                        bcdres <= dbin - sbin - xf;
2956
                else if (bcdneg)
2957
                        bcdres <= 8'h00 - dbin - xf;
2958
                else
2959
                        bcdres <= dbin + sbin + xf;
2960
                goto (BCD3);
2961
        end
2962
BCD3:   goto (BCD4);    // clock to load binary to BCD conversion
2963
BCD4:
2964
        if (dd_done) begin
2965
                if (ir[3] || (bcdneg && mmm!=3'b000 && mmm != 3'b001))
2966
                        goto (STORE_BYTE);
2967
                else begin
2968
                        rfwrB <= 1'b1;
2969
                        if (bcdneg)
2970
                                Rt <= {1'b0,rrr};
2971
                        else
2972
                                Rt <= {1'b0,RRR};
2973
                        resB <= bcdreso[7:0];
2974
                        ret();
2975
                end
2976
                d <= bcdreso[7:0];
2977
                cf <= |bcdreso[11:8];
2978
                xf <= |bcdreso[11:8];
2979
                nf <= bcdreso[7];
2980
                if (bcdreso[7:0]!=8'h00)
2981
                        zf <= 1'b0;
2982
        end
2983
`endif
2984
 
2985
//-----------------------------------------------------------------------------
2986
//-----------------------------------------------------------------------------
2987
STOP:
2988
        begin
2989
                if (!sf) begin
2990
                isr <= srx;
2991
                tf <= 1'b0;
2992
                sf <= 1'b1;
2993
                        vecno <= `PRIV_VEC;
2994
                        goto (TRAP3);
2995
                end
2996
                else
2997
                        call (FETCH_IMM16, STOP1);
2998
        end
2999
STOP1:
3000
        begin
3001
                cf <= imm[0];
3002
                vf <= imm[1];
3003
                zf <= imm[2];
3004
                nf <= imm[3];
3005
                xf <= imm[4];
3006
                im[0] <= imm[8];
3007
                im[1] <= imm[9];
3008
                im[2] <= imm[10];
3009
                sf <= imm[13];
3010
                tf <= imm[15];
3011
                if (ipl_i > imm[10:8] || ipl_i==3'd7)
3012
                        ret();
3013
        end
3014
 
3015
//-----------------------------------------------------------------------------
3016
// MULU / MULS
3017
// - a couple of regs may be needed.
3018
//-----------------------------------------------------------------------------
3019
MULS1:
3020
        begin
3021
                resMS1 <= $signed(rfoDn[15:0]) * $signed(s[15:0]);
3022
                goto (MULS2);
3023
        end
3024
MULS2:
3025
        begin
3026
                resMS2 <= resMS1;
3027
                goto (MULS3);
3028
        end
3029
MULS3:
3030
        begin
3031
                flag_update <= FU_MUL;
3032
                rfwrL <= 1'b1;
3033
                Rt <= {1'b0,DDD};
3034
                resL <= resMS2;
3035
                ret();
3036
        end
3037
MULU1:
3038
        begin
3039
                resMU1 <= rfoDn[15:0] * s[15:0];
3040
                goto (MULU2);
3041
        end
3042
MULU2:
3043
        begin
3044
                resMU2 <= resMU1;
3045
                goto (MULU3);
3046
        end
3047
MULU3:
3048
        begin
3049
                flag_update <= FU_MUL;
3050
                rfwrL <= 1'b1;
3051
                Rt <= {1'b0,DDD};
3052
                resL <= resMU2;
3053
                ret();
3054
        end
3055
 
3056
//-----------------------------------------------------------------------------
3057
// DIVU / DIVS
3058
// - the target register is not updated if overflow occurs.
3059
//-----------------------------------------------------------------------------
3060
DIV1:
3061
        if (s[15:0]==16'd0) begin
3062
                isr <= srx;
3063
                tf <= 1'b0;
3064
                sf <= 1'b1;
3065
                vecno <= `DBZ_VEC;
3066
                goto (TRAP3);
3067
        end
3068
        else
3069
                goto (DIV2);
3070
DIV2:
3071
        if (dvdone) begin
3072
                cf <= 1'b0;
3073
                if (dvovf)
3074
                        vf <= 1'b1;
3075
                else begin
3076
                        nf <= divq[15];
3077
                        zf <= divq[15:0]==16'h0000;
3078
                        vf <= 1'b0;
3079
                        Rt <= {1'b0,DDD};
3080
                        resL <= {divr[15:0],divq[15:0]};
3081
                        rfwrL <= 1'b1;
3082
                end
3083
                ret();
3084
        end
3085
 
3086
//-----------------------------------------------------------------------------
3087
// NOT
3088
//-----------------------------------------------------------------------------
3089
NOT:
3090
        begin
3091
                resB <= ~d[7:0];
3092
                resW <= ~d[15:0];
3093
                resL <= ~d;
3094
                d <= ~d;
3095
                cf <= 1'b0;
3096
                vf <= 1'b0;
3097
                case(sz)
3098
                2'b00:  begin zf <= d[7:0]==8'hFF; nf <= ~d[7]; end
3099
                2'b01:  begin zf <= d[15:0]==16'hFFFF; nf <= ~d[15]; end
3100
                2'b10:  begin zf <= d[31:0]==32'hFFFFFFFF; nf <= ~d[31]; end
3101
                default:        ;
3102
                endcase
3103
                if (mmm==3'b000) begin
3104
                        Rt <= {1'b0,rrr};
3105
                        case(sz)
3106
                        2'b00:  rfwrB <= 1'b1;
3107
                        2'b01:  rfwrW <= 1'b1;
3108
                        2'b10:  rfwrL <= 1'b1;
3109
                        default:        ;
3110
                        endcase
3111
                        ret();
3112
                end
3113
                else if (mmm==3'b001)
3114
                        ret();
3115
                else begin
3116
                        case(sz)
3117
                        2'b00:  begin goto(STORE_BYTE); end
3118
                        2'b01:  begin goto(STORE_WORD); end
3119
                        2'b10:  begin goto(STORE_LWORD); end
3120
                        default:        ;
3121
                        endcase
3122
                end
3123
        end
3124
 
3125
//-----------------------------------------------------------------------------
3126
// NEG / NEGX
3127
//-----------------------------------------------------------------------------
3128
NEG:
3129
        begin
3130
                resL <= -d;
3131
                resW <= -d[15:0];
3132
                resB <= -d[7:0];
3133
                d <= -d;
3134
                s <= d;
3135
                dd <= 'd0;
3136
                goto (NEGX1);
3137
        end
3138
NEGX:
3139
        begin
3140
                resL <= -d - xf;
3141
                resW <= -d[15:0] - xf;
3142
                resB <= -d[7:0] - xf;
3143
                d <= -d - xf;
3144
                s <= d + xf;
3145
                dd <= 'd0;
3146
                goto (NEGX1);
3147
        end
3148
NEGX1:
3149
        begin
3150
                case(sz)
3151
                2'b00:  begin cf <= resB[8]; nf <= resB[7]; vf <= fnSubOverflow(resB[7],dd[7],s[7]); zf <= resB[7:0]==8'h00; xf <= resB[8]; end
3152
                2'b01:  begin cf <= resW[16]; nf <= resW[15]; vf <= fnSubOverflow(resW[15],dd[15],s[15]); zf <= resW[15:0]==16'h00; xf <= resW[16]; end
3153
                2'b10:  begin cf <= resL[32]; nf <= resL[31]; vf <= fnSubOverflow(resL[31],dd[31],s[31]); zf <= resL[31:0]==32'h00; xf <= resL[32]; end
3154
                endcase
3155
                if (mmm==3'b000) begin
3156
                        Rt <= {1'b0,rrr};
3157
                        case(sz)
3158
                        2'b00:  rfwrB <= 1'b1;
3159
                        2'b01:  rfwrW <= 1'b1;
3160
                        2'b10:  rfwrL <= 1'b1;
3161
                        default:        ;
3162
                        endcase
3163
                        ret();
3164
                end
3165
                else if (mmm==3'b001)
3166
                        ret();
3167
                else
3168
                        case(sz)
3169
                        2'b00:  begin goto(STORE_BYTE); end
3170
                        2'b01:  begin goto(STORE_WORD); end
3171
                        2'b10:  begin goto(STORE_LWORD); end
3172
                        default:        ;
3173
                        endcase
3174
        end
3175
 
3176
//-----------------------------------------------------------------------------
3177
//-----------------------------------------------------------------------------
3178
TAS:
3179
        begin
3180
                resB <= {1'b1,d[6:0]};
3181
                cf <= 1'b0;
3182
                vf <= 1'b0;
3183
                zf <= d[7:0]==8'h00;
3184
                nf <= d[7];
3185
                d <= {1'b1,d[6:0]};
3186
                goto(USTORE_BYTE);
3187
        end
3188
 
3189
//-----------------------------------------------------------------------------
3190
// Link
3191
//-----------------------------------------------------------------------------
3192
LINK:
3193
        begin
3194
                d <= rfoAn;
3195
                ea <= sp - 4'd4;
3196
                call (STORE_LWORD,LINK1);
3197
        end
3198
LINK1:
3199
        begin
3200
                call(FETCH_IMM16,LINK2);
3201
        end
3202
LINK2:
3203
        begin
3204
                resL <= sp - 32'd4;
3205
                rfwrL <= 1'b1;
3206
                Rt <= {1'b1,rrr};
3207
                sp <= sp + imm - 32'd4;
3208
                ret();
3209
        end
3210
 
3211
//-----------------------------------------------------------------------------
3212
// LEA
3213
//-----------------------------------------------------------------------------
3214
LEA:
3215
        begin
3216
                push(LEA2);
3217
                fs_data(mmm,rrr,FETCH_NOP_LWORD,S);
3218
        end
3219
LEA2:
3220
        begin
3221
                Rt <= {1'b1,AAA};
3222
                rfwrL <= 1'b1;
3223
                resL <= ea;
3224
                ret();
3225
        end
3226
 
3227
//-----------------------------------------------------------------------------
3228
// PEA
3229
//-----------------------------------------------------------------------------
3230
PEA1:
3231
        begin
3232
                push(PEA2);
3233
                fs_data(mmm,rrr,FETCH_NOP_LWORD,S);
3234
        end
3235
PEA2:
3236
        begin
3237
                d <= ea;
3238
                ea <= sp - 32'd4;
3239
                call (STORE_LWORD,PEA3);
3240
        end
3241
PEA3:
3242
        begin
3243
                sp <= sp - 32'd4;
3244
                ret();
3245
        end
3246
 
3247
//-----------------------------------------------------------------------------
3248
// DBRA
3249
//-----------------------------------------------------------------------------
3250
DBRA:
3251
`ifndef OPT_PERF
3252
        if (~takb)
3253
`endif
3254
        begin
3255
                resW <= rfoDnn - 4'd1;
3256
                Rt <= {1'b0,rrr};
3257
                rfwrW <= 1'b1;
3258
                if (rfoDnn[15:0]!=0)
3259
                        pc <= opc + imm;
3260
                ret();
3261
        end
3262
`ifndef OPT_PERF
3263
        else
3264
                ret();
3265
`endif
3266
 
3267
//-----------------------------------------------------------------------------
3268
// EXG
3269
//-----------------------------------------------------------------------------
3270
EXG1:
3271
        begin
3272
                rfwrL <= 1'b1;
3273
                resL <= s;
3274
                Rt <= rrrr;
3275
                ret();
3276
        end
3277
 
3278
//-----------------------------------------------------------------------------
3279 8 robfinch
// Flags are not updated if the target is an address register.
3280 2 robfinch
//-----------------------------------------------------------------------------
3281 8 robfinch
 
3282 2 robfinch
STORE_IN_DEST:
3283
        begin
3284
                resL <= s;
3285
                resW <= s[15:0];
3286
                resB <= s[7:0];
3287
                d <= s;
3288 8 robfinch
                if (ir[8:6]!=3'b001) begin
3289
                        case(ir[15:12])
3290
                        4'd1:   begin zf <= s[ 7:0]== 8'h00; nf <= s[7]; end
3291
                        4'd3:   begin zf <= s[15:0]==16'h00; nf <= s[15]; end
3292
                        4'd2:   begin zf <= s[31:0]==32'd0;  nf <= s[31]; end
3293
                        default:        ;
3294
                        endcase
3295
                        cf <= 1'b0;
3296
                        vf <= 1'b0;
3297
                end
3298 2 robfinch
                case(ir[15:12])
3299
                4'd1:   fs_data(MMM,RRR,STORE_BYTE,D);
3300
                4'd2:   fs_data(MMM,RRR,STORE_LWORD,D);
3301
                4'd3:   fs_data(MMM,RRR,STORE_WORD,D);
3302
                default:        ;       // cant get here
3303
                endcase
3304
        end
3305
 
3306
 
3307
//-----------------------------------------------------------------------------
3308
// Compares
3309
//-----------------------------------------------------------------------------
3310
CMP:
3311
        begin
3312
                flag_update <= FU_CMP;
3313
                case(sz)
3314
                2'b00:  resB <= d[ 7:0] - s[ 7:0];
3315
                2'b01:  resW <= d[15:0] - s[15:0];
3316
                2'b10:  resL <= d[31:0] - s[31:0];
3317
                2'b11:  ;
3318
                endcase
3319
                ret();
3320
        end
3321
 
3322
CMPA:
3323
        begin
3324
                flag_update <= FU_CMP;
3325
                case(ir[8])
3326
                1'b0:   resL <= d[31:0] - {{16{s[15]}},s[15:0]};
3327
                1'b1:   resL <= d[31:0] - s[31:0];
3328
                endcase
3329
                ret();
3330
        end
3331
 
3332
CMPM:
3333
        begin
3334
                push (CMP);
3335
                case(sz)
3336
                2'd0:   fs_data(3'b011,RRR,FETCH_BYTE,D);
3337
                2'd1:   fs_data(3'b011,RRR,FETCH_WORD,D);
3338
                2'd2:   fs_data(3'b011,RRR,FETCH_LWORD,D);
3339
                default:        ;       // cant get here
3340
                endcase
3341
        end
3342
 
3343
//-----------------------------------------------------------------------------
3344
// Shifts
3345
// Rotate instructions ROL,ROR do not affect the X flag.
3346
//-----------------------------------------------------------------------------
3347
SHIFT1:
3348
        begin
3349
                vf <= 1'b0;
3350
                case(shift_op)
3351
                3'b010, // ROXL, ROXR
3352
                3'b110: cf <= xf;
3353
                default:
3354
                        begin
3355
                                if (cnt=='d0)
3356
                                        cf <= 1'b0;
3357
                        end
3358
                endcase
3359
                // Extend by a bit for ASL overflow detection.
3360
                resB <= {d[7],d[7:0]};
3361
                resW <= {d[15],d[15:0]};
3362
                resL <= {d[31],d[31:0]};
3363
                state <= SHIFT;
3364
        end
3365
SHIFT:
3366
        if (cnt!='d0) begin
3367
                cnt <= cnt - 2'd1;
3368
                case(shift_op)
3369
                3'b000: // ASR
3370
                        case(sz)
3371
                        2'b00:  begin resB <= {resB[ 7],resB[ 7:1]}; cf <= resB[0]; xf <= resB[0]; end
3372
                        2'b01:  begin resW <= {resW[15],resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3373
                        2'b10:  begin resL <= {resL[31],resL[31:1]}; cf <= resL[0]; xf <= resL[0]; end
3374
                        2'b11:  begin resW <= {resW[15],resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3375
                        endcase
3376
                3'b001: // LSR
3377
                        case(sz)
3378
                        2'b00:  begin resB <= {1'b0,resB[ 7:1]}; cf <= resB[0]; xf <= resB[0]; end
3379
                        2'b01:  begin resW <= {1'b0,resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3380
                        2'b10:  begin resL <= {1'b0,resL[31:1]}; cf <= resL[0]; xf <= resL[0]; end
3381
                        2'b11:  begin resW <= {1'b0,resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3382
                        endcase
3383
                3'b010: // ROXR
3384
                        case(sz)
3385
                        2'b00:  begin resB <= {xf,resB[ 7:1]}; cf <= resB[0]; xf <= resB[0]; end
3386
                        2'b01:  begin resW <= {xf,resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3387
                        2'b10:  begin resL <= {xf,resL[31:1]}; cf <= resL[0]; xf <= resL[0]; end
3388
                        2'b11:  begin resW <= {xf,resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3389
                        endcase
3390
                3'b011: // ROR
3391
                        case(sz)
3392
                        2'b00:  begin resB <= {resB[0],resB[ 7:1]}; cf <= resB[0]; end
3393
                        2'b01:  begin resW <= {resW[0],resW[15:1]}; cf <= resW[0]; end
3394
                        2'b10:  begin resL <= {resL[0],resL[31:1]}; cf <= resL[0]; end
3395
                        2'b11:  begin resW <= {resW[0],resW[15:1]}; cf <= resW[0]; end
3396
                        endcase
3397
                3'b100: // ASL
3398
                        case(sz)
3399
                        2'b00:  begin resB <= {resB[ 7:0],1'b0}; cf <= resB[ 7]; xf <= resB[ 7]; if (resB[ 7] != resB[ 8]) vf <= 1'b1; end
3400
                        2'b01:  begin resW <= {resW[15:0],1'b0}; cf <= resW[15]; xf <= resW[15]; if (resW[15] != resW[16]) vf <= 1'b1; end
3401
                        2'b10:  begin resL <= {resL[31:0],1'b0}; cf <= resL[31]; xf <= resL[31]; if (resL[31] != resL[32]) vf <= 1'b1; end
3402
                        2'b11:  begin resW <= {resW[15:0],1'b0}; cf <= resW[15]; xf <= resW[15]; if (resW[15] != resW[16]) vf <= 1'b1; end
3403
                        endcase
3404
                3'b101: // LSL
3405
                        case(sz)
3406
                        2'b00:  begin resB <= {resB[ 6:0],1'b0}; cf <= resB[ 7]; xf <= resB[ 7]; end
3407
                        2'b01:  begin resW <= {resW[14:0],1'b0}; cf <= resW[15]; xf <= resW[15]; end
3408
                        2'b10:  begin resL <= {resL[30:0],1'b0}; cf <= resL[31]; xf <= resL[31]; end
3409
                        2'b11:  begin resW <= {resW[14:0],1'b0}; cf <= resW[15]; xf <= resW[15]; end
3410
                        endcase
3411
                3'b110: // ROXL
3412
                        case(sz)
3413
                        2'b00:  begin resB <= {resB[ 6:0],xf}; cf <= resB[ 7]; xf <= resB[ 7]; end
3414
                        2'b01:  begin resW <= {resW[14:0],xf}; cf <= resW[15]; xf <= resW[15]; end
3415
                        2'b10:  begin resL <= {resL[30:0],xf}; cf <= resL[31]; xf <= resL[31]; end
3416
                        2'b11:  begin resW <= {resW[14:0],xf}; cf <= resW[15]; xf <= resW[15]; end
3417
                        endcase
3418
                3'b111: // ROL
3419
                        case(sz)
3420
                        2'b00:  begin resB <= {resB[ 6:0],resB[ 7]}; cf <= resB[ 7]; end
3421
                        2'b01:  begin resW <= {resW[14:0],resW[15]}; cf <= resW[15]; end
3422
                        2'b10:  begin resL <= {resL[30:0],resL[31]}; cf <= resL[31]; end
3423
                        2'b11:  begin resW <= {resW[14:0],resW[15]}; cf <= resW[15]; end
3424
                        endcase
3425
                endcase
3426
        end
3427
        else begin
3428
                if (shift_op==3'b100)   // ASL
3429
                        case(sz)
3430
                        2'b00:  if (resB[ 7] != resB[ 8]) vf <= 1'b1;
3431
                        2'b01:  if (resW[15] != resW[16]) vf <= 1'b1;
3432
                        2'b10:  if (resL[31] != resL[32]) vf <= 1'b1;
3433
                        2'b11:  if (resW[15] != resW[16]) vf <= 1'b1;
3434
                        /*
3435
                        2'b00:  vf <= resB[ 7] != d[ 7];
3436
                        2'b01:  vf <= resW[15] != d[15];
3437
                        2'b10:  vf <= resL[31] != d[31];
3438
                        2'b11:  vf <= resW[15] != d[15];
3439
                        */
3440
                        endcase
3441
                case(sz)
3442
                2'b00:  d <= resB;
3443
                2'b01:  d <= resW;
3444
                2'b10:  d <= resL;
3445
                2'b11:  d <= resW;
3446
                endcase
3447
                Rt <= {1'b0,rrr};
3448
                case(sz)
3449
                2'b00:  begin zf <= resB[7:0]== 8'h00; nf <= resB[ 7]; end
3450
                2'b01:  begin zf <= resW[15:0]==16'h00; nf <= resW[15]; end
3451
                2'b10:  begin zf <= resL[31:0]==32'h00; nf <= resL[31]; end
3452
                2'b11:  begin zf <= resW[15:0]==16'h00; nf <= resW[15]; end
3453
                endcase
3454
                case(sz)
3455
                2'b00:  begin rfwrB <= 1'b1; ret(); end
3456
                2'b01:  begin rfwrW <= 1'b1; ret(); end
3457
                2'b10:  begin rfwrL <= 1'b1; ret(); end
3458
                2'b11:  fs_data(mmm,rrr,STORE_WORD,D);  // word operations only if memory operate
3459
                endcase
3460
        end
3461
 
3462
//-----------------------------------------------------------------------------
3463
// ADD / SUB / ADDA / SUBA / ADDX / SUBX
3464
//-----------------------------------------------------------------------------
3465
ADD:
3466
        begin
3467
                flag_update <= FU_ADD;
3468
                if (sz==2'b11) begin
3469
                        Rt <= {1'b1,AAA};
3470
                        if (ir[8]) begin
3471
                                rfwrL <= 1'b1;
3472
                                resL <= d + s;
3473
                        end
3474
                        else begin
3475
                                resW <= d[15:0] + s[15:0];
3476
                                rfwrW <= 1'b1;
3477
                        end
3478
                        d <= d + s;
3479
                        dd <= d;
3480
                        ret();
3481
                end
3482
                else if (ir[8]) begin
3483
                        resB <= d[7:0] + s[7:0];
3484
                        resW <= d[15:0] + s[15:0];
3485
                        resL <= d + s;
3486
                        d <= d + s;
3487
                        dd <= d;
3488
                        if (mmm==3'd0 || mmm==3'd1) begin
3489
                                Rt <= {mmm[0],rrr};
3490
                                case(sz)
3491
                                2'b00:  rfwrB <= 1'b1;
3492
                                2'b01:  rfwrW <= 1'b1;
3493
                                2'b10:  rfwrL <= 1'b1;
3494
                                default:        ;
3495
                                endcase
3496
                                ret();
3497
                        end
3498
                        else begin
3499
                                case(sz)
3500
                                2'b00:  goto(STORE_BYTE);
3501
                                2'b01:  goto(STORE_WORD);
3502
                                2'b10:  goto(STORE_LWORD);
3503
                                default:        ;
3504
                                endcase
3505
                        end
3506
                end
3507
                else begin
3508
                        Rt <= {1'b0,DDD};
3509
                        resB <= d[7:0] + s[7:0];
3510
                        resW <= d[15:0] + s[15:0];
3511
                        resL <= d + s;
3512
                        d <= d + s;
3513
                        dd <= d;
3514
                        case(sz)
3515
                        2'b00:  rfwrB <= 1'b1;
3516
                        2'b01:  rfwrW <= 1'b1;
3517
                        2'b10:  rfwrL <= 1'b1;
3518
                        default:        ;
3519
                        endcase
3520
                        ret();
3521
                end
3522
        end
3523
 
3524
//-----------------------------------------------------------------------------
3525
//-----------------------------------------------------------------------------
3526
SUB:
3527
        begin
3528
                flag_update <= FU_SUB;
3529
                if (sz==2'b11) begin
3530
                        Rt <= {1'b1,AAA};
3531
                        if (ir[8]) begin
3532
                                rfwrL <= 1'b1;
3533
                                resL <= d - s;
3534
                        end
3535
                        else begin
3536
                                resW <= d[15:0] - s[15:0];
3537
                                rfwrW <= 1'b1;
3538
                        end
3539
                        d <= d - s;
3540
                        dd <= d;
3541
                        ret();
3542
                end
3543
                else if (ir[8]) begin
3544
                        resB <= d[7:0] - s[7:0];
3545
                        resW <= d[15:0] - s[15:0];
3546
                        resL <= d - s;
3547
                        d <= d - s;
3548
                        dd <= d;
3549
                        if (mmm==3'd0 || mmm==3'd1) begin
3550
                                Rt <= {mmm[0],rrr};
3551
                                case(sz)
3552
                                2'b00:  rfwrB <= 1'b1;
3553
                                2'b01:  rfwrW <= 1'b1;
3554
                                2'b10:  rfwrL <= 1'b1;
3555
                                default:        ;
3556
                                endcase
3557
                                ret();
3558
                        end
3559
                        else begin
3560
                                case(sz)
3561
                                2'b00:  goto(STORE_BYTE);
3562
                                2'b01:  goto(STORE_WORD);
3563
                                2'b10:  goto(STORE_LWORD);
3564
                                default:        ;
3565
                                endcase
3566
                        end
3567
                end
3568
                else begin
3569
                        Rt <= {1'b0,DDD};
3570
                        resB <= d[7:0] - s[7:0];
3571
                        resW <= d[15:0] - s[15:0];
3572
                        resL <= d - s;
3573
                        dd <= d;
3574
                        case(sz)
3575
                        2'b00:  rfwrB <= 1'b1;
3576
                        2'b01:  rfwrW <= 1'b1;
3577
                        2'b10:  rfwrL <= 1'b1;
3578
                        default:        ;
3579
                        endcase
3580
                        ret();
3581
                end
3582
        end
3583
 
3584
ADDX:
3585
        begin
3586
                push (ADDX2);
3587
                case(sz)
3588
                2'd0:   fs_data(3'b100,rrr,FETCH_BYTE,S);
3589
                2'd1:   fs_data(3'b100,rrr,FETCH_WORD,S);
3590
                2'd2:   fs_data(3'b100,rrr,FETCH_LWORD,S);
3591
                default:        ;
3592
                endcase
3593
        end
3594
ADDX2:
3595
        begin
3596
                push(ADDX3);
3597
                case(sz)
3598
                2'd0:   fs_data(3'b100,RRR,FETCH_BYTE,D);
3599
                2'd1:   fs_data(3'b100,RRR,FETCH_WORD,D);
3600
                2'd2:   fs_data(3'b100,RRR,FETCH_LWORD,D);
3601
                default:        ;
3602
                endcase
3603
        end
3604
ADDX3:
3605
        begin
3606
                flag_update <= FU_ADDX;
3607
                resB <= d[ 7:0] + s[ 7:0] + xf;
3608
                resW <= d[15:0] + s[15:0] + xf;
3609
                resL <= d[31:0] + s[31:0] + xf;
3610
                dd <= d;
3611
                d <= d + s + xf;
3612
                if (ir[3])
3613
                        case(sz)
3614
                        2'b00:  goto(STORE_BYTE);
3615
                        2'b01:  goto(STORE_WORD);
3616
                        2'b10:  goto(STORE_LWORD);
3617
                        default:        ;
3618
                        endcase
3619
                else begin
3620
                        Rt <= {1'b0,RRR};
3621
                        case(sz)
3622
                        2'd0:   rfwrB <= 1'b1;
3623
                        2'd1:   rfwrW <= 1'b1;
3624
                        2'd2:   rfwrL <= 1'b1;
3625
                        default:        ;
3626
                        endcase
3627
                        ret();
3628
                end
3629
        end
3630
 
3631
SUBX:
3632
        begin
3633
                push (SUBX2);
3634
                case(sz)
3635
                2'd0:   fs_data(3'b100,rrr,FETCH_BYTE,S);
3636
                2'd1:   fs_data(3'b100,rrr,FETCH_WORD,S);
3637
                2'd2:   fs_data(3'b100,rrr,FETCH_LWORD,S);
3638
                default:        ;
3639
                endcase
3640
        end
3641
SUBX2:
3642
        begin
3643
                push(SUBX3);
3644
                case(sz)
3645
                2'd0:   fs_data(3'b100,RRR,FETCH_BYTE,D);
3646
                2'd1:   fs_data(3'b100,RRR,FETCH_WORD,D);
3647
                2'd2:   fs_data(3'b100,RRR,FETCH_LWORD,D);
3648
                default:        ;
3649
                endcase
3650
        end
3651
SUBX3:
3652
        begin
3653
                flag_update <= FU_SUBX;
3654
                resB <= d[7:0] - s[7:0] - xf;
3655
                resW <= d[15:0] - s[15:0] - xf;
3656
                resL <= d[31:0] - s[31:0] - xf;
3657
                dd <= d;
3658
                d <= d - s - xf;
3659
                if (ir[3])
3660
                        case(sz)
3661
                        2'b00:  goto(STORE_BYTE);
3662
                        2'b01:  goto(STORE_WORD);
3663
                        2'b10:  goto(STORE_LWORD);
3664
                        default:        ;
3665
                        endcase
3666
                else begin
3667
                        Rt <= {1'b0,RRR};
3668
                        case(sz)
3669
                        2'd0:   rfwrB <= 1'b1;
3670
                        2'd1:   rfwrW <= 1'b1;
3671
                        2'd2:   rfwrL <= 1'b1;
3672
                        default:        ;
3673
                        endcase
3674
                        ret();
3675
                end
3676
        end
3677
 
3678
//-----------------------------------------------------------------------------
3679
//-----------------------------------------------------------------------------
3680
AND:
3681
        begin
3682
                flag_update <= FU_LOGIC;
3683
                if (ir[8]) begin
3684
                        resB <= d[7:0] & rfoDn[7:0];
3685
                        resW <= d[15:0] & rfoDn[15:0];
3686
                        resL <= d & rfoDn;
3687
                        d <= d & rfoDn;
3688
                        if (mmm==3'd0 || mmm==3'd1) begin
3689
                                Rt <= {mmm[0],rrr};
3690
                                case(sz)
3691
                                2'b00:  rfwrB <= 1'b1;
3692
                                2'b01:  rfwrW <= 1'b1;
3693
                                2'b10:  rfwrL <= 1'b1;
3694
                                default:        ;
3695
                                endcase
3696
                                ret();
3697
                        end
3698
                        else begin
3699
                                case(sz)
3700
                                2'b00:  goto(STORE_BYTE);
3701
                                2'b01:  goto(STORE_WORD);
3702
                                2'b10:  goto(STORE_LWORD);
3703
                                default:        ;
3704
                                endcase
3705
                        end
3706
                end
3707
                else begin
3708
                        Rt <= {1'b0,DDD};
3709
                        resB <= rfoDn[7:0] & s[7:0];
3710
                        resW <= rfoDn[15:0] & s[15:0];
3711
                        resL <= rfoDn & s;
3712
                        case(sz)
3713
                        2'b00:  rfwrB <= 1'b1;
3714
                        2'b01:  rfwrW <= 1'b1;
3715
                        2'b10:  rfwrL <= 1'b1;
3716
                        default:        ;
3717
                        endcase
3718
                        ret();
3719
                end
3720
        end
3721
 
3722
//-----------------------------------------------------------------------------
3723
// OR
3724
//-----------------------------------------------------------------------------
3725
OR:
3726
        begin
3727
                flag_update <= FU_LOGIC;
3728
                if (ir[8]) begin
3729
                        resB <= d[7:0] | rfoDn[7:0];
3730
                        resW <= d[15:0] | rfoDn[15:0];
3731
                        resL <= d | rfoDn;
3732
                        d <= d | rfoDn;
3733
                        if (mmm==3'd0 || mmm==3'd1) begin
3734
                                Rt <= {mmm[0],rrr};
3735
                                case(sz)
3736
                                2'b00:  rfwrB <= 1'b1;
3737
                                2'b01:  rfwrW <= 1'b1;
3738
                                2'b10:  rfwrL <= 1'b1;
3739
                                default:        ;       // DIV
3740
                                endcase
3741
                                ret();
3742
                        end
3743
                        else begin
3744
                                case(sz)
3745
                                2'b00:  goto(STORE_BYTE);
3746
                                2'b01:  goto(STORE_WORD);
3747
                                2'b10:  goto(STORE_LWORD);
3748
                                default:        ;       // DIV
3749
                                endcase
3750
                        end
3751
                end
3752
                else begin
3753
                        Rt <= {1'b0,DDD};
3754
                        resB <= rfoDn[7:0] | s[7:0];
3755
                        resW <= rfoDn[15:0] | s[15:0];
3756
                        resL <= rfoDn | s;
3757
                        case(sz)
3758
                        2'b00:  rfwrB <= 1'b1;
3759
                        2'b01:  rfwrW <= 1'b1;
3760
                        2'b10:  rfwrL <= 1'b1;
3761
                        default:        ;
3762
                        endcase
3763
                        ret();
3764
                end
3765
        end
3766
 
3767
//-----------------------------------------------------------------------------
3768
// EOR
3769
//-----------------------------------------------------------------------------
3770
EOR:
3771
        begin
3772
                flag_update <= FU_LOGIC;
3773
                resB <= d[7:0] ^ rfoDn[7:0];
3774
                resW <= d[15:0] ^ rfoDn[15:0];
3775
                resL <= d ^ rfoDn;
3776
                d <= d ^ rfoDn;
3777
                if (mmm[2:1]==2'd0) begin
3778
                        Rt <= {mmm[0],rrr};
3779
                        case(sz)
3780
                        2'b00:  rfwrB <= 1'b1;
3781
                        2'b01:  rfwrW <= 1'b1;
3782
                        2'b10:  rfwrL <= 1'b1;
3783
                        default:        ;
3784
                        endcase
3785
                        ret();
3786
                end
3787
                else begin
3788
                        case(sz)
3789
                        2'b00:  goto(STORE_BYTE);
3790
                        2'b01:  goto(STORE_WORD);
3791
                        2'b10:  goto(STORE_LWORD);
3792
                        default:        ;
3793
                        endcase
3794
                end
3795
        end
3796
 
3797
//-----------------------------------------------------------------------------
3798
// ADDQ / SUBQ
3799
// Flags are not updated if the target is an address register.
3800
// If the target is an address register, the entire register is updated.
3801
//-----------------------------------------------------------------------------
3802
ADDQ:
3803
        begin
3804
                if (ir[8]) begin
3805
                        if (mmm!=3'b001)
3806
                                flag_update <= FU_SUBQ;
3807
                        resL <= d - immx;
3808
                        resB <= d[7:0] - immx[7:0];
3809
                        resW <= d[15:0] - immx[15:0];
3810
                        d <= d - immx;
3811
                        dd <= d;
3812
                        s <= immx;
3813
                end
3814
                else begin
3815
                        if (mmm!=3'b001)
3816
                                flag_update <= FU_ADDQ;
3817
                        resL <= d + immx;
3818
                        resB <= d[7:0] + immx[7:0];
3819
                        resW <= d[15:0] + immx[15:0];
3820
                        d <= d + immx;
3821
                        dd <= d;
3822
                        s <= immx;
3823
                end
3824
                if (mmm==3'd0) begin
3825
                        ret();
3826
                        Rt <= {mmm[0],rrr};
3827
                        case(sz)
3828
                        2'b00:  rfwrB <= 1'b1;
3829
                        2'b01:  rfwrW <= 1'b1;
3830
                        2'b10:  rfwrL <= 1'b1;
3831
                        default:        ;
3832
                        endcase
3833
                end
3834
                // If the target is an address register, the entire register is updated.
3835
                else if (mmm==3'b001) begin
3836
                        ret();
3837
                        Rt <= {mmm[0],rrr};
3838
                        rfwrL <= 1'b1;
3839
                end
3840
                else
3841
                        case(sz)
3842
                        2'b00:  goto(STORE_BYTE);
3843
                        2'b01:  goto(STORE_WORD);
3844
                        2'b10:  goto(STORE_LWORD);
3845
                        default:        ;       // Scc / DBRA
3846
                        endcase
3847
        end
3848
 
3849
//-----------------------------------------------------------------------------
3850
// ADDI / SUBI / CMPI / ANDI / ORI / EORI
3851
//-----------------------------------------------------------------------------
3852
ADDI:
3853
        case(sz)
3854
        2'b00:  call(FETCH_IMM8,ADDI2);
3855
        2'b01:  call(FETCH_IMM16,ADDI2);
3856
        2'b10:  call(FETCH_IMM32,ADDI2);
3857
        default:        tIllegal();
3858
        endcase
3859
ADDI2:
3860
        begin
3861
        immx <= imm;
3862
        case(sz)
3863
        2'b00:  begin push(ADDI3); fs_data(mmm,rrr,FETCH_BYTE,D); end
3864
        2'b01:  begin push(ADDI3); fs_data(mmm,rrr,FETCH_WORD,D); end
3865
        2'b10:  begin push(ADDI3); fs_data(mmm,rrr,FETCH_LWORD,D); end
3866
        default:        ;       // Cant get here
3867
        endcase
3868
        end
3869
ADDI3:
3870
        begin
3871
                flag_update <= FU_ADDI;
3872
                dd <= d;
3873
                s <= immx;
3874
                // Odd numbers are BIT insns.
3875
                case(ir[11:8])
3876
                4'h0:   resL <= d | immx;       // ORI
3877
                4'h2:   resL <= d & immx;     // ANDI
3878
                4'h4:   resL <= d - immx;       // SUBI
3879
                4'h6:   resL <= d + immx;       // ADDI
3880
                4'hA:   resL <= d ^ immx;       // EORI
3881
                4'hC:   resL <= d - immx;       // CMPI
3882
                default:        ;
3883
                endcase
3884
                case(ir[11:8])
3885
                4'h0:   resW <= d[15:0] | immx[15:0];   // ORI
3886
                4'h2:   resW <= d[15:0] & immx[15:0];       // ANDI
3887
                4'h4:   resW <= d[15:0] - immx[15:0];   // SUBI
3888
                4'h6:   resW <= d[15:0] + immx[15:0];   // ADDI
3889
                4'hA:   resW <= d[15:0] ^ immx[15:0];   // EORI
3890
                4'hC:   resW <= d[15:0] - immx[15:0];   // CMPI
3891
                default:        ;
3892
                endcase
3893
                case(ir[11:8])
3894
                4'h0:   resB <= d[7:0] | immx[7:0];     // ORI
3895
                4'h2:   resB <= d[7:0] & immx[7:0];        // ANDI
3896
                4'h4:   resB <= d[7:0] - immx[7:0];     // SUBI
3897
                4'h6:   resB <= d[7:0] + immx[7:0];     // ADDI
3898
                4'hA:   resB <= d[7:0] ^ immx[7:0];     // EORI
3899
                4'hC:   resB <= d[7:0] - immx[7:0];     // CMPI
3900
                default:        ;
3901
                endcase
3902
                case(ir[11:8])
3903
                4'h0:   d <= d | immx;  // ORI
3904
                4'h2:   d <= d & immx;        // ANDI
3905
                4'h4:   d <= d - immx;  // SUBI
3906
                4'h6:   d <= d + immx;  // ADDI
3907
                4'hA:   d <= d ^ immx;  // EORI
3908
                4'hC:   d <= d - immx;  // CMPI
3909
                default:        ;
3910
                endcase
3911
                if (ir[11:8]==4'hC)
3912
                        ret();
3913
                else if (mmm==3'b000 || mmm==3'b001) begin
3914
                        case(sz)
3915
                        2'b00:  rfwrB <= 1'b1;
3916
                        2'b01:  rfwrW <= 1'b1;
3917
                        2'b10:  rfwrL <= 1'b1;
3918
                        default:        ;
3919
                        endcase
3920
                        Rt <= {mmm[0],rrr};
3921
                        ret();
3922
                end
3923
                else
3924
                        case(sz)
3925
                        2'b00:  goto(STORE_BYTE);
3926
                        2'b01:  goto(STORE_WORD);
3927
                        2'b10:  goto(STORE_LWORD);
3928
                        default:        ret();
3929
                        endcase
3930
        end
3931
 
3932
//-----------------------------------------------------------------------------
3933
// ANDI_CCR / ANDI_SR / EORI_CCR / EORI_SR / ORI_CCR / ORI_SR
3934
//-----------------------------------------------------------------------------
3935
//
3936
ANDI_CCR:
3937
        begin flag_update <= FU_ANDI_CCR; goto(FETCH_IMM8); end
3938
ANDI_SR:
3939
        begin flag_update <= FU_ANDI_SR; goto(FETCH_IMM16); end
3940
ANDI_SRX:
3941
        begin flag_update <= FU_ANDI_SRX; goto(FETCH_IMM32); end
3942
EORI_CCR:
3943
        begin flag_update <= FU_EORI_CCR; goto(FETCH_IMM8); end
3944
EORI_SR:
3945
        begin flag_update <= FU_EORI_SR; goto(FETCH_IMM16); end
3946
EORI_SRX:
3947
        begin flag_update <= FU_EORI_SRX; goto(FETCH_IMM32); end
3948
ORI_CCR:
3949
        begin flag_update <= FU_ORI_CCR; goto(FETCH_IMM8); end
3950
ORI_SR:
3951
        begin flag_update <= FU_ORI_SR; goto(FETCH_IMM16); end
3952
ORI_SRX:
3953
        begin flag_update <= FU_ORI_SRX; goto(FETCH_IMM32); end
3954
 
3955
//-----------------------------------------------------------------------------
3956
// Bit manipulation
3957
//-----------------------------------------------------------------------------
3958
BIT:
3959
        begin
3960
                mmm_save <= mmm;
3961
                if (ir[11:8]==4'h8) begin
3962
                        call(FETCH_IMM16,BIT1);
3963
                end
3964
                else begin
3965
                        imm <= rfoDn;
3966
                        goto(BIT1);
3967
                end
3968
        end
3969
BIT1:
3970
        begin
3971
                bit2test <= imm;
3972
                if (mmm_save==3'b000) begin     // Dn
3973
                        goto(BIT2);
3974
                        d <= rfob;
3975
                end
3976
                else begin
3977
                        push(BIT2);
3978
                        // This might fetch an immediate
3979
                        // might also alter mmm
3980
                        fs_data(mmm,rrr,FETCH_BYTE,D);
3981
                end
3982
        end
3983
// ToDo: Speed this up by a clock cycle by placing the update in IFETCH.
3984
BIT2:
3985
        begin
3986
                // Targets a data register then the size is 32-bit, test is mod 32.
3987
                if (mmm_save==3'b000)
3988
                        case(sz)
3989
                        2'b00:  // BTST
3990
                                begin
3991
`ifdef SUPPORT_BITPAIRS
3992
                                        if (bit2test[7]) begin
3993
                                                zf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b00;
3994
                                                cf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b01;
3995
                                                nf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b10;
3996
                                                vf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b11;
3997
                                        end
3998
                                        else
3999
`endif
4000
                                                zf <= ~d[bit2test[4:0]];
4001
                                        ret();
4002
                                end
4003
                        2'b01:  // BCHG
4004
                                begin
4005
`ifdef SUPPORT_BITPAIRS
4006
                                        if (bit2test[7]) begin
4007
                                                zf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b00;
4008
                                                cf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b01;
4009
                                                nf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b10;
4010
                                                vf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b11;
4011
                                                resL <= d ^ (32'd3 << {bit2test[3:0],1'b0});
4012
                                        end
4013
                                        else
4014
`endif
4015
                                        begin
4016
                                                zf <= ~d[bit2test[4:0]];
4017
                                                resL <= d ^  (32'd1 << bit2test[4:0]);
4018
                                        end
4019
                                        rfwrL <= 1'b1;
4020
                                        Rt <= {1'b0,rrr};
4021
                                        ret();
4022
                                end
4023
                        2'b10:  // BCLR
4024
                                begin
4025
`ifdef SUPPORT_BITPAIRS
4026
                                        if (bit2test[7]) begin
4027
                                                zf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b00;
4028
                                                cf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b01;
4029
                                                nf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b10;
4030
                                                vf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b11;
4031
                                                resL <= d & ~(32'd3 << {bit2test[3:0],1'b0});
4032
                                        end
4033
                                        else
4034
`endif
4035
                                        begin
4036
                                                zf <= ~d[bit2test[4:0]];
4037
                                                resL <= d & ~(32'd1 << bit2test[4:0]);
4038
                                        end
4039
                                        rfwrL <= 1'b1;
4040
                                        Rt <= {1'b0,rrr};
4041
                                        ret();
4042
                                end
4043
                        2'b11:  // BSET
4044
                                begin
4045
`ifdef SUPPORT_BITPAIRS
4046
                                        if (bit2test[7]) begin
4047
                                                zf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b00;
4048
                                                cf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b01;
4049
                                                nf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b10;
4050
                                                vf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b11;
4051
                                                resL <= (d & ~(32'd3 << {bit2test[3:0],1'b0})) | (bit2test[5:4] << {bit2test[3:0],1'b0});
4052
                                        end
4053
                                        else
4054
`endif
4055
                                        begin
4056
                                                zf <= ~d[bit2test[4:0]];
4057
                                                resL <= d |  (32'd1 << bit2test[4:0]);
4058
                                        end
4059
                                        rfwrL <= 1'b1;
4060
                                        Rt <= {1'b0,rrr};
4061
                                        ret();
4062
                                end
4063
                        endcase
4064
                // Target is memory, size is byte, test is mod 8.
4065
                else
4066
                        case(sz)
4067
                        2'b00:  // BTST
4068
                                begin
4069
`ifdef SUPPORT_BITPAIRS
4070
                                        if (bit2test[7]) begin
4071
                                                zf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b00;
4072
                                                cf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b01;
4073
                                                nf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b10;
4074
                                                vf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b11;
4075
                                        end
4076
                                        else
4077
`endif
4078
                                                zf <= ~d[bit2test[2:0]];
4079
                                        ret();
4080
                                end
4081
                        2'b01:  // BCHG
4082
                                begin
4083
`ifdef SUPPORT_BITPAIRS
4084
                                        if (bit2test[7]) begin
4085
                                                zf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b00;
4086
                                                cf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b01;
4087
                                                nf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b10;
4088
                                                vf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b11;
4089
                                                d <= d ^ (32'd3 << {bit2test[1:0],1'b0});
4090
                                        end
4091
                                        else
4092
`endif
4093
                                        begin
4094
                                                zf <= ~d[bit2test[2:0]];
4095
                                                d <= d ^  (32'd1 << bit2test[2:0]);
4096
                                        end
4097
                                        goto(STORE_BYTE);
4098
                                end
4099
                        2'b10:  // BCLR
4100
                                begin
4101
`ifdef SUPPORT_BITPAIRS
4102
                                        if (bit2test[7]) begin
4103
                                                zf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b00;
4104
                                                cf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b01;
4105
                                                nf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b10;
4106
                                                vf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b11;
4107
                                                d <= d & ~(32'd3 << {bit2test[1:0],1'b0});
4108
                                        end
4109
                                        else
4110
`endif
4111
                                        begin
4112
                                                zf <= ~d[bit2test[2:0]];
4113
                                                d <= d & ~(32'd1 << bit2test[2:0]);
4114
                                        end
4115
                                        goto(STORE_BYTE);
4116
                                end
4117
                        2'b11:  // BSET
4118
                                begin
4119
`ifdef SUPPORT_BITPAIRS
4120
                                        if (bit2test[7]) begin
4121
                                                zf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b00;
4122
                                                cf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b01;
4123
                                                nf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b10;
4124
                                                vf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b11;
4125
                                                d <= (d & ~(32'd3 << {bit2test[1:0],1'b0})) | (bit2test[5:4] << {bit2test[1:0],1'b0});
4126
                                        end
4127
                                        else
4128
`endif
4129
                                        begin
4130
                                                zf <= ~d[bit2test[2:0]];
4131
                                                d <= d |  (32'd1 << bit2test[2:0]);
4132
                                        end
4133
                                        goto(STORE_BYTE);
4134
                                end
4135
                        endcase
4136
        end
4137
 
4138
//-----------------------------------------------------------------------------
4139
//-----------------------------------------------------------------------------
4140
CHK:
4141
        begin
4142
                if (d[15] || $signed(d[15:0]) > $signed(s[15:0])) begin
4143
                isr <= srx;
4144
                tf <= 1'b0;
4145
                sf <= 1'b1;
4146
                        vecno <= `CHK_VEC;
4147
            state <= TRAP3;
4148
                end
4149
                else
4150
                        ret();
4151
        end
4152
 
4153
//-----------------------------------------------------------------------------
4154
//-----------------------------------------------------------------------------
4155
FETCH_NOP_BYTE,FETCH_NOP_WORD,FETCH_NOP_LWORD:
4156
        ret();
4157
 
4158
FETCH_BRDISP:
4159
        begin
4160
/*
4161
                if (fnInCache(pc)) begin
4162
                        tFindInCache(pc,disp);
4163
                        goto (FETCH_BRDISP1);
4164
                end
4165
                else
4166
*/
4167
                if (!cyc_o) begin
4168
                        fc_o <= {sf,2'b10};
4169
                        cyc_o <= 1'b1;
4170
                        stb_o <= 1'b1;
4171
                        sel_o <= 4'b1111;
4172
                        adr_o <= pc;
4173
                end
4174
                else if (ack_i) begin
4175
                        cyc_o <= 1'b0;
4176
                        stb_o <= 1'b0;
4177
                        sel_o <= 4'b00;
4178
                        d <= {16'd0,iri};
4179
                        goto (FETCH_BRDISPa);
4180
                end
4181
        end
4182
FETCH_BRDISPa:
4183
        begin
4184
                // Record 'd' for bsr
4185
`ifdef SUPPORT_B24
4186
                if (ir[0]) begin
4187
                        d <= pc + {{9{ir[7]}},ir[7:1],d[15:0],1'b0};
4188
                        ea <= pc + {{9{ir[7]}},ir[7:1],d[15:0],1'b0};
4189
                end
4190
                else
4191
`endif
4192
                        d <= pc + {{16{d[15]}},d[15:0]};
4193
                        ea <= pc + {{16{d[15]}},d[15:0]};
4194
                // Want to point PC to return after displacement, it will be stacked
4195
                if (bsr)
4196
                        pc <= pc + 4'd2;
4197
                // else branch
4198
                else begin
4199
`ifdef SUPPORT_B24
4200
                        if (ir[0])
4201
                                pc <= pc + {{9{ir[7]}},ir[7:1],d[15:0],1'b0};
4202
                        else
4203
`endif
4204
                                pc <= pc + {{16{d[15]}},d[15:0]};
4205
                end
4206
                ret();
4207
        end
4208
 
4209
// Fetch 8 bit immediate
4210
//
4211
FETCH_IMM8:
4212
        if (!cyc_o) begin
4213
                fc_o <= {sf,2'b10};
4214
                cyc_o <= 1'b1;
4215
                stb_o <= 1'b1;
4216
                sel_o <= 4'b1111;
4217
                adr_o <= pc;
4218
        end
4219
        else if (ack_i) begin
4220
                cyc_o <= 1'b0;
4221
                stb_o <= 1'b0;
4222
                sel_o <= 4'b00;
4223
                imm <= {{24{iri[7]}},iri[7:0]};
4224
                if (ds==D)
4225
                        d <= {{24{iri[7]}},iri[7:0]};
4226
                else
4227
                        s <= {{24{iri[7]}},iri[7:0]};
4228
                goto (FETCH_IMM8a);
4229
        end
4230
FETCH_IMM8a:
4231
        begin
4232
                pc <= pc + 32'd2;
4233
                ret();
4234
        end
4235
 
4236
// Fetch 16 bit immediate
4237
//
4238
FETCH_IMM16:
4239
        if (!cyc_o) begin
4240
                fc_o <= {sf,2'b10};
4241
                cyc_o <= 1'b1;
4242
                stb_o <= 1'b1;
4243
                sel_o <= 4'b1111;
4244
                adr_o <= pc;
4245
        end
4246
        else if (ack_i) begin
4247
                cyc_o <= 1'b0;
4248
                stb_o <= 1'b0;
4249
                sel_o <= 4'b00;
4250
                imm <= {{16{iri[15]}},iri};
4251
                if (ds==D)
4252
                        d <= {{16{iri[15]}},iri};
4253
                else
4254
                        s <= {{16{iri[15]}},iri};
4255
                goto (FETCH_IMM16a);
4256
        end
4257
FETCH_IMM16a:
4258
        begin
4259
                pc <= pc + 32'd2;
4260
                ret();
4261
        end
4262
 
4263
// Fetch 32 bit immediate
4264
//
4265
FETCH_IMM32:
4266
        if (!cyc_o) begin
4267
                fc_o <= {sf,2'b10};
4268
                cyc_o <= 1'b1;
4269
                stb_o <= 1'b1;
4270
                sel_o <= 4'b1111;
4271
                adr_o <= pc;
4272
        end
4273
        else if (ack_i) begin
4274
                stb_o <= 1'b0;
4275
                sel_o <= 4'b00;
4276
                if (pc[1]) begin
4277
`ifdef BIG_ENDIAN
4278
                        imm[31:16] <= {dat_i[23:16],dat_i[31:24]};
4279
                        if (ds==D)
4280
                                d[31:16] <= {dat_i[23:16],dat_i[31:24]};
4281
                        else
4282
                                s[31:16] <= {dat_i[23:16],dat_i[31:24]};
4283
`else
4284
      imm[15:0] <= dat_i[31:16];
4285
      if (ds==D)
4286
        d[15:0] <= dat_i[31:16];
4287
        else
4288
        s[15:0] <= dat_i[31:16];
4289
`endif
4290
                  goto(FETCH_IMM32a);
4291
                end
4292
                else begin
4293
`ifdef BIG_ENDIAN
4294
                        imm <= rbo(dat_i);
4295
                        if (ds==D)
4296
                                d <= rbo(dat_i);
4297
                        else
4298
                                s <= rbo(dat_i);
4299
`else
4300
      imm <= dat_i;
4301
      if (ds==D)
4302
        d <= dat_i;
4303
      else
4304
        s <= dat_i;
4305
`endif
4306
                  cyc_o <= 1'b0;
4307
                  goto (FETCH_IMM32b);
4308
                end
4309
        end
4310
FETCH_IMM32a:
4311
        if (!stb_o) begin
4312
                stb_o <= 1'b1;
4313
                sel_o <= 4'b1111;
4314
                adr_o <= pc + 4'd2;
4315
        end
4316
        else if (ack_i) begin
4317
                cyc_o <= 1'b0;
4318
                stb_o <= 1'b0;
4319
                sel_o <= 4'b00;
4320
`ifdef BIG_ENDIAN
4321
                imm[15:0] <= {dat_i[7:0],dat_i[15:8]};
4322
                if (ds==D)
4323
                        d[15:0] <= {dat_i[7:0],dat_i[15:8]};
4324
                else
4325
                        s[15:0] <= {dat_i[7:0],dat_i[15:8]};
4326
`else
4327
                imm[31:16] <= dat_i[15:0];
4328
                if (ds==D)
4329
                        d[31:26] <= dat_i[15:0];
4330
                else
4331
                        s[31:26] <= dat_i[15:0];
4332
`endif
4333
                goto (FETCH_IMM32b);
4334
        end
4335
FETCH_IMM32b:
4336
        begin
4337
                pc <= pc + 32'd4;
4338
                ret();
4339
        end
4340 8 robfinch
 
4341
`ifdef SUPPORT_DECFLT
4342
FETCH_IMM96:
4343
        begin
4344
                call(FETCH_IMM32,FETCH_IMM96b);
4345
        end
4346
FETCH_IMM96b:
4347
        begin
4348
`ifdef BIG_ENDIAN
4349
                fps[95:64] <= imm;
4350
`else
4351
                fps[31: 0] <= imm;
4352
`endif
4353
                call(FETCH_IMM32,FETCH_IMM96c);
4354
        end
4355
FETCH_IMM96c:
4356
        begin
4357
`ifdef BIG_ENDIAN
4358
                fps[63:32] <= imm;
4359
`else
4360
                fps[63:32] <= imm;
4361
`endif
4362
                call(FETCH_IMM32,FETCH_IMM96d);
4363
        end
4364
FETCH_IMM96d:
4365
        begin
4366
`ifdef BIG_ENDIAN
4367
                fps[31: 0] <= imm;
4368
`else
4369
                fps[95:64] <= imm;
4370
`endif
4371
                ret();
4372
        end
4373
`endif
4374 2 robfinch
 
4375
// Fetch 32 bit displacement
4376
//
4377
FETCH_D32:
4378
        if (!cyc_o) begin
4379
                fc_o <= {sf,2'b10};
4380
                cyc_o <= 1'b1;
4381
                stb_o <= 1'b1;
4382
                sel_o <= 4'b1111;
4383
                adr_o <= pc;
4384
        end
4385
        else if (ack_i) begin
4386
    if (pc[1]) begin
4387
      stb_o <= 1'b0;
4388
      sel_o <= 4'b0000;
4389
`ifdef BIG_ENDIAN
4390
                        disp[31:16] <= {dat_i[23:16],dat_i[31:24]};
4391
`else
4392
      disp[15:0] <= dat_i[31:16];
4393
`endif
4394
                goto (FETCH_D32a);
4395
                end
4396
                else begin
4397
            cyc_o <= `LOW;
4398
      stb_o <= 1'b0;
4399
      sel_o <= 4'b0000;
4400
`ifdef BIG_ENDIAN
4401
                        disp <= rbo(dat_i);
4402
`else
4403
      disp <= dat_i;
4404
`endif
4405
      goto (FETCH_D32b);
4406
                end
4407
        end
4408
FETCH_D32a:
4409
        if (!stb_o) begin
4410
                stb_o <= 1'b1;
4411
                sel_o <= 4'b1111;
4412
                adr_o <= pc + 4'd2;
4413
        end
4414
        else if (ack_i) begin
4415
    cyc_o <= `LOW;
4416
                stb_o <= 1'b0;
4417
                sel_o <= 2'b00;
4418
`ifdef BIG_ENDIAN
4419
                disp[15:0] <= {dat_i[7:0],dat_i[15:8]};
4420
`else
4421
                disp[31:16] <= dat_i[15:0];
4422
`endif
4423
                goto (FETCH_D32b);
4424
        end
4425
FETCH_D32b:
4426
        begin
4427
                pc <= pc + 4'd4;
4428
                ea <= ea + disp;
4429
                ret();
4430
        end
4431
 
4432
// Fetch 16 bit displacement
4433
//
4434
FETCH_D16:
4435
        if (!cyc_o) begin
4436
                fc_o <= {sf,2'b10};
4437
                cyc_o <= 1'b1;
4438
                stb_o <= 1'b1;
4439
                sel_o <= 4'b1111;
4440
                adr_o <= pc;
4441
        end
4442
        else if (ack_i) begin
4443
                cyc_o <= 1'b0;
4444
                stb_o <= 1'b0;
4445
                sel_o <= 4'b0;
4446
                disp <= {{16{iri[15]}},iri};
4447
                state <= FETCH_D16a;
4448
        end
4449
FETCH_D16a:
4450
        begin
4451
                pc <= pc + 32'd2;
4452
                ea <= ea + disp;
4453
                ret();
4454
        end
4455
 
4456
// Fetch index word
4457
//
4458
FETCH_NDX:
4459
        if (!cyc_o) begin
4460
                fc_o <= {sf,2'b10};
4461
                cyc_o <= 1'b1;
4462
                stb_o <= 1'b1;
4463
                sel_o <= 4'b1111;
4464
                adr_o <= pc;
4465
        end
4466
        else if (ack_i) begin
4467
                cyc_o <= 1'b0;
4468
                stb_o <= 1'b0;
4469
                sel_o <= 2'b00;
4470
                disp <= {{24{iri[7]}},iri[7:0]};
4471
                mmm <= {2'b00,iri[15]}; // to get reg
4472
                rrr <= iri[14:12];
4473
                wl <= iri[11];
4474
                state <= FETCH_NDXa;
4475
        end
4476
FETCH_NDXa:
4477
        begin
4478
                pc <= pc + 32'd2;
4479
                if (wl)
4480
                        ea <= ea + rfob + disp;
4481
                else
4482
                        ea <= ea + {{16{rfob[15]}},rfob[15:0]} + disp;
4483
                ret();
4484
        end
4485
 
4486
FETCH_BYTE:
4487
        if (!cyc_o) begin
4488
                if (use_sfc)
4489
                        fc_o <= sfc[2:0];
4490
                else if (use_dfc)
4491
                        fc_o <= dfc[2:0];
4492
                else
4493
                        fc_o <= {sf,2'b01};
4494
                cyc_o <= `HIGH;
4495
                stb_o <= `HIGH;
4496
                adr_o <= ea;
4497
                sel_o <= 4'b1111;
4498
        end
4499
        else if (ack_i) begin
4500
                cyc_o <= `LOW;
4501
                stb_o <= `LOW;
4502
                sel_o <= 4'b0000;
4503
                if (ds==D) begin
4504
            case(ea[1:0])
4505
            2'b00:  d <= {{24{dat_i[7]}},dat_i[7:0]};
4506
            2'b01:  d <= {{24{dat_i[15]}},dat_i[15:8]};
4507
            2'b10:  d <= {{24{dat_i[23]}},dat_i[23:16]};
4508
            2'b11:  d <= {{24{dat_i[31]}},dat_i[31:24]};
4509
            default:  ;
4510
            endcase
4511
                end
4512
                else begin
4513
            case(ea[1:0])
4514
      2'b00:  s <= {{24{dat_i[7]}},dat_i[7:0]};
4515
      2'b01:  s <= {{24{dat_i[15]}},dat_i[15:8]};
4516
      2'b10:  s <= {{24{dat_i[23]}},dat_i[23:16]};
4517
      2'b11:  s <= {{24{dat_i[31]}},dat_i[31:24]};
4518
      default:    ;
4519
      endcase
4520
                end
4521
                ret();
4522
        end
4523
 
4524
// Fetch byte, but hold onto bus
4525
//
4526
LFETCH_BYTE:
4527
        if (!cyc_o) begin
4528
                if (use_sfc)
4529
                        fc_o <= sfc[2:0];
4530
                else if (use_dfc)
4531
                        fc_o <= dfc[2:0];
4532
                else
4533
                        fc_o <= {sf,2'b01};
4534
                lock_o <= `HIGH;
4535
                cyc_o <= `HIGH;
4536
                stb_o <= `HIGH;
4537
                adr_o <= ea;
4538
                sel_o <= 4'b1111;
4539
        end
4540
        else if (ack_i) begin
4541
                stb_o <= 1'b0;
4542
                sel_o <= 4'b0;
4543
                if (ds==D) begin
4544
      case(ea[1:0])
4545
      2'b00:  d <= {{24{dat_i[7]}},dat_i[7:0]};
4546
      2'b01:  d <= {{24{dat_i[15]}},dat_i[15:8]};
4547
      2'b10:  d <= {{24{dat_i[23]}},dat_i[23:16]};
4548
      2'b11:  d <= {{24{dat_i[31]}},dat_i[31:24]};
4549
      default:    ;
4550
      endcase
4551
    end
4552
    else begin
4553
      case(ea[1:0])
4554
      2'b00:  s <= {{24{dat_i[7]}},dat_i[7:0]};
4555
      2'b01:  s <= {{24{dat_i[15]}},dat_i[15:8]};
4556
      2'b10:  s <= {{24{dat_i[23]}},dat_i[23:16]};
4557
      2'b11:  s <= {{24{dat_i[31]}},dat_i[31:24]};
4558
      default:    ;
4559
      endcase
4560
    end
4561
                ret();
4562
        end
4563
 
4564
FETCH_WORD:
4565
        if (!cyc_o) begin
4566
                if (use_sfc)
4567
                        fc_o <= sfc[2:0];
4568
                else if (use_dfc)
4569
                        fc_o <= dfc[2:0];
4570
                else
4571
                        fc_o <= {sf,2'b01};
4572
                cyc_o <= `HIGH;
4573
                stb_o <= `HIGH;
4574
                adr_o <= ea;
4575
                sel_o <= 4'b1111;
4576
        end
4577
        else if (ack_i) begin
4578
                cyc_o <= 1'b0;
4579
                stb_o <= 1'b0;
4580
                sel_o <= 4'b00;
4581
`ifdef BIG_ENDIAN
4582
                if (ds==D)
4583
                  d <= ea[1] ? {{16{dat_i[23]}},dat_i[23:16],dat_i[31:24]} : {{16{dat_i[7]}},dat_i[7:0],dat_i[15:8]};
4584
                else
4585
                  s <= ea[1] ? {{16{dat_i[23]}},dat_i[23:16],dat_i[31:24]} : {{16{dat_i[7]}},dat_i[7:0],dat_i[15:8]};
4586
`else
4587
                if (ds==D)
4588
                  d <= ea[1] ? {{16{dat_i[31]}},dat_i[31:16]} : {{16{dat_i[15]}},dat_i[15:0]};
4589
                else
4590
                  s <= ea[1] ? {{16{dat_i[31]}},dat_i[31:16]} : {{16{dat_i[15]}},dat_i[15:0]};
4591
`endif
4592
                ret();
4593
        end
4594
 
4595
FETCH_LWORD:
4596
  if (!cyc_o) begin
4597
                if (use_sfc)
4598
                        fc_o <= sfc[2:0];
4599
                else if (use_dfc)
4600
                        fc_o <= dfc[2:0];
4601
                else
4602
                        fc_o <= {sf,2'b01};
4603
                cyc_o <= 1'b1;
4604
                stb_o <= 1'b1;
4605
                adr_o <= ea;
4606
                sel_o <= 4'b1111;
4607
        end
4608
        else if (ack_i) begin
4609
                stb_o <= 1'b0;
4610
                sel_o <= 4'b00;
4611
                if (ea[1]) begin
4612
`ifdef BIG_ENDIAN
4613
      if (ds==D)
4614
        d[31:16] <= {dat_i[23:16],dat_i[31:24]};
4615 8 robfinch
      else
4616 2 robfinch
        s[31:16] <= {dat_i[23:16],dat_i[31:24]};
4617
`else
4618
      if (ds==D)
4619
        d[15:0] <= dat_i[31:16];
4620 8 robfinch
      else
4621 2 robfinch
        s[15:0] <= dat_i[31:16];
4622
`endif
4623
                goto (FETCH_LWORDa);
4624
    end
4625
    else begin
4626
      cyc_o <= `LOW;
4627
`ifdef BIG_ENDIAN
4628
      if (ds==D)
4629 4 robfinch
        d <= rbo(dat_i);
4630 8 robfinch
      else
4631 4 robfinch
        s <= rbo(dat_i);
4632 2 robfinch
`else
4633
      if (ds==D)
4634 4 robfinch
        d <= dat_i;
4635 8 robfinch
      else
4636 4 robfinch
        s <= dat_i;
4637 2 robfinch
`endif
4638
      ret();
4639
    end
4640
        end
4641
FETCH_LWORDa:
4642
        if (!stb_o) begin
4643
                cyc_o <= 1'b1;
4644
                stb_o <= 1'b1;
4645
                adr_o <= adr_o + 32'd2;
4646
                sel_o <= 4'b1111;
4647
        end
4648
        else if (ack_i) begin
4649
                cyc_o <= 1'b0;
4650
                stb_o <= 1'b0;
4651
                sel_o <= 4'b00;
4652
`ifdef BIG_ENDIAN
4653
                if (ds==D)
4654
                        d[15:0] <= {dat_i[7:0],dat_i[15:8]};
4655 8 robfinch
                else
4656 2 robfinch
                        s[15:0] <= {dat_i[7:0],dat_i[15:8]};
4657
`else
4658
                if (ds==D)
4659
                        d[31:16] <= dat_i[15:0];
4660 8 robfinch
                else
4661 2 robfinch
                        s[31:16] <= dat_i[15:0];
4662
`endif
4663
                ret();
4664
        end
4665
 
4666 4 robfinch
`ifdef SUPPORT_DECFLT
4667
FETCH_HEXI1:
4668 8 robfinch
        call (FETCH_LWORD,FETCH_HEXI2);
4669
FETCH_HEXI2:
4670
        begin
4671 4 robfinch
`ifdef BIG_ENDIAN
4672
                if (ds==S)
4673 8 robfinch
                        fps[95:64] <= s;
4674 4 robfinch
                else
4675 8 robfinch
                        fpd[95:64] <= d;
4676 4 robfinch
`else
4677
                if (ds==S)
4678 8 robfinch
                        fps[31: 0] <= s;
4679 4 robfinch
                else
4680 8 robfinch
                        fpd[31: 0] <= d;
4681 4 robfinch
`endif
4682 8 robfinch
                ea <= ea + 4'd4;
4683
                call (FETCH_LWORD,FETCH_HEXI3);
4684 4 robfinch
        end
4685
FETCH_HEXI3:
4686 8 robfinch
        begin
4687 4 robfinch
`ifdef BIG_ENDIAN
4688
                if (ds==S)
4689 8 robfinch
                        fps[63:32] <= s;
4690 4 robfinch
                else
4691 8 robfinch
                        fpd[63:32] <= d;
4692 4 robfinch
`else
4693
                if (ds==S)
4694 8 robfinch
                        fps[63:32] <= s;
4695 4 robfinch
                else
4696 8 robfinch
                        fpd[63:32] <= d;
4697
`endif
4698
                ea <= ea + 4'd4;
4699
                call (FETCH_LWORD,FETCH_HEXI4);
4700 4 robfinch
        end
4701
FETCH_HEXI4:
4702 8 robfinch
        begin
4703 4 robfinch
`ifdef BIG_ENDIAN
4704
                if (ds==S)
4705 8 robfinch
                        fps[31: 0] <= s;
4706 4 robfinch
                else
4707 8 robfinch
                        fpd[31: 0] <= d;
4708 4 robfinch
`else
4709
                if (ds==S)
4710 8 robfinch
                        fps[95:64] <= s;
4711 4 robfinch
                else
4712 8 robfinch
                        fpd[95:64] <= d;
4713 4 robfinch
`endif
4714 8 robfinch
                ea <= ea - 4'd8;
4715 4 robfinch
                ret();
4716
        end
4717 2 robfinch
 
4718 4 robfinch
STORE_HEXI1:
4719 8 robfinch
        begin
4720 4 robfinch
`ifdef BIG_ENDIAN
4721 8 robfinch
                d <= fpd[95:64];
4722 4 robfinch
`else
4723 8 robfinch
                d <= fpd[31: 0];
4724 4 robfinch
`endif
4725 8 robfinch
                call (STORE_LWORD,STORE_HEXI2);
4726 4 robfinch
        end
4727 8 robfinch
STORE_HEXI2:
4728
        begin
4729 4 robfinch
`ifdef BIG_ENDIAN
4730 8 robfinch
                d <= fpd[63:32];
4731 4 robfinch
`else
4732 8 robfinch
                d <= fpd[63:32];
4733 4 robfinch
`endif
4734 8 robfinch
                ea <= ea + 4'd4;
4735
                call (STORE_LWORD,STORE_HEXI3);
4736 4 robfinch
        end
4737
STORE_HEXI3:
4738 8 robfinch
        begin
4739 4 robfinch
`ifdef BIG_ENDIAN
4740 8 robfinch
                d <= fpd[31: 0];
4741 4 robfinch
`else
4742 8 robfinch
                d <= fpd[95:32];
4743 4 robfinch
`endif
4744 8 robfinch
                ea <= ea + 4'd4;
4745
                call (STORE_LWORD,STORE_HEXI4);
4746 4 robfinch
        end
4747
STORE_HEXI4:
4748 8 robfinch
        begin
4749
                ea <= ea - 4'd8;
4750 4 robfinch
                ret();
4751
        end
4752 8 robfinch
 
4753 4 robfinch
`endif
4754
 
4755 2 robfinch
STORE_BYTE:
4756
        if (!cyc_o) begin
4757
                if (use_sfc)
4758
                        fc_o <= sfc[2:0];
4759
                else if (use_dfc)
4760
                        fc_o <= dfc[2:0];
4761
                else
4762
                        fc_o <= {sf,2'b01};
4763
                cyc_o <= 1'b1;
4764
                stb_o <= 1'b1;
4765
                we_o <= 1'b1;
4766
                adr_o <= ea;
4767
                case(ea[1:0])
4768
                2'b00:  sel_o <= 4'b0001;
4769
                2'b01:  sel_o <= 4'b0010;
4770
                2'b10:  sel_o <= 4'b0100;
4771
                2'b11:  sel_o <= 4'b1000;
4772
                endcase
4773
//              dat_o <= {4{resB[7:0]}};
4774
                dat_o <= {4{d[7:0]}};
4775
        end
4776
        else if (ack_i) begin
4777
                cyc_o <= 1'b0;
4778
                stb_o <= 1'b0;
4779
                we_o <= 1'b0;
4780
                sel_o <= 4'b0;
4781
                ret();
4782
        end
4783
 
4784
// Store byte and unlock
4785
//
4786
USTORE_BYTE:
4787
        if (!stb_o) begin
4788
                if (use_sfc)
4789
                        fc_o <= sfc[2:0];
4790
                else if (use_dfc)
4791
                        fc_o <= dfc[2:0];
4792
                else
4793
                        fc_o <= {sf,2'b01};
4794
                stb_o <= 1'b1;
4795
                we_o <= 1'b1;
4796
                adr_o <= ea;
4797
                case(ea[1:0])
4798
                2'b00:  sel_o <= 4'b0001;
4799
                2'b01:  sel_o <= 4'b0010;
4800
                2'b10:  sel_o <= 4'b0100;
4801
                2'b11:  sel_o <= 4'b1000;
4802
                endcase
4803
//              dat_o <= {4{resB[7:0]}};
4804
                dat_o <= {4{d[7:0]}};
4805
        end
4806
        else if (ack_i) begin
4807
                lock_o <= 1'b0;
4808
                cyc_o <= 1'b0;
4809
                stb_o <= 1'b0;
4810
                we_o <= 1'b0;
4811
                sel_o <= 2'b00;
4812
                ret();
4813
        end
4814
 
4815
STORE_WORD:
4816
        if (!cyc_o) begin
4817
                if (use_sfc)
4818
                        fc_o <= sfc[2:0];
4819
                else if (use_dfc)
4820
                        fc_o <= dfc[2:0];
4821
                else
4822
                        fc_o <= {sf,2'b01};
4823
                cyc_o <= 1'b1;
4824
                stb_o <= 1'b1;
4825
                we_o <= 1'b1;
4826
                adr_o <= ea;
4827
                sel_o <= ea[1] ? 4'b1100 : 4'b0011;
4828
`ifdef BIG_ENDIAN
4829
//              dat_o <= {2{resW[7:0],resW[15:8]}};
4830
                dat_o <= {2{d[7:0],d[15:8]}};
4831
`else
4832
//              dat_o <= {2{resW[15:0]}};
4833
                dat_o <= {2{d[15:0]}};
4834
`endif
4835
        end
4836
        else if (ack_i) begin
4837
                cyc_o <= 1'b0;
4838
                stb_o <= 1'b0;
4839
                we_o <= 1'b0;
4840
                sel_o <= 2'b00;
4841
                ret();
4842
        end
4843
STORE_LWORD:
4844
        if (!cyc_o) begin
4845
                if (use_sfc)
4846
                        fc_o <= sfc[2:0];
4847
                else if (use_dfc)
4848
                        fc_o <= dfc[2:0];
4849
                else
4850
                        fc_o <= {sf,2'b01};
4851
                cyc_o <= 1'b1;
4852
                stb_o <= 1'b1;
4853
                we_o <= 1'b1;
4854
                adr_o <= ea;
4855
                sel_o <= ea[1] ? 4'b1100 : 4'b1111;
4856
`ifdef BIG_ENDIAN
4857
//              dat_o <= ea[1] ? {resL[23:16],resL[31:24],resL[7:0],resL[15:8]} : rbo(resL);
4858
                dat_o <= ea[1] ? {d[23:16],d[31:24],d[7:0],d[15:8]} : rbo(d);
4859
`else
4860
//              dat_o <= ea[1] ? {resL[15:0],resL[31:16]} : resL;
4861
                dat_o <= ea[1] ? {d[15:0],d[31:16]} : d;
4862
`endif
4863
        end
4864
        else if (ack_i) begin
4865
    if (ea[1]) begin
4866
      stb_o <= 1'b0;
4867
      we_o <= 1'b0;
4868
      sel_o <= 4'b00;
4869
      state <= STORE_LWORDa;
4870
                end
4871
                else begin
4872
            cyc_o <= `LOW;
4873
      stb_o <= 1'b0;
4874
      we_o <= 1'b0;
4875
      sel_o <= 4'b00;
4876
      ret();
4877
                end
4878
        end
4879
STORE_LWORDa:
4880
        if (!stb_o) begin
4881
                stb_o <= 1'b1;
4882
                we_o <= 1'b1;
4883
                adr_o <= adr_o + 32'd2;
4884
                sel_o <= 4'b0011;
4885
        end
4886
        else if (ack_i) begin
4887
                cyc_o <= 1'b0;
4888
                stb_o <= 1'b0;
4889
                we_o <= 1'b0;
4890
                sel_o <= 4'b0000;
4891
                ret();
4892
        end
4893
 
4894
//----------------------------------------------------
4895
//----------------------------------------------------
4896
RESET:
4897
  begin
4898
    pc <= `RESET_VECTOR;
4899
    push(IFETCH);
4900
    goto(TRAP);
4901
        end
4902
 
4903
//----------------------------------------------------
4904
//----------------------------------------------------
4905
TRAP:
4906
  begin
4907
    goto (TRAP3);
4908
    /*
4909
    if (is_nmi)
4910
        vecno <= `NMI_VEC;
4911
    else
4912
    */
4913
    case(1'b1)
4914
    // group 0
4915
    is_rst:
4916
        begin
4917
                is_rst <= 1'b0;
4918
                tf <= 1'b0;
4919
                sf <= 1'b1;
4920
                im <= 3'd7;
4921
                vecno <= `RESET_VEC;
4922
                goto(TRAP6);
4923
        end
4924
    is_adr_err:
4925
        begin
4926
                isr <= srx;
4927
                tf <= 1'b0;
4928
                sf <= 1'b1;
4929
                vecno <= `ADDRERR_VEC;
4930
        goto (TRAP3);
4931
        end
4932
    is_bus_err:
4933
        begin
4934
                isr <= srx;
4935
                tf <= 1'b0;
4936
                sf <= 1'b1;
4937
                vecno <= `BUSERR_VEC;
4938
        goto (TRAP3);
4939
        end
4940
    // group 1
4941
    is_trace:
4942
        begin
4943
                isr <= srx;
4944
                tf <= 1'b0;
4945
                sf <= 1'b1;
4946
                vecno <= `TRACE_VEC;
4947
        goto (TRAP3);
4948
        end
4949
    is_irq:
4950
        begin
4951
                isr <= srx;
4952
                tf <= 1'b0;
4953
                sf <= 1'b1;
4954
        vecno <= `IRQ_VEC + ipl_i;
4955
        im <= ipl_i;
4956
        goto (INTA);
4957
        end
4958
    is_priv:
4959
        begin
4960
                isr <= srx;
4961
                tf <= 1'b0;
4962
                sf <= 1'b1;
4963
                vecno <= `PRIV_VEC;
4964
        goto (TRAP3);
4965
        end
4966
    is_illegal:
4967
        begin
4968
                isr <= srx;
4969
                tf <= 1'b0;
4970
                sf <= 1'b1;
4971
                vecno <= `ILLEGAL_VEC;
4972
        goto (TRAP3);
4973
        end
4974
    default:
4975
        begin
4976
                isr <= srx;
4977
                tf <= 1'b0;
4978
                sf <= 1'b1;
4979
        vecno <= `TRAP_VEC + ir[3:0];
4980
        end
4981
    endcase
4982
  end
4983
INTA:
4984
  if (!cyc_o) begin
4985
        fc_o <= 3'b111;
4986
    cyc_o <= `HIGH;
4987
    stb_o <= `HIGH;
4988
    sel_o <= 4'b1111;
4989
    adr_o <= {28'hFFFFFFF,ipl_i,1'b0};
4990
  end
4991
  else if (ack_i|err_i|vpa_i) begin
4992
    cyc_o <= `LOW;
4993
    stb_o <= `LOW;
4994
    sel_o <= 4'b0;
4995
    if (err_i)
4996
        vecno <= `SPURIOUS_VEC;
4997
    else if (!vpa_i)
4998
        vecno <= iri[7:0];
4999
    goto (TRAP3);
5000
  end
5001
TRAP3:
5002
        begin
5003
                // If was in user mode, capture stack pointer in usp.
5004
                if (!isr[13]) begin
5005
                        usp <= sp;
5006
                        sp <= ssp;
5007
                end
5008
`ifdef SUPPORT_010
5009
                if (is_bus_err | is_adr_err)
5010
                        goto (TRAP20);
5011
                else
5012
                        goto (TRAP3a);
5013
`else
5014
                goto (TRAP3b);
5015
`endif
5016
        end
5017
// First 16 words of internal state are stored
5018
TRAP20:
5019
        begin
5020
                sp <= sp - 6'd32;
5021
                goto (TRAP21);
5022
        end
5023
// Next instruction input buffer.
5024
TRAP21:
5025
        begin
5026
                d <= ir;
5027
                ea <= sp - 4'd2;
5028
                sp <= sp - 4'd2;
5029
                call (STORE_WORD, TRAP22);
5030
        end
5031
TRAP22:
5032
        begin
5033
                d <= dati_buf;
5034
                ea <= sp - 4'd4;
5035
                sp <= sp - 4'd4;
5036
                call (STORE_LWORD, TRAP23);
5037
        end
5038
TRAP23:
5039
        begin
5040
                d <= dato_buf;
5041
                ea <= sp - 4'd4;
5042
                sp <= sp - 4'd4;
5043
                call (STORE_LWORD, TRAP24);
5044
        end
5045
// 1 word Unused
5046
TRAP24:
5047
        begin
5048
                sp <= sp - 4'd2;
5049
                goto (TRAP25);
5050
        end
5051
TRAP25:
5052
        begin
5053
                d <= bad_addr;
5054
                ea <= sp - 4'd4;
5055
                sp <= sp - 4'd4;
5056
                call (STORE_LWORD, TRAP26);
5057
        end
5058
TRAP26:
5059
        begin
5060
                d <= mac_cycle_type;
5061
                ea <= sp - 4'd2;
5062
                sp <= sp - 4'd2;
5063
                s <= sp - 4'd2;
5064
                call (STORE_WORD, TRAP3a);
5065
        end
5066
// For the 68010 and above push the format word.
5067
TRAP3a:
5068
        begin
5069
`ifdef SUPPORT_010
5070
                if (is_bus_err|is_adr_err)
5071
                        d <= {4'b1000,2'b00,vecno,2'b00};
5072
                else
5073
                        d <= {4'b0000,2'b00,vecno,2'b00};
5074
                ea <= sp - 4'd2;
5075
                sp <= sp - 4'd2;
5076
                call (STORE_WORD, TRAP3b);
5077
`else
5078
                goto (TRAP3b);
5079
`endif
5080
        end
5081
// Push the program counter
5082
TRAP3b:
5083
        begin
5084
                d <= pc;
5085
                ea <= sp - 4'd4;
5086
                sp <= sp - 4'd4;
5087
                call (STORE_LWORD, TRAP4);
5088
        end
5089
// And the status register
5090
TRAP4:
5091
        begin
5092
                d <= isr;
5093
                ea <= sp - 4'd2;
5094
                sp <= sp - 4'd2;
5095
                s <= sp - 4'd2;
5096
`ifdef SUPPORT_010
5097
                call (STORE_WORD, TRAP7);
5098
`else
5099
                call (STORE_WORD, is_bus_err|is_adr_err?TRAP8:TRAP7);
5100
`endif
5101
        end
5102
// Push IR
5103
TRAP8:
5104
        begin
5105
                d <= ir;
5106
                ea <= sp - 4'd2;
5107
                sp <= sp - 4'd2;
5108
                is_bus_err <= 1'b0;
5109
                is_adr_err <= 1'b0;
5110
                call (STORE_WORD, TRAP9);
5111
        end
5112
// Push bad address
5113
TRAP9:
5114
        begin
5115
                d <= bad_addr;
5116
                ea <= sp - 4'd4;
5117
                sp <= sp - 4'd4;
5118
                call (STORE_LWORD, TRAP10);
5119
        end
5120
TRAP10:
5121
        begin
5122
                d <= mac_cycle_type;
5123
                ea <= sp - 4'd2;
5124
                sp <= sp - 4'd2;
5125
                s <= sp - 4'd2;
5126
                call (STORE_WORD, TRAP7);
5127
        end
5128
// Load SP from vector table
5129
TRAP6:
5130
        begin
5131
                ea <= 'd0;
5132
                ds <= S;
5133
                call (FETCH_LWORD, TRAP7);
5134
        end
5135
// Load PC from vector table.
5136
TRAP7:
5137
        begin
5138
                sp <= s;
5139
                ssp <= s;
5140
                ea <= {vbr[31:2]+vecno,2'b00};
5141
                ds <= S;
5142
                call (FETCH_LWORD, TRAP7a);
5143
        end
5144
TRAP7a:
5145
        begin
5146
                pc <= s;
5147
                ret();
5148
        end
5149
 
5150
//----------------------------------------------------
5151
//----------------------------------------------------
5152
/*
5153
JMP_VECTOR:
5154
        if (!cyc_o) begin
5155
                fc_o <= {sf,2'b01};
5156
                cyc_o <= 1'b1;
5157
                stb_o <= 1'b1;
5158
                sel_o <= 2'b11;
5159
                adr_o <= vector;
5160
        end
5161
        else if (ack_i) begin
5162
                stb_o <= 1'b0;
5163
                sel_o <= 2'b00;
5164
                pc[15:0] <= dat_i;
5165
                state <= JMP_VECTOR2;
5166
        end
5167
JMP_VECTOR2:
5168
        if (!stb_o) begin
5169
                fc_o <= {sf,2'b01};
5170
                cyc_o <= 1'b1;
5171
                stb_o <= 1'b1;
5172
                sel_o <= 2'b11;
5173
                adr_o <= adr_o + 32'd2;
5174
        end
5175
        else if (ack_i) begin
5176
                cyc_o <= 1'b0;
5177
                stb_o <= 1'b0;
5178
                sel_o <= 2'b00;
5179
                pc[31:16] <= dat_i;
5180
                state <= IFETCH;
5181
        end
5182
*/
5183
//----------------------------------------------------
5184
//----------------------------------------------------
5185
UNLNK:
5186
        begin
5187
                ds <= S;
5188
                ea <= sp;
5189
                sp <= sp + 4'd4;
5190
                call (FETCH_LWORD,UNLNK2);
5191
        end
5192
UNLNK2:
5193
        begin
5194
                rfwrL <= 1'b1;
5195
                Rt <= {1'b1,rrr};
5196
                resL <= s;
5197
                ret();
5198
        end
5199
 
5200
//----------------------------------------------------
5201
// JMP / JSR / BSR
5202
//----------------------------------------------------
5203
 
5204
JMP:
5205
        begin
5206
                pc <= ea;
5207
                ret();
5208
        end
5209
JSR:
5210
        begin
5211
                ea <= sp - 4'd4;
5212
                sp <= sp - 4'd4;
5213
                d <= pc;
5214
                pc <= ea;
5215
                goto (STORE_LWORD);
5216
        end
5217
/*
5218
        if (!cyc_o) begin
5219
                fc_o <= {sf,2'b01};
5220
                cyc_o <= 1'b1;
5221
                stb_o <= 1'b1;
5222
                we_o <= 1'b1;
5223
                sel_o <= 4'b1111;
5224
                adr_o <= sp - 32'd4;
5225
`ifdef BIG_ENDIAN
5226
                dat_o <= rbo(pc);
5227
`else
5228
                dat_o <= pc;
5229
`endif
5230
        end
5231
        else if (ack_i) begin
5232
                cyc_o <= 1'b0;
5233
                stb_o <= 1'b0;
5234
                we_o <= 1'b0;
5235
                sel_o <= 4'b00;
5236
                sp <= sp - 32'd4;
5237
                pc <= d;
5238
`ifdef SUPPORT_TASK
5239
`ifdef BIG_ENDIAN
5240
                if (d[24]) begin
5241
                        otr <= tr;
5242
                        tr <= d[29:25];
5243
        reg_copy_mask <= {d[7:0],d[15:8],d[16]};
5244
                        goto (THREAD2);
5245
    end
5246
                else
5247
                        ret();
5248
`else
5249
                if (d[0]) begin
5250
                        otr <= tr;
5251
                        tr <= d[5:1];
5252
                        reg_copy_mask <= d[31:16];
5253
                        goto (THREAD2);
5254
                end
5255
                else
5256
                        ret();
5257
`endif
5258
`else
5259
                ret();
5260
`endif
5261
        end
5262
*/
5263
 
5264
//----------------------------------------------------
5265
// RTE / RTR
5266
// Return from exception
5267
//----------------------------------------------------
5268
 
5269
RTE1:
5270
        begin
5271
                ds <= S;
5272
                ea <= sp;
5273
                sp <= sp + 4'd2;
5274
                call (FETCH_WORD,RTE2);
5275
        end
5276
RTE2:
5277
        begin
5278
                ds <= S;
5279
                ea <= sp;
5280
                sp <= sp + 4'd4;
5281
                cf <= s[0];
5282
                vf <= s[1];
5283
                zf <= s[2];
5284
                nf <= s[3];
5285
                xf <= s[4];
5286
                ccr57 <= s[7:5];
5287
                if (!rtr) begin
5288
                        im[0] <= s[8];
5289
                        im[1] <= s[9];
5290
                        im[2] <= s[10];
5291
                        sr1112 <= s[12:11];
5292
                        sf <= s[13];
5293
                        sr14 <= s[14];
5294
                        tf <= s[15];
5295
                        //pl <= s[31:24];
5296
                end
5297
                call (FETCH_LWORD,RTE3);
5298
        end
5299
RTE3:
5300
        begin
5301
                pc <= s;
5302
`ifdef SUPPORT_010
5303
                ea <= sp;
5304
                sp <= sp + 4'd2;
5305
                if (!rtr)
5306
                        call (FETCH_WORD,RTE4);
5307
                else
5308
                        ret();
5309
`else
5310
                if (!rtr && !sf) begin
5311
                        ssp <= sp;
5312
                        sp <= usp;
5313
                end
5314
                ret();
5315
`endif
5316
        end
5317
// The core might have been in supervisor mode already when the exception
5318
// occurred. Reset the working stack pointer accordingly.
5319
`ifdef SUPPORT_010
5320
RTE4:
5321
        begin
5322
                if (s[15:12]==4'b1000) begin
5323
                        ea <= sp;
5324
                        sp <= sp + 4'd2;
5325
                        call(FETCH_WORD,RTE5);
5326
                end
5327
                else begin
5328
                        if (!sf) begin
5329
                                ssp <= sp;
5330
                                sp <= usp;      // switch back to user stack
5331
                        end
5332
                        ret();
5333
                end
5334
        end
5335
RTE5:
5336
        begin
5337
                mac_cycle_type <= s;
5338
                ea <= sp;
5339
                sp <= sp + 4'd4;
5340
                call(FETCH_LWORD,RTE6);
5341
        end
5342
RTE6:
5343
        begin
5344
                bad_addr <= s;
5345
                ea <= sp;
5346
                sp <= sp + 4'd2;
5347
                call(FETCH_WORD,RTE7);
5348
        end
5349
RTE7:
5350
        begin
5351
                ea <= sp;
5352
                sp <= sp + 4'd4;
5353
                call(FETCH_LWORD,RTE8);
5354
        end
5355
RTE8:
5356
        begin
5357
                dato_buf <= s;
5358
                ea <= sp;
5359
                sp <= sp + 4'd4;
5360
                call(FETCH_LWORD,RTE9);
5361
        end
5362
RTE9:
5363
        begin
5364
                dati_buf <= s;
5365
                ea <= sp;
5366
                sp <= sp + 4'd2;
5367
                call(FETCH_WORD,RTE10);
5368
        end
5369
RTE10:
5370
        begin
5371
                ea <= sp;
5372
                sp <= sp + 6'd32;
5373
                goto (RTE11);
5374
        end
5375
RTE11:
5376
        begin
5377
                if (!sf) begin
5378
                        ssp <= sp;
5379
                        sp <= usp;      // switch back to user stack
5380
                end
5381
                ret();
5382
        end
5383
`endif
5384
 
5385
//----------------------------------------------------
5386
// Return from subroutine.
5387
//----------------------------------------------------
5388
 
5389
RTS1:
5390
        begin
5391
                pc <= s;
5392
                ret();
5393
        end
5394
 
5395
//----------------------------------------------------
5396
MOVEM_Xn2D:
5397
`ifdef OPT_PERF
5398
        if (imm[15:0]!=16'h0000) begin
5399
                push(MOVEM_Xn2D2);
5400 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
5401 2 robfinch
        end
5402
        else
5403 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
5404 2 robfinch
`else
5405
        begin
5406
                push(MOVEM_Xn2D2);
5407 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
5408 2 robfinch
        end
5409
`endif
5410
MOVEM_Xn2D2:
5411
        begin
5412
                if (imm[15:0]!=16'h0000)
5413
                        state <= MOVEM_Xn2D3;
5414
                else begin
5415
                        case(mmm)
5416
                        3'b100: // -(An)
5417
                                begin
5418
                                        Rt <= {1'b1,rrr};
5419 8 robfinch
                                        resL <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5420 2 robfinch
                                        rfwrL <= 1'b1;
5421
                                end
5422
                        endcase
5423
                        ret();
5424
                end
5425
                if (mmm!=3'b100) begin
5426
                        if (imm[0]) begin
5427
                                imm[0] <= 1'b0;
5428
                                rrrr <= 4'd0;
5429 8 robfinch
                                FLTSRC <= 3'd7;
5430 2 robfinch
                        end
5431
                        else if (imm[1]) begin
5432
                                imm[1] <= 1'b0;
5433
                                rrrr <= 4'd1;
5434 8 robfinch
                                FLTSRC <= 3'd6;
5435 2 robfinch
                        end
5436
                        else if (imm[2]) begin
5437
                                imm[2] <= 1'b0;
5438
                                rrrr <= 4'd2;
5439 8 robfinch
                                FLTSRC <= 3'd5;
5440 2 robfinch
                        end
5441
                        else if (imm[3]) begin
5442
                                imm[3] <= 1'b0;
5443
                                rrrr <= 4'd3;
5444 8 robfinch
                                FLTSRC <= 3'd4;
5445 2 robfinch
                        end
5446
                        else if (imm[4]) begin
5447
                                imm[4] <= 1'b0;
5448
                                rrrr <= 4'd4;
5449 8 robfinch
                                FLTSRC <= 3'd3;
5450 2 robfinch
                        end
5451
                        else if (imm[5]) begin
5452
                                imm[5] <= 1'b0;
5453
                                rrrr <= 4'd5;
5454 8 robfinch
                                FLTSRC <= 3'd2;
5455 2 robfinch
                        end
5456
                        else if (imm[6]) begin
5457
                                imm[6] <= 1'b0;
5458
                                rrrr <= 4'd6;
5459 8 robfinch
                                FLTSRC <= 3'd1;
5460 2 robfinch
                        end
5461
                        else if (imm[7]) begin
5462
                                imm[7] <= 1'b0;
5463
                                rrrr <= 4'd7;
5464 8 robfinch
                                FLTSRC <= 3'd0;
5465 2 robfinch
                        end
5466
                        else if (imm[8]) begin
5467
                                imm[8] <= 1'b0;
5468
                                rrrr <= 4'd8;
5469
                        end
5470
                        else if (imm[9]) begin
5471
                                imm[9] <= 1'b0;
5472
                                rrrr <= 4'd9;
5473
                        end
5474
                        else if (imm[10]) begin
5475
                                imm[10] <= 1'b0;
5476
                                rrrr <= 4'd10;
5477
                        end
5478
                        else if (imm[11]) begin
5479
                                imm[11] <= 1'b0;
5480
                                rrrr <= 4'd11;
5481
                        end
5482
                        else if (imm[12]) begin
5483
                                imm[12] <= 1'b0;
5484
                                rrrr <= 4'd12;
5485
                        end
5486
                        else if (imm[13]) begin
5487
                                imm[13] <= 1'b0;
5488
                                rrrr <= 4'd13;
5489
                        end
5490
                        else if (imm[14]) begin
5491
                                imm[14] <= 1'b0;
5492
                                rrrr <= 4'd14;
5493
                        end
5494
                        else if (imm[15]) begin
5495
                                imm[15] <= 1'b0;
5496
                                rrrr <= 4'd15;
5497
                        end
5498
                end
5499
                else begin
5500
                        if (imm[0]) begin
5501
                                imm[0] <= 1'b0;
5502
                                rrrr <= 4'd15;
5503 8 robfinch
                                FLTSRC <= 3'd0;
5504 2 robfinch
                        end
5505
                        else if (imm[1]) begin
5506
                                imm[1] <= 1'b0;
5507
                                rrrr <= 4'd14;
5508 8 robfinch
                                FLTSRC <= 3'd1;
5509 2 robfinch
                        end
5510
                        else if (imm[2]) begin
5511
                                imm[2] <= 1'b0;
5512
                                rrrr <= 4'd13;
5513 8 robfinch
                                FLTSRC <= 3'd2;
5514 2 robfinch
                        end
5515
                        else if (imm[3]) begin
5516
                                imm[3] <= 1'b0;
5517
                                rrrr <= 4'd12;
5518 8 robfinch
                                FLTSRC <= 3'd3;
5519 2 robfinch
                        end
5520
                        else if (imm[4]) begin
5521
                                imm[4] <= 1'b0;
5522
                                rrrr <= 4'd11;
5523 8 robfinch
                                FLTSRC <= 3'd4;
5524 2 robfinch
                        end
5525
                        else if (imm[5]) begin
5526
                                imm[5] <= 1'b0;
5527
                                rrrr <= 4'd10;
5528 8 robfinch
                                FLTSRC <= 3'd5;
5529 2 robfinch
                        end
5530
                        else if (imm[6]) begin
5531
                                imm[6] <= 1'b0;
5532
                                rrrr <= 4'd9;
5533 8 robfinch
                                FLTSRC <= 3'd6;
5534 2 robfinch
                        end
5535
                        else if (imm[7]) begin
5536
                                imm[7] <= 1'b0;
5537
                                rrrr <= 4'd8;
5538 8 robfinch
                                FLTSRC <= 3'd7;
5539 2 robfinch
                        end
5540
                        else if (imm[8]) begin
5541
                                imm[8] <= 1'b0;
5542
                                rrrr <= 4'd7;
5543
                        end
5544
                        else if (imm[9]) begin
5545
                                imm[9] <= 1'b0;
5546
                                rrrr <= 4'd6;
5547
                        end
5548
                        else if (imm[10]) begin
5549
                                imm[10] <= 1'b0;
5550
                                rrrr <= 4'd5;
5551
                        end
5552
                        else if (imm[11]) begin
5553
                                imm[11] <= 1'b0;
5554
                                rrrr <= 4'd4;
5555
                        end
5556
                        else if (imm[12]) begin
5557
                                imm[12] <= 1'b0;
5558
                                rrrr <= 4'd3;
5559
                        end
5560
                        else if (imm[13]) begin
5561
                                imm[13] <= 1'b0;
5562
                                rrrr <= 4'd2;
5563
                        end
5564
                        else if (imm[14]) begin
5565
                                imm[14] <= 1'b0;
5566
                                rrrr <= 4'd1;
5567
                        end
5568
                        else if (imm[15]) begin
5569
                                imm[15] <= 1'b0;
5570
                                rrrr <= 4'd0;
5571
                        end
5572
                end
5573
        end
5574
MOVEM_Xn2D3:
5575
        begin
5576
                resL <= rfoRnn;
5577
                resW <= rfoRnn[15:0];
5578 8 robfinch
                if (fmovem)
5579
                        fpd <= rfoFpsrc;
5580
                else
5581
                        d <= rfoRnn;
5582 2 robfinch
                ds <= D;
5583 8 robfinch
                call(fmovem ? STORE_HEXI1 : ir[6] ? STORE_LWORD : STORE_WORD,MOVEM_Xn2D4);
5584 2 robfinch
        end
5585
MOVEM_Xn2D4:
5586
        begin
5587
                case(mmm)
5588 8 robfinch
                // ea is updated by STORE_HEXI1, incremented by 8
5589
                3'b011: ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5590
                3'b100: ea <= ea - (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5591 2 robfinch
                default:
5592 8 robfinch
                        ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5593 2 robfinch
                endcase
5594
                if (imm[15:0]!=16'h0000)
5595
                        state <= MOVEM_Xn2D3;
5596
                else begin
5597
                        case(mmm)
5598
                        3'b011:
5599
                                begin
5600
                                        Rt <= {1'b1,rrr};
5601 8 robfinch
                                        resL <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5602 2 robfinch
                                        rfwrL <= 1'b1;
5603
                                end
5604
                        3'b100:
5605
                                begin
5606
                                        Rt <= {1'b1,rrr};
5607
                                        resL <= ea;
5608
                                        rfwrL <= 1'b1;
5609
                                end
5610
                        endcase
5611
                        ret();
5612
                end
5613
                if (mmm!=3'b100) begin
5614
                        if (imm[0]) begin
5615
                                imm[0] <= 1'b0;
5616
                                rrrr <= 4'd0;
5617 8 robfinch
                                FLTSRC <= 3'd7;
5618 2 robfinch
                        end
5619
                        else if (imm[1]) begin
5620
                                imm[1] <= 1'b0;
5621
                                rrrr <= 4'd1;
5622 8 robfinch
                                FLTSRC <= 3'd6;
5623 2 robfinch
                        end
5624
                        else if (imm[2]) begin
5625
                                imm[2] <= 1'b0;
5626
                                rrrr <= 4'd2;
5627 8 robfinch
                                FLTSRC <= 3'd5;
5628 2 robfinch
                        end
5629
                        else if (imm[3]) begin
5630
                                imm[3] <= 1'b0;
5631
                                rrrr <= 4'd3;
5632 8 robfinch
                                FLTSRC <= 3'd4;
5633 2 robfinch
                        end
5634
                        else if (imm[4]) begin
5635
                                imm[4] <= 1'b0;
5636
                                rrrr <= 4'd4;
5637 8 robfinch
                                FLTSRC <= 3'd3;
5638 2 robfinch
                        end
5639
                        else if (imm[5]) begin
5640
                                imm[5] <= 1'b0;
5641
                                rrrr <= 4'd5;
5642 8 robfinch
                                FLTSRC <= 3'd2;
5643 2 robfinch
                        end
5644
                        else if (imm[6]) begin
5645
                                imm[6] <= 1'b0;
5646
                                rrrr <= 4'd6;
5647 8 robfinch
                                FLTSRC <= 3'd1;
5648 2 robfinch
                        end
5649
                        else if (imm[7]) begin
5650
                                imm[7] <= 1'b0;
5651
                                rrrr <= 4'd7;
5652 8 robfinch
                                FLTSRC <= 3'd0;
5653 2 robfinch
                        end
5654
                        else if (imm[8]) begin
5655
                                imm[8] <= 1'b0;
5656
                                rrrr <= 4'd8;
5657
                        end
5658
                        else if (imm[9]) begin
5659
                                imm[9] <= 1'b0;
5660
                                rrrr <= 4'd9;
5661
                        end
5662
                        else if (imm[10]) begin
5663
                                imm[10] <= 1'b0;
5664
                                rrrr <= 4'd10;
5665
                        end
5666
                        else if (imm[11]) begin
5667
                                imm[11] <= 1'b0;
5668
                                rrrr <= 4'd11;
5669
                        end
5670
                        else if (imm[12]) begin
5671
                                imm[12] <= 1'b0;
5672
                                rrrr <= 4'd12;
5673
                        end
5674
                        else if (imm[13]) begin
5675
                                imm[13] <= 1'b0;
5676
                                rrrr <= 4'd13;
5677
                        end
5678
                        else if (imm[14]) begin
5679
                                imm[14] <= 1'b0;
5680
                                rrrr <= 4'd14;
5681
                        end
5682
                        else if (imm[15]) begin
5683
                                imm[15] <= 1'b0;
5684
                                rrrr <= 4'd15;
5685
                        end
5686
                end
5687
                else begin
5688
                        if (imm[0]) begin
5689
                                imm[0] <= 1'b0;
5690
                                rrrr <= 4'd15;
5691 8 robfinch
                                FLTSRC <= 3'd0;
5692 2 robfinch
                        end
5693
                        else if (imm[1]) begin
5694
                                imm[1] <= 1'b0;
5695
                                rrrr <= 4'd14;
5696 8 robfinch
                                FLTSRC <= 3'd1;
5697 2 robfinch
                        end
5698
                        else if (imm[2]) begin
5699
                                imm[2] <= 1'b0;
5700
                                rrrr <= 4'd13;
5701 8 robfinch
                                FLTSRC <= 3'd2;
5702 2 robfinch
                        end
5703
                        else if (imm[3]) begin
5704
                                imm[3] <= 1'b0;
5705
                                rrrr <= 4'd12;
5706 8 robfinch
                                FLTSRC <= 3'd3;
5707 2 robfinch
                        end
5708
                        else if (imm[4]) begin
5709
                                imm[4] <= 1'b0;
5710
                                rrrr <= 4'd11;
5711 8 robfinch
                                FLTSRC <= 3'd4;
5712 2 robfinch
                        end
5713
                        else if (imm[5]) begin
5714
                                imm[5] <= 1'b0;
5715
                                rrrr <= 4'd10;
5716 8 robfinch
                                FLTSRC <= 3'd5;
5717 2 robfinch
                        end
5718
                        else if (imm[6]) begin
5719
                                imm[6] <= 1'b0;
5720
                                rrrr <= 4'd9;
5721 8 robfinch
                                FLTSRC <= 3'd6;
5722 2 robfinch
                        end
5723
                        else if (imm[7]) begin
5724
                                imm[7] <= 1'b0;
5725
                                rrrr <= 4'd8;
5726 8 robfinch
                                FLTSRC <= 3'd7;
5727 2 robfinch
                        end
5728
                        else if (imm[8]) begin
5729
                                imm[8] <= 1'b0;
5730
                                rrrr <= 4'd7;
5731
                        end
5732
                        else if (imm[9]) begin
5733
                                imm[9] <= 1'b0;
5734
                                rrrr <= 4'd6;
5735
                        end
5736
                        else if (imm[10]) begin
5737
                                imm[10] <= 1'b0;
5738
                                rrrr <= 4'd5;
5739
                        end
5740
                        else if (imm[11]) begin
5741
                                imm[11] <= 1'b0;
5742
                                rrrr <= 4'd4;
5743
                        end
5744
                        else if (imm[12]) begin
5745
                                imm[12] <= 1'b0;
5746
                                rrrr <= 4'd3;
5747
                        end
5748
                        else if (imm[13]) begin
5749
                                imm[13] <= 1'b0;
5750
                                rrrr <= 4'd2;
5751
                        end
5752
                        else if (imm[14]) begin
5753
                                imm[14] <= 1'b0;
5754
                                rrrr <= 4'd1;
5755
                        end
5756
                        else if (imm[15]) begin
5757
                                imm[15] <= 1'b0;
5758
                                rrrr <= 4'd0;
5759
                        end
5760
                end
5761
        end
5762
 
5763
//----------------------------------------------------
5764
MOVEM_s2Xn:
5765
`ifdef OPT_PERF
5766
        if (imm[15:0]!=16'h0000) begin
5767
                push(MOVEM_s2Xn2);
5768 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
5769 2 robfinch
        end
5770
        else
5771 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
5772 2 robfinch
`else
5773
        begin
5774
                push(MOVEM_s2Xn2);
5775 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
5776 2 robfinch
        end
5777
`endif
5778
MOVEM_s2Xn2:
5779
        if (imm[15:0] != 16'h0000) begin
5780
                ds <= S;
5781 8 robfinch
                call(fmovem ? FETCH_HEXI1 : ir[6] ? FETCH_LWORD : FETCH_WORD,MOVEM_s2Xn3);
5782 2 robfinch
        end
5783
        else begin
5784
                case(mmm)
5785
                3'b011: // (An)+
5786
                        begin
5787
                                Rt <= {1'b1,rrr};
5788
                                resL <= ea;
5789
                                rfwrL <= 1'b1;
5790
                        end
5791
                3'b100: // -(An)
5792
                        begin
5793
                                Rt <= {1'b1,rrr};
5794 8 robfinch
                                resL <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5795 2 robfinch
                                rfwrL <= 1'b1;
5796
                        end
5797
                endcase
5798
                ret();
5799
        end
5800
MOVEM_s2Xn3:
5801
        begin
5802
                case(mmm)
5803 8 robfinch
                3'b011: ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5804
                3'b100: ea <= ea - (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5805 2 robfinch
                default:
5806 8 robfinch
                        ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5807 2 robfinch
                endcase
5808
                goto (MOVEM_s2Xn2);
5809
                // Another bizzare gotcha. Word values moved to a data register are sign
5810
                // extended to long-word width.
5811
                rfwrL <= 1'b1;
5812
                if (ir[6])
5813
                        resL <= s;
5814
                else
5815
                        resL <= {{16{s[15]}},s[15:0]};
5816 8 robfinch
                resF <= fps;
5817 2 robfinch
                if (mmm!=3'b100) begin
5818
                        if (imm[0]) begin
5819
                                imm[0] <= 1'b0;
5820 8 robfinch
                                Rt <= 4'd0 ^ {3{fmovem}};
5821 2 robfinch
                        end
5822
                        else if (imm[1]) begin
5823
                                imm[1] <= 1'b0;
5824 8 robfinch
                                Rt <= 4'd1 ^ {3{fmovem}};
5825 2 robfinch
                        end
5826
                        else if (imm[2]) begin
5827
                                imm[2] <= 1'b0;
5828 8 robfinch
                                Rt <= 4'd2 ^ {3{fmovem}};
5829 2 robfinch
                        end
5830
                        else if (imm[3]) begin
5831
                                imm[3] <= 1'b0;
5832 8 robfinch
                                Rt <= 4'd3 ^ {3{fmovem}};
5833 2 robfinch
                        end
5834
                        else if (imm[4]) begin
5835
                                imm[4] <= 1'b0;
5836 8 robfinch
                                Rt <= 4'd4 ^ {3{fmovem}};
5837 2 robfinch
                        end
5838
                        else if (imm[5]) begin
5839
                                imm[5] <= 1'b0;
5840 8 robfinch
                                Rt <= 4'd5 ^ {3{fmovem}};
5841 2 robfinch
                        end
5842
                        else if (imm[6]) begin
5843
                                imm[6] <= 1'b0;
5844 8 robfinch
                                Rt <= 4'd6 ^ {3{fmovem}};
5845 2 robfinch
                        end
5846
                        else if (imm[7]) begin
5847
                                imm[7] <= 1'b0;
5848 8 robfinch
                                Rt <= 4'd7 ^ {3{fmovem}};
5849 2 robfinch
                        end
5850
                        else if (imm[8]) begin
5851
                                imm[8] <= 1'b0;
5852
                                Rt <= 4'd8;
5853
                        end
5854
                        else if (imm[9]) begin
5855
                                imm[9] <= 1'b0;
5856
                                Rt <= 4'd9;
5857
                        end
5858
                        else if (imm[10]) begin
5859
                                imm[10] <= 1'b0;
5860
                                Rt <= 4'd10;
5861
                        end
5862
                        else if (imm[11]) begin
5863
                                imm[11] <= 1'b0;
5864
                                Rt <= 4'd11;
5865
                        end
5866
                        else if (imm[12]) begin
5867
                                imm[12] <= 1'b0;
5868
                                Rt <= 4'd12;
5869
                        end
5870
                        else if (imm[13]) begin
5871
                                imm[13] <= 1'b0;
5872
                                Rt <= 4'd13;
5873
                        end
5874
                        else if (imm[14]) begin
5875
                                imm[14] <= 1'b0;
5876
                                Rt <= 4'd14;
5877
                        end
5878
                        else if (imm[15]) begin
5879
                                imm[15] <= 1'b0;
5880
                                Rt <= 4'd15;
5881
                        end
5882
                end
5883
                else begin
5884
                        if (imm[0]) begin
5885
                                imm[0] <= 1'b0;
5886 8 robfinch
                                Rt <= 4'd15 ^ {4{fmovem}};
5887 2 robfinch
                        end
5888
                        else if (imm[1]) begin
5889
                                imm[1] <= 1'b0;
5890 8 robfinch
                                Rt <= 4'd14 ^ {4{fmovem}};
5891 2 robfinch
                        end
5892
                        else if (imm[2]) begin
5893
                                imm[2] <= 1'b0;
5894 8 robfinch
                                Rt <= 4'd13 ^ {4{fmovem}};
5895 2 robfinch
                        end
5896
                        else if (imm[3]) begin
5897
                                imm[3] <= 1'b0;
5898 8 robfinch
                                Rt <= 4'd12 ^ {4{fmovem}};
5899 2 robfinch
                        end
5900
                        else if (imm[4]) begin
5901
                                imm[4] <= 1'b0;
5902 8 robfinch
                                Rt <= 4'd11 ^ {4{fmovem}};
5903 2 robfinch
                        end
5904
                        else if (imm[5]) begin
5905
                                imm[5] <= 1'b0;
5906 8 robfinch
                                Rt <= 4'd10 ^ {4{fmovem}};
5907 2 robfinch
                        end
5908
                        else if (imm[6]) begin
5909
                                imm[6] <= 1'b0;
5910 8 robfinch
                                Rt <= 4'd9 ^ {4{fmovem}};
5911 2 robfinch
                        end
5912
                        else if (imm[7]) begin
5913
                                imm[7] <= 1'b0;
5914 8 robfinch
                                Rt <= 4'd8 ^ {4{fmovem}};
5915 2 robfinch
                        end
5916
                        else if (imm[8]) begin
5917
                                imm[8] <= 1'b0;
5918
                                Rt <= 4'd7;
5919
                        end
5920
                        else if (imm[9]) begin
5921
                                imm[9] <= 1'b0;
5922
                                Rt <= 4'd6;
5923
                        end
5924
                        else if (imm[10]) begin
5925
                                imm[10] <= 1'b0;
5926
                                Rt <= 4'd5;
5927
                        end
5928
                        else if (imm[11]) begin
5929
                                imm[11] <= 1'b0;
5930
                                Rt <= 4'd4;
5931
                        end
5932
                        else if (imm[12]) begin
5933
                                imm[12] <= 1'b0;
5934
                                Rt <= 4'd3;
5935
                        end
5936
                        else if (imm[13]) begin
5937
                                imm[13] <= 1'b0;
5938
                                Rt <= 4'd2;
5939
                        end
5940
                        else if (imm[14]) begin
5941
                                imm[14] <= 1'b0;
5942
                                Rt <= 4'd1;
5943
                        end
5944
                        else if (imm[15]) begin
5945
                                imm[15] <= 1'b0;
5946
                                Rt <= 4'd0;
5947
                        end
5948
                end
5949
        end
5950
//----------------------------------------------------
5951
RETSTATE:
5952
        ret();
5953
 
5954
//------------------------------------------------------------------------------
5955
//------------------------------------------------------------------------------
5956
MOVEP:
5957
        if (!cyc_o) begin
5958
                cyc_o <= `HIGH;
5959
                stb_o <= `HIGH;
5960
                we_o <= ir[7];
5961
                casez({ir[7],ea[1:0]})
5962
                3'b0??: sel_o <= 4'b1111;
5963
                3'b100: sel_o <= 4'b0001;
5964
                3'b101: sel_o <= 4'b0010;
5965
                3'b110: sel_o <= 4'b0100;
5966
                3'b111: sel_o <= 4'b1000;
5967
                endcase
5968
                adr_o <= ea;
5969
                if (ir[6])
5970
                        dat_o <= {4{rfoDn[31:24]}};
5971
                else
5972
                        dat_o <= {4{rfoDn[15:8]}};
5973
        end
5974
        else if (ack_i) begin
5975
                stb_o <= `LOW;
5976
                if (ir[6])
5977
                        resL[31:24] <= dat_i >> {ea[1:0],3'b0};
5978
                else
5979
                        resW[15:8] <= dat_i >> {ea[1:0],3'b0};
5980
                goto (MOVEP1);
5981
        end
5982
MOVEP1:
5983
        if (!stb_o) begin
5984
                stb_o <= `HIGH;
5985
                we_o <= ir[7];
5986
                casez({ir[7],~ea[1],ea[0]})
5987
                3'b0??: sel_o <= 4'b1111;
5988
                3'b100: sel_o <= 4'b0001;
5989
                3'b101: sel_o <= 4'b0010;
5990
                3'b110: sel_o <= 4'b0100;
5991
                3'b111: sel_o <= 4'b1000;
5992
                endcase
5993
                adr_o <= ea + 4'd2;
5994
                if (ir[6])
5995
                        dat_o <= {4{rfoDn[23:16]}};
5996
                else
5997
                        dat_o <= {4{rfoDn[7:0]}};
5998
        end
5999
        else if (ack_i) begin
6000
                stb_o <= `LOW;
6001
                if (ir[6])
6002
                        resL[23:16] <= dat_i >> {ea[1:0]+4'd2,3'b0};
6003
                else
6004
                        resW[7:0] <= dat_i >> {ea[1:0]+4'd2,3'b0};
6005
                Rt <= {1'b0,DDD};
6006
                if (ir[6])
6007
                        goto (MOVEP2);
6008
                else begin
6009
                        cyc_o <= `LOW;
6010
                        we_o <= `LOW;
6011
                        sel_o <= 4'h0;
6012
                        rfwrW <= ~ir[7];
6013
                        ret();
6014
                end
6015
        end
6016
MOVEP2:
6017
        if (!stb_o) begin
6018
                stb_o <= `HIGH;
6019
                we_o <= ir[7];
6020
                casez({ir[7],ea[1:0]})
6021
                3'b0??: sel_o <= 4'b1111;
6022
                3'b100: sel_o <= 4'b0001;
6023
                3'b101: sel_o <= 4'b0010;
6024
                3'b110: sel_o <= 4'b0100;
6025
                3'b111: sel_o <= 4'b1000;
6026
                endcase
6027
                adr_o <= ea + 4'd4;
6028
                dat_o <= {4{rfoDn[15:8]}};
6029
        end
6030
        else if (ack_i) begin
6031
                stb_o <= `LOW;
6032
                resL[15:8] <= dat_i >> {ea[1:0],3'b0};
6033
                goto (MOVEP3);
6034
        end
6035
MOVEP3:
6036
        if (!stb_o) begin
6037
                stb_o <= `HIGH;
6038
                we_o <= ir[7];
6039
                casez({ir[7],~ea[1],ea[0]})
6040
                3'b0??: sel_o <= 4'b1111;
6041
                3'b100: sel_o <= 4'b0001;
6042
                3'b101: sel_o <= 4'b0010;
6043
                3'b110: sel_o <= 4'b0100;
6044
                3'b111: sel_o <= 4'b1000;
6045
                endcase
6046
                adr_o <= ea + 4'd6;
6047
                dat_o <= {4{rfoDn[7:0]}};
6048
        end
6049
        else if (ack_i) begin
6050
                cyc_o <= `LOW;
6051
                stb_o <= `LOW;
6052
                we_o <= `LOW;
6053
                sel_o <= 4'h0;
6054
                resL[7:0] <= dat_i >> {ea[1:0]+4'd2,3'b0};
6055
                Rt <= {1'b0,DDD};
6056
                rfwrL <= ~ir[7];
6057
                ret();
6058
        end
6059
 
6060
 
6061
FSDATA2:
6062
        fs_data2(mmmx,rrrx,sz_state,dsix);
6063
 
6064
// On a retry, wait some random number of cycle before retrying the bus
6065
// operation.
6066
`ifdef SUPPORT_RETRY
6067
RETRY:
6068
        begin
6069
                cnt <= {lfsr_o[3:0] + 4'd8};
6070
                goto (RETRY2);
6071
        end
6072
RETRY2:
6073
        begin
6074
                cnt <= cnt - 2'd1;
6075
                if (cnt=='d0)
6076
                        goto (rstate);
6077
        end
6078
`endif
6079
 
6080
MOVERn2Rc:
6081
        begin
6082
                rrrr <= imm[15:12];
6083
                goto (MOVERn2Rc2);
6084
        end
6085
MOVERn2Rc2:
6086
        case(imm[11:0])
6087
        12'h000:        begin sfc <= rfoRnn; ret(); end
6088
        12'h001:        begin dfc <= rfoRnn; ret(); end
6089 3 robfinch
        12'h003:  begin asid <= rfoRnn[7:0]; ret(); end
6090
        12'h010:  begin apc <= rfoRnn; ret(); end
6091
        12'h011:  begin cpl <= rfoRnn[7:0]; ret(); end
6092
        12'h012:  begin tr <= rfoRnn; ret(); end
6093
        12'h013:  begin tcba <= rfoRnn; ret(); end
6094
        12'h014:        begin mmus <= rfoRnn; ret(); end
6095
        12'h015:        begin ios <= rfoRnn; ret(); end
6096
        12'h016:        begin iops <= rfoRnn; ret(); end
6097 8 robfinch
        12'h020:        begin canary <= rfoRnn; ret(); end
6098 2 robfinch
        12'h800:        begin usp <= rfoRnn; ret(); end
6099
        12'h801:        begin vbr <= rfoRnn; ret(); end
6100
/*
6101
        12'hFE1:
6102
                begin
6103
                        cf <= rfoRnn[0];
6104
                        vf <= rfoRnn[1];
6105
                        zf <= rfoRnn[2];
6106
                        nf <= rfoRnn[3];
6107
                        xf <= rfoRnn[4];
6108
                        ccr57 <= rfoRnn[7:5];
6109
                        if (!rtr) begin
6110
                                im[0] <= rfoRnn[8];
6111
                                im[1] <= rfoRnn[9];
6112
                                im[2] <= rfoRnn[10];
6113
                                sr1112 <= rfoRnn[12:11];
6114
                                sf <= rfoRnn[13];
6115
                                sr14 <= rfoRnn[14];
6116
                                tf <= rfoRnn[15];
6117
                                //pl <= rfoRnn[31:24];
6118
                        end
6119
//                      tr <= rfoRnn[23:16];
6120
//                      pl <= rfoRnn[31:24];
6121
                end
6122
*/
6123
        default:        tIllegal();
6124
        endcase
6125
MOVERc2Rn:
6126
        case(imm[11:0])
6127
        12'h000:        begin resL <= sfc; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6128
        12'h001:        begin resL <= dfc; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6129
        12'h003:  begin resL <= {24'h0,asid}; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6130
        12'h010:  begin resL <= apc; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6131
        12'h011:  begin resL <= {24'h0,cpl}; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6132
        12'h012:  begin resL <= tr; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6133
        12'h013:  begin resL <= tcba; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6134
        12'h014:  begin resL <= mmus; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6135
        12'h015:  begin resL <= ios; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6136
        12'h016:  begin resL <= iops; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6137 8 robfinch
        12'h020:  begin resL <= canary; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6138 2 robfinch
        12'h800:        begin resL <= usp; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6139
        12'h801:        begin resL <= vbr; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6140
        12'hFE0:        begin resL <= coreno_i; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6141
//      12'hFE1:        begin resL <= srx; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6142
        12'hFF0:        begin resL <= tick; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6143
        12'hFF8:        begin resL <= icnt; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6144
        default:        tIllegal();
6145
        endcase
6146
 
6147
BIN2BCD1:
6148
        goto (BIN2BCD2);
6149
BIN2BCD2:
6150
        if (dd32done) begin
6151
                zf <= dd32in==32'h0;
6152
                vf <= dd32out[39:32]!=8'h00;
6153
                resL <= dd32out[31:0];
6154
                rfwrL <= 1'b1;
6155
                Rt <= {1'b0,rrr};
6156
                ret();
6157
        end
6158
BCD2BIN1:
6159
        begin
6160
                (* USE_DSP = "no" *)
6161
                resL1 <= d[3:0] +
6162
                     d[7:4] * 4'd10 +
6163
                     d[11:8] * 7'd100 +
6164
                     d[15:12] * 10'd1000 +
6165
                     d[19:16] * 14'd10000 +
6166
                     d[23:20] * 17'd100000 +
6167
                     d[27:24] * 20'd1000000 +
6168
                     d[31:28] * 24'd10000000
6169
                     ;
6170
                goto (BCD2BIN2);
6171
        end
6172
BCD2BIN2:
6173
        begin
6174
                resL2 <= resL1;
6175
                goto (BCD2BIN3);
6176
        end
6177
BCD2BIN3:
6178
        begin
6179
                resL <= resL2;
6180
                rfwrL <= 1'b1;
6181
                Rt <= {1'b0,rrr};
6182
                ret();
6183
        end
6184 8 robfinch
CCHK:
6185
        begin
6186
                if (s != canary) begin
6187
                isr <= srx;
6188
                tf <= 1'b0;
6189
                sf <= 1'b1;
6190
                        vecno <= `CHK_VEC;
6191
            goto (TRAP3);
6192
                end
6193
                else
6194
                        ret();
6195
        end
6196 4 robfinch
`ifdef SUPPORT_DECFLT
6197
FADD:
6198
        begin
6199
                fpcnt <= fpcnt + 2'd1;
6200
                if (fpcnt==8'd50) begin
6201
                        if (DECFLT) begin
6202
                                fzf <= dfaddsubo[94:0]==95'd0;
6203
                                fnf <= dfaddsubo[95];
6204
                                fvf <= dfaddsubo[94:90]==5'b11110;
6205
                                fnanf <= dfaddsubo[94:90]==5'b11111;
6206
                                resF <= dfaddsubo;
6207
                                Rt <= {1'b0,FLTDST};
6208
                                rfwrF <= 1'b1;
6209
                        end
6210
                        ret();
6211
                end
6212
        end
6213
FSCALE:
6214
        begin
6215
                fpcnt <= fpcnt + 2'd1;
6216
                if (fpcnt==8'd3) begin
6217
                        if (DECFLT) begin
6218
                                fzf <= dfscaleo[94:0]==95'd0;
6219
                                fnf <= dfscaleo[95];
6220
                                fvf <= dfscaleo[94:90]==5'b11110;
6221
                                fnanf <= dfscaleo[94:90]==5'b11111;
6222
                                resF <= dfscaleo;
6223
                                Rt <= {1'b0,FLTDST};
6224
                                rfwrF <= 1'b1;
6225
                        end
6226
                        ret();
6227
                end
6228
        end
6229 8 robfinch
FNEG:   // Also FABS
6230 4 robfinch
        begin
6231
                if (DECFLT) begin
6232 8 robfinch
                        resF <= {~fps[95] & ~fabs,fps[94:0]};
6233 4 robfinch
                        fzf <= fps[94:0]==95'd0;
6234 8 robfinch
                        fnf <= ~fps[95] & ~fabs;
6235 4 robfinch
                        Rt <= {1'b0,FLTDST};
6236
                        rfwrF <= 1'b1;
6237
                end
6238
                ret();
6239
        end
6240
FMUL1:
6241
        goto (FMUL2);
6242
FMUL2:
6243
        if (DECFLT) begin
6244
                if (dfmuldone) begin
6245
                        fzf <= dfmulo[94:0]==95'd0;
6246
                        fnf <= dfmulo[95];
6247
                        fvf <= dfmulo[94:90]==5'b11110;
6248
                        fnanf <= dfmulo[94:90]==5'b11111;
6249
                        resF <= dfmulo;
6250
                        Rt <= {1'b0,FLTDST};
6251
                        rfwrF <= 1'b1;
6252
                        ret();
6253
                end
6254
        end
6255
        else
6256
                ret();
6257 8 robfinch
        // For divide the done signal may take several cycles to go inactive after
6258
        // the load signal is activated. Prevent a premature recognition of done
6259
        // using a counter.
6260 4 robfinch
FDIV1:
6261 8 robfinch
        begin
6262
                fpcnt <= fpcnt + 2'd1;
6263
                if (fpcnt == 8'd50)
6264
                        goto (FDIV2);
6265
        end
6266 4 robfinch
FDIV2:
6267
        if (dfdivdone) begin
6268
                if (DECFLT) begin
6269
                        fzf <= dfdivo[94:0]==95'd0;
6270
                        fnf <= dfdivo[95];
6271
                        fvf <= dfdivo[94:90]==5'b11110;
6272
                        fnanf <= dfdivo[94:90]==5'b11111;
6273
                        resF <= dfdivo;
6274
                        Rt <= {1'b0,FLTDST};
6275
                        rfwrF <= 1'b1;
6276 6 robfinch
                        quotient_bits <= {dfdivo[95],dfdivo[6:0]};
6277
                        quotient_bitshi <= {dfdivo[9:7]};
6278 4 robfinch
                end
6279
                ret();
6280
        end
6281
FCMP:
6282
        begin
6283
                if (DECFLT) begin
6284
                        fzf <= dfcmpo[0];
6285
                        fnf <= dfcmpo[1];
6286
                        fvf <= 1'b0;
6287
                        fnanf <= dfcmpo[4];
6288
                end
6289
                ret();
6290
        end
6291
FMOVE:
6292
        begin
6293
                if (DECFLT) begin
6294 8 robfinch
                        if (ir2[14])
6295
                                case(ir2[12:10])
6296
                                3'b000:
6297
                                        begin
6298
                                                fps <= {64'd0,s};
6299
                                                goto (I2DF1);
6300
                                        end
6301
                                3'b100:
6302
                                        begin
6303
                                                fps <= {80'd0,s[15:0]};
6304
                                                goto (I2DF1);
6305
                                        end
6306
                                3'b110:
6307
                                        begin
6308
                                                fps <= {88'd0,s[7:0]};
6309
                                                goto (I2DF1);
6310
                                        end
6311
                                default:
6312
                                        begin
6313
                                                resF <= fps[95:0];
6314
                                                fzf <= fps[94:0]==95'd0;
6315
                                                fnf <= fps[95];
6316
                                                Rt <= {1'b0,FLTDST};
6317
                                                rfwrF <= 1'b1;
6318
                                                ret();
6319
                                        end
6320
                                endcase
6321 4 robfinch
                        else begin
6322
                                resF <= fps[95:0];
6323
                                fzf <= fps[94:0]==95'd0;
6324
                                fnf <= fps[95];
6325
                                Rt <= {1'b0,FLTDST};
6326
                                rfwrF <= 1'b1;
6327
                                ret();
6328
                        end
6329
                end
6330
                else
6331
                        ret();
6332
        end
6333
I2DF1:
6334
        goto (I2DF2);
6335
I2DF2:
6336
        begin
6337
                if (DECFLT) begin
6338
                        if (i2dfdone) begin
6339
                                resF <= i2dfo;
6340
                                fzf <= i2dfo[94:0]==95'd0;
6341
                                fnf <= i2dfo[95];
6342
                                Rt <= {1'b0,FLTDST};
6343
                                rfwrF <= 1'b1;
6344
                                ret();
6345
                        end
6346
                end
6347
                else
6348
                        ret();
6349
        end
6350
DF2I1:
6351
        goto (DF2I2);
6352
DF2I2:
6353
        begin
6354
                if (DECFLT) begin
6355
                        if (df2idone) begin
6356 8 robfinch
                                case(ir2[12:10])
6357
                                3'b000: fs_data(mmm,rrr,STORE_LWORD,D);
6358
                                3'b100: fs_data(mmm,rrr,STORE_WORD,D);
6359
                                3'b110: fs_data(mmm,rrr,STORE_BYTE,D);
6360
                                default:        ret();
6361
                                endcase
6362 4 robfinch
                                resF <= df2io;
6363 8 robfinch
                                resL <= df2io[31:0];
6364
                                resW <= df2io[15:0];
6365
                                resB <= df2io[ 7:0];
6366
                                d <= df2io;
6367 4 robfinch
                                fzf <= df2io[94:0]==95'd0;
6368
                                fnf <= df2io[95];
6369
                                fvf <= df2iover;
6370 8 robfinch
                                //Rt <= {1'b0,FLTDST};
6371
                                //rfwrL <= 1'b1;
6372 4 robfinch
                        end
6373
                end
6374
                else
6375
                        ret();
6376
        end
6377
FTST:
6378
        begin
6379 8 robfinch
                case(ir2[12:10])
6380
                3'b000: begin fnf <= s[31]; fzf <= s[31:0]==32'd0; fnanf <= 1'b0; fvf <= 1'b0; end
6381
                3'b100: begin fnf <= s[15]; fzf <= s[15:0]==16'd0; fnanf <= 1'b0; fvf <= 1'b0; end
6382
                3'b110: begin fnf <= s[ 7]; fzf <= s[ 7:0]== 8'd0; fnanf <= 1'b0; fvf <= 1'b0; end
6383
                default:
6384
                        begin
6385
                                fnf <= fps[95];
6386
                                fzf <= fps[94:0]=='d0;
6387
                                fnanf <= fps[94:90]==5'b11111;
6388
                                fvf <= fps[94:90]==5'b11110;
6389
                        end
6390
                endcase
6391 4 robfinch
                ret();
6392
        end
6393
FBCC:
6394
        begin
6395
                if (ftakb)
6396
                        pc <= opc + imm;
6397
                ret();
6398
        end
6399
/*
6400
FCOPYEXP:
6401
        begin
6402
                resF <= fpdp;
6403
                rfwrF <= 1'b1;
6404
                Rt <= {1'b0,FLTDST};
6405
                ret();
6406
        end
6407
*/
6408 8 robfinch
FMOVEM1:
6409
        begin
6410
                imm <= rfoDnn[7:0];
6411
                if (ir2[13])
6412
                        goto(MOVEM_Xn2D);
6413
                else
6414
                        goto(MOVEM_s2Xn);
6415
        end
6416
 
6417 4 robfinch
`endif
6418
 
6419 2 robfinch
default:
6420
        goto(RESET);
6421
endcase
6422
 
6423
        // Bus error: abort current cycle and trap.
6424
        if (cyc_o & err_i) begin
6425
                cyc_o <= `LOW;
6426
                stb_o <= `LOW;
6427
                we_o <= `LOW;
6428
                sel_o <= 4'h0;
6429
                mac_cycle_type <= {state[6:0],sel_o,~we_o,1'b0,fc_o};
6430
                bad_addr <= adr_o;
6431
                if (state != INTA) begin
6432
                        is_bus_err <= 1'b1;
6433
                        dati_buf <= dat_i;
6434
                        dato_buf <= dat_o;
6435
                        goto (TRAP);
6436
                end
6437
        end
6438
 
6439
`ifdef SUPPORT_RETRY
6440
        // Retry: abort current cycle and retry.
6441
        if (cyc_o & rty_i) begin
6442
                cyc_o <= `LOW;
6443
                stb_o <= `LOW;
6444
                we_o <= `LOW;
6445
                sel_o <= 4'h0;
6446
                rstate <= state;
6447
                goto (RETRY);
6448
        end
6449
`endif
6450
 
6451
end
6452
 
6453
//-----------------------------------------------------------------------------
6454
//-----------------------------------------------------------------------------
6455
task fs_data;
6456
input [2:0] mmm;
6457
input [2:0] rrr;
6458
input state_t size_state;
6459
input dsi;
6460
begin
6461
        ds <= dsi;
6462
        case(mmm)
6463
        3'd0:   begin
6464
                                if (dsi==D)
6465 4 robfinch
                                        d <= MMMRRR ? rfoDn : rfob;
6466
                                else begin
6467
                                        s <= MMMRRR ? rfoDn : rfob;
6468
                                        fps <= MMMRRR ? rfoDn : rfob;
6469
                                end
6470 2 robfinch
                                case(size_state)
6471
                                STORE_LWORD:
6472
                                        begin
6473
                                                Rt <= {mmm[0],rrr};
6474
                                                rfwrL <= 1'b1;
6475
                                        end
6476
                                STORE_WORD:
6477
                                        begin
6478
                                                Rt <= {mmm[0],rrr};
6479
                                                rfwrW <= 1'b1;
6480
                                        end
6481
                                STORE_BYTE:
6482
                                        begin
6483
                                                Rt <= {mmm[0],rrr};
6484
                                                rfwrB <= 1'b1;
6485
                                        end
6486
                                default:        ;
6487
                                endcase
6488
                                goto(RETSTATE);
6489
                        end     // Dn
6490
        3'd1:   begin
6491
                                if (dsi==D)
6492
                                        d <= rfob;
6493
                                else
6494
                                        s <= rfob;
6495
                                case(size_state)
6496
                                STORE_LWORD:
6497
                                        begin
6498
                                                Rt <= {mmm[0],rrr};
6499
                                                rfwrL <= 1'b1;
6500
                                        end
6501
                                STORE_WORD:
6502
                                        begin
6503
                                                Rt <= {mmm[0],rrr};
6504
                                                rfwrW <= 1'b1;
6505
                                        end
6506
                                STORE_BYTE:
6507
                                        begin
6508
                                                Rt <= {mmm[0],rrr};
6509
                                                rfwrB <= 1'b1;
6510
                                        end
6511
                                default:        ;
6512
                                endcase
6513
                                goto(RETSTATE);
6514
                                end     // An
6515
        3'd2:   begin   //(An)
6516
                                ea <= MMMRRR ? rfoAna : rfoAn;
6517
                                goto(size_state);
6518
                        end
6519
        3'd3:   begin   // (An)+
6520
                                ea <= (MMMRRR ? rfoAna : rfoAn);
6521
                                if (!lea) begin
6522
                                        Rt <= {1'b1,rrr};
6523
                                        rfwrL <= 1'b1;
6524
                                end
6525
                                case(size_state)
6526
                                LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:  resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd1;
6527
                                FETCH_WORD,STORE_WORD:  resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd2;
6528
                                FETCH_LWORD,STORE_LWORD:        resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd4;
6529 4 robfinch
`ifdef SUPPORT_DECFLT
6530 8 robfinch
                                FETCH_HEXI1,STORE_HEXI1: resL <= rfoAn + 5'd12;
6531 4 robfinch
`endif
6532 2 robfinch
                                default:        ;
6533
                                endcase
6534
                                goto(size_state);
6535
                        end
6536
        3'd4:   begin   // -(An)
6537
                                if (!lea) begin
6538
                                        Rt <= {1'b1,rrr};
6539
                                        rfwrL <= 1'b1;
6540
                                end
6541
                                case(size_state)
6542
                                FETCH_NOP_BYTE,LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:   ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd1;
6543
                                FETCH_NOP_WORD,FETCH_WORD,STORE_WORD:   ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd2;
6544
                                FETCH_NOP_LWORD,FETCH_LWORD,STORE_LWORD:        ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd4;
6545 4 robfinch
`ifdef SUPPORT_DECFLT
6546 8 robfinch
                                FETCH_NOP_HEXI,FETCH_HEXI1,STORE_HEXI1: ea <= rfoAn - 5'd12;
6547 4 robfinch
`endif
6548 2 robfinch
                                default:        ;
6549
                                endcase
6550
                                case(size_state)
6551
                                LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:  resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd1;
6552
                                FETCH_WORD,STORE_WORD:  resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd2;
6553
                                FETCH_LWORD,STORE_LWORD:        resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd4;
6554 4 robfinch
`ifdef SUPPORT_DECFLT
6555 8 robfinch
                                FETCH_HEXI1,STORE_HEXI1: resL <= rfoAn - 5'd12;
6556 4 robfinch
`endif
6557 2 robfinch
                                default:        ;
6558
                                endcase
6559
                                goto(size_state);
6560
                        end
6561
        3'd5:   begin   // d16(An)
6562
                                ea <= (MMMRRR ? rfoAna : rfoAn);
6563
                                mmmx <= mmm;
6564
                                rrrx <= rrr;
6565
                                sz_state <= size_state;
6566
                                dsix <= dsi;
6567
                                goto (FSDATA2);
6568
                        end
6569
        3'd6:   begin   // d8(An,Xn)
6570
                                ea <= (MMMRRR ? rfoAna : rfoAn);
6571
                                mmmx <= mmm;
6572
                                rrrx <= rrr;
6573
                                sz_state <= size_state;
6574
                                dsix <= dsi;
6575
                                goto (FSDATA2);
6576
                        end
6577
        3'd7:   begin
6578
                                case(rrr)
6579
                                3'd0:   begin   // abs short
6580
                                                        ea <= 32'd0;
6581
                                                        mmmx <= mmm;
6582
                                                        rrrx <= rrr;
6583
                                                        sz_state <= size_state;
6584
                                                        dsix <= dsi;
6585
                                                        goto (FSDATA2);
6586
                                                end
6587
                                3'd1:   begin   // abs long
6588
                                                        ea <= 32'd0;
6589
                                                        mmmx <= mmm;
6590
                                                        rrrx <= rrr;
6591
                                                        sz_state <= size_state;
6592
                                                        dsix <= dsi;
6593
                                                        goto (FSDATA2);
6594
                                                end
6595
                                3'd2:   begin   // d16(PC)
6596
                                                        ea <= pc;
6597
                                                        mmmx <= mmm;
6598
                                                        rrrx <= rrr;
6599
                                                        sz_state <= size_state;
6600
                                                        dsix <= dsi;
6601
                                                        goto (FSDATA2);
6602
                                                end
6603
                                3'd3:   begin   // d8(PC,Xn)
6604
                                                        ea <= pc;
6605
                                                        mmmx <= mmm;
6606
                                                        rrrx <= rrr;
6607
                                                        sz_state <= size_state;
6608
                                                        dsix <= dsi;
6609
                                                        goto (FSDATA2);
6610
                                                end
6611 4 robfinch
                                                // ToDo: add FETCH_IMM128
6612 2 robfinch
                                3'd4:   begin   // #i16
6613 8 robfinch
                                                        goto(size_state==FETCH_NOP_HEXI ? FETCH_IMM96:(size_state==FETCH_LWORD||size_state==FETCH_NOP_LWORD)?FETCH_IMM32:FETCH_IMM16);
6614 2 robfinch
                                                end
6615
                                3'd5:   begin   // #i32
6616
                                                        state <= FETCH_IMM32;
6617
                                                        goto (FETCH_IMM32);
6618
                                                end
6619
                                endcase
6620
                        end
6621
                endcase
6622
        end
6623
endtask
6624
 
6625
task fs_data2;
6626
input [2:0] mmm;
6627
input [2:0] rrr;
6628
input state_t size_state;
6629
input dsi;
6630
begin
6631
        ds <= dsi;
6632
        case(mmm)
6633
        3'd5:   begin   // d16(An)
6634
                                ea <= (MMMRRR ? rfoAna : rfoAn);
6635
                                call(FETCH_D16,size_state);
6636
                        end
6637
        3'd6:   begin   // d8(An,Xn)
6638
                                ea <= (MMMRRR ? rfoAna : rfoAn);
6639
                                call(FETCH_NDX,size_state);
6640
                        end
6641
        3'd7:   begin
6642
                                case(rrr)
6643
                                3'd0:   begin   // abs short
6644
                                                        ea <= 32'd0;
6645
                                                        call(FETCH_D16,size_state);
6646
                                                end
6647
                                3'd1:   begin   // abs long
6648
                                                        ea <= 32'd0;
6649
                                                        call(FETCH_D32,size_state);
6650
                                                end
6651
                                3'd2:   begin   // d16(PC)
6652
                                                        ea <= pc;
6653
                                                        call(FETCH_D16,size_state);
6654
                                                end
6655
                                3'd3:   begin   // d8(PC,Xn)
6656
                                                        ea <= pc;
6657
                                                        call(FETCH_NDX,size_state);
6658
                                                end
6659
                                3'd4:   begin   // #i16
6660 8 robfinch
                                                        goto((size_state==FETCH_LWORD||size_state==FETCH_NOP_LWORD||size_state==FETCH_NOP_HEXI)?FETCH_IMM32:FETCH_IMM16);
6661 2 robfinch
                                                        end
6662
                                3'd5:   begin   // #i32
6663
                                                        state <= FETCH_IMM32;
6664
                                                        goto (FETCH_IMM32);
6665
                                                end
6666
                                endcase
6667
                        end
6668
                endcase
6669
        end
6670
endtask
6671
 
6672
task goto;
6673
input state_t nst;
6674
begin
6675
        state <= nst;
6676
end
6677
endtask
6678
 
6679
task gosub;
6680
input state_t tgt;
6681
begin
6682
        state_stk1 <= state;
6683
        state_stk2 <= state_stk1;
6684
        state_stk3 <= state_stk2;
6685
        state_stk4 <= state_stk3;
6686 8 robfinch
        state_stk5 <= state_stk4;
6687 2 robfinch
        state <= tgt;
6688
end
6689
endtask
6690
 
6691
task call;
6692
input state_t tgt;
6693
input state_t retst;
6694
begin
6695
        state_stk1 <= retst;
6696
        state_stk2 <= state_stk1;
6697
        state_stk3 <= state_stk2;
6698
        state_stk4 <= state_stk3;
6699 8 robfinch
        state_stk5 <= state_stk4;
6700 2 robfinch
        state <= tgt;
6701
end
6702
endtask
6703
 
6704
task push;
6705
input state_t st;
6706
begin
6707
        state_stk1 <= st;
6708
        state_stk2 <= state_stk1;
6709
        state_stk3 <= state_stk2;
6710
        state_stk4 <= state_stk3;
6711 8 robfinch
        state_stk5 <= state_stk4;
6712 2 robfinch
end
6713
endtask
6714
 
6715
task tIllegal;
6716
begin
6717
        is_illegal <= 1'b1;
6718
  vecno <= `ILLEGAL_VEC;
6719
  goto (TRAP);
6720
end
6721
endtask
6722
 
6723
task tPrivilegeViolation;
6724
begin
6725
        is_priv <= 1'b1;
6726
        vecno <= `PRIV_VEC;
6727
        goto (TRAP);
6728
end
6729
endtask
6730
 
6731
task tBadBranchDisp;
6732
begin
6733
        isr <= srx;
6734
        tf <= 1'b0;
6735
        sf <= 1'b1;
6736
        vecno <= `DISP_VEC;
6737
        goto (TRAP3);
6738
end
6739
endtask
6740
 
6741
// MMMRRR needs to be set already when the STORE_IN_DEST state is entered.
6742
// This state is entered after being popped off the state stack.
6743
// If about to fetch the next instruction and trace is enabled, then take the
6744
// trace trap.
6745
task ret;
6746
begin
6747
        if (state_stk1==STORE_IN_DEST ||
6748
                        state_stk1==ADDX2 ||
6749
                        state_stk1==SUBX2 ||
6750
                        state_stk1==BCD0 ||
6751
                        state_stk1==CMPM)
6752
                MMMRRR <= 1'b1;
6753
        if (state_stk1==IFETCH && tf) begin
6754
                is_trace <= 1'b1;
6755
                state <= TRAP;
6756
        end
6757
        else
6758
                state <= state_stk1;
6759
        state_stk1 <= state_stk2;
6760
        state_stk2 <= state_stk3;
6761
        state_stk3 <= state_stk4;
6762 8 robfinch
        state_stk4 <= state_stk5;
6763 2 robfinch
end
6764
endtask
6765
 
6766
endmodule
6767
 

powered by: WebSVN 2.1.0

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