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

Subversion Repositories rf68000

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

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 9 robfinch
// The destination store for the MOVE instruction.
3280 8 robfinch
// Flags are not updated if the target is an address register.
3281 2 robfinch
//-----------------------------------------------------------------------------
3282 8 robfinch
 
3283 2 robfinch
STORE_IN_DEST:
3284
        begin
3285
                resL <= s;
3286
                resW <= s[15:0];
3287
                resB <= s[7:0];
3288
                d <= s;
3289 8 robfinch
                if (ir[8:6]!=3'b001) begin
3290
                        case(ir[15:12])
3291
                        4'd1:   begin zf <= s[ 7:0]== 8'h00; nf <= s[7]; end
3292
                        4'd3:   begin zf <= s[15:0]==16'h00; nf <= s[15]; end
3293
                        4'd2:   begin zf <= s[31:0]==32'd0;  nf <= s[31]; end
3294
                        default:        ;
3295
                        endcase
3296
                        cf <= 1'b0;
3297
                        vf <= 1'b0;
3298
                end
3299 2 robfinch
                case(ir[15:12])
3300
                4'd1:   fs_data(MMM,RRR,STORE_BYTE,D);
3301
                4'd2:   fs_data(MMM,RRR,STORE_LWORD,D);
3302
                4'd3:   fs_data(MMM,RRR,STORE_WORD,D);
3303
                default:        ;       // cant get here
3304
                endcase
3305
        end
3306
 
3307
 
3308
//-----------------------------------------------------------------------------
3309
// Compares
3310
//-----------------------------------------------------------------------------
3311
CMP:
3312
        begin
3313
                flag_update <= FU_CMP;
3314
                case(sz)
3315
                2'b00:  resB <= d[ 7:0] - s[ 7:0];
3316
                2'b01:  resW <= d[15:0] - s[15:0];
3317
                2'b10:  resL <= d[31:0] - s[31:0];
3318
                2'b11:  ;
3319
                endcase
3320
                ret();
3321
        end
3322
 
3323
CMPA:
3324
        begin
3325
                flag_update <= FU_CMP;
3326
                case(ir[8])
3327
                1'b0:   resL <= d[31:0] - {{16{s[15]}},s[15:0]};
3328
                1'b1:   resL <= d[31:0] - s[31:0];
3329
                endcase
3330
                ret();
3331
        end
3332
 
3333
CMPM:
3334
        begin
3335
                push (CMP);
3336
                case(sz)
3337
                2'd0:   fs_data(3'b011,RRR,FETCH_BYTE,D);
3338
                2'd1:   fs_data(3'b011,RRR,FETCH_WORD,D);
3339
                2'd2:   fs_data(3'b011,RRR,FETCH_LWORD,D);
3340
                default:        ;       // cant get here
3341
                endcase
3342
        end
3343
 
3344
//-----------------------------------------------------------------------------
3345
// Shifts
3346
// Rotate instructions ROL,ROR do not affect the X flag.
3347
//-----------------------------------------------------------------------------
3348
SHIFT1:
3349
        begin
3350
                vf <= 1'b0;
3351
                case(shift_op)
3352
                3'b010, // ROXL, ROXR
3353
                3'b110: cf <= xf;
3354
                default:
3355
                        begin
3356
                                if (cnt=='d0)
3357
                                        cf <= 1'b0;
3358
                        end
3359
                endcase
3360
                // Extend by a bit for ASL overflow detection.
3361
                resB <= {d[7],d[7:0]};
3362
                resW <= {d[15],d[15:0]};
3363
                resL <= {d[31],d[31:0]};
3364
                state <= SHIFT;
3365
        end
3366
SHIFT:
3367
        if (cnt!='d0) begin
3368
                cnt <= cnt - 2'd1;
3369
                case(shift_op)
3370
                3'b000: // ASR
3371
                        case(sz)
3372
                        2'b00:  begin resB <= {resB[ 7],resB[ 7:1]}; cf <= resB[0]; xf <= resB[0]; end
3373
                        2'b01:  begin resW <= {resW[15],resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3374
                        2'b10:  begin resL <= {resL[31],resL[31:1]}; cf <= resL[0]; xf <= resL[0]; end
3375
                        2'b11:  begin resW <= {resW[15],resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3376
                        endcase
3377
                3'b001: // LSR
3378
                        case(sz)
3379
                        2'b00:  begin resB <= {1'b0,resB[ 7:1]}; cf <= resB[0]; xf <= resB[0]; end
3380
                        2'b01:  begin resW <= {1'b0,resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3381
                        2'b10:  begin resL <= {1'b0,resL[31:1]}; cf <= resL[0]; xf <= resL[0]; end
3382
                        2'b11:  begin resW <= {1'b0,resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3383
                        endcase
3384
                3'b010: // ROXR
3385
                        case(sz)
3386
                        2'b00:  begin resB <= {xf,resB[ 7:1]}; cf <= resB[0]; xf <= resB[0]; end
3387
                        2'b01:  begin resW <= {xf,resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3388
                        2'b10:  begin resL <= {xf,resL[31:1]}; cf <= resL[0]; xf <= resL[0]; end
3389
                        2'b11:  begin resW <= {xf,resW[15:1]}; cf <= resW[0]; xf <= resW[0]; end
3390
                        endcase
3391
                3'b011: // ROR
3392
                        case(sz)
3393
                        2'b00:  begin resB <= {resB[0],resB[ 7:1]}; cf <= resB[0]; end
3394
                        2'b01:  begin resW <= {resW[0],resW[15:1]}; cf <= resW[0]; end
3395
                        2'b10:  begin resL <= {resL[0],resL[31:1]}; cf <= resL[0]; end
3396
                        2'b11:  begin resW <= {resW[0],resW[15:1]}; cf <= resW[0]; end
3397
                        endcase
3398
                3'b100: // ASL
3399
                        case(sz)
3400
                        2'b00:  begin resB <= {resB[ 7:0],1'b0}; cf <= resB[ 7]; xf <= resB[ 7]; if (resB[ 7] != resB[ 8]) vf <= 1'b1; end
3401
                        2'b01:  begin resW <= {resW[15:0],1'b0}; cf <= resW[15]; xf <= resW[15]; if (resW[15] != resW[16]) vf <= 1'b1; end
3402
                        2'b10:  begin resL <= {resL[31:0],1'b0}; cf <= resL[31]; xf <= resL[31]; if (resL[31] != resL[32]) vf <= 1'b1; end
3403
                        2'b11:  begin resW <= {resW[15:0],1'b0}; cf <= resW[15]; xf <= resW[15]; if (resW[15] != resW[16]) vf <= 1'b1; end
3404
                        endcase
3405
                3'b101: // LSL
3406
                        case(sz)
3407
                        2'b00:  begin resB <= {resB[ 6:0],1'b0}; cf <= resB[ 7]; xf <= resB[ 7]; end
3408
                        2'b01:  begin resW <= {resW[14:0],1'b0}; cf <= resW[15]; xf <= resW[15]; end
3409
                        2'b10:  begin resL <= {resL[30:0],1'b0}; cf <= resL[31]; xf <= resL[31]; end
3410
                        2'b11:  begin resW <= {resW[14:0],1'b0}; cf <= resW[15]; xf <= resW[15]; end
3411
                        endcase
3412
                3'b110: // ROXL
3413
                        case(sz)
3414
                        2'b00:  begin resB <= {resB[ 6:0],xf}; cf <= resB[ 7]; xf <= resB[ 7]; end
3415
                        2'b01:  begin resW <= {resW[14:0],xf}; cf <= resW[15]; xf <= resW[15]; end
3416
                        2'b10:  begin resL <= {resL[30:0],xf}; cf <= resL[31]; xf <= resL[31]; end
3417
                        2'b11:  begin resW <= {resW[14:0],xf}; cf <= resW[15]; xf <= resW[15]; end
3418
                        endcase
3419
                3'b111: // ROL
3420
                        case(sz)
3421
                        2'b00:  begin resB <= {resB[ 6:0],resB[ 7]}; cf <= resB[ 7]; end
3422
                        2'b01:  begin resW <= {resW[14:0],resW[15]}; cf <= resW[15]; end
3423
                        2'b10:  begin resL <= {resL[30:0],resL[31]}; cf <= resL[31]; end
3424
                        2'b11:  begin resW <= {resW[14:0],resW[15]}; cf <= resW[15]; end
3425
                        endcase
3426
                endcase
3427
        end
3428
        else begin
3429
                if (shift_op==3'b100)   // ASL
3430
                        case(sz)
3431
                        2'b00:  if (resB[ 7] != resB[ 8]) vf <= 1'b1;
3432
                        2'b01:  if (resW[15] != resW[16]) vf <= 1'b1;
3433
                        2'b10:  if (resL[31] != resL[32]) vf <= 1'b1;
3434
                        2'b11:  if (resW[15] != resW[16]) vf <= 1'b1;
3435
                        /*
3436
                        2'b00:  vf <= resB[ 7] != d[ 7];
3437
                        2'b01:  vf <= resW[15] != d[15];
3438
                        2'b10:  vf <= resL[31] != d[31];
3439
                        2'b11:  vf <= resW[15] != d[15];
3440
                        */
3441
                        endcase
3442
                case(sz)
3443
                2'b00:  d <= resB;
3444
                2'b01:  d <= resW;
3445
                2'b10:  d <= resL;
3446
                2'b11:  d <= resW;
3447
                endcase
3448
                Rt <= {1'b0,rrr};
3449
                case(sz)
3450
                2'b00:  begin zf <= resB[7:0]== 8'h00; nf <= resB[ 7]; end
3451
                2'b01:  begin zf <= resW[15:0]==16'h00; nf <= resW[15]; end
3452
                2'b10:  begin zf <= resL[31:0]==32'h00; nf <= resL[31]; end
3453
                2'b11:  begin zf <= resW[15:0]==16'h00; nf <= resW[15]; end
3454
                endcase
3455
                case(sz)
3456
                2'b00:  begin rfwrB <= 1'b1; ret(); end
3457
                2'b01:  begin rfwrW <= 1'b1; ret(); end
3458
                2'b10:  begin rfwrL <= 1'b1; ret(); end
3459
                2'b11:  fs_data(mmm,rrr,STORE_WORD,D);  // word operations only if memory operate
3460
                endcase
3461
        end
3462
 
3463
//-----------------------------------------------------------------------------
3464
// ADD / SUB / ADDA / SUBA / ADDX / SUBX
3465
//-----------------------------------------------------------------------------
3466
ADD:
3467
        begin
3468
                flag_update <= FU_ADD;
3469
                if (sz==2'b11) begin
3470 9 robfinch
                        flag_update <= FU_NONE;
3471 2 robfinch
                        Rt <= {1'b1,AAA};
3472
                        if (ir[8]) begin
3473
                                rfwrL <= 1'b1;
3474
                                resL <= d + s;
3475
                        end
3476
                        else begin
3477
                                resW <= d[15:0] + s[15:0];
3478
                                rfwrW <= 1'b1;
3479
                        end
3480
                        d <= d + s;
3481
                        dd <= d;
3482
                        ret();
3483
                end
3484
                else if (ir[8]) begin
3485
                        resB <= d[7:0] + s[7:0];
3486
                        resW <= d[15:0] + s[15:0];
3487
                        resL <= d + s;
3488
                        d <= d + s;
3489
                        dd <= d;
3490
                        if (mmm==3'd0 || mmm==3'd1) begin
3491
                                Rt <= {mmm[0],rrr};
3492
                                case(sz)
3493
                                2'b00:  rfwrB <= 1'b1;
3494
                                2'b01:  rfwrW <= 1'b1;
3495
                                2'b10:  rfwrL <= 1'b1;
3496
                                default:        ;
3497
                                endcase
3498
                                ret();
3499
                        end
3500
                        else begin
3501
                                case(sz)
3502
                                2'b00:  goto(STORE_BYTE);
3503
                                2'b01:  goto(STORE_WORD);
3504
                                2'b10:  goto(STORE_LWORD);
3505
                                default:        ;
3506
                                endcase
3507
                        end
3508
                end
3509
                else begin
3510
                        Rt <= {1'b0,DDD};
3511
                        resB <= d[7:0] + s[7:0];
3512
                        resW <= d[15:0] + s[15:0];
3513
                        resL <= d + s;
3514
                        d <= d + s;
3515
                        dd <= d;
3516
                        case(sz)
3517
                        2'b00:  rfwrB <= 1'b1;
3518
                        2'b01:  rfwrW <= 1'b1;
3519
                        2'b10:  rfwrL <= 1'b1;
3520
                        default:        ;
3521
                        endcase
3522
                        ret();
3523
                end
3524
        end
3525
 
3526
//-----------------------------------------------------------------------------
3527
//-----------------------------------------------------------------------------
3528
SUB:
3529
        begin
3530
                flag_update <= FU_SUB;
3531
                if (sz==2'b11) begin
3532 9 robfinch
                        flag_update <= FU_NONE;
3533 2 robfinch
                        Rt <= {1'b1,AAA};
3534
                        if (ir[8]) begin
3535
                                rfwrL <= 1'b1;
3536
                                resL <= d - s;
3537
                        end
3538
                        else begin
3539
                                resW <= d[15:0] - s[15:0];
3540
                                rfwrW <= 1'b1;
3541
                        end
3542
                        d <= d - s;
3543
                        dd <= d;
3544
                        ret();
3545
                end
3546
                else if (ir[8]) begin
3547
                        resB <= d[7:0] - s[7:0];
3548
                        resW <= d[15:0] - s[15:0];
3549
                        resL <= d - s;
3550
                        d <= d - s;
3551
                        dd <= d;
3552
                        if (mmm==3'd0 || mmm==3'd1) begin
3553
                                Rt <= {mmm[0],rrr};
3554
                                case(sz)
3555
                                2'b00:  rfwrB <= 1'b1;
3556
                                2'b01:  rfwrW <= 1'b1;
3557
                                2'b10:  rfwrL <= 1'b1;
3558
                                default:        ;
3559
                                endcase
3560
                                ret();
3561
                        end
3562
                        else begin
3563
                                case(sz)
3564
                                2'b00:  goto(STORE_BYTE);
3565
                                2'b01:  goto(STORE_WORD);
3566
                                2'b10:  goto(STORE_LWORD);
3567
                                default:        ;
3568
                                endcase
3569
                        end
3570
                end
3571
                else begin
3572
                        Rt <= {1'b0,DDD};
3573
                        resB <= d[7:0] - s[7:0];
3574
                        resW <= d[15:0] - s[15:0];
3575
                        resL <= d - s;
3576
                        dd <= d;
3577
                        case(sz)
3578
                        2'b00:  rfwrB <= 1'b1;
3579
                        2'b01:  rfwrW <= 1'b1;
3580
                        2'b10:  rfwrL <= 1'b1;
3581
                        default:        ;
3582
                        endcase
3583
                        ret();
3584
                end
3585
        end
3586
 
3587
ADDX:
3588
        begin
3589
                push (ADDX2);
3590
                case(sz)
3591
                2'd0:   fs_data(3'b100,rrr,FETCH_BYTE,S);
3592
                2'd1:   fs_data(3'b100,rrr,FETCH_WORD,S);
3593
                2'd2:   fs_data(3'b100,rrr,FETCH_LWORD,S);
3594
                default:        ;
3595
                endcase
3596
        end
3597
ADDX2:
3598
        begin
3599
                push(ADDX3);
3600
                case(sz)
3601
                2'd0:   fs_data(3'b100,RRR,FETCH_BYTE,D);
3602
                2'd1:   fs_data(3'b100,RRR,FETCH_WORD,D);
3603
                2'd2:   fs_data(3'b100,RRR,FETCH_LWORD,D);
3604
                default:        ;
3605
                endcase
3606
        end
3607
ADDX3:
3608
        begin
3609
                flag_update <= FU_ADDX;
3610
                resB <= d[ 7:0] + s[ 7:0] + xf;
3611
                resW <= d[15:0] + s[15:0] + xf;
3612
                resL <= d[31:0] + s[31:0] + xf;
3613
                dd <= d;
3614
                d <= d + s + xf;
3615
                if (ir[3])
3616
                        case(sz)
3617
                        2'b00:  goto(STORE_BYTE);
3618
                        2'b01:  goto(STORE_WORD);
3619
                        2'b10:  goto(STORE_LWORD);
3620
                        default:        ;
3621
                        endcase
3622
                else begin
3623
                        Rt <= {1'b0,RRR};
3624
                        case(sz)
3625
                        2'd0:   rfwrB <= 1'b1;
3626
                        2'd1:   rfwrW <= 1'b1;
3627
                        2'd2:   rfwrL <= 1'b1;
3628
                        default:        ;
3629
                        endcase
3630
                        ret();
3631
                end
3632
        end
3633
 
3634
SUBX:
3635
        begin
3636
                push (SUBX2);
3637
                case(sz)
3638
                2'd0:   fs_data(3'b100,rrr,FETCH_BYTE,S);
3639
                2'd1:   fs_data(3'b100,rrr,FETCH_WORD,S);
3640
                2'd2:   fs_data(3'b100,rrr,FETCH_LWORD,S);
3641
                default:        ;
3642
                endcase
3643
        end
3644
SUBX2:
3645
        begin
3646
                push(SUBX3);
3647
                case(sz)
