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

Subversion Repositories rf68000

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

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

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

powered by: WebSVN 2.1.0

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