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

Subversion Repositories rf68000

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

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

powered by: WebSVN 2.1.0

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