3648
                2'd0:   fs_data(3'b100,RRR,FETCH_BYTE,D);
3649
                2'd1:   fs_data(3'b100,RRR,FETCH_WORD,D);
3650
                2'd2:   fs_data(3'b100,RRR,FETCH_LWORD,D);
3651
                default:        ;
3652
                endcase
3653
        end
3654
SUBX3:
3655
        begin
3656
                flag_update <= FU_SUBX;
3657
                resB <= d[7:0] - s[7:0] - xf;
3658
                resW <= d[15:0] - s[15:0] - xf;
3659
                resL <= d[31:0] - s[31:0] - xf;
3660
                dd <= d;
3661
                d <= d - s - xf;
3662
                if (ir[3])
3663
                        case(sz)
3664
                        2'b00:  goto(STORE_BYTE);
3665
                        2'b01:  goto(STORE_WORD);
3666
                        2'b10:  goto(STORE_LWORD);
3667
                        default:        ;
3668
                        endcase
3669
                else begin
3670
                        Rt <= {1'b0,RRR};
3671
                        case(sz)
3672
                        2'd0:   rfwrB <= 1'b1;
3673
                        2'd1:   rfwrW <= 1'b1;
3674
                        2'd2:   rfwrL <= 1'b1;
3675
                        default:        ;
3676
                        endcase
3677
                        ret();
3678
                end
3679
        end
3680
 
3681
//-----------------------------------------------------------------------------
3682
//-----------------------------------------------------------------------------
3683
AND:
3684
        begin
3685
                flag_update <= FU_LOGIC;
3686
                if (ir[8]) begin
3687
                        resB <= d[7:0] & rfoDn[7:0];
3688
                        resW <= d[15:0] & rfoDn[15:0];
3689
                        resL <= d & rfoDn;
3690
                        d <= d & rfoDn;
3691
                        if (mmm==3'd0 || mmm==3'd1) begin
3692
                                Rt <= {mmm[0],rrr};
3693
                                case(sz)
3694
                                2'b00:  rfwrB <= 1'b1;
3695
                                2'b01:  rfwrW <= 1'b1;
3696
                                2'b10:  rfwrL <= 1'b1;
3697
                                default:        ;
3698
                                endcase
3699
                                ret();
3700
                        end
3701
                        else begin
3702
                                case(sz)
3703
                                2'b00:  goto(STORE_BYTE);
3704
                                2'b01:  goto(STORE_WORD);
3705
                                2'b10:  goto(STORE_LWORD);
3706
                                default:        ;
3707
                                endcase
3708
                        end
3709
                end
3710
                else begin
3711
                        Rt <= {1'b0,DDD};
3712
                        resB <= rfoDn[7:0] & s[7:0];
3713
                        resW <= rfoDn[15:0] & s[15:0];
3714
                        resL <= rfoDn & s;
3715
                        case(sz)
3716
                        2'b00:  rfwrB <= 1'b1;
3717
                        2'b01:  rfwrW <= 1'b1;
3718
                        2'b10:  rfwrL <= 1'b1;
3719
                        default:        ;
3720
                        endcase
3721
                        ret();
3722
                end
3723
        end
3724
 
3725
//-----------------------------------------------------------------------------
3726
// OR
3727
//-----------------------------------------------------------------------------
3728
OR:
3729
        begin
3730
                flag_update <= FU_LOGIC;
3731
                if (ir[8]) begin
3732
                        resB <= d[7:0] | rfoDn[7:0];
3733
                        resW <= d[15:0] | rfoDn[15:0];
3734
                        resL <= d | rfoDn;
3735
                        d <= d | rfoDn;
3736
                        if (mmm==3'd0 || mmm==3'd1) begin
3737
                                Rt <= {mmm[0],rrr};
3738
                                case(sz)
3739
                                2'b00:  rfwrB <= 1'b1;
3740
                                2'b01:  rfwrW <= 1'b1;
3741
                                2'b10:  rfwrL <= 1'b1;
3742
                                default:        ;       // DIV
3743
                                endcase
3744
                                ret();
3745
                        end
3746
                        else begin
3747
                                case(sz)
3748
                                2'b00:  goto(STORE_BYTE);
3749
                                2'b01:  goto(STORE_WORD);
3750
                                2'b10:  goto(STORE_LWORD);
3751
                                default:        ;       // DIV
3752
                                endcase
3753
                        end
3754
                end
3755
                else begin
3756
                        Rt <= {1'b0,DDD};
3757
                        resB <= rfoDn[7:0] | s[7:0];
3758
                        resW <= rfoDn[15:0] | s[15:0];
3759
                        resL <= rfoDn | s;
3760
                        case(sz)
3761
                        2'b00:  rfwrB <= 1'b1;
3762
                        2'b01:  rfwrW <= 1'b1;
3763
                        2'b10:  rfwrL <= 1'b1;
3764
                        default:        ;
3765
                        endcase
3766
                        ret();
3767
                end
3768
        end
3769
 
3770
//-----------------------------------------------------------------------------
3771
// EOR
3772
//-----------------------------------------------------------------------------
3773
EOR:
3774
        begin
3775
                flag_update <= FU_LOGIC;
3776
                resB <= d[7:0] ^ rfoDn[7:0];
3777
                resW <= d[15:0] ^ rfoDn[15:0];
3778
                resL <= d ^ rfoDn;
3779
                d <= d ^ rfoDn;
3780
                if (mmm[2:1]==2'd0) begin
3781
                        Rt <= {mmm[0],rrr};
3782
                        case(sz)
3783
                        2'b00:  rfwrB <= 1'b1;
3784
                        2'b01:  rfwrW <= 1'b1;
3785
                        2'b10:  rfwrL <= 1'b1;
3786
                        default:        ;
3787
                        endcase
3788
                        ret();
3789
                end
3790
                else begin
3791
                        case(sz)
3792
                        2'b00:  goto(STORE_BYTE);
3793
                        2'b01:  goto(STORE_WORD);
3794
                        2'b10:  goto(STORE_LWORD);
3795
                        default:        ;
3796
                        endcase
3797
                end
3798
        end
3799
 
3800
//-----------------------------------------------------------------------------
3801
// ADDQ / SUBQ
3802
// Flags are not updated if the target is an address register.
3803
// If the target is an address register, the entire register is updated.
3804
//-----------------------------------------------------------------------------
3805
ADDQ:
3806
        begin
3807
                if (ir[8]) begin
3808
                        if (mmm!=3'b001)
3809
                                flag_update <= FU_SUBQ;
3810
                        resL <= d - immx;
3811
                        resB <= d[7:0] - immx[7:0];
3812
                        resW <= d[15:0] - immx[15:0];
3813
                        d <= d - immx;
3814
                        dd <= d;
3815
                        s <= immx;
3816
                end
3817
                else begin
3818
                        if (mmm!=3'b001)
3819
                                flag_update <= FU_ADDQ;
3820
                        resL <= d + immx;
3821
                        resB <= d[7:0] + immx[7:0];
3822
                        resW <= d[15:0] + immx[15:0];
3823
                        d <= d + immx;
3824
                        dd <= d;
3825
                        s <= immx;
3826
                end
3827
                if (mmm==3'd0) begin
3828
                        ret();
3829
                        Rt <= {mmm[0],rrr};
3830
                        case(sz)
3831
                        2'b00:  rfwrB <= 1'b1;
3832
                        2'b01:  rfwrW <= 1'b1;
3833
                        2'b10:  rfwrL <= 1'b1;
3834
                        default:        ;
3835
                        endcase
3836
                end
3837
                // If the target is an address register, the entire register is updated.
3838
                else if (mmm==3'b001) begin
3839
                        ret();
3840
                        Rt <= {mmm[0],rrr};
3841
                        rfwrL <= 1'b1;
3842
                end
3843
                else
3844
                        case(sz)
3845
                        2'b00:  goto(STORE_BYTE);
3846
                        2'b01:  goto(STORE_WORD);
3847
                        2'b10:  goto(STORE_LWORD);
3848
                        default:        ;       // Scc / DBRA
3849
                        endcase
3850
        end
3851
 
3852
//-----------------------------------------------------------------------------
3853
// ADDI / SUBI / CMPI / ANDI / ORI / EORI
3854
//-----------------------------------------------------------------------------
3855
ADDI:
3856
        case(sz)
3857
        2'b00:  call(FETCH_IMM8,ADDI2);
3858
        2'b01:  call(FETCH_IMM16,ADDI2);
3859
        2'b10:  call(FETCH_IMM32,ADDI2);
3860
        default:        tIllegal();
3861
        endcase
3862
ADDI2:
3863
        begin
3864
        immx <= imm;
3865
        case(sz)
3866
        2'b00:  begin push(ADDI3); fs_data(mmm,rrr,FETCH_BYTE,D); end
3867
        2'b01:  begin push(ADDI3); fs_data(mmm,rrr,FETCH_WORD,D); end
3868
        2'b10:  begin push(ADDI3); fs_data(mmm,rrr,FETCH_LWORD,D); end
3869
        default:        ;       // Cant get here
3870
        endcase
3871
        end
3872
ADDI3:
3873
        begin
3874
                flag_update <= FU_ADDI;
3875
                dd <= d;
3876
                s <= immx;
3877
                // Odd numbers are BIT insns.
3878
                case(ir[11:8])
3879
                4'h0:   resL <= d | immx;       // ORI
3880
                4'h2:   resL <= d & immx;     // ANDI
3881
                4'h4:   resL <= d - immx;       // SUBI
3882
                4'h6:   resL <= d + immx;       // ADDI
3883
                4'hA:   resL <= d ^ immx;       // EORI
3884
                4'hC:   resL <= d - immx;       // CMPI
3885
                default:        ;
3886
                endcase
3887
                case(ir[11:8])
3888
                4'h0:   resW <= d[15:0] | immx[15:0];   // ORI
3889
                4'h2:   resW <= d[15:0] & immx[15:0];       // ANDI
3890
                4'h4:   resW <= d[15:0] - immx[15:0];   // SUBI
3891
                4'h6:   resW <= d[15:0] + immx[15:0];   // ADDI
3892
                4'hA:   resW <= d[15:0] ^ immx[15:0];   // EORI
3893
                4'hC:   resW <= d[15:0] - immx[15:0];   // CMPI
3894
                default:        ;
3895
                endcase
3896
                case(ir[11:8])
3897
                4'h0:   resB <= d[7:0] | immx[7:0];     // ORI
3898
                4'h2:   resB <= d[7:0] & immx[7:0];        // ANDI
3899
                4'h4:   resB <= d[7:0] - immx[7:0];     // SUBI
3900
                4'h6:   resB <= d[7:0] + immx[7:0];     // ADDI
3901
                4'hA:   resB <= d[7:0] ^ immx[7:0];     // EORI
3902
                4'hC:   resB <= d[7:0] - immx[7:0];     // CMPI
3903
                default:        ;
3904
                endcase
3905
                case(ir[11:8])
3906
                4'h0:   d <= d | immx;  // ORI
3907
                4'h2:   d <= d & immx;        // ANDI
3908
                4'h4:   d <= d - immx;  // SUBI
3909
                4'h6:   d <= d + immx;  // ADDI
3910
                4'hA:   d <= d ^ immx;  // EORI
3911
                4'hC:   d <= d - immx;  // CMPI
3912
                default:        ;
3913
                endcase
3914
                if (ir[11:8]==4'hC)
3915
                        ret();
3916
                else if (mmm==3'b000 || mmm==3'b001) begin
3917
                        case(sz)
3918
                        2'b00:  rfwrB <= 1'b1;
3919
                        2'b01:  rfwrW <= 1'b1;
3920
                        2'b10:  rfwrL <= 1'b1;
3921
                        default:        ;
3922
                        endcase
3923
                        Rt <= {mmm[0],rrr};
3924
                        ret();
3925
                end
3926
                else
3927
                        case(sz)
3928
                        2'b00:  goto(STORE_BYTE);
3929
                        2'b01:  goto(STORE_WORD);
3930
                        2'b10:  goto(STORE_LWORD);
3931
                        default:        ret();
3932
                        endcase
3933
        end
3934
 
3935
//-----------------------------------------------------------------------------
3936
// ANDI_CCR / ANDI_SR / EORI_CCR / EORI_SR / ORI_CCR / ORI_SR
3937
//-----------------------------------------------------------------------------
3938
//
3939
ANDI_CCR:
3940
        begin flag_update <= FU_ANDI_CCR; goto(FETCH_IMM8); end
3941
ANDI_SR:
3942
        begin flag_update <= FU_ANDI_SR; goto(FETCH_IMM16); end
3943
ANDI_SRX:
3944
        begin flag_update <= FU_ANDI_SRX; goto(FETCH_IMM32); end
3945
EORI_CCR:
3946
        begin flag_update <= FU_EORI_CCR; goto(FETCH_IMM8); end
3947
EORI_SR:
3948
        begin flag_update <= FU_EORI_SR; goto(FETCH_IMM16); end
3949
EORI_SRX:
3950
        begin flag_update <= FU_EORI_SRX; goto(FETCH_IMM32); end
3951
ORI_CCR:
3952
        begin flag_update <= FU_ORI_CCR; goto(FETCH_IMM8); end
3953
ORI_SR:
3954
        begin flag_update <= FU_ORI_SR; goto(FETCH_IMM16); end
3955
ORI_SRX:
3956
        begin flag_update <= FU_ORI_SRX; goto(FETCH_IMM32); end
3957
 
3958
//-----------------------------------------------------------------------------
3959
// Bit manipulation
3960
//-----------------------------------------------------------------------------
3961
BIT:
3962
        begin
3963
                mmm_save <= mmm;
3964
                if (ir[11:8]==4'h8) begin
3965
                        call(FETCH_IMM16,BIT1);
3966
                end
3967
                else begin
3968
                        imm <= rfoDn;
3969
                        goto(BIT1);
3970
                end
3971
        end
3972
BIT1:
3973
        begin
3974
                bit2test <= imm;
3975
                if (mmm_save==3'b000) begin     // Dn
3976
                        goto(BIT2);
3977
                        d <= rfob;
3978
                end
3979
                else begin
3980
                        push(BIT2);
3981
                        // This might fetch an immediate
3982
                        // might also alter mmm
3983
                        fs_data(mmm,rrr,FETCH_BYTE,D);
3984
                end
3985
        end
3986
// ToDo: Speed this up by a clock cycle by placing the update in IFETCH.
3987
BIT2:
3988
        begin
3989
                // Targets a data register then the size is 32-bit, test is mod 32.
3990
                if (mmm_save==3'b000)
3991
                        case(sz)
3992
                        2'b00:  // BTST
3993
                                begin
3994
`ifdef SUPPORT_BITPAIRS
3995
                                        if (bit2test[7]) begin
3996
                                                zf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b00;
3997
                                                cf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b01;
3998
                                                nf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b10;
3999
                                                vf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b11;
4000
                                        end
4001
                                        else
4002
`endif
4003
                                                zf <= ~d[bit2test[4:0]];
4004
                                        ret();
4005
                                end
4006
                        2'b01:  // BCHG
4007
                                begin
4008
`ifdef SUPPORT_BITPAIRS
4009
                                        if (bit2test[7]) begin
4010
                                                zf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b00;
4011
                                                cf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b01;
4012
                                                nf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b10;
4013
                                                vf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b11;
4014
                                                resL <= d ^ (32'd3 << {bit2test[3:0],1'b0});
4015
                                        end
4016
                                        else
4017
`endif
4018
                                        begin
4019
                                                zf <= ~d[bit2test[4:0]];
4020
                                                resL <= d ^  (32'd1 << bit2test[4:0]);
4021
                                        end
4022
                                        rfwrL <= 1'b1;
4023
                                        Rt <= {1'b0,rrr};
4024
                                        ret();
4025
                                end
4026
                        2'b10:  // BCLR
4027
                                begin
4028
`ifdef SUPPORT_BITPAIRS
4029
                                        if (bit2test[7]) begin
4030
                                                zf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b00;
4031
                                                cf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b01;
4032
                                                nf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b10;
4033
                                                vf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b11;
4034
                                                resL <= d & ~(32'd3 << {bit2test[3:0],1'b0});
4035
                                        end
4036
                                        else
4037
`endif
4038
                                        begin
4039
                                                zf <= ~d[bit2test[4:0]];
4040
                                                resL <= d & ~(32'd1 << bit2test[4:0]);
4041
                                        end
4042
                                        rfwrL <= 1'b1;
4043
                                        Rt <= {1'b0,rrr};
4044
                                        ret();
4045
                                end
4046
                        2'b11:  // BSET
4047
                                begin
4048
`ifdef SUPPORT_BITPAIRS
4049
                                        if (bit2test[7]) begin
4050
                                                zf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b00;
4051
                                                cf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b01;
4052
                                                nf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b10;
4053
                                                vf <= (d >> {bit2test[3:0],1'b0} & 4'd3) == 2'b11;
4054
                                                resL <= (d & ~(32'd3 << {bit2test[3:0],1'b0})) | (bit2test[5:4] << {bit2test[3:0],1'b0});
4055
                                        end
4056
                                        else
4057
`endif
4058
                                        begin
4059
                                                zf <= ~d[bit2test[4:0]];
4060
                                                resL <= d |  (32'd1 << bit2test[4:0]);
4061
                                        end
4062
                                        rfwrL <= 1'b1;
4063
                                        Rt <= {1'b0,rrr};
4064
                                        ret();
4065
                                end
4066
                        endcase
4067
                // Target is memory, size is byte, test is mod 8.
4068
                else
4069
                        case(sz)
4070
                        2'b00:  // BTST
4071
                                begin
4072
`ifdef SUPPORT_BITPAIRS
4073
                                        if (bit2test[7]) begin
4074
                                                zf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b00;
4075
                                                cf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b01;
4076
                                                nf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b10;
4077
                                                vf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b11;
4078
                                        end
4079
                                        else
4080
`endif
4081
                                                zf <= ~d[bit2test[2:0]];
4082
                                        ret();
4083
                                end
4084
                        2'b01:  // BCHG
4085
                                begin
4086
`ifdef SUPPORT_BITPAIRS
4087
                                        if (bit2test[7]) begin
4088
                                                zf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b00;
4089
                                                cf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b01;
4090
                                                nf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b10;
4091
                                                vf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b11;
4092
                                                d <= d ^ (32'd3 << {bit2test[1:0],1'b0});
4093
                                        end
4094
                                        else
4095
`endif
4096
                                        begin
4097
                                                zf <= ~d[bit2test[2:0]];
4098
                                                d <= d ^  (32'd1 << bit2test[2:0]);
4099
                                        end
4100
                                        goto(STORE_BYTE);
4101
                                end
4102
                        2'b10:  // BCLR
4103
                                begin
4104
`ifdef SUPPORT_BITPAIRS
4105
                                        if (bit2test[7]) begin
4106
                                                zf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b00;
4107
                                                cf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b01;
4108
                                                nf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b10;
4109
                                                vf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b11;
4110
                                                d <= d & ~(32'd3 << {bit2test[1:0],1'b0});
4111
                                        end
4112
                                        else
4113
`endif
4114
                                        begin
4115
                                                zf <= ~d[bit2test[2:0]];
4116
                                                d <= d & ~(32'd1 << bit2test[2:0]);
4117
                                        end
4118
                                        goto(STORE_BYTE);
4119
                                end
4120
                        2'b11:  // BSET
4121
                                begin
4122
`ifdef SUPPORT_BITPAIRS
4123
                                        if (bit2test[7]) begin
4124
                                                zf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b00;
4125
                                                cf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b01;
4126
                                                nf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b10;
4127
                                                vf <= (d >> {bit2test[1:0],1'b0} & 4'd3) == 2'b11;
4128
                                                d <= (d & ~(32'd3 << {bit2test[1:0],1'b0})) | (bit2test[5:4] << {bit2test[1:0],1'b0});
4129
                                        end
4130
                                        else
4131
`endif
4132
                                        begin
4133
                                                zf <= ~d[bit2test[2:0]];
4134
                                                d <= d |  (32'd1 << bit2test[2:0]);
4135
                                        end
4136
                                        goto(STORE_BYTE);
4137
                                end
4138
                        endcase
4139
        end
4140
 
4141
//-----------------------------------------------------------------------------
4142
//-----------------------------------------------------------------------------
4143
CHK:
4144
        begin
4145
                if (d[15] || $signed(d[15:0]) > $signed(s[15:0])) begin
4146
                isr <= srx;
4147
                tf <= 1'b0;
4148
                sf <= 1'b1;
4149
                        vecno <= `CHK_VEC;
4150
            state <= TRAP3;
4151
                end
4152
                else
4153
                        ret();
4154
        end
4155
 
4156
//-----------------------------------------------------------------------------
4157
//-----------------------------------------------------------------------------
4158
FETCH_NOP_BYTE,FETCH_NOP_WORD,FETCH_NOP_LWORD:
4159
        ret();
4160
 
4161
FETCH_BRDISP:
4162
        begin
4163
/*
4164
                if (fnInCache(pc)) begin
4165
                        tFindInCache(pc,disp);
4166
                        goto (FETCH_BRDISP1);
4167
                end
4168
                else
4169
*/
4170
                if (!cyc_o) begin
4171
                        fc_o <= {sf,2'b10};
4172
                        cyc_o <= 1'b1;
4173
                        stb_o <= 1'b1;
4174
                        sel_o <= 4'b1111;
4175
                        adr_o <= pc;
4176
                end
4177
                else if (ack_i) begin
4178
                        cyc_o <= 1'b0;
4179
                        stb_o <= 1'b0;
4180
                        sel_o <= 4'b00;
4181
                        d <= {16'd0,iri};
4182
                        goto (FETCH_BRDISPa);
4183
                end
4184
        end
4185
FETCH_BRDISPa:
4186
        begin
4187
                // Record 'd' for bsr
4188
`ifdef SUPPORT_B24
4189
                if (ir[0]) begin
4190
                        d <= pc + {{9{ir[7]}},ir[7:1],d[15:0],1'b0};
4191
                        ea <= pc + {{9{ir[7]}},ir[7:1],d[15:0],1'b0};
4192
                end
4193
                else
4194
`endif
4195
                        d <= pc + {{16{d[15]}},d[15:0]};
4196
                        ea <= pc + {{16{d[15]}},d[15:0]};
4197
                // Want to point PC to return after displacement, it will be stacked
4198
                if (bsr)
4199
                        pc <= pc + 4'd2;
4200
                // else branch
4201
                else begin
4202
`ifdef SUPPORT_B24
4203
                        if (ir[0])
4204
                                pc <= pc + {{9{ir[7]}},ir[7:1],d[15:0],1'b0};
4205
                        else
4206
`endif
4207
                                pc <= pc + {{16{d[15]}},d[15:0]};
4208
                end
4209
                ret();
4210
        end
4211
 
4212
// Fetch 8 bit immediate
4213
//
4214
FETCH_IMM8:
4215
        if (!cyc_o) begin
4216
                fc_o <= {sf,2'b10};
4217
                cyc_o <= 1'b1;
4218
                stb_o <= 1'b1;
4219
                sel_o <= 4'b1111;
4220
                adr_o <= pc;
4221
        end
4222
        else if (ack_i) begin
4223
                cyc_o <= 1'b0;
4224
                stb_o <= 1'b0;
4225
                sel_o <= 4'b00;
4226
                imm <= {{24{iri[7]}},iri[7:0]};
4227
                if (ds==D)
4228
                        d <= {{24{iri[7]}},iri[7:0]};
4229
                else
4230
                        s <= {{24{iri[7]}},iri[7:0]};
4231
                goto (FETCH_IMM8a);
4232
        end
4233
FETCH_IMM8a:
4234
        begin
4235
                pc <= pc + 32'd2;
4236
                ret();
4237
        end
4238
 
4239
// Fetch 16 bit immediate
4240
//
4241
FETCH_IMM16:
4242
        if (!cyc_o) begin
4243
                fc_o <= {sf,2'b10};
4244
                cyc_o <= 1'b1;
4245
                stb_o <= 1'b1;
4246
                sel_o <= 4'b1111;
4247
                adr_o <= pc;
4248
        end
4249
        else if (ack_i) begin
4250
                cyc_o <= 1'b0;
4251
                stb_o <= 1'b0;
4252
                sel_o <= 4'b00;
4253
                imm <= {{16{iri[15]}},iri};
4254
                if (ds==D)
4255
                        d <= {{16{iri[15]}},iri};
4256
                else
4257
                        s <= {{16{iri[15]}},iri};
4258
                goto (FETCH_IMM16a);
4259
        end
4260
FETCH_IMM16a:
4261
        begin
4262
                pc <= pc + 32'd2;
4263
                ret();
4264
        end
4265
 
4266
// Fetch 32 bit immediate
4267
//
4268
FETCH_IMM32:
4269
        if (!cyc_o) begin
4270
                fc_o <= {sf,2'b10};
4271
                cyc_o <= 1'b1;
4272
                stb_o <= 1'b1;
4273
                sel_o <= 4'b1111;
4274
                adr_o <= pc;
4275
        end
4276
        else if (ack_i) begin
4277
                stb_o <= 1'b0;
4278
                sel_o <= 4'b00;
4279
                if (pc[1]) begin
4280
`ifdef BIG_ENDIAN
4281
                        imm[31:16] <= {dat_i[23:16],dat_i[31:24]};
4282
                        if (ds==D)
4283
                                d[31:16] <= {dat_i[23:16],dat_i[31:24]};
4284
                        else
4285
                                s[31:16] <= {dat_i[23:16],dat_i[31:24]};
4286
`else
4287
      imm[15:0] <= dat_i[31:16];
4288
      if (ds==D)
4289
        d[15:0] <= dat_i[31:16];
4290
        else
4291
        s[15:0] <= dat_i[31:16];
4292
`endif
4293
                  goto(FETCH_IMM32a);
4294
                end
4295
                else begin
4296
`ifdef BIG_ENDIAN
4297
                        imm <= rbo(dat_i);
4298
                        if (ds==D)
4299
                                d <= rbo(dat_i);
4300
                        else
4301
                                s <= rbo(dat_i);
4302
`else
4303
      imm <= dat_i;
4304
      if (ds==D)
4305
        d <= dat_i;
4306
      else
4307
        s <= dat_i;
4308
`endif
4309
                  cyc_o <= 1'b0;
4310
                  goto (FETCH_IMM32b);
4311
                end
4312
        end
4313
FETCH_IMM32a:
4314
        if (!stb_o) begin
4315
                stb_o <= 1'b1;
4316
                sel_o <= 4'b1111;
4317
                adr_o <= pc + 4'd2;
4318
        end
4319
        else if (ack_i) begin
4320
                cyc_o <= 1'b0;
4321
                stb_o <= 1'b0;
4322
                sel_o <= 4'b00;
4323
`ifdef BIG_ENDIAN
4324
                imm[15:0] <= {dat_i[7:0],dat_i[15:8]};
4325
                if (ds==D)
4326
                        d[15:0] <= {dat_i[7:0],dat_i[15:8]};
4327
                else
4328
                        s[15:0] <= {dat_i[7:0],dat_i[15:8]};
4329
`else
4330
                imm[31:16] <= dat_i[15:0];
4331
                if (ds==D)
4332
                        d[31:26] <= dat_i[15:0];
4333
                else
4334
                        s[31:26] <= dat_i[15:0];
4335
`endif
4336
                goto (FETCH_IMM32b);
4337
        end
4338
FETCH_IMM32b:
4339
        begin
4340
                pc <= pc + 32'd4;
4341
                ret();
4342
        end
4343 8 robfinch
 
4344
`ifdef SUPPORT_DECFLT
4345
FETCH_IMM96:
4346
        begin
4347
                call(FETCH_IMM32,FETCH_IMM96b);
4348
        end
4349
FETCH_IMM96b:
4350
        begin
4351
`ifdef BIG_ENDIAN
4352
                fps[95:64] <= imm;
4353
`else
4354
                fps[31: 0] <= imm;
4355
`endif
4356
                call(FETCH_IMM32,FETCH_IMM96c);
4357
        end
4358
FETCH_IMM96c:
4359
        begin
4360
`ifdef BIG_ENDIAN
4361
                fps[63:32] <= imm;
4362
`else
4363
                fps[63:32] <= imm;
4364
`endif
4365
                call(FETCH_IMM32,FETCH_IMM96d);
4366
        end
4367
FETCH_IMM96d:
4368
        begin
4369
`ifdef BIG_ENDIAN
4370
                fps[31: 0] <= imm;
4371
`else
4372
                fps[95:64] <= imm;
4373
`endif
4374
                ret();
4375
        end
4376
`endif
4377 2 robfinch
 
4378
// Fetch 32 bit displacement
4379
//
4380
FETCH_D32:
4381
        if (!cyc_o) begin
4382
                fc_o <= {sf,2'b10};
4383
                cyc_o <= 1'b1;
4384
                stb_o <= 1'b1;
4385
                sel_o <= 4'b1111;
4386
                adr_o <= pc;
4387
        end
4388
        else if (ack_i) begin
4389
    if (pc[1]) begin
4390
      stb_o <= 1'b0;
4391
      sel_o <= 4'b0000;
4392
`ifdef BIG_ENDIAN
4393
                        disp[31:16] <= {dat_i[23:16],dat_i[31:24]};
4394
`else
4395
      disp[15:0] <= dat_i[31:16];
4396
`endif
4397
                goto (FETCH_D32a);
4398
                end
4399
                else begin
4400
            cyc_o <= `LOW;
4401
      stb_o <= 1'b0;
4402
      sel_o <= 4'b0000;
4403
`ifdef BIG_ENDIAN
4404
                        disp <= rbo(dat_i);
4405
`else
4406
      disp <= dat_i;
4407
`endif
4408
      goto (FETCH_D32b);
4409
                end
4410
        end
4411
FETCH_D32a:
4412
        if (!stb_o) begin
4413
                stb_o <= 1'b1;
4414
                sel_o <= 4'b1111;
4415
                adr_o <= pc + 4'd2;
4416
        end
4417
        else if (ack_i) begin
4418
    cyc_o <= `LOW;
4419
                stb_o <= 1'b0;
4420
                sel_o <= 2'b00;
4421
`ifdef BIG_ENDIAN
4422
                disp[15:0] <= {dat_i[7:0],dat_i[15:8]};
4423
`else
4424
                disp[31:16] <= dat_i[15:0];
4425
`endif
4426
                goto (FETCH_D32b);
4427
        end
4428
FETCH_D32b:
4429
        begin
4430
                pc <= pc + 4'd4;
4431
                ea <= ea + disp;
4432
                ret();
4433
        end
4434
 
4435
// Fetch 16 bit displacement
4436
//
4437
FETCH_D16:
4438
        if (!cyc_o) begin
4439
                fc_o <= {sf,2'b10};
4440
                cyc_o <= 1'b1;
4441
                stb_o <= 1'b1;
4442
                sel_o <= 4'b1111;
4443
                adr_o <= pc;
4444
        end
4445
        else if (ack_i) begin
4446
                cyc_o <= 1'b0;
4447
                stb_o <= 1'b0;
4448
                sel_o <= 4'b0;
4449
                disp <= {{16{iri[15]}},iri};
4450
                state <= FETCH_D16a;
4451
        end
4452
FETCH_D16a:
4453
        begin
4454
                pc <= pc + 32'd2;
4455
                ea <= ea + disp;
4456
                ret();
4457
        end
4458
 
4459
// Fetch index word
4460
//
4461
FETCH_NDX:
4462
        if (!cyc_o) begin
4463
                fc_o <= {sf,2'b10};
4464
                cyc_o <= 1'b1;
4465
                stb_o <= 1'b1;
4466
                sel_o <= 4'b1111;
4467
                adr_o <= pc;
4468
        end
4469
        else if (ack_i) begin
4470
                cyc_o <= 1'b0;
4471
                stb_o <= 1'b0;
4472
                sel_o <= 2'b00;
4473
                disp <= {{24{iri[7]}},iri[7:0]};
4474
                mmm <= {2'b00,iri[15]}; // to get reg
4475
                rrr <= iri[14:12];
4476
                wl <= iri[11];
4477
                state <= FETCH_NDXa;
4478
        end
4479
FETCH_NDXa:
4480
        begin
4481
                pc <= pc + 32'd2;
4482
                if (wl)
4483
                        ea <= ea + rfob + disp;
4484
                else
4485
                        ea <= ea + {{16{rfob[15]}},rfob[15:0]} + disp;
4486
                ret();
4487
        end
4488
 
4489
FETCH_BYTE:
4490
        if (!cyc_o) begin
4491
                if (use_sfc)
4492
                        fc_o <= sfc[2:0];
4493
                else if (use_dfc)
4494
                        fc_o <= dfc[2:0];
4495
                else
4496
                        fc_o <= {sf,2'b01};
4497
                cyc_o <= `HIGH;
4498
                stb_o <= `HIGH;
4499
                adr_o <= ea;
4500
                sel_o <= 4'b1111;
4501
        end
4502
        else if (ack_i) begin
4503
                cyc_o <= `LOW;
4504
                stb_o <= `LOW;
4505
                sel_o <= 4'b0000;
4506
                if (ds==D) begin
4507
            case(ea[1:0])
4508
            2'b00:  d <= {{24{dat_i[7]}},dat_i[7:0]};
4509
            2'b01:  d <= {{24{dat_i[15]}},dat_i[15:8]};
4510
            2'b10:  d <= {{24{dat_i[23]}},dat_i[23:16]};
4511
            2'b11:  d <= {{24{dat_i[31]}},dat_i[31:24]};
4512
            default:  ;
4513
            endcase
4514
                end
4515
                else begin
4516
            case(ea[1:0])
4517
      2'b00:  s <= {{24{dat_i[7]}},dat_i[7:0]};
4518
      2'b01:  s <= {{24{dat_i[15]}},dat_i[15:8]};
4519
      2'b10:  s <= {{24{dat_i[23]}},dat_i[23:16]};
4520
      2'b11:  s <= {{24{dat_i[31]}},dat_i[31:24]};
4521
      default:    ;
4522
      endcase
4523
                end
4524
                ret();
4525
        end
4526
 
4527
// Fetch byte, but hold onto bus
4528
//
4529
LFETCH_BYTE:
4530
        if (!cyc_o) begin
4531
                if (use_sfc)
4532
                        fc_o <= sfc[2:0];
4533
                else if (use_dfc)
4534
                        fc_o <= dfc[2:0];
4535
                else
4536
                        fc_o <= {sf,2'b01};
4537
                lock_o <= `HIGH;
4538
                cyc_o <= `HIGH;
4539
                stb_o <= `HIGH;
4540
                adr_o <= ea;
4541
                sel_o <= 4'b1111;
4542
        end
4543
        else if (ack_i) begin
4544
                stb_o <= 1'b0;
4545
                sel_o <= 4'b0;
4546
                if (ds==D) begin
4547
      case(ea[1:0])
4548
      2'b00:  d <= {{24{dat_i[7]}},dat_i[7:0]};
4549
      2'b01:  d <= {{24{dat_i[15]}},dat_i[15:8]};
4550
      2'b10:  d <= {{24{dat_i[23]}},dat_i[23:16]};
4551
      2'b11:  d <= {{24{dat_i[31]}},dat_i[31:24]};
4552
      default:    ;
4553
      endcase
4554
    end
4555
    else begin
4556
      case(ea[1:0])
4557
      2'b00:  s <= {{24{dat_i[7]}},dat_i[7:0]};
4558
      2'b01:  s <= {{24{dat_i[15]}},dat_i[15:8]};
4559
      2'b10:  s <= {{24{dat_i[23]}},dat_i[23:16]};
4560
      2'b11:  s <= {{24{dat_i[31]}},dat_i[31:24]};
4561
      default:    ;
4562
      endcase
4563
    end
4564
                ret();
4565
        end
4566
 
4567
FETCH_WORD:
4568
        if (!cyc_o) begin
4569
                if (use_sfc)
4570
                        fc_o <= sfc[2:0];
4571
                else if (use_dfc)
4572
                        fc_o <= dfc[2:0];
4573
                else
4574
                        fc_o <= {sf,2'b01};
4575
                cyc_o <= `HIGH;
4576
                stb_o <= `HIGH;
4577
                adr_o <= ea;
4578
                sel_o <= 4'b1111;
4579
        end
4580
        else if (ack_i) begin
4581
                cyc_o <= 1'b0;
4582
                stb_o <= 1'b0;
4583
                sel_o <= 4'b00;
4584
`ifdef BIG_ENDIAN
4585
                if (ds==D)
4586
                  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]};
4587
                else
4588
                  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]};
4589
`else
4590
                if (ds==D)
4591
                  d <= ea[1] ? {{16{dat_i[31]}},dat_i[31:16]} : {{16{dat_i[15]}},dat_i[15:0]};
4592
                else
4593
                  s <= ea[1] ? {{16{dat_i[31]}},dat_i[31:16]} : {{16{dat_i[15]}},dat_i[15:0]};
4594
`endif
4595
                ret();
4596
        end
4597
 
4598
FETCH_LWORD:
4599
  if (!cyc_o) begin
4600
                if (use_sfc)
4601
                        fc_o <= sfc[2:0];
4602
                else if (use_dfc)
4603
                        fc_o <= dfc[2:0];
4604
                else
4605
                        fc_o <= {sf,2'b01};
4606
                cyc_o <= 1'b1;
4607
                stb_o <= 1'b1;
4608
                adr_o <= ea;
4609
                sel_o <= 4'b1111;
4610
        end
4611
        else if (ack_i) begin
4612
                stb_o <= 1'b0;
4613
                sel_o <= 4'b00;
4614
                if (ea[1]) begin
4615
`ifdef BIG_ENDIAN
4616
      if (ds==D)
4617
        d[31:16] <= {dat_i[23:16],dat_i[31:24]};
4618 8 robfinch
      else
4619 2 robfinch
        s[31:16] <= {dat_i[23:16],dat_i[31:24]};
4620
`else
4621
      if (ds==D)
4622
        d[15:0] <= dat_i[31:16];
4623 8 robfinch
      else
4624 2 robfinch
        s[15:0] <= dat_i[31:16];
4625
`endif
4626
                goto (FETCH_LWORDa);
4627
    end
4628
    else begin
4629
      cyc_o <= `LOW;
4630
`ifdef BIG_ENDIAN
4631
      if (ds==D)
4632 4 robfinch
        d <= rbo(dat_i);
4633 8 robfinch
      else
4634 4 robfinch
        s <= rbo(dat_i);
4635 2 robfinch
`else
4636
      if (ds==D)
4637 4 robfinch
        d <= dat_i;
4638 8 robfinch
      else
4639 4 robfinch
        s <= dat_i;
4640 2 robfinch
`endif
4641
      ret();
4642
    end
4643
        end
4644
FETCH_LWORDa:
4645
        if (!stb_o) begin
4646
                cyc_o <= 1'b1;
4647
                stb_o <= 1'b1;
4648
                adr_o <= adr_o + 32'd2;
4649
                sel_o <= 4'b1111;
4650
        end
4651
        else if (ack_i) begin
4652
                cyc_o <= 1'b0;
4653
                stb_o <= 1'b0;
4654
                sel_o <= 4'b00;
4655
`ifdef BIG_ENDIAN
4656
                if (ds==D)
4657
                        d[15:0] <= {dat_i[7:0],dat_i[15:8]};
4658 8 robfinch
                else
4659 2 robfinch
                        s[15:0] <= {dat_i[7:0],dat_i[15:8]};
4660
`else
4661
                if (ds==D)
4662
                        d[31:16] <= dat_i[15:0];
4663 8 robfinch
                else
4664 2 robfinch
                        s[31:16] <= dat_i[15:0];
4665
`endif
4666
                ret();
4667
        end
4668
 
4669 4 robfinch
`ifdef SUPPORT_DECFLT
4670
FETCH_HEXI1:
4671 8 robfinch
        call (FETCH_LWORD,FETCH_HEXI2);
4672
FETCH_HEXI2:
4673
        begin
4674 4 robfinch
`ifdef BIG_ENDIAN
4675
                if (ds==S)
4676 8 robfinch
                        fps[95:64] <= s;
4677 4 robfinch
                else
4678 8 robfinch
                        fpd[95:64] <= d;
4679 4 robfinch
`else
4680
                if (ds==S)
4681 8 robfinch
                        fps[31: 0] <= s;
4682 4 robfinch
                else
4683 8 robfinch
                        fpd[31: 0] <= d;
4684 4 robfinch
`endif
4685 8 robfinch
                ea <= ea + 4'd4;
4686
                call (FETCH_LWORD,FETCH_HEXI3);
4687 4 robfinch
        end
4688
FETCH_HEXI3:
4689 8 robfinch
        begin
4690 4 robfinch
`ifdef BIG_ENDIAN
4691
                if (ds==S)
4692 8 robfinch
                        fps[63:32] <= s;
4693 4 robfinch
                else
4694 8 robfinch
                        fpd[63:32] <= d;
4695 4 robfinch
`else
4696
                if (ds==S)
4697 8 robfinch
                        fps[63:32] <= s;
4698 4 robfinch
                else
4699 8 robfinch
                        fpd[63:32] <= d;
4700
`endif
4701
                ea <= ea + 4'd4;
4702
                call (FETCH_LWORD,FETCH_HEXI4);
4703 4 robfinch
        end
4704
FETCH_HEXI4:
4705 8 robfinch
        begin
4706 4 robfinch
`ifdef BIG_ENDIAN
4707
                if (ds==S)
4708 8 robfinch
                        fps[31: 0] <= s;
4709 4 robfinch
                else
4710 8 robfinch
                        fpd[31: 0] <= d;
4711 4 robfinch
`else
4712
                if (ds==S)
4713 8 robfinch
                        fps[95:64] <= s;
4714 4 robfinch
                else
4715 8 robfinch
                        fpd[95:64] <= d;
4716 4 robfinch
`endif
4717 8 robfinch
                ea <= ea - 4'd8;
4718 4 robfinch
                ret();
4719
        end
4720 2 robfinch
 
4721 4 robfinch
STORE_HEXI1:
4722 8 robfinch
        begin
4723 4 robfinch
`ifdef BIG_ENDIAN
4724 8 robfinch
                d <= fpd[95:64];
4725 4 robfinch
`else
4726 8 robfinch
                d <= fpd[31: 0];
4727 4 robfinch
`endif
4728 8 robfinch
                call (STORE_LWORD,STORE_HEXI2);
4729 4 robfinch
        end
4730 8 robfinch
STORE_HEXI2:
4731
        begin
4732 4 robfinch
`ifdef BIG_ENDIAN
4733 8 robfinch
                d <= fpd[63:32];
4734 4 robfinch
`else
4735 8 robfinch
                d <= fpd[63:32];
4736 4 robfinch
`endif
4737 8 robfinch
                ea <= ea + 4'd4;
4738
                call (STORE_LWORD,STORE_HEXI3);
4739 4 robfinch
        end
4740
STORE_HEXI3:
4741 8 robfinch
        begin
4742 4 robfinch
`ifdef BIG_ENDIAN
4743 8 robfinch
                d <= fpd[31: 0];
4744 4 robfinch
`else
4745 8 robfinch
                d <= fpd[95:32];
4746 4 robfinch
`endif
4747 8 robfinch
                ea <= ea + 4'd4;
4748
                call (STORE_LWORD,STORE_HEXI4);
4749 4 robfinch
        end
4750
STORE_HEXI4:
4751 8 robfinch
        begin
4752
                ea <= ea - 4'd8;
4753 4 robfinch
                ret();
4754
        end
4755 8 robfinch
 
4756 4 robfinch
`endif
4757
 
4758 2 robfinch
STORE_BYTE:
4759
        if (!cyc_o) begin
4760
                if (use_sfc)
4761
                        fc_o <= sfc[2:0];
4762
                else if (use_dfc)
4763
                        fc_o <= dfc[2:0];
4764
                else
4765
                        fc_o <= {sf,2'b01};
4766
                cyc_o <= 1'b1;
4767
                stb_o <= 1'b1;
4768
                we_o <= 1'b1;
4769
                adr_o <= ea;
4770
                case(ea[1:0])
4771
                2'b00:  sel_o <= 4'b0001;
4772
                2'b01:  sel_o <= 4'b0010;
4773
                2'b10:  sel_o <= 4'b0100;
4774
                2'b11:  sel_o <= 4'b1000;
4775
                endcase
4776
//              dat_o <= {4{resB[7:0]}};
4777
                dat_o <= {4{d[7:0]}};
4778
        end
4779
        else if (ack_i) begin
4780
                cyc_o <= 1'b0;
4781
                stb_o <= 1'b0;
4782
                we_o <= 1'b0;
4783
                sel_o <= 4'b0;
4784
                ret();
4785
        end
4786
 
4787
// Store byte and unlock
4788
//
4789
USTORE_BYTE:
4790
        if (!stb_o) begin
4791
                if (use_sfc)
4792
                        fc_o <= sfc[2:0];
4793
                else if (use_dfc)
4794
                        fc_o <= dfc[2:0];
4795
                else
4796
                        fc_o <= {sf,2'b01};
4797
                stb_o <= 1'b1;
4798
                we_o <= 1'b1;
4799
                adr_o <= ea;
4800
                case(ea[1:0])
4801
                2'b00:  sel_o <= 4'b0001;
4802
                2'b01:  sel_o <= 4'b0010;
4803
                2'b10:  sel_o <= 4'b0100;
4804
                2'b11:  sel_o <= 4'b1000;
4805
                endcase
4806
//              dat_o <= {4{resB[7:0]}};
4807
                dat_o <= {4{d[7:0]}};
4808
        end
4809
        else if (ack_i) begin
4810
                lock_o <= 1'b0;
4811
                cyc_o <= 1'b0;
4812
                stb_o <= 1'b0;
4813
                we_o <= 1'b0;
4814
                sel_o <= 2'b00;
4815
                ret();
4816
        end
4817
 
4818
STORE_WORD:
4819
        if (!cyc_o) begin
4820
                if (use_sfc)
4821
                        fc_o <= sfc[2:0];
4822
                else if (use_dfc)
4823
                        fc_o <= dfc[2:0];
4824
                else
4825
                        fc_o <= {sf,2'b01};
4826
                cyc_o <= 1'b1;
4827
                stb_o <= 1'b1;
4828
                we_o <= 1'b1;
4829
                adr_o <= ea;
4830
                sel_o <= ea[1] ? 4'b1100 : 4'b0011;
4831
`ifdef BIG_ENDIAN
4832
//              dat_o <= {2{resW[7:0],resW[15:8]}};
4833
                dat_o <= {2{d[7:0],d[15:8]}};
4834
`else
4835
//              dat_o <= {2{resW[15:0]}};
4836
                dat_o <= {2{d[15:0]}};
4837
`endif
4838
        end
4839
        else if (ack_i) begin
4840
                cyc_o <= 1'b0;
4841
                stb_o <= 1'b0;
4842
                we_o <= 1'b0;
4843
                sel_o <= 2'b00;
4844
                ret();
4845
        end
4846
STORE_LWORD:
4847
        if (!cyc_o) begin
4848
                if (use_sfc)
4849
                        fc_o <= sfc[2:0];
4850
                else if (use_dfc)
4851
                        fc_o <= dfc[2:0];
4852
                else
4853
                        fc_o <= {sf,2'b01};
4854
                cyc_o <= 1'b1;
4855
                stb_o <= 1'b1;
4856
                we_o <= 1'b1;
4857
                adr_o <= ea;
4858
                sel_o <= ea[1] ? 4'b1100 : 4'b1111;
4859
`ifdef BIG_ENDIAN
4860
//              dat_o <= ea[1] ? {resL[23:16],resL[31:24],resL[7:0],resL[15:8]} : rbo(resL);
4861
                dat_o <= ea[1] ? {d[23:16],d[31:24],d[7:0],d[15:8]} : rbo(d);
4862
`else
4863
//              dat_o <= ea[1] ? {resL[15:0],resL[31:16]} : resL;
4864
                dat_o <= ea[1] ? {d[15:0],d[31:16]} : d;
4865
`endif
4866
        end
4867
        else if (ack_i) begin
4868
    if (ea[1]) begin
4869
      stb_o <= 1'b0;
4870
      we_o <= 1'b0;
4871
      sel_o <= 4'b00;
4872
      state <= STORE_LWORDa;
4873
                end
4874
                else begin
4875
            cyc_o <= `LOW;
4876
      stb_o <= 1'b0;
4877
      we_o <= 1'b0;
4878
      sel_o <= 4'b00;
4879
      ret();
4880
                end
4881
        end
4882
STORE_LWORDa:
4883
        if (!stb_o) begin
4884
                stb_o <= 1'b1;
4885
                we_o <= 1'b1;
4886
                adr_o <= adr_o + 32'd2;
4887
                sel_o <= 4'b0011;
4888
        end
4889
        else if (ack_i) begin
4890
                cyc_o <= 1'b0;
4891
                stb_o <= 1'b0;
4892
                we_o <= 1'b0;
4893
                sel_o <= 4'b0000;
4894
                ret();
4895
        end
4896
 
4897
//----------------------------------------------------
4898
//----------------------------------------------------
4899
RESET:
4900
  begin
4901
    pc <= `RESET_VECTOR;
4902
    push(IFETCH);
4903
    goto(TRAP);
4904
        end
4905
 
4906
//----------------------------------------------------
4907
//----------------------------------------------------
4908
TRAP:
4909
  begin
4910
    goto (TRAP3);
4911
    /*
4912
    if (is_nmi)
4913
        vecno <= `NMI_VEC;
4914
    else
4915
    */
4916
    case(1'b1)
4917
    // group 0
4918
    is_rst:
4919
        begin
4920
                is_rst <= 1'b0;
4921
                tf <= 1'b0;
4922
                sf <= 1'b1;
4923
                im <= 3'd7;
4924
                vecno <= `RESET_VEC;
4925
                goto(TRAP6);
4926
        end
4927
    is_adr_err:
4928
        begin
4929
                isr <= srx;
4930
                tf <= 1'b0;
4931
                sf <= 1'b1;
4932
                vecno <= `ADDRERR_VEC;
4933
        goto (TRAP3);
4934
        end
4935
    is_bus_err:
4936
        begin
4937
                isr <= srx;
4938
                tf <= 1'b0;
4939
                sf <= 1'b1;
4940
                vecno <= `BUSERR_VEC;
4941
        goto (TRAP3);
4942
        end
4943
    // group 1
4944
    is_trace:
4945
        begin
4946
                isr <= srx;
4947
                tf <= 1'b0;
4948
                sf <= 1'b1;
4949
                vecno <= `TRACE_VEC;
4950
        goto (TRAP3);
4951
        end
4952
    is_irq:
4953
        begin
4954
                isr <= srx;
4955
                tf <= 1'b0;
4956
                sf <= 1'b1;
4957
        vecno <= `IRQ_VEC + ipl_i;
4958
        im <= ipl_i;
4959
        goto (INTA);
4960
        end
4961
    is_priv:
4962
        begin
4963
                isr <= srx;
4964
                tf <= 1'b0;
4965
                sf <= 1'b1;
4966
                vecno <= `PRIV_VEC;
4967
        goto (TRAP3);
4968
        end
4969
    is_illegal:
4970
        begin
4971
                isr <= srx;
4972
                tf <= 1'b0;
4973
                sf <= 1'b1;
4974
                vecno <= `ILLEGAL_VEC;
4975
        goto (TRAP3);
4976
        end
4977
    default:
4978
        begin
4979
                isr <= srx;
4980
                tf <= 1'b0;
4981
                sf <= 1'b1;
4982
        vecno <= `TRAP_VEC + ir[3:0];
4983
        end
4984
    endcase
4985
  end
4986
INTA:
4987
  if (!cyc_o) begin
4988
        fc_o <= 3'b111;
4989
    cyc_o <= `HIGH;
4990
    stb_o <= `HIGH;
4991
    sel_o <= 4'b1111;
4992
    adr_o <= {28'hFFFFFFF,ipl_i,1'b0};
4993
  end
4994
  else if (ack_i|err_i|vpa_i) begin
4995
    cyc_o <= `LOW;
4996
    stb_o <= `LOW;
4997
    sel_o <= 4'b0;
4998
    if (err_i)
4999
        vecno <= `SPURIOUS_VEC;
5000
    else if (!vpa_i)
5001
        vecno <= iri[7:0];
5002
    goto (TRAP3);
5003
  end
5004
TRAP3:
5005
        begin
5006
                // If was in user mode, capture stack pointer in usp.
5007
                if (!isr[13]) begin
5008
                        usp <= sp;
5009
                        sp <= ssp;
5010
                end
5011
`ifdef SUPPORT_010
5012
                if (is_bus_err | is_adr_err)
5013
                        goto (TRAP20);
5014
                else
5015
                        goto (TRAP3a);
5016
`else
5017
                goto (TRAP3b);
5018
`endif
5019
        end
5020
// First 16 words of internal state are stored
5021
TRAP20:
5022
        begin
5023
                sp <= sp - 6'd32;
5024
                goto (TRAP21);
5025
        end
5026
// Next instruction input buffer.
5027
TRAP21:
5028
        begin
5029
                d <= ir;
5030
                ea <= sp - 4'd2;
5031
                sp <= sp - 4'd2;
5032
                call (STORE_WORD, TRAP22);
5033
        end
5034
TRAP22:
5035
        begin
5036
                d <= dati_buf;
5037
                ea <= sp - 4'd4;
5038
                sp <= sp - 4'd4;
5039
                call (STORE_LWORD, TRAP23);
5040
        end
5041
TRAP23:
5042
        begin
5043
                d <= dato_buf;
5044
                ea <= sp - 4'd4;
5045
                sp <= sp - 4'd4;
5046
                call (STORE_LWORD, TRAP24);
5047
        end
5048
// 1 word Unused
5049
TRAP24:
5050
        begin
5051
                sp <= sp - 4'd2;
5052
                goto (TRAP25);
5053
        end
5054
TRAP25:
5055
        begin
5056
                d <= bad_addr;
5057
                ea <= sp - 4'd4;
5058
                sp <= sp - 4'd4;
5059
                call (STORE_LWORD, TRAP26);
5060
        end
5061
TRAP26:
5062
        begin
5063
                d <= mac_cycle_type;
5064
                ea <= sp - 4'd2;
5065
                sp <= sp - 4'd2;
5066
                s <= sp - 4'd2;
5067
                call (STORE_WORD, TRAP3a);
5068
        end
5069
// For the 68010 and above push the format word.
5070
TRAP3a:
5071
        begin
5072
`ifdef SUPPORT_010
5073
                if (is_bus_err|is_adr_err)
5074
                        d <= {4'b1000,2'b00,vecno,2'b00};
5075
                else
5076
                        d <= {4'b0000,2'b00,vecno,2'b00};
5077
                ea <= sp - 4'd2;
5078
                sp <= sp - 4'd2;
5079
                call (STORE_WORD, TRAP3b);
5080
`else
5081
                goto (TRAP3b);
5082
`endif
5083
        end
5084
// Push the program counter
5085
TRAP3b:
5086
        begin
5087
                d <= pc;
5088
                ea <= sp - 4'd4;
5089
                sp <= sp - 4'd4;
5090
                call (STORE_LWORD, TRAP4);
5091
        end
5092
// And the status register
5093
TRAP4:
5094
        begin
5095
                d <= isr;
5096
                ea <= sp - 4'd2;
5097
                sp <= sp - 4'd2;
5098
                s <= sp - 4'd2;
5099
`ifdef SUPPORT_010
5100
                call (STORE_WORD, TRAP7);
5101
`else
5102
                call (STORE_WORD, is_bus_err|is_adr_err?TRAP8:TRAP7);
5103
`endif
5104
        end
5105
// Push IR
5106
TRAP8:
5107
        begin
5108
                d <= ir;
5109
                ea <= sp - 4'd2;
5110
                sp <= sp - 4'd2;
5111
                is_bus_err <= 1'b0;
5112
                is_adr_err <= 1'b0;
5113
                call (STORE_WORD, TRAP9);
5114
        end
5115
// Push bad address
5116
TRAP9:
5117
        begin
5118
                d <= bad_addr;
5119
                ea <= sp - 4'd4;
5120
                sp <= sp - 4'd4;
5121
                call (STORE_LWORD, TRAP10);
5122
        end
5123
TRAP10:
5124
        begin
5125
                d <= mac_cycle_type;
5126
                ea <= sp - 4'd2;
5127
                sp <= sp - 4'd2;
5128
                s <= sp - 4'd2;
5129
                call (STORE_WORD, TRAP7);
5130
        end
5131
// Load SP from vector table
5132
TRAP6:
5133
        begin
5134
                ea <= 'd0;
5135
                ds <= S;
5136
                call (FETCH_LWORD, TRAP7);
5137
        end
5138
// Load PC from vector table.
5139
TRAP7:
5140
        begin
5141
                sp <= s;
5142
                ssp <= s;
5143
                ea <= {vbr[31:2]+vecno,2'b00};
5144
                ds <= S;
5145
                call (FETCH_LWORD, TRAP7a);
5146
        end
5147
TRAP7a:
5148
        begin
5149
                pc <= s;
5150
                ret();
5151
        end
5152
 
5153
//----------------------------------------------------
5154
//----------------------------------------------------
5155
/*
5156
JMP_VECTOR:
5157
        if (!cyc_o) begin
5158
                fc_o <= {sf,2'b01};
5159
                cyc_o <= 1'b1;
5160
                stb_o <= 1'b1;
5161
                sel_o <= 2'b11;
5162
                adr_o <= vector;
5163
        end
5164
        else if (ack_i) begin
5165
                stb_o <= 1'b0;
5166
                sel_o <= 2'b00;
5167
                pc[15:0] <= dat_i;
5168
                state <= JMP_VECTOR2;
5169
        end
5170
JMP_VECTOR2:
5171
        if (!stb_o) begin
5172
                fc_o <= {sf,2'b01};
5173
                cyc_o <= 1'b1;
5174
                stb_o <= 1'b1;
5175
                sel_o <= 2'b11;
5176
                adr_o <= adr_o + 32'd2;
5177
        end
5178
        else if (ack_i) begin
5179
                cyc_o <= 1'b0;
5180
                stb_o <= 1'b0;
5181
                sel_o <= 2'b00;
5182
                pc[31:16] <= dat_i;
5183
                state <= IFETCH;
5184
        end
5185
*/
5186
//----------------------------------------------------
5187
//----------------------------------------------------
5188
UNLNK:
5189
        begin
5190
                ds <= S;
5191
                ea <= sp;
5192
                sp <= sp + 4'd4;
5193
                call (FETCH_LWORD,UNLNK2);
5194
        end
5195
UNLNK2:
5196
        begin
5197
                rfwrL <= 1'b1;
5198
                Rt <= {1'b1,rrr};
5199
                resL <= s;
5200
                ret();
5201
        end
5202
 
5203
//----------------------------------------------------
5204
// JMP / JSR / BSR
5205
//----------------------------------------------------
5206
 
5207
JMP:
5208
        begin
5209
                pc <= ea;
5210
                ret();
5211
        end
5212
JSR:
5213
        begin
5214
                ea <= sp - 4'd4;
5215
                sp <= sp - 4'd4;
5216
                d <= pc;
5217
                pc <= ea;
5218
                goto (STORE_LWORD);
5219
        end
5220
/*
5221
        if (!cyc_o) begin
5222
                fc_o <= {sf,2'b01};
5223
                cyc_o <= 1'b1;
5224
                stb_o <= 1'b1;
5225
                we_o <= 1'b1;
5226
                sel_o <= 4'b1111;
5227
                adr_o <= sp - 32'd4;
5228
`ifdef BIG_ENDIAN
5229
                dat_o <= rbo(pc);
5230
`else
5231
                dat_o <= pc;
5232
`endif
5233
        end
5234
        else if (ack_i) begin
5235
                cyc_o <= 1'b0;
5236
                stb_o <= 1'b0;
5237
                we_o <= 1'b0;
5238
                sel_o <= 4'b00;
5239
                sp <= sp - 32'd4;
5240
                pc <= d;
5241
`ifdef SUPPORT_TASK
5242
`ifdef BIG_ENDIAN
5243
                if (d[24]) begin
5244
                        otr <= tr;
5245
                        tr <= d[29:25];
5246
        reg_copy_mask <= {d[7:0],d[15:8],d[16]};
5247
                        goto (THREAD2);
5248
    end
5249
                else
5250
                        ret();
5251
`else
5252
                if (d[0]) begin
5253
                        otr <= tr;
5254
                        tr <= d[5:1];
5255
                        reg_copy_mask <= d[31:16];
5256
                        goto (THREAD2);
5257
                end
5258
                else
5259
                        ret();
5260
`endif
5261
`else
5262
                ret();
5263
`endif
5264
        end
5265
*/
5266
 
5267
//----------------------------------------------------
5268
// RTE / RTR
5269
// Return from exception
5270
//----------------------------------------------------
5271
 
5272
RTE1:
5273
        begin
5274
                ds <= S;
5275
                ea <= sp;
5276
                sp <= sp + 4'd2;
5277
                call (FETCH_WORD,RTE2);
5278
        end
5279
RTE2:
5280
        begin
5281
                ds <= S;
5282
                ea <= sp;
5283
                sp <= sp + 4'd4;
5284
                cf <= s[0];
5285
                vf <= s[1];
5286
                zf <= s[2];
5287
                nf <= s[3];
5288
                xf <= s[4];
5289
                ccr57 <= s[7:5];
5290
                if (!rtr) begin
5291
                        im[0] <= s[8];
5292
                        im[1] <= s[9];
5293
                        im[2] <= s[10];
5294
                        sr1112 <= s[12:11];
5295
                        sf <= s[13];
5296
                        sr14 <= s[14];
5297
                        tf <= s[15];
5298
                        //pl <= s[31:24];
5299
                end
5300
                call (FETCH_LWORD,RTE3);
5301
        end
5302
RTE3:
5303
        begin
5304
                pc <= s;
5305
`ifdef SUPPORT_010
5306
                ea <= sp;
5307
                sp <= sp + 4'd2;
5308
                if (!rtr)
5309
                        call (FETCH_WORD,RTE4);
5310
                else
5311
                        ret();
5312
`else
5313
                if (!rtr && !sf) begin
5314
                        ssp <= sp;
5315
                        sp <= usp;
5316
                end
5317
                ret();
5318
`endif
5319
        end
5320
// The core might have been in supervisor mode already when the exception
5321
// occurred. Reset the working stack pointer accordingly.
5322
`ifdef SUPPORT_010
5323
RTE4:
5324
        begin
5325
                if (s[15:12]==4'b1000) begin
5326
                        ea <= sp;
5327
                        sp <= sp + 4'd2;
5328
                        call(FETCH_WORD,RTE5);
5329
                end
5330
                else begin
5331
                        if (!sf) begin
5332
                                ssp <= sp;
5333
                                sp <= usp;      // switch back to user stack
5334
                        end
5335
                        ret();
5336
                end
5337
        end
5338
RTE5:
5339
        begin
5340
                mac_cycle_type <= s;
5341
                ea <= sp;
5342
                sp <= sp + 4'd4;
5343
                call(FETCH_LWORD,RTE6);
5344
        end
5345
RTE6:
5346
        begin
5347
                bad_addr <= s;
5348
                ea <= sp;
5349
                sp <= sp + 4'd2;
5350
                call(FETCH_WORD,RTE7);
5351
        end
5352
RTE7:
5353
        begin
5354
                ea <= sp;
5355
                sp <= sp + 4'd4;
5356
                call(FETCH_LWORD,RTE8);
5357
        end
5358
RTE8:
5359
        begin
5360
                dato_buf <= s;
5361
                ea <= sp;
5362
                sp <= sp + 4'd4;
5363
                call(FETCH_LWORD,RTE9);
5364
        end
5365
RTE9:
5366
        begin
5367
                dati_buf <= s;
5368
                ea <= sp;
5369
                sp <= sp + 4'd2;
5370
                call(FETCH_WORD,RTE10);
5371
        end
5372
RTE10:
5373
        begin
5374
                ea <= sp;
5375
                sp <= sp + 6'd32;
5376
                goto (RTE11);
5377
        end
5378
RTE11:
5379
        begin
5380
                if (!sf) begin
5381
                        ssp <= sp;
5382
                        sp <= usp;      // switch back to user stack
5383
                end
5384
                ret();
5385
        end
5386
`endif
5387
 
5388
//----------------------------------------------------
5389
// Return from subroutine.
5390
//----------------------------------------------------
5391
 
5392
RTS1:
5393
        begin
5394
                pc <= s;
5395
                ret();
5396
        end
5397
 
5398
//----------------------------------------------------
5399
MOVEM_Xn2D:
5400
`ifdef OPT_PERF
5401
        if (imm[15:0]!=16'h0000) begin
5402
                push(MOVEM_Xn2D2);
5403 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
5404 2 robfinch
        end
5405
        else
5406 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
5407 2 robfinch
`else
5408
        begin
5409
                push(MOVEM_Xn2D2);
5410 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,D);
5411 2 robfinch
        end
5412
`endif
5413
MOVEM_Xn2D2:
5414
        begin
5415
                if (imm[15:0]!=16'h0000)
5416
                        state <= MOVEM_Xn2D3;
5417
                else begin
5418
                        case(mmm)
5419
                        3'b100: // -(An)
5420
                                begin
5421
                                        Rt <= {1'b1,rrr};
5422 8 robfinch
                                        resL <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5423 2 robfinch
                                        rfwrL <= 1'b1;
5424
                                end
5425
                        endcase
5426
                        ret();
5427
                end
5428
                if (mmm!=3'b100) begin
5429
                        if (imm[0]) begin
5430
                                imm[0] <= 1'b0;
5431
                                rrrr <= 4'd0;
5432 8 robfinch
                                FLTSRC <= 3'd7;
5433 2 robfinch
                        end
5434
                        else if (imm[1]) begin
5435
                                imm[1] <= 1'b0;
5436
                                rrrr <= 4'd1;
5437 8 robfinch
                                FLTSRC <= 3'd6;
5438 2 robfinch
                        end
5439
                        else if (imm[2]) begin
5440
                                imm[2] <= 1'b0;
5441
                                rrrr <= 4'd2;
5442 8 robfinch
                                FLTSRC <= 3'd5;
5443 2 robfinch
                        end
5444
                        else if (imm[3]) begin
5445
                                imm[3] <= 1'b0;
5446
                                rrrr <= 4'd3;
5447 8 robfinch
                                FLTSRC <= 3'd4;
5448 2 robfinch
                        end
5449
                        else if (imm[4]) begin
5450
                                imm[4] <= 1'b0;
5451
                                rrrr <= 4'd4;
5452 8 robfinch
                                FLTSRC <= 3'd3;
5453 2 robfinch
                        end
5454
                        else if (imm[5]) begin
5455
                                imm[5] <= 1'b0;
5456
                                rrrr <= 4'd5;
5457 8 robfinch
                                FLTSRC <= 3'd2;
5458 2 robfinch
                        end
5459
                        else if (imm[6]) begin
5460
                                imm[6] <= 1'b0;
5461
                                rrrr <= 4'd6;
5462 8 robfinch
                                FLTSRC <= 3'd1;
5463 2 robfinch
                        end
5464
                        else if (imm[7]) begin
5465
                                imm[7] <= 1'b0;
5466
                                rrrr <= 4'd7;
5467 8 robfinch
                                FLTSRC <= 3'd0;
5468 2 robfinch
                        end
5469
                        else if (imm[8]) begin
5470
                                imm[8] <= 1'b0;
5471
                                rrrr <= 4'd8;
5472
                        end
5473
                        else if (imm[9]) begin
5474
                                imm[9] <= 1'b0;
5475
                                rrrr <= 4'd9;
5476
                        end
5477
                        else if (imm[10]) begin
5478
                                imm[10] <= 1'b0;
5479
                                rrrr <= 4'd10;
5480
                        end
5481
                        else if (imm[11]) begin
5482
                                imm[11] <= 1'b0;
5483
                                rrrr <= 4'd11;
5484
                        end
5485
                        else if (imm[12]) begin
5486
                                imm[12] <= 1'b0;
5487
                                rrrr <= 4'd12;
5488
                        end
5489
                        else if (imm[13]) begin
5490
                                imm[13] <= 1'b0;
5491
                                rrrr <= 4'd13;
5492
                        end
5493
                        else if (imm[14]) begin
5494
                                imm[14] <= 1'b0;
5495
                                rrrr <= 4'd14;
5496
                        end
5497
                        else if (imm[15]) begin
5498
                                imm[15] <= 1'b0;
5499
                                rrrr <= 4'd15;
5500
                        end
5501
                end
5502
                else begin
5503
                        if (imm[0]) begin
5504
                                imm[0] <= 1'b0;
5505
                                rrrr <= 4'd15;
5506 8 robfinch
                                FLTSRC <= 3'd0;
5507 2 robfinch
                        end
5508
                        else if (imm[1]) begin
5509
                                imm[1] <= 1'b0;
5510
                                rrrr <= 4'd14;
5511 8 robfinch
                                FLTSRC <= 3'd1;
5512 2 robfinch
                        end
5513
                        else if (imm[2]) begin
5514
                                imm[2] <= 1'b0;
5515
                                rrrr <= 4'd13;
5516 8 robfinch
                                FLTSRC <= 3'd2;
5517 2 robfinch
                        end
5518
                        else if (imm[3]) begin
5519
                                imm[3] <= 1'b0;
5520
                                rrrr <= 4'd12;
5521 8 robfinch
                                FLTSRC <= 3'd3;
5522 2 robfinch
                        end
5523
                        else if (imm[4]) begin
5524
                                imm[4] <= 1'b0;
5525
                                rrrr <= 4'd11;
5526 8 robfinch
                                FLTSRC <= 3'd4;
5527 2 robfinch
                        end
5528
                        else if (imm[5]) begin
5529
                                imm[5] <= 1'b0;
5530
                                rrrr <= 4'd10;
5531 8 robfinch
                                FLTSRC <= 3'd5;
5532 2 robfinch
                        end
5533
                        else if (imm[6]) begin
5534
                                imm[6] <= 1'b0;
5535
                                rrrr <= 4'd9;
5536 8 robfinch
                                FLTSRC <= 3'd6;
5537 2 robfinch
                        end
5538
                        else if (imm[7]) begin
5539
                                imm[7] <= 1'b0;
5540
                                rrrr <= 4'd8;
5541 8 robfinch
                                FLTSRC <= 3'd7;
5542 2 robfinch
                        end
5543
                        else if (imm[8]) begin
5544
                                imm[8] <= 1'b0;
5545
                                rrrr <= 4'd7;
5546
                        end
5547
                        else if (imm[9]) begin
5548
                                imm[9] <= 1'b0;
5549
                                rrrr <= 4'd6;
5550
                        end
5551
                        else if (imm[10]) begin
5552
                                imm[10] <= 1'b0;
5553
                                rrrr <= 4'd5;
5554
                        end
5555
                        else if (imm[11]) begin
5556
                                imm[11] <= 1'b0;
5557
                                rrrr <= 4'd4;
5558
                        end
5559
                        else if (imm[12]) begin
5560
                                imm[12] <= 1'b0;
5561
                                rrrr <= 4'd3;
5562
                        end
5563
                        else if (imm[13]) begin
5564
                                imm[13] <= 1'b0;
5565
                                rrrr <= 4'd2;
5566
                        end
5567
                        else if (imm[14]) begin
5568
                                imm[14] <= 1'b0;
5569
                                rrrr <= 4'd1;
5570
                        end
5571
                        else if (imm[15]) begin
5572
                                imm[15] <= 1'b0;
5573
                                rrrr <= 4'd0;
5574
                        end
5575
                end
5576
        end
5577
MOVEM_Xn2D3:
5578
        begin
5579
                resL <= rfoRnn;
5580
                resW <= rfoRnn[15:0];
5581 8 robfinch
                if (fmovem)
5582
                        fpd <= rfoFpsrc;
5583
                else
5584
                        d <= rfoRnn;
5585 2 robfinch
                ds <= D;
5586 8 robfinch
                call(fmovem ? STORE_HEXI1 : ir[6] ? STORE_LWORD : STORE_WORD,MOVEM_Xn2D4);
5587 2 robfinch
        end
5588
MOVEM_Xn2D4:
5589
        begin
5590
                case(mmm)
5591 8 robfinch
                // ea is updated by STORE_HEXI1, incremented by 8
5592
                3'b011: ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5593
                3'b100: ea <= ea - (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5594 2 robfinch
                default:
5595 8 robfinch
                        ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5596 2 robfinch
                endcase
5597
                if (imm[15:0]!=16'h0000)
5598
                        state <= MOVEM_Xn2D3;
5599
                else begin
5600
                        case(mmm)
5601
                        3'b011:
5602
                                begin
5603
                                        Rt <= {1'b1,rrr};
5604 8 robfinch
                                        resL <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5605 2 robfinch
                                        rfwrL <= 1'b1;
5606
                                end
5607
                        3'b100:
5608
                                begin
5609
                                        Rt <= {1'b1,rrr};
5610
                                        resL <= ea;
5611
                                        rfwrL <= 1'b1;
5612
                                end
5613
                        endcase
5614
                        ret();
5615
                end
5616
                if (mmm!=3'b100) begin
5617
                        if (imm[0]) begin
5618
                                imm[0] <= 1'b0;
5619
                                rrrr <= 4'd0;
5620 8 robfinch
                                FLTSRC <= 3'd7;
5621 2 robfinch
                        end
5622
                        else if (imm[1]) begin
5623
                                imm[1] <= 1'b0;
5624
                                rrrr <= 4'd1;
5625 8 robfinch
                                FLTSRC <= 3'd6;
5626 2 robfinch
                        end
5627
                        else if (imm[2]) begin
5628
                                imm[2] <= 1'b0;
5629
                                rrrr <= 4'd2;
5630 8 robfinch
                                FLTSRC <= 3'd5;
5631 2 robfinch
                        end
5632
                        else if (imm[3]) begin
5633
                                imm[3] <= 1'b0;
5634
                                rrrr <= 4'd3;
5635 8 robfinch
                                FLTSRC <= 3'd4;
5636 2 robfinch
                        end
5637
                        else if (imm[4]) begin
5638
                                imm[4] <= 1'b0;
5639
                                rrrr <= 4'd4;
5640 8 robfinch
                                FLTSRC <= 3'd3;
5641 2 robfinch
                        end
5642
                        else if (imm[5]) begin
5643
                                imm[5] <= 1'b0;
5644
                                rrrr <= 4'd5;
5645 8 robfinch
                                FLTSRC <= 3'd2;
5646 2 robfinch
                        end
5647
                        else if (imm[6]) begin
5648
                                imm[6] <= 1'b0;
5649
                                rrrr <= 4'd6;
5650 8 robfinch
                                FLTSRC <= 3'd1;
5651 2 robfinch
                        end
5652
                        else if (imm[7]) begin
5653
                                imm[7] <= 1'b0;
5654
                                rrrr <= 4'd7;
5655 8 robfinch
                                FLTSRC <= 3'd0;
5656 2 robfinch
                        end
5657
                        else if (imm[8]) begin
5658
                                imm[8] <= 1'b0;
5659
                                rrrr <= 4'd8;
5660
                        end
5661
                        else if (imm[9]) begin
5662
                                imm[9] <= 1'b0;
5663
                                rrrr <= 4'd9;
5664
                        end
5665
                        else if (imm[10]) begin
5666
                                imm[10] <= 1'b0;
5667
                                rrrr <= 4'd10;
5668
                        end
5669
                        else if (imm[11]) begin
5670
                                imm[11] <= 1'b0;
5671
                                rrrr <= 4'd11;
5672
                        end
5673
                        else if (imm[12]) begin
5674
                                imm[12] <= 1'b0;
5675
                                rrrr <= 4'd12;
5676
                        end
5677
                        else if (imm[13]) begin
5678
                                imm[13] <= 1'b0;
5679
                                rrrr <= 4'd13;
5680
                        end
5681
                        else if (imm[14]) begin
5682
                                imm[14] <= 1'b0;
5683
                                rrrr <= 4'd14;
5684
                        end
5685
                        else if (imm[15]) begin
5686
                                imm[15] <= 1'b0;
5687
                                rrrr <= 4'd15;
5688
                        end
5689
                end
5690
                else begin
5691
                        if (imm[0]) begin
5692
                                imm[0] <= 1'b0;
5693
                                rrrr <= 4'd15;
5694 8 robfinch
                                FLTSRC <= 3'd0;
5695 2 robfinch
                        end
5696
                        else if (imm[1]) begin
5697
                                imm[1] <= 1'b0;
5698
                                rrrr <= 4'd14;
5699 8 robfinch
                                FLTSRC <= 3'd1;
5700 2 robfinch
                        end
5701
                        else if (imm[2]) begin
5702
                                imm[2] <= 1'b0;
5703
                                rrrr <= 4'd13;
5704 8 robfinch
                                FLTSRC <= 3'd2;
5705 2 robfinch
                        end
5706
                        else if (imm[3]) begin
5707
                                imm[3] <= 1'b0;
5708
                                rrrr <= 4'd12;
5709 8 robfinch
                                FLTSRC <= 3'd3;
5710 2 robfinch
                        end
5711
                        else if (imm[4]) begin
5712
                                imm[4] <= 1'b0;
5713
                                rrrr <= 4'd11;
5714 8 robfinch
                                FLTSRC <= 3'd4;
5715 2 robfinch
                        end
5716
                        else if (imm[5]) begin
5717
                                imm[5] <= 1'b0;
5718
                                rrrr <= 4'd10;
5719 8 robfinch
                                FLTSRC <= 3'd5;
5720 2 robfinch
                        end
5721
                        else if (imm[6]) begin
5722
                                imm[6] <= 1'b0;
5723
                                rrrr <= 4'd9;
5724 8 robfinch
                                FLTSRC <= 3'd6;
5725 2 robfinch
                        end
5726
                        else if (imm[7]) begin
5727
                                imm[7] <= 1'b0;
5728
                                rrrr <= 4'd8;
5729 8 robfinch
                                FLTSRC <= 3'd7;
5730 2 robfinch
                        end
5731
                        else if (imm[8]) begin
5732
                                imm[8] <= 1'b0;
5733
                                rrrr <= 4'd7;
5734
                        end
5735
                        else if (imm[9]) begin
5736
                                imm[9] <= 1'b0;
5737
                                rrrr <= 4'd6;
5738
                        end
5739
                        else if (imm[10]) begin
5740
                                imm[10] <= 1'b0;
5741
                                rrrr <= 4'd5;
5742
                        end
5743
                        else if (imm[11]) begin
5744
                                imm[11] <= 1'b0;
5745
                                rrrr <= 4'd4;
5746
                        end
5747
                        else if (imm[12]) begin
5748
                                imm[12] <= 1'b0;
5749
                                rrrr <= 4'd3;
5750
                        end
5751
                        else if (imm[13]) begin
5752
                                imm[13] <= 1'b0;
5753
                                rrrr <= 4'd2;
5754
                        end
5755
                        else if (imm[14]) begin
5756
                                imm[14] <= 1'b0;
5757
                                rrrr <= 4'd1;
5758
                        end
5759
                        else if (imm[15]) begin
5760
                                imm[15] <= 1'b0;
5761
                                rrrr <= 4'd0;
5762
                        end
5763
                end
5764
        end
5765
 
5766
//----------------------------------------------------
5767
MOVEM_s2Xn:
5768
`ifdef OPT_PERF
5769
        if (imm[15:0]!=16'h0000) begin
5770
                push(MOVEM_s2Xn2);
5771 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
5772 2 robfinch
        end
5773
        else
5774 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
5775 2 robfinch
`else
5776
        begin
5777
                push(MOVEM_s2Xn2);
5778 8 robfinch
                fs_data(mmm,rrr,fmovem ? FETCH_NOP_HEXI : ir[6] ? FETCH_NOP_LWORD : FETCH_NOP_WORD,S);
5779 2 robfinch
        end
5780
`endif
5781
MOVEM_s2Xn2:
5782
        if (imm[15:0] != 16'h0000) begin
5783
                ds <= S;
5784 8 robfinch
                call(fmovem ? FETCH_HEXI1 : ir[6] ? FETCH_LWORD : FETCH_WORD,MOVEM_s2Xn3);
5785 2 robfinch
        end
5786
        else begin
5787
                case(mmm)
5788
                3'b011: // (An)+
5789
                        begin
5790
                                Rt <= {1'b1,rrr};
5791
                                resL <= ea;
5792
                                rfwrL <= 1'b1;
5793
                        end
5794
                3'b100: // -(An)
5795
                        begin
5796
                                Rt <= {1'b1,rrr};
5797 8 robfinch
                                resL <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5798 2 robfinch
                                rfwrL <= 1'b1;
5799
                        end
5800
                endcase
5801
                ret();
5802
        end
5803
MOVEM_s2Xn3:
5804
        begin
5805
                case(mmm)
5806 8 robfinch
                3'b011: ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5807
                3'b100: ea <= ea - (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5808 2 robfinch
                default:
5809 8 robfinch
                        ea <= ea + (fmovem ? 32'd12 : ir[6] ? 32'd4 : 32'd2);
5810 2 robfinch
                endcase
5811
                goto (MOVEM_s2Xn2);
5812
                // Another bizzare gotcha. Word values moved to a data register are sign
5813
                // extended to long-word width.
5814
                rfwrL <= 1'b1;
5815
                if (ir[6])
5816
                        resL <= s;
5817
                else
5818
                        resL <= {{16{s[15]}},s[15:0]};
5819 8 robfinch
                resF <= fps;
5820 2 robfinch
                if (mmm!=3'b100) begin
5821
                        if (imm[0]) begin
5822
                                imm[0] <= 1'b0;
5823 8 robfinch
                                Rt <= 4'd0 ^ {3{fmovem}};
5824 2 robfinch
                        end
5825
                        else if (imm[1]) begin
5826
                                imm[1] <= 1'b0;
5827 8 robfinch
                                Rt <= 4'd1 ^ {3{fmovem}};
5828 2 robfinch
                        end
5829
                        else if (imm[2]) begin
5830
                                imm[2] <= 1'b0;
5831 8 robfinch
                                Rt <= 4'd2 ^ {3{fmovem}};
5832 2 robfinch
                        end
5833
                        else if (imm[3]) begin
5834
                                imm[3] <= 1'b0;
5835 8 robfinch
                                Rt <= 4'd3 ^ {3{fmovem}};
5836 2 robfinch
                        end
5837
                        else if (imm[4]) begin
5838
                                imm[4] <= 1'b0;
5839 8 robfinch
                                Rt <= 4'd4 ^ {3{fmovem}};
5840 2 robfinch
                        end
5841
                        else if (imm[5]) begin
5842
                                imm[5] <= 1'b0;
5843 8 robfinch
                                Rt <= 4'd5 ^ {3{fmovem}};
5844 2 robfinch
                        end
5845
                        else if (imm[6]) begin
5846
                                imm[6] <= 1'b0;
5847 8 robfinch
                                Rt <= 4'd6 ^ {3{fmovem}};
5848 2 robfinch
                        end
5849
                        else if (imm[7]) begin
5850
                                imm[7] <= 1'b0;
5851 8 robfinch
                                Rt <= 4'd7 ^ {3{fmovem}};
5852 2 robfinch
                        end
5853
                        else if (imm[8]) begin
5854
                                imm[8] <= 1'b0;
5855
                                Rt <= 4'd8;
5856
                        end
5857
                        else if (imm[9]) begin
5858
                                imm[9] <= 1'b0;
5859
                                Rt <= 4'd9;
5860
                        end
5861
                        else if (imm[10]) begin
5862
                                imm[10] <= 1'b0;
5863
                                Rt <= 4'd10;
5864
                        end
5865
                        else if (imm[11]) begin
5866
                                imm[11] <= 1'b0;
5867
                                Rt <= 4'd11;
5868
                        end
5869
                        else if (imm[12]) begin
5870
                                imm[12] <= 1'b0;
5871
                                Rt <= 4'd12;
5872
                        end
5873
                        else if (imm[13]) begin
5874
                                imm[13] <= 1'b0;
5875
                                Rt <= 4'd13;
5876
                        end
5877
                        else if (imm[14]) begin
5878
                                imm[14] <= 1'b0;
5879
                                Rt <= 4'd14;
5880
                        end
5881
                        else if (imm[15]) begin
5882
                                imm[15] <= 1'b0;
5883
                                Rt <= 4'd15;
5884
                        end
5885
                end
5886
                else begin
5887
                        if (imm[0]) begin
5888
                                imm[0] <= 1'b0;
5889 8 robfinch
                                Rt <= 4'd15 ^ {4{fmovem}};
5890 2 robfinch
                        end
5891
                        else if (imm[1]) begin
5892
                                imm[1] <= 1'b0;
5893 8 robfinch
                                Rt <= 4'd14 ^ {4{fmovem}};
5894 2 robfinch
                        end
5895
                        else if (imm[2]) begin
5896
                                imm[2] <= 1'b0;
5897 8 robfinch
                                Rt <= 4'd13 ^ {4{fmovem}};
5898 2 robfinch
                        end
5899
                        else if (imm[3]) begin
5900
                                imm[3] <= 1'b0;
5901 8 robfinch
                                Rt <= 4'd12 ^ {4{fmovem}};
5902 2 robfinch
                        end
5903
                        else if (imm[4]) begin
5904
                                imm[4] <= 1'b0;
5905 8 robfinch
                                Rt <= 4'd11 ^ {4{fmovem}};
5906 2 robfinch
                        end
5907
                        else if (imm[5]) begin
5908
                                imm[5] <= 1'b0;
5909 8 robfinch
                                Rt <= 4'd10 ^ {4{fmovem}};
5910 2 robfinch
                        end
5911
                        else if (imm[6]) begin
5912
                                imm[6] <= 1'b0;
5913 8 robfinch
                                Rt <= 4'd9 ^ {4{fmovem}};
5914 2 robfinch
                        end
5915
                        else if (imm[7]) begin
5916
                                imm[7] <= 1'b0;
5917 8 robfinch
                                Rt <= 4'd8 ^ {4{fmovem}};
5918 2 robfinch
                        end
5919
                        else if (imm[8]) begin
5920
                                imm[8] <= 1'b0;
5921
                                Rt <= 4'd7;
5922
                        end
5923
                        else if (imm[9]) begin
5924
                                imm[9] <= 1'b0;
5925
                                Rt <= 4'd6;
5926
                        end
5927
                        else if (imm[10]) begin
5928
                                imm[10] <= 1'b0;
5929
                                Rt <= 4'd5;
5930
                        end
5931
                        else if (imm[11]) begin
5932
                                imm[11] <= 1'b0;
5933
                                Rt <= 4'd4;
5934
                        end
5935
                        else if (imm[12]) begin
5936
                                imm[12] <= 1'b0;
5937
                                Rt <= 4'd3;
5938
                        end
5939
                        else if (imm[13]) begin
5940
                                imm[13] <= 1'b0;
5941
                                Rt <= 4'd2;
5942
                        end
5943
                        else if (imm[14]) begin
5944
                                imm[14] <= 1'b0;
5945
                                Rt <= 4'd1;
5946
                        end
5947
                        else if (imm[15]) begin
5948
                                imm[15] <= 1'b0;
5949
                                Rt <= 4'd0;
5950
                        end
5951
                end
5952
        end
5953
//----------------------------------------------------
5954
RETSTATE:
5955
        ret();
5956
 
5957
//------------------------------------------------------------------------------
5958
//------------------------------------------------------------------------------
5959
MOVEP:
5960
        if (!cyc_o) begin
5961
                cyc_o <= `HIGH;
5962
                stb_o <= `HIGH;
5963
                we_o <= ir[7];
5964
                casez({ir[7],ea[1:0]})
5965
                3'b0??: sel_o <= 4'b1111;
5966
                3'b100: sel_o <= 4'b0001;
5967
                3'b101: sel_o <= 4'b0010;
5968
                3'b110: sel_o <= 4'b0100;
5969
                3'b111: sel_o <= 4'b1000;
5970
                endcase
5971
                adr_o <= ea;
5972
                if (ir[6])
5973
                        dat_o <= {4{rfoDn[31:24]}};
5974
                else
5975
                        dat_o <= {4{rfoDn[15:8]}};
5976
        end
5977
        else if (ack_i) begin
5978
                stb_o <= `LOW;
5979
                if (ir[6])
5980
                        resL[31:24] <= dat_i >> {ea[1:0],3'b0};
5981
                else
5982
                        resW[15:8] <= dat_i >> {ea[1:0],3'b0};
5983
                goto (MOVEP1);
5984
        end
5985
MOVEP1:
5986
        if (!stb_o) begin
5987
                stb_o <= `HIGH;
5988
                we_o <= ir[7];
5989
                casez({ir[7],~ea[1],ea[0]})
5990
                3'b0??: sel_o <= 4'b1111;
5991
                3'b100: sel_o <= 4'b0001;
5992
                3'b101: sel_o <= 4'b0010;
5993
                3'b110: sel_o <= 4'b0100;
5994
                3'b111: sel_o <= 4'b1000;
5995
                endcase
5996
                adr_o <= ea + 4'd2;
5997
                if (ir[6])
5998
                        dat_o <= {4{rfoDn[23:16]}};
5999
                else
6000
                        dat_o <= {4{rfoDn[7:0]}};
6001
        end
6002
        else if (ack_i) begin
6003
                stb_o <= `LOW;
6004
                if (ir[6])
6005
                        resL[23:16] <= dat_i >> {ea[1:0]+4'd2,3'b0};
6006
                else
6007
                        resW[7:0] <= dat_i >> {ea[1:0]+4'd2,3'b0};
6008
                Rt <= {1'b0,DDD};
6009
                if (ir[6])
6010
                        goto (MOVEP2);
6011
                else begin
6012
                        cyc_o <= `LOW;
6013
                        we_o <= `LOW;
6014
                        sel_o <= 4'h0;
6015
                        rfwrW <= ~ir[7];
6016
                        ret();
6017
                end
6018
        end
6019
MOVEP2:
6020
        if (!stb_o) begin
6021
                stb_o <= `HIGH;
6022
                we_o <= ir[7];
6023
                casez({ir[7],ea[1:0]})
6024
                3'b0??: sel_o <= 4'b1111;
6025
                3'b100: sel_o <= 4'b0001;
6026
                3'b101: sel_o <= 4'b0010;
6027
                3'b110: sel_o <= 4'b0100;
6028
                3'b111: sel_o <= 4'b1000;
6029
                endcase
6030
                adr_o <= ea + 4'd4;
6031
                dat_o <= {4{rfoDn[15:8]}};
6032
        end
6033
        else if (ack_i) begin
6034
                stb_o <= `LOW;
6035
                resL[15:8] <= dat_i >> {ea[1:0],3'b0};
6036
                goto (MOVEP3);
6037
        end
6038
MOVEP3:
6039
        if (!stb_o) begin
6040
                stb_o <= `HIGH;
6041
                we_o <= ir[7];
6042
                casez({ir[7],~ea[1],ea[0]})
6043
                3'b0??: sel_o <= 4'b1111;
6044
                3'b100: sel_o <= 4'b0001;
6045
                3'b101: sel_o <= 4'b0010;
6046
                3'b110: sel_o <= 4'b0100;
6047
                3'b111: sel_o <= 4'b1000;
6048
                endcase
6049
                adr_o <= ea + 4'd6;
6050
                dat_o <= {4{rfoDn[7:0]}};
6051
        end
6052
        else if (ack_i) begin
6053
                cyc_o <= `LOW;
6054
                stb_o <= `LOW;
6055
                we_o <= `LOW;
6056
                sel_o <= 4'h0;
6057
                resL[7:0] <= dat_i >> {ea[1:0]+4'd2,3'b0};
6058
                Rt <= {1'b0,DDD};
6059
                rfwrL <= ~ir[7];
6060
                ret();
6061
        end
6062
 
6063
 
6064
FSDATA2:
6065
        fs_data2(mmmx,rrrx,sz_state,dsix);
6066
 
6067
// On a retry, wait some random number of cycle before retrying the bus
6068
// operation.
6069
`ifdef SUPPORT_RETRY
6070
RETRY:
6071
        begin
6072
                cnt <= {lfsr_o[3:0] + 4'd8};
6073
                goto (RETRY2);
6074
        end
6075
RETRY2:
6076
        begin
6077
                cnt <= cnt - 2'd1;
6078
                if (cnt=='d0)
6079
                        goto (rstate);
6080
        end
6081
`endif
6082
 
6083
MOVERn2Rc:
6084
        begin
6085
                rrrr <= imm[15:12];
6086
                goto (MOVERn2Rc2);
6087
        end
6088
MOVERn2Rc2:
6089
        case(imm[11:0])
6090
        12'h000:        begin sfc <= rfoRnn; ret(); end
6091
        12'h001:        begin dfc <= rfoRnn; ret(); end
6092 3 robfinch
        12'h003:  begin asid <= rfoRnn[7:0]; ret(); end
6093
        12'h010:  begin apc <= rfoRnn; ret(); end
6094
        12'h011:  begin cpl <= rfoRnn[7:0]; ret(); end
6095
        12'h012:  begin tr <= rfoRnn; ret(); end
6096
        12'h013:  begin tcba <= rfoRnn; ret(); end
6097
        12'h014:        begin mmus <= rfoRnn; ret(); end
6098
        12'h015:        begin ios <= rfoRnn; ret(); end
6099
        12'h016:        begin iops <= rfoRnn; ret(); end
6100 8 robfinch
        12'h020:        begin canary <= rfoRnn; ret(); end
6101 2 robfinch
        12'h800:        begin usp <= rfoRnn; ret(); end
6102
        12'h801:        begin vbr <= rfoRnn; ret(); end
6103
/*
6104
        12'hFE1:
6105
                begin
6106
                        cf <= rfoRnn[0];
6107
                        vf <= rfoRnn[1];
6108
                        zf <= rfoRnn[2];
6109
                        nf <= rfoRnn[3];
6110
                        xf <= rfoRnn[4];
6111
                        ccr57 <= rfoRnn[7:5];
6112
                        if (!rtr) begin
6113
                                im[0] <= rfoRnn[8];
6114
                                im[1] <= rfoRnn[9];
6115
                                im[2] <= rfoRnn[10];
6116
                                sr1112 <= rfoRnn[12:11];
6117
                                sf <= rfoRnn[13];
6118
                                sr14 <= rfoRnn[14];
6119
                                tf <= rfoRnn[15];
6120
                                //pl <= rfoRnn[31:24];
6121
                        end
6122
//                      tr <= rfoRnn[23:16];
6123
//                      pl <= rfoRnn[31:24];
6124
                end
6125
*/
6126
        default:        tIllegal();
6127
        endcase
6128
MOVERc2Rn:
6129
        case(imm[11:0])
6130
        12'h000:        begin resL <= sfc; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6131
        12'h001:        begin resL <= dfc; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6132
        12'h003:  begin resL <= {24'h0,asid}; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6133
        12'h010:  begin resL <= apc; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6134
        12'h011:  begin resL <= {24'h0,cpl}; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6135
        12'h012:  begin resL <= tr; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6136
        12'h013:  begin resL <= tcba; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6137
        12'h014:  begin resL <= mmus; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6138
        12'h015:  begin resL <= ios; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6139
        12'h016:  begin resL <= iops; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6140 8 robfinch
        12'h020:  begin resL <= canary; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6141 2 robfinch
        12'h800:        begin resL <= usp; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6142
        12'h801:        begin resL <= vbr; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6143
        12'hFE0:        begin resL <= coreno_i; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6144
//      12'hFE1:        begin resL <= srx; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6145
        12'hFF0:        begin resL <= tick; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6146
        12'hFF8:        begin resL <= icnt; Rt <= imm[15:12]; rfwrL <= 1'b1; ret(); end
6147
        default:        tIllegal();
6148
        endcase
6149
 
6150
BIN2BCD1:
6151
        goto (BIN2BCD2);
6152
BIN2BCD2:
6153
        if (dd32done) begin
6154
                zf <= dd32in==32'h0;
6155
                vf <= dd32out[39:32]!=8'h00;
6156
                resL <= dd32out[31:0];
6157
                rfwrL <= 1'b1;
6158
                Rt <= {1'b0,rrr};
6159
                ret();
6160
        end
6161
BCD2BIN1:
6162
        begin
6163
                (* USE_DSP = "no" *)
6164
                resL1 <= d[3:0] +
6165
                     d[7:4] * 4'd10 +
6166
                     d[11:8] * 7'd100 +
6167
                     d[15:12] * 10'd1000 +
6168
                     d[19:16] * 14'd10000 +
6169
                     d[23:20] * 17'd100000 +
6170
                     d[27:24] * 20'd1000000 +
6171
                     d[31:28] * 24'd10000000
6172
                     ;
6173
                goto (BCD2BIN2);
6174
        end
6175
BCD2BIN2:
6176
        begin
6177
                resL2 <= resL1;
6178
                goto (BCD2BIN3);
6179
        end
6180
BCD2BIN3:
6181
        begin
6182
                resL <= resL2;
6183
                rfwrL <= 1'b1;
6184
                Rt <= {1'b0,rrr};
6185
                ret();
6186
        end
6187 8 robfinch
CCHK:
6188
        begin
6189
                if (s != canary) begin
6190
                isr <= srx;
6191
                tf <= 1'b0;
6192
                sf <= 1'b1;
6193
                        vecno <= `CHK_VEC;
6194
            goto (TRAP3);
6195
                end
6196
                else
6197
                        ret();
6198
        end
6199 4 robfinch
`ifdef SUPPORT_DECFLT
6200
FADD:
6201
        begin
6202
                fpcnt <= fpcnt + 2'd1;
6203
                if (fpcnt==8'd50) begin
6204
                        if (DECFLT) begin
6205
                                fzf <= dfaddsubo[94:0]==95'd0;
6206
                                fnf <= dfaddsubo[95];
6207
                                fvf <= dfaddsubo[94:90]==5'b11110;
6208
                                fnanf <= dfaddsubo[94:90]==5'b11111;
6209
                                resF <= dfaddsubo;
6210
                                Rt <= {1'b0,FLTDST};
6211
                                rfwrF <= 1'b1;
6212
                        end
6213
                        ret();
6214
                end
6215
        end
6216
FSCALE:
6217
        begin
6218
                fpcnt <= fpcnt + 2'd1;
6219
                if (fpcnt==8'd3) begin
6220
                        if (DECFLT) begin
6221
                                fzf <= dfscaleo[94:0]==95'd0;
6222
                                fnf <= dfscaleo[95];
6223
                                fvf <= dfscaleo[94:90]==5'b11110;
6224
                                fnanf <= dfscaleo[94:90]==5'b11111;
6225
                                resF <= dfscaleo;
6226
                                Rt <= {1'b0,FLTDST};
6227
                                rfwrF <= 1'b1;
6228
                        end
6229
                        ret();
6230
                end
6231
        end
6232 8 robfinch
FNEG:   // Also FABS
6233 4 robfinch
        begin
6234
                if (DECFLT) begin
6235 8 robfinch
                        resF <= {~fps[95] & ~fabs,fps[94:0]};
6236 4 robfinch
                        fzf <= fps[94:0]==95'd0;
6237 8 robfinch
                        fnf <= ~fps[95] & ~fabs;
6238 4 robfinch
                        Rt <= {1'b0,FLTDST};
6239
                        rfwrF <= 1'b1;
6240
                end
6241
                ret();
6242
        end
6243
FMUL1:
6244
        goto (FMUL2);
6245
FMUL2:
6246
        if (DECFLT) begin
6247
                if (dfmuldone) begin
6248
                        fzf <= dfmulo[94:0]==95'd0;
6249
                        fnf <= dfmulo[95];
6250
                        fvf <= dfmulo[94:90]==5'b11110;
6251
                        fnanf <= dfmulo[94:90]==5'b11111;
6252
                        resF <= dfmulo;
6253
                        Rt <= {1'b0,FLTDST};
6254
                        rfwrF <= 1'b1;
6255
                        ret();
6256
                end
6257
        end
6258
        else
6259
                ret();
6260 8 robfinch
        // For divide the done signal may take several cycles to go inactive after
6261
        // the load signal is activated. Prevent a premature recognition of done
6262
        // using a counter.
6263 4 robfinch
FDIV1:
6264 8 robfinch
        begin
6265
                fpcnt <= fpcnt + 2'd1;
6266
                if (fpcnt == 8'd50)
6267
                        goto (FDIV2);
6268
        end
6269 4 robfinch
FDIV2:
6270
        if (dfdivdone) begin
6271
                if (DECFLT) begin
6272
                        fzf <= dfdivo[94:0]==95'd0;
6273
                        fnf <= dfdivo[95];
6274
                        fvf <= dfdivo[94:90]==5'b11110;
6275
                        fnanf <= dfdivo[94:90]==5'b11111;
6276
                        resF <= dfdivo;
6277
                        Rt <= {1'b0,FLTDST};
6278
                        rfwrF <= 1'b1;
6279 6 robfinch
                        quotient_bits <= {dfdivo[95],dfdivo[6:0]};
6280
                        quotient_bitshi <= {dfdivo[9:7]};
6281 4 robfinch
                end
6282
                ret();
6283
        end
6284
FCMP:
6285
        begin
6286
                if (DECFLT) begin
6287
                        fzf <= dfcmpo[0];
6288
                        fnf <= dfcmpo[1];
6289
                        fvf <= 1'b0;
6290
                        fnanf <= dfcmpo[4];
6291
                end
6292
                ret();
6293
        end
6294
FMOVE:
6295
        begin
6296
                if (DECFLT) begin
6297 8 robfinch
                        if (ir2[14])
6298
                                case(ir2[12:10])
6299
                                3'b000:
6300
                                        begin
6301
                                                fps <= {64'd0,s};
6302
                                                goto (I2DF1);
6303
                                        end
6304
                                3'b100:
6305
                                        begin
6306
                                                fps <= {80'd0,s[15:0]};
6307
                                                goto (I2DF1);
6308
                                        end
6309
                                3'b110:
6310
                                        begin
6311
                                                fps <= {88'd0,s[7:0]};
6312
                                                goto (I2DF1);
6313
                                        end
6314
                                default:
6315
                                        begin
6316
                                                resF <= fps[95:0];
6317
                                                fzf <= fps[94:0]==95'd0;
6318
                                                fnf <= fps[95];
6319
                                                Rt <= {1'b0,FLTDST};
6320
                                                rfwrF <= 1'b1;
6321
                                                ret();
6322
                                        end
6323
                                endcase
6324 4 robfinch
                        else begin
6325
                                resF <= fps[95:0];
6326
                                fzf <= fps[94:0]==95'd0;
6327
                                fnf <= fps[95];
6328
                                Rt <= {1'b0,FLTDST};
6329
                                rfwrF <= 1'b1;
6330
                                ret();
6331
                        end
6332
                end
6333
                else
6334
                        ret();
6335
        end
6336
I2DF1:
6337
        goto (I2DF2);
6338
I2DF2:
6339
        begin
6340
                if (DECFLT) begin
6341
                        if (i2dfdone) begin
6342
                                resF <= i2dfo;
6343
                                fzf <= i2dfo[94:0]==95'd0;
6344
                                fnf <= i2dfo[95];
6345
                                Rt <= {1'b0,FLTDST};
6346
                                rfwrF <= 1'b1;
6347
                                ret();
6348
                        end
6349
                end
6350
                else
6351
                        ret();
6352
        end
6353
DF2I1:
6354
        goto (DF2I2);
6355
DF2I2:
6356
        begin
6357
                if (DECFLT) begin
6358
                        if (df2idone) begin
6359 8 robfinch
                                case(ir2[12:10])
6360
                                3'b000: fs_data(mmm,rrr,STORE_LWORD,D);
6361
                                3'b100: fs_data(mmm,rrr,STORE_WORD,D);
6362
                                3'b110: fs_data(mmm,rrr,STORE_BYTE,D);
6363
                                default:        ret();
6364
                                endcase
6365 4 robfinch
                                resF <= df2io;
6366 8 robfinch
                                resL <= df2io[31:0];
6367
                                resW <= df2io[15:0];
6368
                                resB <= df2io[ 7:0];
6369
                                d <= df2io;
6370 4 robfinch
                                fzf <= df2io[94:0]==95'd0;
6371
                                fnf <= df2io[95];
6372
                                fvf <= df2iover;
6373 8 robfinch
                                //Rt <= {1'b0,FLTDST};
6374
                                //rfwrL <= 1'b1;
6375 4 robfinch
                        end
6376
                end
6377
                else
6378
                        ret();
6379
        end
6380
FTST:
6381
        begin
6382 8 robfinch
                case(ir2[12:10])
6383
                3'b000: begin fnf <= s[31]; fzf <= s[31:0]==32'd0; fnanf <= 1'b0; fvf <= 1'b0; end
6384
                3'b100: begin fnf <= s[15]; fzf <= s[15:0]==16'd0; fnanf <= 1'b0; fvf <= 1'b0; end
6385
                3'b110: begin fnf <= s[ 7]; fzf <= s[ 7:0]== 8'd0; fnanf <= 1'b0; fvf <= 1'b0; end
6386
                default:
6387
                        begin
6388
                                fnf <= fps[95];
6389
                                fzf <= fps[94:0]=='d0;
6390
                                fnanf <= fps[94:90]==5'b11111;
6391
                                fvf <= fps[94:90]==5'b11110;
6392
                        end
6393
                endcase
6394 4 robfinch
                ret();
6395
        end
6396
FBCC:
6397
        begin
6398
                if (ftakb)
6399
                        pc <= opc + imm;
6400
                ret();
6401
        end
6402
/*
6403
FCOPYEXP:
6404
        begin
6405
                resF <= fpdp;
6406
                rfwrF <= 1'b1;
6407
                Rt <= {1'b0,FLTDST};
6408
                ret();
6409
        end
6410
*/
6411 8 robfinch
FMOVEM1:
6412
        begin
6413
                imm <= rfoDnn[7:0];
6414
                if (ir2[13])
6415
                        goto(MOVEM_Xn2D);
6416
                else
6417
                        goto(MOVEM_s2Xn);
6418
        end
6419
 
6420 4 robfinch
`endif
6421
 
6422 2 robfinch
default:
6423
        goto(RESET);
6424
endcase
6425
 
6426
        // Bus error: abort current cycle and trap.
6427
        if (cyc_o & err_i) begin
6428
                cyc_o <= `LOW;
6429
                stb_o <= `LOW;
6430
                we_o <= `LOW;
6431
                sel_o <= 4'h0;
6432
                mac_cycle_type <= {state[6:0],sel_o,~we_o,1'b0,fc_o};
6433
                bad_addr <= adr_o;
6434
                if (state != INTA) begin
6435
                        is_bus_err <= 1'b1;
6436
                        dati_buf <= dat_i;
6437
                        dato_buf <= dat_o;
6438
                        goto (TRAP);
6439
                end
6440
        end
6441
 
6442
`ifdef SUPPORT_RETRY
6443
        // Retry: abort current cycle and retry.
6444
        if (cyc_o & rty_i) begin
6445
                cyc_o <= `LOW;
6446
                stb_o <= `LOW;
6447
                we_o <= `LOW;
6448
                sel_o <= 4'h0;
6449
                rstate <= state;
6450
                goto (RETRY);
6451
        end
6452
`endif
6453
 
6454
end
6455
 
6456
//-----------------------------------------------------------------------------
6457
//-----------------------------------------------------------------------------
6458
task fs_data;
6459
input [2:0] mmm;
6460
input [2:0] rrr;
6461
input state_t size_state;
6462
input dsi;
6463
begin
6464
        ds <= dsi;
6465
        case(mmm)
6466
        3'd0:   begin
6467
                                if (dsi==D)
6468 4 robfinch
                                        d <= MMMRRR ? rfoDn : rfob;
6469
                                else begin
6470
                                        s <= MMMRRR ? rfoDn : rfob;
6471
                                        fps <= MMMRRR ? rfoDn : rfob;
6472
                                end
6473 2 robfinch
                                case(size_state)
6474
                                STORE_LWORD:
6475
                                        begin
6476
                                                Rt <= {mmm[0],rrr};
6477
                                                rfwrL <= 1'b1;
6478
                                        end
6479
                                STORE_WORD:
6480
                                        begin
6481
                                                Rt <= {mmm[0],rrr};
6482
                                                rfwrW <= 1'b1;
6483
                                        end
6484
                                STORE_BYTE:
6485
                                        begin
6486
                                                Rt <= {mmm[0],rrr};
6487
                                                rfwrB <= 1'b1;
6488
                                        end
6489
                                default:        ;
6490
                                endcase
6491
                                goto(RETSTATE);
6492
                        end     // Dn
6493
        3'd1:   begin
6494
                                if (dsi==D)
6495
                                        d <= rfob;
6496
                                else
6497
                                        s <= rfob;
6498
                                case(size_state)
6499
                                STORE_LWORD:
6500
                                        begin
6501
                                                Rt <= {mmm[0],rrr};
6502
                                                rfwrL <= 1'b1;
6503
                                        end
6504
                                STORE_WORD:
6505
                                        begin
6506
                                                Rt <= {mmm[0],rrr};
6507
                                                rfwrW <= 1'b1;
6508
                                        end
6509
                                STORE_BYTE:
6510
                                        begin
6511
                                                Rt <= {mmm[0],rrr};
6512
                                                rfwrB <= 1'b1;
6513
                                        end
6514
                                default:        ;
6515
                                endcase
6516
                                goto(RETSTATE);
6517
                                end     // An
6518
        3'd2:   begin   //(An)
6519
                                ea <= MMMRRR ? rfoAna : rfoAn;
6520
                                goto(size_state);
6521
                        end
6522
        3'd3:   begin   // (An)+
6523
                                ea <= (MMMRRR ? rfoAna : rfoAn);
6524
                                if (!lea) begin
6525
                                        Rt <= {1'b1,rrr};
6526
                                        rfwrL <= 1'b1;
6527
                                end
6528
                                case(size_state)
6529
                                LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:  resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd1;
6530
                                FETCH_WORD,STORE_WORD:  resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd2;
6531
                                FETCH_LWORD,STORE_LWORD:        resL <= (MMMRRR ? rfoAna : rfoAn) + 4'd4;
6532 4 robfinch
`ifdef SUPPORT_DECFLT
6533 8 robfinch
                                FETCH_HEXI1,STORE_HEXI1: resL <= rfoAn + 5'd12;
6534 4 robfinch
`endif
6535 2 robfinch
                                default:        ;
6536
                                endcase
6537
                                goto(size_state);
6538
                        end
6539
        3'd4:   begin   // -(An)
6540
                                if (!lea) begin
6541
                                        Rt <= {1'b1,rrr};
6542
                                        rfwrL <= 1'b1;
6543
                                end
6544
                                case(size_state)
6545
                                FETCH_NOP_BYTE,LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:   ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd1;
6546
                                FETCH_NOP_WORD,FETCH_WORD,STORE_WORD:   ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd2;
6547
                                FETCH_NOP_LWORD,FETCH_LWORD,STORE_LWORD:        ea <= (MMMRRR ? rfoAna : rfoAn) - 4'd4;
6548 4 robfinch
`ifdef SUPPORT_DECFLT
6549 8 robfinch
                                FETCH_NOP_HEXI,FETCH_HEXI1,STORE_HEXI1: ea <= rfoAn - 5'd12;
6550 4 robfinch
`endif
6551 2 robfinch
                                default:        ;
6552
                                endcase
6553
                                case(size_state)
6554
                                LFETCH_BYTE,FETCH_BYTE,STORE_BYTE,USTORE_BYTE:  resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd1;
6555
                                FETCH_WORD,STORE_WORD:  resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd2;
6556
                                FETCH_LWORD,STORE_LWORD:        resL <= (MMMRRR ? rfoAna : rfoAn) - 4'd4;
6557 4 robfinch
`ifdef SUPPORT_DECFLT
6558 8 robfinch
                                FETCH_HEXI1,STORE_HEXI1: resL <= rfoAn - 5'd12;
6559 4 robfinch
`endif
6560 2 robfinch
                                default:        ;
6561
                                endcase
6562
                                goto(size_state);
6563
                        end
6564
        3'd5:   begin   // d16(An)
6565
                                ea <= (MMMRRR ? rfoAna : rfoAn);
6566
                                mmmx <= mmm;
6567
                                rrrx <= rrr;
6568
                                sz_state <= size_state;
6569
                                dsix <= dsi;
6570
                                goto (FSDATA2);
6571
                        end
6572
        3'd6:   begin   // d8(An,Xn)
6573
                                ea <= (MMMRRR ? rfoAna : rfoAn);
6574
                                mmmx <= mmm;
6575
                                rrrx <= rrr;
6576
                                sz_state <= size_state;
6577
                                dsix <= dsi;
6578
                                goto (FSDATA2);
6579
                        end
6580
        3'd7:   begin
6581
                                case(rrr)
6582
                                3'd0:   begin   // abs short
6583
                                                        ea <= 32'd0;
6584
                                                        mmmx <= mmm;
6585
                                                        rrrx <= rrr;
6586
                                                        sz_state <= size_state;
6587
                                                        dsix <= dsi;
6588
                                                        goto (FSDATA2);
6589
                                                end
6590
                                3'd1:   begin   // abs long
6591
                                                        ea <= 32'd0;
6592
                                                        mmmx <= mmm;
6593
                                                        rrrx <= rrr;
6594
                                                        sz_state <= size_state;
6595
                                                        dsix <= dsi;
6596
                                                        goto (FSDATA2);
6597
                                                end
6598
                                3'd2:   begin   // d16(PC)
6599
                                                        ea <= pc;
6600
                                                        mmmx <= mmm;
6601
                                                        rrrx <= rrr;
6602
                                                        sz_state <= size_state;
6603
                                                        dsix <= dsi;
6604
                                                        goto (FSDATA2);
6605
                                                end
6606
                                3'd3:   begin   // d8(PC,Xn)
6607
                                                        ea <= pc;
6608
                                                        mmmx <= mmm;
6609
                                                        rrrx <= rrr;
6610
                                                        sz_state <= size_state;
6611
                                                        dsix <= dsi;
6612
                                                        goto (FSDATA2);
6613
                                                end
6614 4 robfinch
                                                // ToDo: add FETCH_IMM128
6615 2 robfinch
                                3'd4:   begin   // #i16
6616 8 robfinch
                                                        goto(size_state==FETCH_NOP_HEXI ? FETCH_IMM96:(size_state==FETCH_LWORD||size_state==FETCH_NOP_LWORD)?FETCH_IMM32:FETCH_IMM16);
6617 2 robfinch
                                                end
6618
                                3'd5:   begin   // #i32
6619
                                                        state <= FETCH_IMM32;
6620
                                                        goto (FETCH_IMM32);
6621
                                                end
6622
                                endcase
6623
                        end
6624
                endcase
6625
        end
6626
endtask
6627
 
6628
task fs_data2;
6629
input [2:0] mmm;
6630
input [2:0] rrr;
6631
input state_t size_state;
6632
input dsi;
6633
begin
6634
        ds <= dsi;
6635
        case(mmm)
6636
        3'd5:   begin   // d16(An)
6637
                                ea <= (MMMRRR ? rfoAna : rfoAn);
6638
                                call(FETCH_D16,size_state);
6639
                        end
6640
        3'd6:   begin   // d8(An,Xn)
6641
                                ea <= (MMMRRR ? rfoAna : rfoAn);
6642
                                call(FETCH_NDX,size_state);
6643
                        end
6644
        3'd7:   begin
6645
                                case(rrr)
6646
                                3'd0:   begin   // abs short
6647
                                                        ea <= 32'd0;
6648
                                                        call(FETCH_D16,size_state);
6649
                                                end
6650
                                3'd1:   begin   // abs long
6651
                                                        ea <= 32'd0;
6652
                                                        call(FETCH_D32,size_state);
6653
                                                end
6654
                                3'd2:   begin   // d16(PC)
6655
                                                        ea <= pc;
6656
                                                        call(FETCH_D16,size_state);
6657
                                                end
6658
                                3'd3:   begin   // d8(PC,Xn)
6659
                                                        ea <= pc;
6660
                                                        call(FETCH_NDX,size_state);
6661
                                                end
6662
                                3'd4:   begin   // #i16
6663 8 robfinch
                                                        goto((size_state==FETCH_LWORD||size_state==FETCH_NOP_LWORD||size_state==FETCH_NOP_HEXI)?FETCH_IMM32:FETCH_IMM16);
6664 2 robfinch
                                                        end
6665
                                3'd5:   begin   // #i32
6666
                                                        state <= FETCH_IMM32;
6667
                                                        goto (FETCH_IMM32);
6668
                                                end
6669
                                endcase
6670
                        end
6671
                endcase
6672
        end
6673
endtask
6674
 
6675
task goto;
6676
input state_t nst;
6677
begin
6678
        state <= nst;
6679
end
6680
endtask
6681
 
6682
task gosub;
6683
input state_t tgt;
6684
begin
6685
        state_stk1 <= state;
6686
        state_stk2 <= state_stk1;
6687
        state_stk3 <= state_stk2;
6688
        state_stk4 <= state_stk3;
6689 8 robfinch
        state_stk5 <= state_stk4;
6690 2 robfinch
        state <= tgt;
6691
end
6692
endtask
6693
 
6694
task call;
6695
input state_t tgt;
6696
input state_t retst;
6697
begin
6698
        state_stk1 <= retst;
6699
        state_stk2 <= state_stk1;
6700
        state_stk3 <= state_stk2;
6701
        state_stk4 <= state_stk3;
6702 8 robfinch
        state_stk5 <= state_stk4;
6703 2 robfinch
        state <= tgt;
6704
end
6705
endtask
6706
 
6707
task push;
6708
input state_t st;
6709
begin
6710
        state_stk1 <= st;
6711
        state_stk2 <= state_stk1;
6712
        state_stk3 <= state_stk2;
6713
        state_stk4 <= state_stk3;
6714 8 robfinch
        state_stk5 <= state_stk4;
6715 2 robfinch
end
6716
endtask
6717
 
6718
task tIllegal;
6719
begin
6720
        is_illegal <= 1'b1;
6721
  vecno <= `ILLEGAL_VEC;
6722
  goto (TRAP);
6723
end
6724
endtask
6725
 
6726
task tPrivilegeViolation;
6727
begin
6728
        is_priv <= 1'b1;
6729
        vecno <= `PRIV_VEC;
6730
        goto (TRAP);
6731
end
6732
endtask
6733
 
6734
task tBadBranchDisp;
6735
begin
6736
        isr <= srx;
6737
        tf <= 1'b0;
6738
        sf <= 1'b1;
6739
        vecno <= `DISP_VEC;
6740
        goto (TRAP3);
6741
end
6742
endtask
6743
 
6744
// MMMRRR needs to be set already when the STORE_IN_DEST state is entered.
6745
// This state is entered after being popped off the state stack.
6746
// If about to fetch the next instruction and trace is enabled, then take the
6747
// trace trap.
6748
task ret;
6749
begin
6750
        if (state_stk1==STORE_IN_DEST ||
6751
                        state_stk1==ADDX2 ||
6752
                        state_stk1==SUBX2 ||
6753
                        state_stk1==BCD0 ||
6754
                        state_stk1==CMPM)
6755
                MMMRRR <= 1'b1;
6756
        if (state_stk1==IFETCH && tf) begin
6757
                is_trace <= 1'b1;
6758
                state <= TRAP;
6759
        end
6760
        else
6761
                state <= state_stk1;
6762
        state_stk1 <= state_stk2;
6763
        state_stk2 <= state_stk3;
6764
        state_stk3 <= state_stk4;
6765 8 robfinch
        state_stk4 <= state_stk5;
6766 2 robfinch
end
6767
endtask
6768
 
6769
endmodule
6770
 

powered by: WebSVN 2.1.0

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