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

Subversion Repositories rf68000

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

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

powered by: WebSVN 2.1.0

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