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

Subversion Repositories rtf65002

[/] [rtf65002/] [trunk/] [rtl/] [verilog/] [rtf65002d.v] - Blame information for rev 5

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

Line No. Rev Author Line
1 5 robfinch
`define TRUE            1'b1
2
`define FALSE           1'b0
3
 
4
`define RST_VECT        34'h3FFFFFFF8
5
`define NMI_VECT        34'h3FFFFFFF4
6
`define IRQ_VECT        34'h3FFFFFFF0
7
`define BRK_VECT        34'h3FFFFFFEC
8
`define SLP_VECT        34'h3FFFFFFE8
9
`define BYTE_NMI_VECT   34'h00000FFFA
10
`define BYTE_IRQ_VECT   34'h00000FFFE
11
 
12
`define BRK                     8'h00
13
`define RTI                     8'h40
14
`define RTS                     8'h60
15
`define PHP                     8'h08
16
`define CLC                     8'h18
17
`define PLP                     8'h28
18
`define SEC                     8'h38
19
`define PHA                     8'h48
20
`define CLI                     8'h58
21
`define PLA                     8'h68
22
`define SEI                     8'h78
23
`define DEY                     8'h88
24
`define TYA                     8'h98
25
`define TAY                     8'hA8
26
`define CLV                     8'hB8
27
`define INY                     8'hC8
28
`define CLD                     8'hD8
29
`define INX                     8'hE8
30
`define SED                     8'hF8
31
`define ROR_ACC         8'h6A
32
`define TXA                     8'h8A
33
`define TXS                     8'h9A
34
`define TAX                     8'hAA
35
`define TSX                     8'hBA
36
`define DEX                     8'hCA
37
`define NOP                     8'hEA
38
`define TXY                     8'h9B
39
`define TYX                     8'hBB
40
`define TAS                     8'h1B
41
`define TSA                     8'h3B
42
`define TRS                     8'h8B
43
`define TSR                     8'hAB
44
`define STP                     8'hDB
45
`define NAT                     8'hFB
46
`define EMM                     8'hFB
47
`define INA                     8'h1A
48
`define DEA                     8'h3A
49
 
50
`define RR                      8'h02
51
`define ADD_RR                  4'h0
52
`define SUB_RR                  4'h1
53
`define CMP_RR                  4'h2
54
`define AND_RR                  4'h3
55
`define EOR_RR                  4'h4
56
`define OR_RR                   4'h5
57
`define MUL_RR                  4'h8
58
 
59
 
60
`define ADD_IMM8        8'h65           // 8 bit operand
61
`define ADD_IMM16       8'h79           // 16 bit operand
62
`define ADD_IMM32       8'h69           // 32 bit operand
63
`define ADD_ZPX         8'h75           // there is no ZP mode, use R0 to syntheisze
64
`define ADD_IX          8'h61
65
`define ADD_IY          8'h71
66
`define ADD_ABS         8'h6D
67
`define ADD_ABSX        8'h7D
68
`define ADD_RIND        8'h72
69
 
70
`define SUB_IMM8        8'hE5
71
`define SUB_IMM16       8'hF9
72
`define SUB_IMM32       8'hE9
73
`define SUB_ZPX         8'hF5
74
`define SUB_IX          8'hE1
75
`define SUB_IY          8'hF1
76
`define SUB_ABS         8'hED
77
`define SUB_ABSX        8'hFD
78
`define SUB_RIND        8'hF2
79
 
80
// CMP = SUB r0,....
81
 
82
`define ADC_IMM         8'h69
83
`define ADC_ZP          8'h65
84
`define ADC_ZPX         8'h75
85
`define ADC_IX          8'h61
86
`define ADC_IY          8'h71
87
`define ADC_ABS         8'h6D
88
`define ADC_ABSX        8'h7D
89
`define ADC_ABSY        8'h79
90
`define ADC_I           8'h72
91
 
92
`define SBC_IMM         8'hE9
93
`define SBC_ZP          8'hE5
94
`define SBC_ZPX         8'hF5
95
`define SBC_IX          8'hE1
96
`define SBC_IY          8'hF1
97
`define SBC_ABS         8'hED
98
`define SBC_ABSX        8'hFD
99
`define SBC_ABSY        8'hF9
100
`define SBC_I           8'hF2
101
 
102
`define CMP_IMM32       8'hC9
103
`define CMP_IMM         8'hC9
104
`define CMP_ZP          8'hC5
105
`define CMP_ZPX         8'hD5
106
`define CMP_IX          8'hC1
107
`define CMP_IY          8'hD1
108
`define CMP_ABS         8'hCD
109
`define CMP_ABSX        8'hDD
110
`define CMP_ABSY        8'hD9
111
`define CMP_I           8'hD2
112
 
113
 
114
`define LDA_IMM8        8'hA5
115
`define LDA_IMM16       8'hB9
116
`define LDA_IMM32       8'hA9
117
 
118
`define AND_IMM8        8'h25
119
`define AND_IMM16       8'h39
120
`define AND_IMM32       8'h29
121
`define AND_IMM         8'h29
122
`define AND_ZP          8'h25
123
`define AND_ZPX         8'h35
124
`define AND_IX          8'h21
125
`define AND_IY          8'h31
126
`define AND_ABS         8'h2D
127
`define AND_ABSX        8'h3D
128
`define AND_ABSY        8'h39
129
`define AND_RIND        8'h32
130
`define AND_I           8'h32
131
 
132
`define OR_IMM8         8'h05
133
`define OR_IMM16        8'h19
134
`define OR_IMM32        8'h09
135
`define OR_ZPX          8'h15
136
`define OR_IX           8'h01
137
`define OR_IY           8'h11
138
`define OR_ABS          8'h0D
139
`define OR_ABSX         8'h1D
140
`define OR_RIND         8'h12
141
 
142
`define ORA_IMM         8'h09
143
`define ORA_ZP          8'h05
144
`define ORA_ZPX         8'h15
145
`define ORA_IX          8'h01
146
`define ORA_IY          8'h11
147
`define ORA_ABS         8'h0D
148
`define ORA_ABSX        8'h1D
149
`define ORA_ABSY        8'h19
150
`define ORA_I           8'h12
151
 
152
`define EOR_IMM         8'h49
153
`define EOR_IMM8        8'h45
154
`define EOR_IMM16       8'h59
155
`define EOR_IMM32       8'h49
156
`define EOR_ZP          8'h45
157
`define EOR_ZPX         8'h55
158
`define EOR_IX          8'h41
159
`define EOR_IY          8'h51
160
`define EOR_ABS         8'h4D
161
`define EOR_ABSX        8'h5D
162
`define EOR_ABSY        8'h59
163
`define EOR_RIND        8'h52
164
`define EOR_I           8'h52
165
 
166
// LD is OR rt,r0,....
167
 
168
`define ST_ZPX          8'h95
169
`define ST_IX           8'h81
170
`define ST_IY           8'h91
171
`define ST_ABS          8'h8D
172
`define ST_ABSX         8'h9D
173
`define ST_RIND         8'h92
174
 
175
`define ORB_ZPX         8'hB5
176
`define ORB_IX          8'hA1
177
`define ORB_IY          8'hB1
178
`define ORB_ABS         8'hAD
179
`define ORB_ABSX        8'hBD
180
 
181
`define STB_ZPX         8'h74
182
`define STB_ABS         8'h9C
183
`define STB_ABSX        8'h9E
184
 
185
 
186
//`define LDB_RIND      8'hB2   // Conflict with LDX #imm16
187
 
188
`define LDA_IMM         8'hA9
189
`define LDA_ZP          8'hA5
190
`define LDA_ZPX         8'hB5
191
`define LDA_IX          8'hA1
192
`define LDA_IY          8'hB1
193
`define LDA_ABS         8'hAD
194
`define LDA_ABSX        8'hBD
195
`define LDA_ABSY        8'hB9
196
`define LDA_I           8'hB2
197
 
198
`define STA_ZP          8'h85
199
`define STA_ZPX         8'h95
200
`define STA_IX          8'h81
201
`define STA_IY          8'h91
202
`define STA_ABS         8'h8D
203
`define STA_ABSX        8'h9D
204
`define STA_ABSY        8'h99
205
`define STA_I           8'h92
206
 
207
`define ASL_ACC         8'h0A
208
`define ASL_ZP          8'h06
209
`define ASL_RR          8'h06
210
`define ASL_ZPX         8'h16
211
`define ASL_ABS         8'h0E
212
`define ASL_ABSX        8'h1E
213
 
214
`define ROL_ACC         8'h2A
215
`define ROL_ZP          8'h26
216
`define ROL_RR          8'h26
217
`define ROL_ZPX         8'h36
218
`define ROL_ABS         8'h2E
219
`define ROL_ABSX        8'h3E
220
 
221
`define LSR_ACC         8'h4A
222
`define LSR_ZP          8'h46
223
`define LSR_RR          8'h46
224
`define LSR_ZPX         8'h56
225
`define LSR_ABS         8'h4E
226
`define LSR_ABSX        8'h5E
227
 
228
`define ROR_RR          8'h66
229
`define ROR_ZP          8'h66
230
`define ROR_ZPX         8'h76
231
`define ROR_ABS         8'h6E
232
`define ROR_ABSX        8'h7E
233
 
234
`define DEC_ZP          8'hC6
235
`define DEC_ZPX         8'hD6
236
`define DEC_ABS         8'hCE
237
`define DEC_ABSX        8'hDE
238
`define INC_ZP          8'hE6
239
`define INC_ZPX         8'hF6
240
`define INC_ABS         8'hEE
241
`define INC_ABSX        8'hFE
242
 
243
`define BIT_IMM         8'h89
244
`define BIT_ZP          8'h24
245
`define BIT_ZPX         8'h34
246
`define BIT_ABS         8'h2C
247
`define BIT_ABSX        8'h3C
248
 
249
// CMP = SUB r0,...
250
// BIT = AND r0,...
251
`define BPL                     8'h10
252
`define BVC                     8'h50
253
`define BCC                     8'h90
254
`define BNE                     8'hD0
255
`define BMI                     8'h30
256
`define BVS                     8'h70
257
`define BCS                     8'hB0
258
`define BEQ                     8'hF0
259
`define BRL                     8'h82
260
 
261
`define JML                     8'h5C
262
`define JMP                     8'h4C
263
`define JMP_IND         8'h6C
264
`define JMP_INDX        8'h7C
265
`define JMP_RIND        8'hD2
266
`define JSR                     8'h20
267
`define JSL                     8'h22
268
`define JSR_INDX        8'hFC
269
`define JSR_RIND        8'hC2
270
`define RTS                     8'h60
271
`define RTL                     8'h6B
272
`define BSR                     8'h62
273
`define NOP                     8'hEA
274
 
275
`define BRK                     8'h00
276
`define PLX                     8'hFA
277
`define PLY                     8'h7A
278
`define PHX                     8'hDA
279
`define PHY                     8'h5A
280
`define BRA                     8'h80
281
`define WAI                     8'hCB
282
`define PUSH            8'h0B
283
`define POP                     8'h2B
284
 
285
`define LDX_IMM         8'hA2
286
`define LDX_ZP          8'hA6
287
`define LDX_ZPX         8'hB6
288
`define LDX_ZPY         8'hB6
289
`define LDX_ABS         8'hAE
290
`define LDX_ABSY        8'hBE
291
 
292
`define LDX_IMM32       8'hA2
293
`define LDX_IMM16       8'hB2
294
`define LDX_IMM8        8'hA6
295
 
296
`define LDY_IMM         8'hA0
297
`define LDY_ZP          8'hA4
298
`define LDY_ZPX         8'hB4
299
`define LDY_IMM32       8'hA0
300
`define LDY_ABS         8'hAC
301
`define LDY_ABSX        8'hBC
302
 
303
`define STX_ZP          8'h86
304
`define STX_ZPX         8'h96
305
`define STX_ZPY         8'h96
306
`define STX_ABS         8'h8E
307
 
308
`define STY_ZP          8'h84
309
`define STY_ZPX         8'h94
310
`define STY_ABS         8'h8C
311
 
312
`define STZ_ZP          8'h64
313
`define STZ_ZPX         8'h74
314
`define STZ_ABS         8'h9C
315
`define STZ_ABSX        8'h9E
316
 
317
`define CPX_IMM         8'hE0
318
`define CPX_IMM32       8'hE0
319
`define CPX_ZP          8'hE4
320
`define CPX_ZPX         8'hE4
321
`define CPX_ABS         8'hEC
322
`define CPY_IMM         8'hC0
323
`define CPY_IMM32       8'hC0
324
`define CPY_ZP          8'hC4
325
`define CPY_ZPX         8'hC4
326
`define CPY_ABS         8'hCC
327
 
328
`define TRB_ZP          8'h14
329
`define TRB_ZPX         8'h14
330
`define TRB_ABS         8'h1C
331
`define TSB_ZP          8'h04
332
`define TSB_ZPX         8'h04
333
`define TSB_ABS         8'h0C
334
 
335
module icachemem(wclk, wr, adr, dat, rclk, pc, insn);
336
input wclk;
337
input wr;
338
input [33:0] adr;
339
input [31:0] dat;
340
input rclk;
341
input [31:0] pc;
342
output reg [55:0] insn;
343
 
344
wire [63:0] insn0;
345
wire [63:0] insn1;
346
wire [31:0] pcp8 = pc + 32'd8;
347
reg [31:0] rpc;
348
 
349
always @(posedge rclk)
350
        rpc <= pc;
351
 
352
// memL and memH combined allow a 64 bit read
353
syncRam1kx32_1rw1r ramL0
354
(
355
        .wrst(1'b0),
356
        .wclk(wclk),
357
        .wce(~adr[2]),
358
        .we(wr),
359
        .wsel(4'hF),
360
        .wadr(adr[12:3]),
361
        .i(dat),
362
        .wo(),
363
        .rrst(1'b0),
364
        .rclk(rclk),
365
        .rce(1'b1),
366
        .radr(pc[12:3]),
367
        .o(insn0[31:0])
368
);
369
 
370
syncRam1kx32_1rw1r ramH0
371
(
372
        .wrst(1'b0),
373
        .wclk(wclk),
374
        .wce(adr[2]),
375
        .we(wr),
376
        .wsel(4'hF),
377
        .wadr(adr[12:3]),
378
        .i(dat),
379
        .wo(),
380
        .rrst(1'b0),
381
        .rclk(rclk),
382
        .rce(1'b1),
383
        .radr(pc[12:3]),
384
        .o(insn0[63:32])
385
);
386
 
387
syncRam1kx32_1rw1r ramL1
388
(
389
        .wrst(1'b0),
390
        .wclk(wclk),
391
        .wce(~adr[2]),
392
        .we(wr),
393
        .wsel(4'hF),
394
        .wadr(adr[12:3]),
395
        .i(dat),
396
        .wo(),
397
        .rrst(1'b0),
398
        .rclk(rclk),
399
        .rce(1'b1),
400
        .radr(pcp8[12:3]),
401
        .o(insn1[31:0])
402
);
403
 
404
syncRam1kx32_1rw1r ramH1
405
(
406
        .wrst(1'b0),
407
        .wclk(wclk),
408
        .wce(adr[2]),
409
        .we(wr),
410
        .wsel(4'hF),
411
        .wadr(adr[12:3]),
412
        .i(dat),
413
        .wo(),
414
        .rrst(1'b0),
415
        .rclk(rclk),
416
        .rce(1'b1),
417
        .radr(pcp8[12:3]),
418
        .o(insn1[63:32])
419
);
420
 
421
always @(rpc or insn0 or insn1)
422
case(rpc[2:0])
423
3'd0:   insn <= insn0[55:0];
424
3'd1:   insn <= insn0[63:8];
425
3'd2:   insn <= {insn1[7:0],insn0[63:16]};
426
3'd3:   insn <= {insn1[15:0],insn0[63:24]};
427
3'd4:   insn <= {insn1[23:0],insn0[63:32]};
428
3'd5:   insn <= {insn1[31:0],insn0[63:40]};
429
3'd6:   insn <= {insn1[39:0],insn0[63:48]};
430
3'd7:   insn <= {insn1[47:0],insn0[63:56]};
431
endcase
432
endmodule
433
 
434
module tagmem(wclk, wr, adr, rclk, pc, hit0, hit1);
435
input wclk;
436
input wr;
437
input [33:0] adr;
438
input rclk;
439
input [31:0] pc;
440
output hit0;
441
output hit1;
442
 
443
wire [31:0] pcp8 = pc + 32'd8;
444
wire [31:0] tag0;
445
wire [31:0] tag1;
446
reg [31:0] rpc;
447
reg [31:0] rpcp8;
448
 
449
always @(posedge rclk)
450
        rpc <= pc;
451
always @(posedge rclk)
452
        rpcp8 <= pcp8;
453
 
454
syncRam512x32_1rw2r ram0 (
455
        .wrst(1'b0),
456
        .wclk(wclk),
457
        .wce(adr[3:2]==2'b11),
458
        .we(wr),
459
        .wadr(adr[12:4]),
460
        .i(adr[31:0]),
461
        .wo(),
462
 
463
        .rrsta(1'b0),
464
        .rclka(rclk),
465
        .rcea(1'b1),
466
        .radra(pc[12:4]),
467
        .roa(tag0),
468
 
469
        .rrstb(1'b0),
470
        .rclkb(rclk),
471
        .rceb(1'b1),
472
        .radrb(pcp8[12:4]),
473
        .rob(tag1)
474
);
475
 
476
assign hit0 = tag0[31:13]==rpc[31:13];
477
assign hit1 = tag1[31:13]==rpcp8[31:13];
478
 
479
endmodule
480
 
481
module dcachemem(wclk, wr, sel, wadr, wdat, rclk, radr, rdat);
482
input wclk;
483
input wr;
484
input [3:0] sel;
485
input [31:0] wadr;
486
input [31:0] wdat;
487
input rclk;
488
input [31:0] radr;
489
output [31:0] rdat;
490
 
491
syncRam2kx32_1rw1r ram0 (
492
        .wrst(1'b0),
493
        .wclk(wclk),
494
        .wce(1'b1),
495
        .we(wr),
496
        .wsel(sel),
497
        .wadr(wadr[10:0]),
498
        .i(wdat),
499
        .wo(),
500
        .rrst(1'b0),
501
        .rclk(rclk),
502
        .rce(1'b1),
503
        .radr(radr[10:0]),
504
        .o(rdat)
505
);
506
 
507
endmodule
508
 
509
module dtagmem(wclk, wr, wadr, rclk, radr, hit);
510
input wclk;
511
input wr;
512
input [31:0] wadr;
513
input rclk;
514
input [31:0] radr;
515
output hit;
516
 
517
reg [31:0] rradr;
518
wire [31:0] tag;
519
 
520
syncRam512x32_1rw1r u1
521
        (
522
                .wrst(1'b0),
523
                .wclk(wclk),
524
                .wce(wadr[1:0]==2'b11),
525
                .we(wr),
526
                .wadr(wadr[10:2]),
527
                .i(wadr),
528
                .wo(),
529
                .rrst(1'b0),
530
                .rclk(rclk),
531
                .rce(1'b1),
532
                .radr(radr[10:2]),
533
                .o(tag)
534
        );
535
 
536
 
537
always @(rclk)
538
        rradr <= radr;
539
 
540
assign hit = tag[31:11]==rradr[31:11];
541
 
542
endmodule
543
 
544
module overflow(op, a, b, s, v);
545
 
546
input op;       // 0=add,1=sub
547
input a;
548
input b;
549
input s;        // sum
550
output v;
551
 
552
// Overflow:
553
// Add: the signs of the inputs are the same, and the sign of the
554
// sum is different
555
// Sub: the signs of the inputs are different, and the sign of
556
// the sum is the same as B
557
assign v = (op ^ s ^ b) & (~op ^ a ^ b);
558
 
559
endmodule
560
 
561
module rtf65002d(rst_i, clk_i, nmi_i, irq_i, bte_o, cti_o, bl_o, lock_o, cyc_o, stb_o, ack_i, we_o, sel_o, adr_o, dat_i, dat_o);
562
parameter IDLE = 3'd0;
563
parameter LOAD_DCACHE = 3'd1;
564
parameter LOAD_ICACHE = 3'd2;
565
parameter LOAD_IBUF1 = 3'd3;
566
parameter LOAD_IBUF2 = 3'd4;
567
parameter LOAD_IBUF3 = 3'd5;
568
parameter RESET = 7'd0;
569
parameter IFETCH = 7'd1;
570
parameter JMP_IND1 = 7'd2;
571
parameter JMP_IND2 = 7'd3;
572
parameter DECODE = 7'd4;
573
parameter STORE1 = 7'd5;
574
parameter STORE2 = 7'd6;
575
parameter LOAD1 = 7'd7;
576
parameter LOAD2 = 7'd8;
577
parameter IRQ1 = 7'd9;
578
parameter IRQ2 = 7'd10;
579
parameter IRQ3 = 7'd11;
580
parameter CALC = 7'd12;
581
parameter JSR1 = 7'd13;
582
parameter JSR_INDX1 = 7'd14;
583
parameter JSR161 = 7'd15;
584
parameter RTS1 = 7'd16;
585
parameter RTS2 = 7'd17;
586
parameter IX1 = 7'd18;
587
parameter IX2 = 7'd19;
588
parameter IX3 = 7'd20;
589
parameter IX4 = 7'd21;
590
parameter IY1 = 7'd22;
591
parameter IY2 = 7'd23;
592
parameter IY3 = 7'd24;
593
parameter PHP1 = 7'd27;
594
parameter PLP1 = 7'd28;
595
parameter PLP2 = 7'd29;
596
parameter PLA1 = 7'd30;
597
parameter PLA2 = 7'd31;
598
parameter BSR1 = 7'd32;
599
parameter BYTE_IX1 = 7'd33;
600
parameter BYTE_IX2 = 7'd34;
601
parameter BYTE_IX3 = 7'd35;
602
parameter BYTE_IX4 = 7'd36;
603
parameter BYTE_IX5 = 7'd37;
604
parameter BYTE_IY1 = 7'd38;
605
parameter BYTE_IY2 = 7'd39;
606
parameter BYTE_IY3 = 7'd40;
607
parameter BYTE_IY4 = 7'd41;
608
parameter BYTE_IY5 = 7'd42;
609
parameter RTS3 = 7'd43;
610
parameter RTS4 = 7'd44;
611
parameter RTS5 = 7'd45;
612
parameter BYTE_JSR1 = 7'd46;
613
parameter BYTE_JSR2 = 7'd47;
614
parameter BYTE_JSR3 = 7'd48;
615
parameter BYTE_IRQ1 = 7'd49;
616
parameter BYTE_IRQ2 = 7'd50;
617
parameter BYTE_IRQ3 = 7'd51;
618
parameter BYTE_IRQ4 = 7'd52;
619
parameter BYTE_IRQ5 = 7'd53;
620
parameter BYTE_IRQ6 = 7'd54;
621
parameter BYTE_IRQ7 = 7'd55;
622
parameter BYTE_IRQ8 = 7'd56;
623
parameter BYTE_IRQ9 = 7'd57;
624
parameter BYTE_JMP_IND1 = 7'd58;
625
parameter BYTE_JMP_IND2 = 7'd59;
626
parameter BYTE_JMP_IND3 = 7'd60;
627
parameter BYTE_JMP_IND4 = 7'd61;
628
parameter BYTE_JSR_INDX1 = 7'd62;
629
parameter BYTE_JSR_INDX2 = 7'd63;
630
parameter BYTE_JSR_INDX3 = 7'd64;
631
parameter RTI1 = 7'd65;
632
parameter RTI2 = 7'd66;
633
parameter RTI3 = 7'd67;
634
parameter RTI4 = 7'd68;
635
parameter BYTE_RTS1 = 7'd69;
636
parameter BYTE_RTS2 = 7'd70;
637
parameter BYTE_RTS3 = 7'd71;
638
parameter BYTE_RTS4 = 7'd72;
639
parameter BYTE_RTS5 = 7'd73;
640
parameter BYTE_RTS6 = 7'd74;
641
parameter BYTE_RTS7 = 7'd75;
642
parameter BYTE_RTS8 = 7'd76;
643
parameter BYTE_RTS9 = 7'd77;
644
parameter BYTE_RTI1 = 7'd78;
645
parameter BYTE_RTI2 = 7'd79;
646
parameter BYTE_RTI3 = 7'd80;
647
parameter BYTE_RTI4 = 7'd81;
648
parameter BYTE_RTI5 = 7'd82;
649
parameter BYTE_RTI6 = 7'd83;
650
parameter BYTE_RTI7 = 7'd84;
651
parameter BYTE_RTI8 = 7'd85;
652
parameter BYTE_RTI9 = 7'd86;
653
parameter BYTE_RTI10 = 7'd87;
654
parameter BYTE_JSL1 = 7'd88;
655
parameter BYTE_JSL2 = 7'd89;
656
parameter BYTE_JSL3 = 7'd90;
657
parameter BYTE_JSL4 = 7'd91;
658
parameter BYTE_JSL5 = 7'd92;
659
parameter BYTE_JSL6 = 7'd93;
660
parameter BYTE_JSL7 = 7'd94;
661
parameter BYTE_PLP1 = 7'd95;
662
parameter BYTE_PLP2 = 7'd96;
663
parameter BYTE_PLA1 = 7'd97;
664
parameter BYTE_PLA2 = 7'd98;
665
 
666
input rst_i;
667
input clk_i;
668
input nmi_i;
669
input irq_i;
670
output reg [1:0] bte_o;
671
output reg [2:0] cti_o;
672
output reg [5:0] bl_o;
673
output reg lock_o;
674
output reg cyc_o;
675
output reg stb_o;
676
input ack_i;
677
output reg we_o;
678
output reg [3:0] sel_o;
679
output reg [33:0] adr_o;
680
input [31:0] dat_i;
681
output reg [31:0] dat_o;
682
 
683
reg [6:0] state;
684
reg [2:0] cstate;
685
wire [55:0] insn;
686
reg [55:0] ibuf;
687
reg [31:0] bufadr;
688
 
689
reg cf,nf,zf,vf,bf,im,df,em;
690
reg em1;
691
reg nmoi;       // native mode on interrupt
692
wire [31:0] sr = {nf,vf,em,24'b0,bf,df,im,zf,cf};
693
wire [7:0] sr8 = {nf,vf,1'b0,bf,df,im,zf,cf};
694
reg nmi1,nmi_edge;
695
reg wai;
696
reg [31:0] acc;
697
reg [31:0] x;
698
reg [31:0] y;
699
reg [7:0] sp;
700
wire [7:0] acc8 = acc[7:0];
701
wire [7:0] x8 = x[7:0];
702
wire [7:0] y8 = y[7:0];
703
reg [31:0] isp;          // interrupt stack pointer
704
reg [63:0] prod;
705
wire [7:0] sp_dec = sp - 8'd1;
706
wire [7:0] sp_inc = sp + 8'd1;
707
wire [31:0] isp_dec = isp - 32'd1;
708
wire [31:0] isp_inc = isp + 32'd1;
709
reg [31:0] pc;
710
wire [31:0] pcp1 = pc + 32'd1;
711
wire [31:0] pcp2 = pc + 32'd2;
712
wire [31:0] pcp3 = pc + 32'd3;
713
wire [31:0] pcp4 = pc + 32'd4;
714
wire [31:0] pcp8 = pc + 32'd8;
715
reg [31:0] dp;
716
wire bhit=pc==bufadr;
717
reg [31:0] regfile [15:0];
718
reg [55:0] ir;
719
wire [3:0] Ra = ir[11:8];
720
wire [3:0] Rb = ir[15:12];
721
reg [31:0] rfoa;
722
reg [31:0] rfob;
723
always @(Ra or x or y or acc)
724
case(Ra)
725
4'h0:   rfoa <= 32'd0;
726
4'h1:   rfoa <= acc;
727
4'h2:   rfoa <= x;
728
4'h3:   rfoa <= y;
729
default:        rfoa <= regfile[Ra];
730
endcase
731
always @(Rb or x or y or acc)
732
case(Rb)
733
4'h0:   rfob <= 32'd0;
734
4'h1:   rfob <= acc;
735
4'h2:   rfob <= x;
736
4'h3:   rfob <= y;
737
default:        rfob <= regfile[Rb];
738
endcase
739
reg [3:0] Rt;
740
reg [33:0] ea;
741
reg first_ifetch;
742
reg [31:0] a, b;
743
reg [7:0] b8;
744
reg [32:0] res;
745
reg [8:0] res8;
746
wire resv8,resv32;
747
wire resc8 = res8[8];
748
wire resc32 = res[32];
749
wire resz8 = res8[7:0]==8'h00;
750
wire resz32 = res[31:0]==32'd0;
751
wire resn8 = res8[7];
752
wire resn32 = res[31];
753
wire resn = em ? res8[7] : res[31];
754
wire resz = em ? res8[7:0]==8'h00 : res[31:0]==32'd0;
755
wire resc = em ? res8[8] : res[32];
756
wire resv = em ? resv8 : resv32;
757
 
758
reg [31:0] vect;
759
reg [31:0] ia;                   // temporary reg to hold indirect address
760
wire [31:0] iapy8 = ia + y[7:0];
761
reg isInsnCacheLoad;
762
reg isDataCacheLoad;
763
wire hit0,hit1;
764
wire dhit;
765
reg wr;
766
reg [3:0] wrsel;
767
reg [31:0] radr;
768
reg [1:0] radr2LSB;
769
wire [33:0] radr34 = {radr,radr2LSB};
770
wire [33:0] radr34p1 = radr34 + 34'd1;
771
reg [31:0] wadr;
772
reg [1:0] wadr2LSB;
773
reg [31:0] wdat;
774
wire [31:0] rdat;
775
reg imiss;
776
reg dmiss;
777
reg icacheOn,dcacheOn;
778
wire unCachedData = radr[31:28]==4'hD || !dcacheOn;
779
wire unCachedInsn =/* pc[31:28]==4'hF || */!icacheOn;
780
 
781
wire isSub = ir[7:0]==`SUB_ZPX || ir[7:0]==`SUB_IX || ir[7:0]==`SUB_IY ||
782
                         ir[7:0]==`SUB_ABS || ir[7:0]==`SUB_ABSX || ir[7:0]==`SUB_IMM8 || ir[7:0]==`SUB_IMM16 || ir[7:0]==`SUB_IMM32;
783
wire isSub8 = ir[7:0]==`SBC_ZP || ir[7:0]==`SBC_ZPX || ir[7:0]==`SBC_IX || ir[7:0]==`SBC_IY || ir[7:0]==`SBC_I ||
784
                         ir[7:0]==`SBC_ABS || ir[7:0]==`SBC_ABSX || ir[7:0]==`SBC_ABSY || ir[7:0]==`SBC_IMM;
785
wire isCmp = ir[7:0]==`CPX_ZPX || ir[7:0]==`CPX_ABS || ir[7:0]==`CPX_IMM32 ||
786
                         ir[7:0]==`CPY_ZPX || ir[7:0]==`CPY_ABS || ir[7:0]==`CPY_IMM32;
787
wire isRMW32 =
788
                         ir[7:0]==`ASL_ZPX || ir[7:0]==`ROL_ZPX || ir[7:0]==`LSR_ZPX || ir[7:0]==`ROR_ZPX || ir[7:0]==`INC_ZPX || ir[7:0]==`DEC_ZPX ||
789
                         ir[7:0]==`ASL_ABS || ir[7:0]==`ROL_ABS || ir[7:0]==`LSR_ABS || ir[7:0]==`ROR_ABS || ir[7:0]==`INC_ABS || ir[7:0]==`DEC_ABS ||
790
                         ir[7:0]==`ASL_ABSX || ir[7:0]==`ROL_ABSX || ir[7:0]==`LSR_ABSX || ir[7:0]==`ROR_ABSX || ir[7:0]==`INC_ABSX || ir[7:0]==`DEC_ABSX ||
791
                         ir[7:0]==`TRB_ZP || ir[7:0]==`TRB_ZPX || ir[7:0]==`TRB_ABS || ir[7:0]==`TSB_ZP || ir[7:0]==`TSB_ZPX || ir[7:0]==`TSB_ABS;
792
                         ;
793
wire isRMW8 =
794
                         ir[7:0]==`ASL_ZP || ir[7:0]==`ROL_ZP || ir[7:0]==`LSR_ZP || ir[7:0]==`ROR_ZP || ir[7:0]==`INC_ZP || ir[7:0]==`DEC_ZP ||
795
                         ir[7:0]==`ASL_ZPX || ir[7:0]==`ROL_ZPX || ir[7:0]==`LSR_ZPX || ir[7:0]==`ROR_ZPX || ir[7:0]==`INC_ZPX || ir[7:0]==`DEC_ZPX ||
796
                         ir[7:0]==`ASL_ABS || ir[7:0]==`ROL_ABS || ir[7:0]==`LSR_ABS || ir[7:0]==`ROR_ABS || ir[7:0]==`INC_ABS || ir[7:0]==`DEC_ABS ||
797
                         ir[7:0]==`ASL_ABSX || ir[7:0]==`ROL_ABSX || ir[7:0]==`LSR_ABSX || ir[7:0]==`ROR_ABSX || ir[7:0]==`INC_ABSX || ir[7:0]==`DEC_ABSX ||
798
                         ir[7:0]==`TRB_ZP || ir[7:0]==`TRB_ZPX || ir[7:0]==`TRB_ABS || ir[7:0]==`TSB_ZP || ir[7:0]==`TSB_ZPX || ir[7:0]==`TSB_ABS;
799
                         ;
800
wire isRMW = em ? isRMW8 : isRMW32;
801
wire isOrb = ir[7:0]==`ORB_ZPX || ir[7:0]==`ORB_IX || ir[7:0]==`ORB_IY || ir[7:0]==`ORB_ABS || ir[7:0]==`ORB_ABSX;
802
wire isStb = ir[7:0]==`STB_ZPX || ir[7:0]==`STB_ABS || ir[7:0]==`STB_ABSX;
803
 
804
icachemem icm0 (
805
        .wclk(clk_i),
806
        .wr(ack_i & isInsnCacheLoad),
807
        .adr(adr_o),
808
        .dat(dat_i),
809
        .rclk(~clk_i),
810
        .pc(pc),
811
        .insn(insn)
812
);
813
 
814
tagmem tgm0 (
815
        .wclk(clk_i),
816
        .wr(ack_i & isInsnCacheLoad),
817
        .adr(adr_o),
818
        .rclk(~clk_i),
819
        .pc(pc),
820
        .hit0(hit0),
821
        .hit1(hit1)
822
);
823
 
824
wire ihit = (hit0 & hit1);//(pc[2:0] > 3'd1 ? hit1 : 1'b1));
825
 
826
dcachemem dcm0 (
827
        .wclk(clk_i),
828
        .wr(wr | (ack_i & isDataCacheLoad)),
829
        .sel(wr ? wrsel : sel_o),
830
        .wadr(wr ? wadr : adr_o[33:2]),
831
        .wdat(wr ? wdat : dat_i),
832
        .rclk(~clk_i),
833
        .radr(radr),
834
        .rdat(rdat)
835
);
836
 
837
dtagmem dtm0 (
838
        .wclk(clk_i),
839
        .wr(wr | (ack_i & isDataCacheLoad)),
840
        .wadr(wr ? wadr : adr_o[33:2]),
841
        .rclk(~clk_i),
842
        .radr(radr),
843
        .hit(dhit)
844
);
845
 
846
overflow uovr1 (
847
        .op(isSub),
848
        .a(a[31]),
849
        .b(b[31]),
850
        .s(res[31]),
851
        .v(resv32)
852
);
853
 
854
overflow uovr2 (
855
        .op(isSub8),
856
        .a(acc8[7]),
857
        .b(b8[7]),
858
        .s(res8[7]),
859
        .v(resv8)
860
);
861
 
862
wire [7:0] bcaio;
863
wire [7:0] bcao;
864
wire [7:0] bcsio;
865
wire [7:0] bcso;
866
wire bcaico,bcaco,bcsico,bcsco;
867
 
868
BCDAdd ubcdai1 (.ci(cf),.a(acc8),.b(ir[15:8]),.o(bcaio),.c(bcaico));
869
BCDAdd ubcda2 (.ci(cf),.a(acc8),.b(b8),.o(bcao),.c(bcaco));
870
BCDSub ubcdsi1 (.ci(cf),.a(acc8),.b(ir[15:8]),.o(bcsio),.c(bcsico));
871
BCDSub ubcds2 (.ci(cf),.a(acc8),.b(b8),.o(bcso),.c(bcsco));
872
 
873
reg [7:0] dati;
874
always @(radr2LSB or dat_i)
875
case(radr2LSB)
876
2'd0:   dati <= dat_i[7:0];
877
2'd1:   dati <= dat_i[15:8];
878
2'd2:   dati <= dat_i[23:16];
879
2'd3:   dati <= dat_i[31:24];
880
endcase
881
reg [7:0] rdat8;
882
always @(radr2LSB or rdat)
883
case(radr2LSB)
884
2'd0:   rdat8 <= rdat[7:0];
885
2'd1:   rdat8 <= rdat[15:8];
886
2'd2:   rdat8 <= rdat[23:16];
887
2'd3:   rdat8 <= rdat[31:24];
888
endcase
889
 
890
reg takb;
891
always @(ir or cf or vf or nf or zf)
892
case(ir[7:0])
893
`BEQ:   takb <= zf;
894
`BNE:   takb <= !zf;
895
`BPL:   takb <= !nf;
896
`BMI:   takb <= nf;
897
`BCS:   takb <= cf;
898
`BCC:   takb <= !cf;
899
`BVS:   takb <= vf;
900
`BVC:   takb <= !vf;
901
`BRA:   takb <= 1'b1;
902
`BRL:   takb <= 1'b1;
903
default:        takb <= 1'b0;
904
endcase
905
 
906
wire [31:0] zpx_address = dp + ir[15:8] + x8;
907
wire [31:0] zpy_address = dp + ir[15:8] + y8;
908
wire [31:0] zp_address = dp + ir[15:8];
909
wire [31:0] absx_address = {16'h0,ir[23:8] + {8'h0,x8}};
910
wire [31:0] absy_address = {16'h0,ir[23:8] + {8'h0,y8}};
911
wire [31:0] zpx32xy_address = dp + ir[23:12] + rfoa;
912
wire [31:0] absx32xy_address = ir[47:16] + rfob;
913
wire [31:0] zpx32_address = dp + ir[31:20] + rfob;
914
wire [31:0] absx32_address = ir[55:24] + rfob;
915
 
916
//-----------------------------------------------------------------------------
917
// Clock control
918
// - reset or NMI reenables the clock
919
// - this circuit must be under the clk_i domain
920
//-----------------------------------------------------------------------------
921
//
922
reg cpu_clk_en;
923
reg clk_en;
924
wire clk;
925
BUFGCE u20 (.CE(cpu_clk_en), .I(clk_i), .O(clk) );
926
 
927
always @(posedge clk_i)
928
if (rst_i) begin
929
        cpu_clk_en <= 1'b1;
930
        nmi1 <= 1'b0;
931
end
932
else begin
933
        nmi1 <= nmi_i;
934
        if (nmi_i)
935
                cpu_clk_en <= 1'b1;
936
        else
937
                cpu_clk_en <= clk_en;
938
end
939
 
940
always @(posedge clk)
941
if (rst_i) begin
942
        bte_o <= 2'b00;
943
        cti_o <= 3'b000;
944
        bl_o <= 6'd0;
945
        cyc_o <= 1'b0;
946
        stb_o <= 1'b0;
947
        we_o <= 1'b0;
948
        sel_o <= 4'h0;
949
        adr_o <= 34'd0;
950
        dat_o <= 32'd0;
951
        nmi_edge <= 1'b0;
952
        wai <= 1'b0;
953
        first_ifetch <= `TRUE;
954
        wr <= 1'b0;
955
        em <= 1'b0;
956
        cf <= 1'b0;
957
        ir <= 56'hEAEAEAEAEAEAEA;
958
        imiss <= `FALSE;
959
        dmiss <= `FALSE;
960
        dcacheOn <= 1'b0;
961
        icacheOn <= 1'b1;
962
        nmoi <= 1'b1;
963
        state <= RESET;
964
        cstate <= IDLE;
965
        vect <= `RST_VECT;
966
        pc <= 32'hFFFFFFF0;
967
        bufadr <= 32'd0;
968
        dp <= 32'd0;
969
        clk_en <= 1'b1;
970
end
971
else begin
972
wr <= 1'b0;
973
if (nmi_i & !nmi1)
974
        nmi_edge <= 1'b1;
975
if (nmi_i|nmi1)
976
        clk_en <= 1'b1;
977
case(state)
978
RESET:
979
        begin
980
                vect <= `RST_VECT;
981
                radr <= vect[31:2];
982
                state <= JMP_IND1;
983
        end
984
IFETCH:
985
        begin
986
                if (nmi_edge & !imiss) begin    // imiss indicates cache controller is active and this state is in a waiting loop
987
                        nmi_edge <= 1'b0;
988
                        wai <= 1'b0;
989
                        bf <= 1'b0;
990
                        if (em & !nmoi) begin
991
                                radr <= {24'h1,sp[7:2]};
992
                                radr2LSB <= sp[1:0];
993
                                wadr <= {24'h1,sp[7:2]};
994
                                wadr2LSB <= sp[1:0];
995
                                wdat <= {4{pc[31:24]}};
996
                                cyc_o <= 1'b1;
997
                                stb_o <= 1'b1;
998
                                we_o <= 1'b1;
999
                                case(sp[1:0])
1000
                                2'd0:   sel_o <= 4'b0001;
1001
                                2'd1:   sel_o <= 4'b0010;
1002
                                2'd2:   sel_o <= 4'b0100;
1003
                                2'd3:   sel_o <= 4'b1000;
1004
                                endcase
1005
                                adr_o <= {24'h1,sp[7:2],2'b00};
1006
                                dat_o <= {4{pc[31:24]}};
1007
                                sp <= sp_dec;
1008
                                vect <= `BYTE_NMI_VECT;
1009
                                state <= BYTE_IRQ1;
1010
                        end
1011
                        else begin
1012
                                radr <= isp_dec;
1013
                                wadr <= isp_dec;
1014
                                wdat <= pc;
1015
                                cyc_o <= 1'b1;
1016
                                stb_o <= 1'b1;
1017
                                we_o <= 1'b1;
1018
                                sel_o <= 4'hF;
1019
                                adr_o <= {isp_dec,2'b00};
1020
                                dat_o <= pc;
1021
                                vect <= `NMI_VECT;
1022
                                state <= IRQ1;
1023
                        end
1024
                end
1025
                else if (irq_i && !imiss) begin
1026
                        if (im) begin
1027
                                wai <= 1'b0;
1028
                                if (unCachedInsn) begin
1029
                                        if (bhit) begin
1030
                                                ir <= ibuf;
1031
                                                state <= DECODE;
1032
                                        end
1033
                                        else
1034
                                                imiss <= `TRUE;
1035
                                end
1036
                                else begin
1037
                                        if (ihit) begin
1038
                                                ir <= insn;
1039
                                                state <= DECODE;
1040
                                        end
1041
                                        else
1042
                                                imiss <= `TRUE;
1043
                                end
1044
                        end
1045
                        else begin
1046
                                bf <= 1'b0;
1047
                                wai <= 1'b0;
1048
                                if (em & !nmoi) begin
1049
                                        radr <= {24'h1,sp[7:2]};
1050
                                        radr2LSB <= sp[1:0];
1051
                                        wadr <= {24'h1,sp[7:2]};
1052
                                        wadr2LSB <= sp[1:0];
1053
                                        wdat <= {4{pc[31:24]}};
1054
                                        cyc_o <= 1'b1;
1055
                                        stb_o <= 1'b1;
1056
                                        we_o <= 1'b1;
1057
                                        case(sp[1:0])
1058
                                        2'd0:   sel_o <= 4'b0001;
1059
                                        2'd1:   sel_o <= 4'b0010;
1060
                                        2'd2:   sel_o <= 4'b0100;
1061
                                        2'd3:   sel_o <= 4'b1000;
1062
                                        endcase
1063
                                        adr_o <= {24'h1,sp[7:2],2'b00};
1064
                                        dat_o <= {4{pc[31:24]}};
1065
                                        sp <= sp_dec;
1066
                                        vect <= `BYTE_IRQ_VECT;
1067
                                        state <= BYTE_IRQ1;
1068
                                end
1069
                                else begin
1070
                                        radr <= isp_dec;
1071
                                        wadr <= isp_dec;
1072
                                        wdat <= pc;
1073
                                        cyc_o <= 1'b1;
1074
                                        stb_o <= 1'b1;
1075
                                        we_o <= 1'b1;
1076
                                        sel_o <= 4'hF;
1077
                                        adr_o <= {isp_dec,2'b00};
1078
                                        dat_o <= pc;
1079
                                        vect <= `IRQ_VECT;
1080
                                        state <= IRQ1;
1081
                                end
1082
                        end
1083
                end
1084
                else if (!wai) begin
1085
                        if (unCachedInsn) begin
1086
                                if (bhit) begin
1087
                                        ir <= ibuf;
1088
                                        state <= DECODE;
1089
                                end
1090
                                else
1091
                                        imiss <= `TRUE;
1092
                        end
1093
                        else begin
1094
                                if (ihit) begin
1095
                                        ir <= insn;
1096
                                        state <= DECODE;
1097
                                end
1098
                                else
1099
                                        imiss <= `TRUE;
1100
                        end
1101
                end
1102
                if (first_ifetch) begin
1103
                        first_ifetch <= `FALSE;
1104
                        if (em) begin
1105
                                case(ir[7:0])
1106
                                `NAT:   em <= 1'b0;
1107
                                `TAY,`TXY,`DEY,`INY:    begin y[7:0] <= res8; nf <= resn8; zf <= resz8; end
1108
                                `TAX,`TYX,`TSX,`DEX,`INX:       begin x[7:0] <= res8; nf <= resn8; zf <= resz8; end
1109
                                `TSA,`TYA,`TXA,`INA,`DEA:       begin acc[7:0] <= res8; nf <= resn8; zf <= resz8; end
1110
                                `TAS,`TXS: sp <= res8[7:0];
1111
                                `ADC_IMM:
1112
                                        begin
1113
                                                acc[7:0] <= df ? bcaio : res8;
1114
                                                cf <= df ? bcaico : resc8;
1115
                                                vf <= resv;
1116
                                                nf <= df ? bcaio[7] : resn8;
1117
                                                zf <= df ? bcaio==8'h00 : resz8;
1118
                                        end
1119
                                `ADC_ZP,`ADC_ZPX,`ADC_IX,`ADC_IY,`ADC_ABS,`ADC_ABSX,`ADC_ABSY,`ADC_I:
1120
                                        begin
1121
                                                acc[7:0] <= df ? bcao : res8;
1122
                                                cf <= df ? bcaco : resc8;
1123
                                                vf <= resv;
1124
                                                nf <= df ? bcao[7] : resn8;
1125
                                                zf <= df ? bcao==8'h00 : resz8;
1126
                                        end
1127
                                `SBC_IMM:
1128
                                        begin
1129
                                                acc[7:0] <= df ? bcsio : res8;
1130
                                                cf <= ~(df ? bcsico : resc8);
1131
                                                vf <= resv;
1132
                                                nf <= df ? bcsio[7] : resn8;
1133
                                                zf <= df ? bcsio==8'h00 : resz8;
1134
                                        end
1135
                                `SBC_ZP,`SBC_ZPX,`SBC_IX,`SBC_IY,`SBC_ABS,`SBC_ABSX,`SBC_ABSY,`SBC_I:
1136
                                        begin
1137
                                                acc[7:0] <= df ? bcso : res8;
1138
                                                vf <= resv;
1139
                                                cf <= ~(df ? bcsco : resc8);
1140
                                                nf <= df ? bcso[7] : resn8;
1141
                                                zf <= df ? bcso==8'h00 : resz8;
1142
                                        end
1143
                                `CMP_IMM,`CMP_ZP,`CMP_ZPX,`CMP_IX,`CMP_IY,`CMP_ABS,`CMP_ABSX,`CMP_ABSY,`CMP_I,
1144
                                `CPX_IMM,`CPX_ZP,`CPX_ABS,
1145
                                `CPY_IMM,`CPY_ZP,`CPY_ABS:
1146
                                                begin cf <= ~resc8; nf <= resn8; zf <= resz8; end
1147
                                `BIT_ZP,`BIT_ABS:
1148
                                                begin nf <= resn8; vf <= res8[6]; zf <= resz8; end
1149
                                `TRB_ZP,`TRB_ABS,`TSB_ZP,`TSB_ABS:
1150
                                        begin zf <= resz8; end
1151
                                `LDA_IMM,`LDA_ZP,`LDA_ZPX,`LDA_IX,`LDA_IY,`LDA_ABS,`LDA_ABSX,`LDA_ABSY,`LDA_I,
1152
                                `AND_IMM,`AND_ZP,`AND_ZPX,`AND_IX,`AND_IY,`AND_ABS,`AND_ABSX,`AND_ABSY,`AND_I,
1153
                                `ORA_IMM,`ORA_ZP,`ORA_ZPX,`ORA_IX,`ORA_IY,`ORA_ABS,`ORA_ABSX,`ORA_ABSY,`ORA_I,
1154
                                `EOR_IMM,`EOR_ZP,`EOR_ZPX,`EOR_IX,`EOR_IY,`EOR_ABS,`EOR_ABSX,`EOR_ABSY,`EOR_I:
1155
                                        begin acc[7:0] <= res8; nf <= resn8; zf <= resz8; end
1156
                                `ASL_ACC:       begin acc[7:0] <= res8; cf <= resc8; nf <= resn8; zf <= resz8; end
1157
                                `ROL_ACC:       begin acc[7:0] <= res8; cf <= resc8; nf <= resn8; zf <= resz8; end
1158
                                `LSR_ACC:       begin acc[7:0] <= res8; cf <= resc8; nf <= resn8; zf <= resz8; end
1159
                                `ROR_ACC:       begin acc[7:0] <= res8; cf <= resc8; nf <= resn8; zf <= resz8; end
1160
                                `ASL_ZP,`ASL_ZPX,`ASL_ABS,`ASL_ABSX: begin cf <= resc8; nf <= resn8; zf <= resz8; end
1161
                                `ROL_ZP,`ROL_ZPX,`ROL_ABS,`ROL_ABSX: begin cf <= resc8; nf <= resn8; zf <= resz8; end
1162
                                `LSR_ZP,`LSR_ZPX,`LSR_ABS,`LSR_ABSX: begin cf <= resc8; nf <= resn8; zf <= resz8; end
1163
                                `ROR_ZP,`ROR_ZPX,`ROR_ABS,`ROR_ABSX: begin cf <= resc8; nf <= resn8; zf <= resz8; end
1164
                                `INC_ZP,`INC_ZPX,`INC_ABS,`INC_ABSX: begin nf <= resn8; zf <= resz8; end
1165
                                `DEC_ZP,`DEC_ZPX,`DEC_ABS,`DEC_ABSX: begin nf <= resn8; zf <= resz8; end
1166
                                `PLA:   begin acc[7:0] <= res8; zf <= resz8; nf <= resn8; end
1167
                                `PLX:   begin x[7:0] <= res8; zf <= resz8; nf <= resn8; end
1168
                                `PLY:   begin y[7:0] <= res8; zf <= resz8; nf <= resn8; end
1169
                                `LDX_IMM,`LDX_ZP,`LDX_ZPY,`LDX_ABS,`LDX_ABSY:   begin x[7:0] <= res8; nf <= resn8; zf <= resz8; end
1170
                                `LDY_IMM,`LDY_ZP,`LDY_ZPX,`LDY_ABS,`LDY_ABSX:   begin y[7:0] <= res8; nf <= resn8; zf <= resz8; end
1171
                                endcase
1172
                        end
1173
                        else begin
1174
                                regfile[Rt] <= res;
1175
                                case(Rt)
1176
                                4'h1:   acc <= res;
1177
                                4'h2:   x <= res;
1178
                                4'h3:   y <= res;
1179
                                default:        ;
1180
                                endcase
1181
                                case(ir[7:0])
1182
//                              `XCE:           begin cf <= em; em <= cf; end
1183
                                `EMM:   em <= 1'b1;
1184
                                `TAY,`TXY,`DEY,`INY:    begin y <= res; nf <= resn32; zf <= resz32; end
1185
                                `TAX,`TYX,`TSX,`DEX,`INX:       begin x <= res; nf <= resn32; zf <= resz32; end
1186
                                `TAS,`TXS:      isp <= res;
1187
                                `TSA,`TYA,`TXA,`INA,`DEA:       begin acc <= res; nf <= resn32; zf <= resz32; end
1188
                                `TRS:
1189
                                        begin
1190
                                                case(ir[15:12])
1191
                                                4'h0:   begin
1192
                                                                $display("res=%h",res);
1193
                                                                icacheOn <= res[0];
1194
                                                                dcacheOn <= res[1];
1195
                                                                end
1196
                                                4'h1:   dp <= res;
1197
                                                4'hE:   sp <= res[7:0];
1198
                                                4'hF:   isp <= res;
1199
                                                endcase
1200
                                        end
1201
                                `ASL_RR,`ROL_RR,`LSR_RR,`ROR_RR: begin cf <= resc32; nf <= resn32; zf <= resz32; end
1202
                                `ADD_IMM8,`ADD_IMM16,`ADD_IMM32,`ADD_ZPX,`ADD_IX,`ADD_IY,`ADD_ABS,`ADD_ABSX,`ADD_RIND:
1203
                                        begin vf <= resv32; cf <= resc32; nf <= resn32; zf <= resz32; end
1204
                                `SUB_IMM8,`SUB_IMM16,`SUB_IMM32,`SUB_ZPX,`SUB_IX,`SUB_IY,`SUB_ABS,`SUB_ABSX,`SUB_RIND:
1205
                                        if (Rt==4'h0)   // CMP doesn't set overflow
1206
                                                begin cf <= ~resc32; nf <= resn32; zf <= resz32; end
1207
                                        else
1208
                                                begin vf <= resv32; cf <= ~resc32; nf <= resn32; zf <= resz32; end
1209
                                `AND_IMM8,`AND_IMM16,`AND_IMM32,`AND_ZPX,`AND_IX,`AND_IY,`AND_ABS,`AND_ABSX,`AND_RIND:
1210
                                        if (Rt==4'h0)   // BIT sets overflow
1211
                                                begin nf <= resn32; vf <= res[30]; zf <= resz32; end
1212
                                        else
1213
                                                begin nf <= resn32; zf <= resz32; end
1214
                                `ORB_ZPX,`ORB_ABS,`ORB_ABSX,
1215
                                `OR_IMM8,`OR_IMM16,`OR_IMM32,`OR_ZPX,`OR_IX,`OR_IY,`OR_ABS,`OR_ABSX,`OR_RIND,
1216
                                `EOR_IMM8,`EOR_IMM16,`EOR_IMM32,`EOR_ZPX,`EOR_IX,`EOR_IY,`EOR_ABS,`EOR_ABSX,`EOR_RIND:
1217
                                        begin nf <= resn32; zf <= resz32; end
1218
                                `ASL_ACC:       begin acc <= res; cf <= resc32; nf <= resn32; zf <= resz32; end
1219
                                `ROL_ACC:       begin acc <= res; cf <= resc32; nf <= resn32; zf <= resz32; end
1220
                                `LSR_ACC:       begin acc <= res; cf <= resc32; nf <= resn32; zf <= resz32; end
1221
                                `ROR_ACC:       begin acc <= res; cf <= resc32; nf <= resn32; zf <= resz32; end
1222
                                `ASL_ZPX,`ASL_ABS,`ASL_ABSX: begin cf <= resc32; nf <= resn32; zf <= resz32; end
1223
                                `ROL_ZPX,`ROL_ABS,`ROL_ABSX: begin cf <= resc32; nf <= resn32; zf <= resz32; end
1224
                                `LSR_ZPX,`LSR_ABS,`LSR_ABSX: begin cf <= resc32; nf <= resn32; zf <= resz32; end
1225
                                `ROR_ZPX,`ROR_ABS,`ROR_ABSX: begin cf <= resc32; nf <= resn32; zf <= resz32; end
1226
                                `INC_ZPX,`INC_ABS,`INC_ABSX: begin nf <= resn32; zf <= resz32; end
1227
                                `DEC_ZPX,`DEC_ABS,`DEC_ABSX: begin nf <= resn32; zf <= resz32; end
1228
                                `PLA:   begin acc <= res; zf <= resz32; nf <= resn32; end
1229
                                `PLX:   begin x <= res; zf <= resz32; nf <= resn32; end
1230
                                `PLY:   begin y <= res; zf <= resz32; nf <= resn32; end
1231
                                `LDX_IMM32,`LDX_IMM16,`LDX_IMM8,`LDX_ZPY,`LDX_ABS,`LDX_ABSY:    begin x <= res; nf <= resn32; zf <= resz32; end
1232
                                `LDY_IMM32,`LDY_ZPX,`LDY_ABS,`LDY_ABSX: begin y <= res; nf <= resn32; zf <= resz32; end
1233
                                `CPX_IMM32,`CPX_ZPX,`CPX_ABS:   begin cf <= ~resc; nf <= resn32; zf <= resz32; end
1234
                                `CPY_IMM32,`CPY_ZPX,`CPY_ABS:   begin cf <= ~resc; nf <= resn32; zf <= resz32; end
1235
                                `LDA_IMM32,`LDA_IMM16,`LDA_IMM8:        begin acc <= res; nf <= resn32; zf <= resz32; end
1236
                                endcase
1237
                        end
1238
                end
1239
        end
1240
DECODE:
1241
        begin
1242
        first_ifetch <= `TRUE;
1243
        Rt <= 4'h0;             // Default
1244
        if (em) begin
1245
                state <= IFETCH;
1246
                case(ir[7:0])
1247
//              `XCE:   begin pc <= pc + 32'd1; state <= IFETCH; end
1248
                `STP:   begin clk_en <= 1'b0; pc <= pc + 32'd1; end
1249
                `NAT:   pc <= pc + 32'd1;
1250
                `NOP:   pc <= pc + 32'd1;
1251
                `CLC:   begin cf <= 1'b0; pc <= pc + 32'd1; end
1252
                `SEC:   begin cf <= 1'b1; pc <= pc + 32'd1; end
1253
                `CLV:   begin vf <= 1'b0; pc <= pc + 32'd1; end
1254
                `CLI:   begin im <= 1'b0; pc <= pc + 32'd1; end
1255
                `SEI:   begin im <= 1'b1; pc <= pc + 32'd1; end
1256
                `CLD:   begin df <= 1'b0; pc <= pc + 32'd1; end
1257
                `SED:   begin df <= 1'b1; pc <= pc + 32'd1; end
1258
                `WAI:   begin wai <= 1'b1; pc <= pc + 32'd1; end
1259
                `DEX:   begin res8 <= x[7:0] - 8'd1; pc <= pc + 32'd1; end
1260
                `INX:   begin res8 <= x[7:0] + 8'd1; pc <= pc + 32'd1; end
1261
                `DEY:   begin res8 <= y[7:0] - 8'd1; pc <= pc + 32'd1; end
1262
                `INY:   begin res8 <= y[7:0] + 8'd1; pc <= pc + 32'd1; end
1263
                `DEA:   begin res8 <= acc[7:0] - 8'd1; pc <= pc + 32'd1; end
1264
                `INA:   begin res8 <= acc[7:0] + 8'd1; pc <= pc + 32'd1; end
1265
                `TSX,`TSA:      begin res8 <= sp[7:0]; pc <= pc + 32'd1; end
1266
                `TXS,`TXA,`TXY: begin res8 <= x[7:0]; pc <= pc + 32'd1; end
1267
                `TAX,`TAY,`TAS: begin res8 <= acc[7:0]; pc <= pc + 32'd1; end
1268
                `TYA,`TYX:      begin res8 <= y[7:0]; pc <= pc + 32'd1; end
1269
                `ASL_ACC:       begin res8 <= {acc8,1'b0}; pc <= pc + 32'd1; end
1270
                `ROL_ACC:       begin res8 <= {acc8,cf}; pc <= pc + 32'd1; end
1271
                `LSR_ACC:       begin res8 <= {acc8[0],1'b0,acc8[7:1]}; pc <= pc + 32'd1; end
1272
                `ROR_ACC:       begin res8 <= {acc8[0],cf,acc8[7:1]}; pc <= pc + 32'd1; end
1273
                // Handle # mode
1274
                `LDA_IMM,`LDX_IMM,`LDY_IMM:
1275
                        begin
1276
                                pc <= pc + 32'd2;
1277
                                res8 <= ir[15:8];
1278
                                state <= IFETCH;
1279
                        end
1280
                `ADC_IMM:
1281
                        begin
1282
                                pc <= pc + 32'd2;
1283
                                res8 <= acc8 + ir[15:8] + {7'b0,cf};
1284
                                b8 <= ir[15:8];         // for overflow calc
1285
                                state <= IFETCH;
1286
                        end
1287
                `SBC_IMM:
1288
                        begin
1289
                                pc <= pc + 32'd2;
1290
//                              res8 <= acc8 - ir[15:8] - ~cf;
1291
                                res8 <= acc8 - ir[15:8] - {7'b0,~cf};
1292
                                $display("sbc: %h= %h-%h-%h", acc8 - ir[15:8] - {7'b0,~cf},acc8,ir[15:8],~cf);
1293
                                b8 <= ir[15:8];         // for overflow calc
1294
                                state <= IFETCH;
1295
                        end
1296
                `AND_IMM,`BIT_IMM:
1297
                        begin
1298
                                pc <= pc + 32'd2;
1299
                                res8 <= acc8 & ir[15:8];
1300
                                state <= IFETCH;
1301
                        end
1302
                `ORA_IMM:
1303
                        begin
1304
                                pc <= pc + 32'd2;
1305
                                res8 <= acc8 | ir[15:8];
1306
                                state <= IFETCH;
1307
                        end
1308
                `EOR_IMM:
1309
                        begin
1310
                                pc <= pc + 32'd2;
1311
                                res8 <= acc8 ^ ir[15:8];
1312
                                state <= IFETCH;
1313
                        end
1314
                `CMP_IMM:
1315
                        begin
1316
                                pc <= pc + 32'd2;
1317
                                res8 <= acc8 - ir[15:8];
1318
                                state <= IFETCH;
1319
                        end
1320
                `CPX_IMM:
1321
                        begin
1322
                                pc <= pc + 32'd2;
1323
                                res8 <= x8 - ir[15:8];
1324
                                state <= IFETCH;
1325
                        end
1326
                `CPY_IMM:
1327
                        begin
1328
                                pc <= pc + 32'd2;
1329
                                res8 <= y8 - ir[15:8];
1330
                                state <= IFETCH;
1331
                        end
1332
                // Handle zp mode
1333
                `ADC_ZP,`SBC_ZP,`AND_ZP,`ORA_ZP,`EOR_ZP,`CMP_ZP,`LDA_ZP,
1334
                `LDX_ZP,`LDY_ZP,`BIT_ZP,`CPX_ZP,`CPY_ZP,
1335
                `ASL_ZP,`ROL_ZP,`LSR_ZP,`ROR_ZP,`INC_ZP,`DEC_ZP,`TRB_ZP,`TSB_ZP:
1336
                        begin
1337
                                pc <= pc + 32'd2;
1338
                                radr <= zp_address[31:2];
1339
                                radr2LSB <= zp_address[1:0];
1340
                                state <= LOAD1;
1341
                        end
1342
                `STA_ZP:
1343
                        begin
1344
                                pc <= pc + 32'd2;
1345
                                wadr <= zp_address[31:2];
1346
                                wadr2LSB <= zp_address[1:0];
1347
                                wdat <= {4{acc8}};
1348
                                state <= STORE1;
1349
                        end
1350
                `STX_ZP:
1351
                        begin
1352
                                pc <= pc + 32'd2;
1353
                                wadr <= zp_address[31:2];
1354
                                wadr2LSB <= zp_address[1:0];
1355
                                wdat <= {4{x8}};
1356
                                state <= STORE1;
1357
                        end
1358
                `STY_ZP:
1359
                        begin
1360
                                pc <= pc + 32'd2;
1361
                                wadr <= zp_address[31:2];
1362
                                wadr2LSB <= zp_address[1:0];
1363
                                wdat <= {4{y8}};
1364
                                state <= STORE1;
1365
                        end
1366
                `STZ_ZP:
1367
                        begin
1368
                                pc <= pc + 32'd2;
1369
                                wadr <= zp_address[31:2];
1370
                                wadr2LSB <= zp_address[1:0];
1371
                                wdat <= {4{8'h00}};
1372
                                state <= STORE1;
1373
                        end
1374
                // Handle zp,x mode
1375
                `ADC_ZPX,`SBC_ZPX,`AND_ZPX,`ORA_ZPX,`EOR_ZPX,`CMP_ZPX,`LDA_ZPX,
1376
                `LDY_ZPX,`BIT_ZPX,
1377
                `ASL_ZPX,`ROL_ZPX,`LSR_ZPX,`ROR_ZPX,`INC_ZPX,`DEC_ZPX:
1378
                        begin
1379
                                pc <= pc + 32'd2;
1380
                                radr <= zpx_address[31:2];
1381
                                radr2LSB <= zpx_address[1:0];
1382
                                state <= LOAD1;
1383
                        end
1384
                `STA_ZPX:
1385
                        begin
1386
                                pc <= pc + 32'd2;
1387
                                wadr <= zpx_address[31:2];
1388
                                wadr2LSB <= zpx_address[1:0];
1389
                                wdat <= {4{acc8}};
1390
                                state <= STORE1;
1391
                        end
1392
                `STY_ZPX:
1393
                        begin
1394
                                pc <= pc + 32'd2;
1395
                                wadr <= zpx_address[31:2];
1396
                                wadr2LSB <= zpx_address[1:0];
1397
                                wdat <= {4{y8}};
1398
                                state <= STORE1;
1399
                        end
1400
                `STZ_ZPX:
1401
                        begin
1402
                                pc <= pc + 32'd2;
1403
                                wadr <= zpx_address[31:2];
1404
                                wadr2LSB <= zpx_address[1:0];
1405
                                wdat <= {4{8'h00}};
1406
                                state <= STORE1;
1407
                        end
1408
                // Handle zp,y
1409
                `LDX_ZPY:
1410
                        begin
1411
                                pc <= pc + 32'd2;
1412
                                radr <= zpy_address[31:2];
1413
                                radr2LSB <= zpy_address[1:0];
1414
                                state <= LOAD1;
1415
                        end
1416
                `STX_ZPY:
1417
                        begin
1418
                                pc <= pc + 32'd2;
1419
                                wadr <= zpy_address[31:2];
1420
                                wadr2LSB <= zpy_address[1:0];
1421
                                wdat <= {4{x8}};
1422
                                state <= STORE1;
1423
                        end
1424
                // Handle (zp,x)
1425
                `ADC_IX,`SBC_IX,`AND_IX,`ORA_IX,`EOR_IX,`CMP_IX,`LDA_IX,`STA_IX:
1426
                        begin
1427
                                pc <= pc + 32'd2;
1428
                                radr <= zpx_address[31:2];
1429
                                radr2LSB <= zpx_address[1:0];
1430
                                state <= BYTE_IX1;
1431
                        end
1432
                // Handle (zp),y
1433
                `ADC_IY,`SBC_IY,`AND_IY,`ORA_IY,`EOR_IY,`CMP_IY,`LDA_IY,`STA_IY:
1434
                        begin
1435
                                pc <= pc + 32'd2;
1436
                                radr <= zp_address[31:2];
1437
                                radr2LSB <= zp_address[1:0];
1438
                                state <= BYTE_IY1;
1439
                        end
1440
                // Handle abs
1441
                `ADC_ABS,`SBC_ABS,`AND_ABS,`ORA_ABS,`EOR_ABS,`CMP_ABS,`LDA_ABS,
1442
                `ASL_ABS,`ROL_ABS,`LSR_ABS,`ROR_ABS,`INC_ABS,`DEC_ABS,`TRB_ABS,`TSB_ABS,
1443
                `LDX_ABS,`LDY_ABS,
1444
                `CPX_ABS,`CPY_ABS,
1445
                `BIT_ABS:
1446
                        begin
1447
                                pc <= pc + 32'd3;
1448
                                radr <= ir[23:10];
1449
                                radr2LSB <= ir[9:8];
1450
                                state <= LOAD1;
1451
                        end
1452
                `STA_ABS:
1453
                        begin
1454
                                pc <= pc + 32'd3;
1455
                                wadr <= ir[23:10];
1456
                                wadr2LSB <= ir[9:8];
1457
                                wdat <= {4{acc8}};
1458
                                state <= STORE1;
1459
                        end
1460
                `STX_ABS:
1461
                        begin
1462
                                pc <= pc + 32'd3;
1463
                                wadr <= ir[23:10];
1464
                                wadr2LSB <= ir[9:8];
1465
                                wdat <= {4{x8}};
1466
                                state <= STORE1;
1467
                        end             // Handle abs,x
1468
                `STY_ABS:
1469
                        begin
1470
                                pc <= pc + 32'd3;
1471
                                wadr <= ir[23:10];
1472
                                wadr2LSB <= ir[9:8];
1473
                                wdat <= {4{y8}};
1474
                                state <= STORE1;
1475
                        end
1476
                `STZ_ABS:
1477
                        begin
1478
                                pc <= pc + 32'd3;
1479
                                wadr <= ir[23:10];
1480
                                wadr2LSB <= ir[9:8];
1481
                                wdat <= {4{8'h00}};
1482
                                state <= STORE1;
1483
                        end
1484
                `ADC_ABSX,`SBC_ABSX,`AND_ABSX,`ORA_ABSX,`EOR_ABSX,`CMP_ABSX,`LDA_ABSX,
1485
                `ASL_ABSX,`ROL_ABSX,`LSR_ABSX,`ROR_ABSX,`INC_ABSX,`DEC_ABSX,`BIT_ABSX,
1486
                `LDY_ABSX:
1487
                        begin
1488
                                pc <= pc + 32'd3;
1489
                                radr <= absx_address[31:2];
1490
                                radr2LSB <= absx_address[1:0];
1491
                                state <= LOAD1;
1492
                        end
1493
                `STA_ABSX:
1494
                        begin
1495
                                pc <= pc + 32'd3;
1496
                                wadr <= absx_address[31:2];
1497
                                wadr2LSB <= absx_address[1:0];
1498
                                wdat <= {4{acc8}};
1499
                                state <= STORE1;
1500
                        end
1501
                `STZ_ABSX:
1502
                        begin
1503
                                pc <= pc + 32'd3;
1504
                                wadr <= absx_address[31:2];
1505
                                wadr2LSB <= absx_address[1:0];
1506
                                wdat <= {4{8'h00}};
1507
                                state <= STORE1;
1508
                        end
1509
                // Handle abs,y
1510
                `ADC_ABSY,`SBC_ABSY,`AND_ABSY,`ORA_ABSY,`EOR_ABSY,`CMP_ABSY,`LDA_ABSY,
1511
                `LDX_ABSY:
1512
                        begin
1513
                                pc <= pc + 32'd3;
1514
                                radr <= absy_address[31:2];
1515
                                radr2LSB <= absy_address[1:0];
1516
                                state <= LOAD1;
1517
                        end
1518
                `STA_ABSY:
1519
                        begin
1520
                                pc <= pc + 32'd3;
1521
                                wadr <= absy_address[31:2];
1522
                                wadr2LSB <= absy_address[1:0];
1523
                                wdat <= {4{acc8}};
1524
                                state <= STORE1;
1525
                        end
1526
                // Handle (zp)
1527
                `ADC_I,`SBC_I,`AND_I,`ORA_I,`EOR_I,`CMP_I,`LDA_I,`STA_I:
1528
                        begin
1529
                                pc <= pc + 32'd2;
1530
                                radr <= zp_address[31:2];
1531
                                radr2LSB <= zp_address[1:0];
1532
                                state <= BYTE_IX1;
1533
                        end
1534
                `BRK:
1535
                        begin
1536
                                radr <= {24'h1,sp[7:2]};
1537
                                radr2LSB <= sp[1:0];
1538
                                wadr <= {24'h1,sp[7:2]};
1539
                                wadr2LSB <= sp[1:0];
1540
                                wdat <= {4{pcp1[31:24]}};
1541
                                cyc_o <= 1'b1;
1542
                                stb_o <= 1'b1;
1543
                                we_o <= 1'b1;
1544
                                case(sp[1:0])
1545
                                2'd0:   sel_o <= 4'b0001;
1546
                                2'd1:   sel_o <= 4'b0010;
1547
                                2'd2:   sel_o <= 4'b0100;
1548
                                2'd3:   sel_o <= 4'b1000;
1549
                                endcase
1550
                                adr_o <= {24'h1,sp[7:2],2'b00};
1551
                                dat_o <= {4{pcp1[31:24]}};
1552
                                sp <= sp_dec;
1553
                                vect <= `BYTE_IRQ_VECT;
1554
                                state <= BYTE_IRQ1;
1555
                                bf <= 1'b1;
1556
                        end
1557
                `JMP:
1558
                        begin
1559
                                pc[15:0] <= ir[23:8];
1560
                                state <= IFETCH;
1561
                        end
1562
                `JML:
1563
                        begin
1564
                                pc <= ir[39:8];
1565
                                state <= IFETCH;
1566
                        end
1567
                `JMP_IND:
1568
                        begin
1569
                                radr <= ir[23:10];
1570
                                radr2LSB <= ir[9:8];
1571
                                state <= BYTE_JMP_IND1;
1572
                        end
1573
                `JMP_INDX:
1574
                        begin
1575
                                radr <= absx_address[15:2];
1576
                                radr2LSB <= absx_address[1:0];
1577
                                state <= BYTE_JMP_IND1;
1578
                        end
1579
                `JSR:
1580
                        begin
1581
                                radr <= {24'h1,sp[7:2]};
1582
                                wadr <= {24'h1,sp[7:2]};
1583
                                radr2LSB <= sp[1:0];
1584
                                wadr2LSB <= sp[1:0];
1585
                                wdat <= {4{pcp2[15:8]}};
1586
                                cyc_o <= 1'b1;
1587
                                stb_o <= 1'b1;
1588
                                we_o <= 1'b1;
1589
                                case(sp[1:0])
1590
                                2'd0:   sel_o <= 4'b0001;
1591
                                2'd1:   sel_o <= 4'b0010;
1592
                                2'd2:   sel_o <= 4'b0100;
1593
                                2'd3:   sel_o <= 4'b1000;
1594
                                endcase
1595
                                adr_o <= {24'h1,sp[7:2],2'b00};
1596
                                dat_o <= {4{pcp2[15:8]}};
1597
                                sp <= sp_dec;
1598
                                state <= BYTE_JSR1;
1599
                        end
1600
                `JSL:
1601
                        begin
1602
                                radr <= {24'h1,sp[7:2]};
1603
                                wadr <= {24'h1,sp[7:2]};
1604
                                radr2LSB <= sp[1:0];
1605
                                wadr2LSB <= sp[1:0];
1606
                                wdat <= {4{pcp4[31:24]}};
1607
                                cyc_o <= 1'b1;
1608
                                stb_o <= 1'b1;
1609
                                we_o <= 1'b1;
1610
                                case(sp[1:0])
1611
                                2'd0:   sel_o <= 4'b0001;
1612
                                2'd1:   sel_o <= 4'b0010;
1613
                                2'd2:   sel_o <= 4'b0100;
1614
                                2'd3:   sel_o <= 4'b1000;
1615
                                endcase
1616
                                adr_o <= {24'h1,sp[7:2],2'b00};
1617
                                dat_o <= {4{pcp4[31:24]}};
1618
                                sp <= sp_dec;
1619
                                state <= BYTE_JSL1;
1620
                        end
1621
                `JSR_INDX:
1622
                        begin
1623
                                radr <= {24'h1,sp[7:2]};
1624
                                wadr <= {24'h1,sp[7:2]};
1625
                                radr2LSB <= sp[1:0];
1626
                                wadr2LSB <= sp[1:0];
1627
                                wdat <= {4{pcp2[15:8]}};
1628
                                cyc_o <= 1'b1;
1629
                                stb_o <= 1'b1;
1630
                                we_o <= 1'b1;
1631
                                case(sp_dec[1:0])
1632
                                2'd0:   sel_o <= 4'b0001;
1633
                                2'd1:   sel_o <= 4'b0010;
1634
                                2'd2:   sel_o <= 4'b0100;
1635
                                2'd3:   sel_o <= 4'b1000;
1636
                                endcase
1637
                                adr_o <= {24'h1,sp[7:2],2'b00};
1638
                                dat_o <= {4{pcp2[15:8]}};
1639
                                sp <= sp_dec;
1640
                                state <= BYTE_JSR_INDX1;
1641
                        end
1642
                `RTS,`RTL:
1643
                        begin
1644
                                radr <= {24'h1,sp_inc[7:2]};
1645
                                radr2LSB <= sp_inc[1:0];
1646
                                sp <= sp_inc;
1647
                                state <= BYTE_RTS1;
1648
                        end
1649
                `RTI:   begin
1650
                                radr <= {24'h1,sp_inc[7:2]};
1651
                                radr2LSB <= sp_inc[1:0];
1652
                                sp <= sp_inc;
1653
                                state <= BYTE_RTI9;
1654
                                end
1655
                `BEQ,`BNE,`BPL,`BMI,`BCC,`BCS,`BVC,`BVS,`BRA:
1656
                        begin
1657
                                state <= IFETCH;
1658
//                              if (ir[15:8]==8'hFE) begin
1659
//                                      radr <= {24'h1,sp[7:2]};
1660
//                                      radr2LSB <= sp[1:0];
1661
//                                      wadr <= {24'h1,sp[7:2]};
1662
//                                      wadr2LSB <= sp[1:0];
1663
//                                      case(sp[1:0])
1664
//                                      2'd0:   sel_o <= 4'b0001;
1665
//                                      2'd1:   sel_o <= 4'b0010;
1666
//                                      2'd2:   sel_o <= 4'b0100;
1667
//                                      2'd3:   sel_o <= 4'b1000;
1668
//                                      endcase
1669
//                                      wdat <= {4{pcp2[31:24]}};
1670
//                                      cyc_o <= 1'b1;
1671
//                                      stb_o <= 1'b1;
1672
//                                      we_o <= 1'b1;
1673
//                                      adr_o <= {24'h1,sp[7:2],2'b00};
1674
//                                      dat_o <= {4{pcp2[31:24]}};
1675
//                                      vect <= `SLP_VECT;
1676
//                                      state <= BYTE_IRQ1;
1677
//                              end
1678
//                              else
1679
                                if (ir[15:8]==8'hFF) begin
1680
                                        if (takb)
1681
                                                pc <= pc + {{16{ir[31]}},ir[31:16]};
1682
                                        else
1683
                                                pc <= pc + 32'd4;
1684
                                end
1685
                                else begin
1686
                                        if (takb)
1687
                                                pc <= pc + {{24{ir[15]}},ir[15:8]} + 32'd2;
1688
                                        else
1689
                                                pc <= pc + 32'd2;
1690
                                end
1691
                        end
1692
                `PHP:
1693
                        begin
1694
                                cyc_o <= 1'b1;
1695
                                stb_o <= 1'b1;
1696
                                we_o <= 1'b1;
1697
                                radr <= {24'h1,sp[7:2]};
1698
                                radr2LSB <= sp[1:0];
1699
                                wadr <= {24'h1,sp[7:2]};
1700
                                wadr2LSB <= sp[1:0];
1701
                                case(sp[1:0])
1702
                                2'd0:   sel_o <= 4'b0001;
1703
                                2'd1:   sel_o <= 4'b0010;
1704
                                2'd2:   sel_o <= 4'b0100;
1705
                                2'd3:   sel_o <= 4'b1000;
1706
                                endcase
1707
                                adr_o <= {24'h1,sp[7:2],2'b00};
1708
                                dat_o <= {4{sr8}};
1709
                                wdat <= {4{sr8}};
1710
                                sp <= sp_dec;
1711
                                state <= PHP1;
1712
                        end
1713
                `PHA:
1714
                        begin
1715
                                cyc_o <= 1'b1;
1716
                                stb_o <= 1'b1;
1717
                                we_o <= 1'b1;
1718
                                radr <= {24'h1,sp[7:2]};
1719
                                radr2LSB <= sp[1:0];
1720
                                wadr <= {24'h1,sp[7:2]};
1721
                                wadr2LSB <= sp[1:0];
1722
                                case(sp[1:0])
1723
                                2'd0:   sel_o <= 4'b0001;
1724
                                2'd1:   sel_o <= 4'b0010;
1725
                                2'd2:   sel_o <= 4'b0100;
1726
                                2'd3:   sel_o <= 4'b1000;
1727
                                endcase
1728
                                adr_o <= {24'h1,sp[7:2],2'b00};
1729
                                dat_o <= {4{acc8}};
1730
                                wdat <= {4{acc8}};
1731
                                sp <= sp_dec;
1732
                                state <= PHP1;
1733
                        end
1734
                `PHX:
1735
                        begin
1736
                                cyc_o <= 1'b1;
1737
                                stb_o <= 1'b1;
1738
                                we_o <= 1'b1;
1739
                                radr <= {24'h1,sp[7:2]};
1740
                                radr2LSB <= sp[1:0];
1741
                                wadr <= {24'h1,sp[7:2]};
1742
                                wadr2LSB <= sp[1:0];
1743
                                case(sp[1:0])
1744
                                2'd0:   sel_o <= 4'b0001;
1745
                                2'd1:   sel_o <= 4'b0010;
1746
                                2'd2:   sel_o <= 4'b0100;
1747
                                2'd3:   sel_o <= 4'b1000;
1748
                                endcase
1749
                                adr_o <= {24'h1,sp[7:2],2'b00};
1750
                                dat_o <= {4{x8}};
1751
                                wdat <= {4{x8}};
1752
                                sp <= sp_dec;
1753
                                state <= PHP1;
1754
                        end
1755
                `PHY:
1756
                        begin
1757
                                cyc_o <= 1'b1;
1758
                                stb_o <= 1'b1;
1759
                                we_o <= 1'b1;
1760
                                radr <= {24'h1,sp[7:2]};
1761
                                radr2LSB <= sp[1:0];
1762
                                wadr <= {24'h1,sp[7:2]};
1763
                                wadr2LSB <= sp[1:0];
1764
                                case(sp[1:0])
1765
                                2'd0:   sel_o <= 4'b0001;
1766
                                2'd1:   sel_o <= 4'b0010;
1767
                                2'd2:   sel_o <= 4'b0100;
1768
                                2'd3:   sel_o <= 4'b1000;
1769
                                endcase
1770
                                adr_o <= {24'h1,sp[7:2],2'b00};
1771
                                dat_o <= {4{y8}};
1772
                                wdat <= {4{y8}};
1773
                                sp <= sp_dec;
1774
                                state <= PHP1;
1775
                        end
1776
                `PLP:
1777
                        begin
1778
                                radr <= {24'h1,sp_inc[7:2]};
1779
                                radr2LSB <= sp_inc[1:0];
1780
                                sp <= sp_inc;
1781
                                state <= BYTE_PLP1;
1782
                                pc <= pc + 32'd1;
1783
                        end
1784
                `PLA,`PLX,`PLY:
1785
                        begin
1786
                                radr <= {24'h1,sp_inc[7:2]};
1787
                                radr2LSB <= sp_inc[1:0];
1788
                                sp <= sp_inc;
1789
                                state <= PLA1;
1790
                                pc <= pc + 32'd1;
1791
                        end
1792
                default:        // unimplemented opcode
1793
                        pc <= pc + 32'd1;
1794
                endcase
1795
        end
1796
        else begin
1797
                state <= IFETCH;
1798
                case(ir[7:0])
1799
                `STP:   begin clk_en <= 1'b0; pc <= pc + 32'd1; end
1800
                `NOP:   begin pc <= pc + 32'd1; end
1801
                `CLC:   begin cf <= 1'b0; pc <= pc + 32'd1; end
1802
                `SEC:   begin cf <= 1'b1; pc <= pc + 32'd1; end
1803
                `CLV:   begin vf <= 1'b0; pc <= pc + 32'd1; end
1804
                `CLI:   begin im <= 1'b0; pc <= pc + 32'd1; end
1805
                `CLD:   begin df <= 1'b0; pc <= pc + 32'd1; end
1806
                `SED:   begin df <= 1'b1; pc <= pc + 32'd1; end
1807
                `SEI:   begin im <= 1'b1; pc <= pc + 32'd1; end
1808
                `WAI:   begin wai <= 1'b1; pc <= pc + 32'd1; end
1809
                `EMM:   begin pc <= pc + 32'd1; end
1810
                `DEX:   begin res <= x - 32'd1; pc <= pc + 32'd1; end
1811
                `INX:   begin res <= x + 32'd1; pc <= pc + 32'd1; end
1812
                `DEY:   begin res <= y - 32'd1; pc <= pc + 32'd1; end
1813
                `INY:   begin res <= y + 32'd1; pc <= pc + 32'd1; end
1814
                `DEA:   begin res <= acc - 32'd1; pc <= pc + 32'd1; end
1815
                `INA:   begin res <= acc + 32'd1; pc <= pc + 32'd1; end
1816
                `TSX:   begin res <= isp; pc <= pc + 32'd1; end
1817
                `TXS,`TXA,`TXY: begin res <= x; pc <= pc + 32'd1; end
1818
                `TAX,`TAY,`TAS: begin res <= acc; pc <= pc + 32'd1; end
1819
                `TYA,`TYX:      begin res <= y; pc <= pc + 32'd1; end
1820
                `TRS:           begin
1821
                                                $display("Ra=%h,set res=%h", Ra, rfoa);
1822
                                                res <= rfoa; pc <= pc + 32'd2; end
1823
                `TSR:           begin
1824
                                                Rt <= ir[15:12];
1825
                                                case(ir[11:8])
1826
                                                4'h0:   res <= {dcacheOn,icacheOn};
1827
                                                4'h1:   res <= dp;
1828
                                                4'h2:   res <= prod[31:0];
1829
                                                4'h3:   res <= prod[63:32];
1830
                                                4'hE:   res <= sp;
1831
                                                4'hF:   res <= isp;
1832
                                                endcase
1833
                                                pc <= pc + 32'd2;
1834
                                        end
1835
                `ASL_ACC:       begin res <= {acc,1'b0}; pc <= pc + 32'd1; end
1836
                `ROL_ACC:       begin res <= {acc,cf}; pc <= pc + 32'd1; end
1837
                `LSR_ACC:       begin res <= {acc[0],1'b0,acc[31:1]}; pc <= pc + 32'd1; end
1838
                `ROR_ACC:       begin res <= {acc[0],cf,acc[31:1]}; pc <= pc + 32'd1; end
1839
 
1840
                `RR:
1841
                        begin
1842
                                a <= rfoa;
1843
                                b <= rfob;
1844
                                Rt <= ir[19:16];
1845
                                pc <= pc + 32'd3;
1846
                                state <= CALC;
1847
                        end
1848
                `ASL_RR,`ROL_RR,`LSR_RR,`ROR_RR:
1849
                        begin
1850
                                a <= rfoa;
1851
                                Rt <= ir[15:12];
1852
                                pc <= pc + 32'd2;
1853
                                state <= CALC;
1854
                        end
1855
                `ADD_IMM8:
1856
                        begin
1857
                                res <= rfoa + {{24{ir[23]}},ir[23:16]};
1858
                                Rt <= ir[15:12];
1859
                                pc <= pc + 32'd3;
1860
                                state <= IFETCH;
1861
                        end
1862
                `SUB_IMM8,`OR_IMM8,`AND_IMM8,`EOR_IMM8:
1863
                        begin
1864
                                a <= rfoa;
1865
                                b <= {{24{ir[23]}},ir[23:16]};
1866
                                Rt <= ir[15:12];
1867
                                pc <= pc + 32'd3;
1868
                                state <= CALC;
1869
                        end
1870
                `ADD_IMM16,`SUB_IMM16,`OR_IMM16,`AND_IMM16,`EOR_IMM16:
1871
                        begin
1872
                                a <= rfoa;
1873
                                b <= {{16{ir[31]}},ir[31:16]};
1874
                                Rt <= ir[15:12];
1875
                                pc <= pc + 32'd4;
1876
                                state <= CALC;
1877
                        end
1878
                `ADD_IMM32,`SUB_IMM32,`OR_IMM32,`AND_IMM32,`EOR_IMM32,`CMP_IMM32:
1879
                        begin
1880
                                a <= rfoa;
1881
                                b <= ir[47:16];
1882
                                Rt <= ir[15:12];
1883
                                pc <= pc + 32'd6;
1884
                                state <= CALC;
1885
                        end
1886
                `LDX_IMM32,`LDY_IMM32,`LDA_IMM32:
1887
                        begin
1888
                                res <= ir[39:8];
1889
                                pc <= pc + 32'd5;
1890
                                state <= IFETCH;
1891
                        end
1892
                `LDX_IMM16,`LDA_IMM16:
1893
                        begin
1894
                                res <= {{16{ir[23]}},ir[23:8]};
1895
                                pc <= pc + 32'd3;
1896
                                state <= IFETCH;
1897
                        end
1898
                `LDX_IMM8,`LDA_IMM8:
1899
                        begin
1900
                                res <= {{24{ir[15]}},ir[15:8]};
1901
                                $display("set res=%h",{{24{ir[15]}},ir[15:8]});
1902
                                pc <= pc + 32'd2;
1903
                                state <= IFETCH;
1904
                        end
1905
                `LDX_ZPX,`LDY_ZPX:
1906
                        begin
1907
                                radr <= zpx32xy_address;
1908
                                pc <= pc + 32'd3;
1909
                                state <= LOAD1;
1910
                        end
1911
                `ORB_ZPX:
1912
                        begin
1913
                                a <= rfoa;
1914
                                Rt <= ir[19:16];
1915
                                radr <= zpx32_address[31:2];
1916
                                radr2LSB <= zpx32_address[1:0];
1917
                                pc <= pc + 32'd4;
1918
                                state <= LOAD1;
1919
                        end
1920
                `LDX_ABS,`LDY_ABS:
1921
                        begin
1922
                                radr <= ir[39:8];
1923
                                pc <= pc + 32'd5;
1924
                                state <= LOAD1;
1925
                        end
1926
                `ORB_ABS:
1927
                        begin
1928
                                a <= rfoa;
1929
                                Rt <= ir[15:12];
1930
                                radr <= ir[47:18];
1931
                                radr2LSB <= ir[17:16];
1932
                                pc <= pc + 32'd6;
1933
                                state <= LOAD1;
1934
                        end
1935
                `LDX_ABSY,`LDY_ABSX:
1936
                        begin
1937
                                radr <= absx32xy_address;
1938
                                pc <= pc + 32'd6;
1939
                                state <= LOAD1;
1940
                        end
1941
                `ORB_ABSX:
1942
                        begin
1943
                                a <= rfoa;
1944
                                Rt <= ir[19:16];
1945
                                radr <= absx32_address[31:2];
1946
                                radr2LSB <= absx32_address[1:0];
1947
                                pc <= pc + 32'd7;
1948
                                state <= LOAD1;
1949
                        end
1950
                `ST_ZPX:
1951
                        begin
1952
                                wadr <= zpx32_address;
1953
                                wdat <= rfoa;
1954
                                pc <= pc + 32'd4;
1955
                                state <= STORE1;
1956
                        end
1957
                `STB_ZPX:
1958
                        begin
1959
                                wadr <= zpx32_address[31:2];
1960
                                wadr2LSB <= zpx32_address[1:0];
1961
                                pc <= pc + 32'd4;
1962
                                state <= STORE1;
1963
                        end
1964
                `ST_ABS:
1965
                        begin
1966
                                wadr <= ir[47:16];
1967
                                wdat <= rfoa;
1968
                                pc <= pc + 32'd6;
1969
                                state <= STORE1;
1970
                        end
1971
                `STB_ABS:
1972
                        begin
1973
                                wadr <= ir[47:18];
1974
                                wadr2LSB <= ir[17:16];
1975
                                wdat <= {4{rfoa[7:0]}};
1976
                                pc <= pc + 32'd6;
1977
                                state <= STORE1;
1978
                        end
1979
                `ST_ABSX:
1980
                        begin
1981
                                wadr <= absx32_address;
1982
                                wdat <= rfoa;
1983
                                pc <= pc + 32'd7;
1984
                                state <= STORE1;
1985
                        end
1986
                `STB_ABSX:
1987
                        begin
1988
                                wadr <= absx32_address[31:2];
1989
                                wadr2LSB <= absx32_address[1:0];
1990
                                wdat <= {4{rfoa[7:0]}};
1991
                                pc <= pc + 32'd7;
1992
                                state <= STORE1;
1993
                        end
1994
                `STX_ZPX:
1995
                        begin
1996
                                wadr <= dp + ir[23:12] + rfoa;
1997
                                wdat <= x;
1998
                                pc <= pc + 32'd3;
1999
                                state <= STORE1;
2000
                        end
2001
                `STX_ABS:
2002
                        begin
2003
                                wadr <= ir[39:8];
2004
                                wdat <= x;
2005
                                pc <= pc + 32'd5;
2006
                                state <= STORE1;
2007
                        end
2008
                `STY_ZPX:
2009
                        begin
2010
                                wadr <= dp + ir[23:12] + rfoa;
2011
                                wdat <= y;
2012
                                pc <= pc + 32'd3;
2013
                                state <= STORE1;
2014
                        end
2015
                `STY_ABS:
2016
                        begin
2017
                                wadr <= ir[39:8];
2018
                                wdat <= y;
2019
                                pc <= pc + 32'd5;
2020
                                state <= STORE1;
2021
                        end
2022
                `ADD_ZPX,`SUB_ZPX,`OR_ZPX,`AND_ZPX,`EOR_ZPX:
2023
                        begin
2024
                                a <= rfoa;
2025
                                Rt <= ir[19:16];
2026
                                radr <= zpx32_address;
2027
                                pc <= pc + 32'd4;
2028
                                state <= LOAD1;
2029
                        end
2030
                `ASL_ZPX,`ROL_ZPX,`LSR_ZPX,`ROR_ZPX,`INC_ZPX,`DEC_ZPX:
2031
                        begin
2032
                                radr <= dp + rfoa + ir[23:12];
2033
                                pc <= pc + 32'd3;
2034
                                state <= LOAD1;
2035
                        end
2036
                `ADD_IX,`SUB_IX,`OR_IX,`AND_IX,`EOR_IX,`ST_IX:
2037
                        begin
2038
                                a <= rfoa;
2039
                                if (ir[7:0]==`ST_IX)
2040
                                        res <= rfoa;            // for ST_IX, Rt=0
2041
                                else
2042
                                        Rt <= ir[19:16];
2043
                                pc <= pc + 32'd4;
2044
                                radr <= dp + ir[31:20] + rfob;
2045
                                state <= IX1;
2046
                        end
2047
                `ADD_RIND,`SUB_RIND,`OR_RIND,`AND_RIND,`EOR_RIND,`ST_RIND:
2048
                        begin
2049
                                a <= rfoa;
2050
                                if (ir[7:0]==`ST_RIND) begin
2051
                                        res <= rfoa;            // for ST_IX, Rt=0
2052
                                        pc <= pc + 32'd2;
2053
                                end
2054
                                else begin
2055
                                        Rt <= ir[19:16];
2056
                                        pc <= pc + 32'd3;
2057
                                end
2058
                                radr <= rfob;
2059
                                state <= IX1;
2060
                        end
2061
                `ADD_IY,`SUB_IY,`OR_IY,`AND_IY,`EOR_IY,`ST_IY:
2062
                        begin
2063
                                a <= rfoa;
2064
                                if (ir[7:0]==`ST_IY)
2065
                                        res <= rfoa;            // for ST_IY, Rt=0
2066
                                else
2067
                                        Rt <= ir[19:16];
2068
                                pc <= pc + 32'd4;
2069
                                radr <= dp + ir[31:20];
2070
                                state <= IY1;
2071
                        end
2072
                `ADD_ABS,`SUB_ABS,`OR_ABS,`AND_ABS,`EOR_ABS:
2073
                        begin
2074
                                a <= rfoa;
2075
                                radr <= ir[47:16];
2076
                                Rt <= ir[15:12];
2077
                                pc <= pc + 32'd6;
2078
                                state <= LOAD1;
2079
                        end
2080
                `ASL_ABS,`ROL_ABS,`LSR_ABS,`ROR_ABS,`INC_ABS,`DEC_ABS:
2081
                        begin
2082
                                radr <= ir[39:8];
2083
                                pc <= pc + 32'd5;
2084
                                state <= LOAD1;
2085
                        end
2086
                `ADD_ABSX,`SUB_ABSX,`OR_ABSX,`AND_ABSX,`EOR_ABSX:
2087
                        begin
2088
                                a <= rfoa;
2089
                                radr <= ir[55:24] + rfob;
2090
                                Rt <= ir[19:16];
2091
                                pc <= pc + 32'd7;
2092
                                state <= LOAD1;
2093
                        end
2094
                `ASL_ABSX,`ROL_ABSX,`LSR_ABSX,`ROR_ABSX,`INC_ABSX,`DEC_ABSX:
2095
                        begin
2096
                                radr <= ir[47:16] + rfob;
2097
                                pc <= pc + 32'd6;
2098
                                state <= LOAD1;
2099
                        end
2100
                `CPX_IMM32:
2101
                        begin
2102
                                res <= x - ir[39:8];
2103
                                pc <= pc + 32'd5;
2104
                                state <= IFETCH;
2105
                        end
2106
                `CPY_IMM32:
2107
                        begin
2108
                                res <= y - ir[39:8];
2109
                                pc <= pc + 32'd5;
2110
                                state <= IFETCH;
2111
                        end
2112
                `CPX_ZPX:
2113
                        begin
2114
                                radr <= dp + ir[23:12] + rfoa;
2115
                                pc <= pc + 32'd3;
2116
                                state <= LOAD1;
2117
                        end
2118
                `CPY_ZPX:
2119
                        begin
2120
                                radr <= dp + ir[23:12] + rfoa;
2121
                                pc <= pc + 32'd3;
2122
                                state <= LOAD1;
2123
                        end
2124
                `CPX_ABS:
2125
                        begin
2126
                                radr <= ir[39:8];
2127
                                pc <= pc + 32'd5;
2128
                                state <= LOAD1;
2129
                        end
2130
                `CPY_ABS:
2131
                        begin
2132
                                radr <= ir[39:8];
2133
                                pc <= pc + 32'd5;
2134
                                state <= LOAD1;
2135
                        end
2136
                `BRK:
2137
                        begin
2138
                                bf <= 1'b1;
2139
                                radr <= isp - 32'd1;
2140
                                wadr <= isp - 32'd1;
2141
                                wdat <= pc + 32'd1;
2142
                                cyc_o <= 1'b1;
2143
                                stb_o <= 1'b1;
2144
                                we_o <= 1'b1;
2145
                                sel_o <= 4'hF;
2146
                                adr_o <= {isp_dec,2'b00};
2147
                                dat_o <= pc + 32'd1;
2148
                                vect <= `BRK_VECT;
2149
                                state <= IRQ1;
2150
                        end
2151
                `JMP:
2152
                        begin
2153
                                pc[15:0] <= ir[23:8];
2154
                                state <= IFETCH;
2155
                        end
2156
                `JML:
2157
                        begin
2158
                                pc <= ir[39:8];
2159
                                state <= IFETCH;
2160
                        end
2161
                `JMP_IND:
2162
                        begin
2163
                                radr <= ir[39:8];
2164
                                state <= JMP_IND1;
2165
                        end
2166
                `JMP_INDX:
2167
                        begin
2168
                                radr <= ir[39:8] + x;
2169
                                state <= JMP_IND1;
2170
                        end
2171
                `JMP_RIND:
2172
                        begin
2173
                                pc <= rfoa;
2174
                                res <= pc + 32'd2;
2175
                                Rt <= ir[15:12];
2176
                                state <= IFETCH;
2177
                        end
2178
                `JSR:
2179
                        begin
2180
                                radr <= isp_dec;
2181
                                wadr <= isp_dec;
2182
                                wdat <= pc + 32'd3;
2183
                                cyc_o <= 1'b1;
2184
                                stb_o <= 1'b1;
2185
                                we_o <= 1'b1;
2186
                                sel_o <= 4'hF;
2187
                                adr_o <= {isp_dec,2'b00};
2188
                                dat_o <= pc + 32'd3;
2189
                                vect <= {pc[31:16],ir[23:8]};
2190
                                state <= JSR1;
2191
                        end
2192
                `JSR_RIND:
2193
                        begin
2194
                                radr <= isp_dec;
2195
                                wadr <= isp_dec;
2196
                                wdat <= pc + 32'd2;
2197
                                cyc_o <= 1'b1;
2198
                                stb_o <= 1'b1;
2199
                                we_o <= 1'b1;
2200
                                sel_o <= 4'hF;
2201
                                adr_o <= {isp_dec,2'b00};
2202
                                dat_o <= pc + 32'd2;
2203
                                vect <= rfoa;
2204
                                state <= JSR1;
2205
                                $stop;
2206
                        end
2207
                `JSL:
2208
                        begin
2209
                                radr <= isp_dec;
2210
                                wadr <= isp_dec;
2211
                                wdat <= pc + 32'd5;
2212
                                cyc_o <= 1'b1;
2213
                                stb_o <= 1'b1;
2214
                                we_o <= 1'b1;
2215
                                sel_o <= 4'hF;
2216
                                adr_o <= {isp_dec,2'b00};
2217
                                dat_o <= pc + 32'd5;
2218
                                vect <= ir[39:8];
2219
                                state <= JSR1;
2220
                        end
2221
                `BSR:
2222
                        begin
2223
                                radr <= isp_dec;
2224
                                wadr <= isp_dec;
2225
                                wdat <= pc + 32'd3;
2226
                                cyc_o <= 1'b1;
2227
                                stb_o <= 1'b1;
2228
                                we_o <= 1'b1;
2229
                                sel_o <= 4'hF;
2230
                                adr_o <= {isp_dec,2'b00};
2231
                                dat_o <= pc + 32'd3;
2232
                                vect <= pc + {{16{ir[23]}},ir[23:8]};
2233
                                state <= JSR1;
2234
                        end
2235
                `JSR_INDX:
2236
                        begin
2237
                                radr <= isp - 32'd1;
2238
                                wadr <= isp - 32'd1;
2239
                                wdat <= pc + 32'd5;
2240
                                cyc_o <= 1'b1;
2241
                                stb_o <= 1'b1;
2242
                                we_o <= 1'b1;
2243
                                sel_o <= 4'hF;
2244
                                adr_o <= {isp-32'd1,2'b00};
2245
                                dat_o <= pc + 32'd5;
2246
                                state <= JSR_INDX1;
2247
                        end
2248
//              `JSR16:
2249
//                      begin
2250
//                              radr <= isp - 32'd1;
2251
//                              wadr <= isp - 32'd1;
2252
//                              wdat <= pc + 32'd3;
2253
//                              cyc_o <= 1'b1;
2254
//                              stb_o <= 1'b1;
2255
//                              we_o <= 1'b1;
2256
//                              sel_o <= 4'hF;
2257
//                              adr_o <= {isp-32'd1,2'b00};
2258
//                              dat_o <= pc + 32'd3;
2259
//                              state <= JSR161;
2260
//                      end
2261
                `RTS,`RTL:
2262
                                begin
2263
                                radr <= isp;
2264
                                state <= RTS1;
2265
                                end
2266
                `RTI:   begin
2267
                                radr <= isp;
2268
                                state <= RTI1;
2269
                                end
2270
                `BEQ,`BNE,`BPL,`BMI,`BCC,`BCS,`BVC,`BVS,`BRA:
2271
                        begin
2272
                                state <= IFETCH;
2273
                                if (ir[15:8]==8'h00) begin
2274
                                        radr <= isp_dec;
2275
                                        wadr <= isp_dec;
2276
                                        wdat <= pc + 32'd2;
2277
                                        cyc_o <= 1'b1;
2278
                                        stb_o <= 1'b1;
2279
                                        we_o <= 1'b1;
2280
                                        sel_o <= 4'hF;
2281
                                        adr_o <= {isp_dec,2'b00};
2282
                                        dat_o <= pc + 32'd2;
2283
                                        vect <= `SLP_VECT;
2284
                                        state <= IRQ1;
2285
                                end
2286
                                else if (ir[15:8]==8'h1) begin
2287
                                        if (takb)
2288
                                                pc <= pc + {{16{ir[31]}},ir[31:16]};
2289
                                        else
2290
                                                pc <= pc + 32'd4;
2291
                                end
2292
                                else begin
2293
                                        if (takb)
2294
                                                pc <= pc + {{24{ir[15]}},ir[15:8]};
2295
                                        else
2296
                                                pc <= pc + 32'd2;
2297
                                end
2298
                        end
2299
                `BRL:
2300
                        begin
2301
                                if (ir[23:8]==16'h0000) begin
2302
                                        radr <= isp_dec;
2303
                                        wadr <= isp_dec;
2304
                                        wdat <= pc + 32'd3;
2305
                                        cyc_o <= 1'b1;
2306
                                        stb_o <= 1'b1;
2307
                                        we_o <= 1'b1;
2308
                                        sel_o <= 4'hF;
2309
                                        adr_o <= {isp_dec,2'b00};
2310
                                        dat_o <= pc + 32'd3;
2311
                                        vect <= `SLP_VECT;
2312
                                        state <= IRQ1;
2313
                                end
2314
                                else begin
2315
                                        pc <= pc + {{16{ir[23]}},ir[23:8]};
2316
                                        state <= IFETCH;
2317
                                end
2318
                        end
2319
                `PHP:
2320
                        begin
2321
                                cyc_o <= 1'b1;
2322
                                stb_o <= 1'b1;
2323
                                sel_o <= 4'hF;
2324
                                we_o <= 1'b1;
2325
                                radr <= isp_dec;
2326
                                wadr <= isp_dec;
2327
                                wdat <= sr;
2328
                                adr_o <= {isp_dec,2'b00};
2329
                                dat_o <= sr;
2330
                                isp <= isp_dec;
2331
                                state <= PHP1;
2332
                        end
2333
                `PHA:
2334
                        begin
2335
                                cyc_o <= 1'b1;
2336
                                stb_o <= 1'b1;
2337
                                sel_o <= 4'hF;
2338
                                we_o <= 1'b1;
2339
                                radr <= isp_dec;
2340
                                wadr <= isp_dec;
2341
                                wdat <= acc;
2342
                                adr_o <= {isp_dec,2'b00};
2343
                                dat_o <= acc;
2344
                                isp <= isp_dec;
2345
                                state <= PHP1;
2346
                        end
2347
                `PHX:
2348
                        begin
2349
                                cyc_o <= 1'b1;
2350
                                stb_o <= 1'b1;
2351
                                sel_o <= 4'hF;
2352
                                we_o <= 1'b1;
2353
                                radr <= isp_dec;
2354
                                wadr <= isp_dec;
2355
                                wdat <= x;
2356
                                adr_o <= {isp_dec,2'b00};
2357
                                dat_o <= x;
2358
                                isp <= isp_dec;
2359
                                state <= PHP1;
2360
                        end
2361
                `PHY:
2362
                        begin
2363
                                cyc_o <= 1'b1;
2364
                                stb_o <= 1'b1;
2365
                                sel_o <= 4'hF;
2366
                                we_o <= 1'b1;
2367
                                radr <= isp_dec;
2368
                                wadr <= isp_dec;
2369
                                wdat <= y;
2370
                                adr_o <= {isp_dec,2'b00};
2371
                                dat_o <= y;
2372
                                isp <= isp_dec;
2373
                                state <= PHP1;
2374
                        end
2375
                `PUSH:
2376
                        begin
2377
                                cyc_o <= 1'b1;
2378
                                stb_o <= 1'b1;
2379
                                sel_o <= 4'hF;
2380
                                we_o <= 1'b1;
2381
                                radr <= isp_dec;
2382
                                wadr <= isp_dec;
2383
                                wdat <= rfoa;
2384
                                adr_o <= {isp_dec,2'b00};
2385
                                dat_o <= rfoa;
2386
                                state <= PHP1;
2387
                                isp <= isp_dec;
2388
                                pc <= pc + 32'd1;
2389
                        end
2390
                `PLP:
2391
                        begin
2392
                                radr <= isp;
2393
                                state <= PLP1;
2394
                                pc <= pc + 32'd1;
2395
                        end
2396
                `PLA,`PLX,`PLY:
2397
                        begin
2398
                                radr <= isp;
2399
                                isp <= isp_inc;
2400
                                state <= PLA1;
2401
                                pc <= pc + 32'd1;
2402
                        end
2403
                `POP:
2404
                        begin
2405
                                Rt <= ir[15:12];
2406
                                radr <= isp;
2407
                                isp <= isp_inc;
2408
                                state <= PLA1;
2409
                                pc <= pc + 32'd2;
2410
                        end
2411
                default:        // unimplemented opcode
2412
                        pc <= pc + 32'd1;
2413
                endcase
2414
                end
2415
        end
2416
 
2417
// Stores always write through to memory, then optionally update the cache if
2418
// there was a write hit.
2419
STORE1:
2420
        begin
2421
                cyc_o <= 1'b1;
2422
                stb_o <= 1'b1;
2423
                we_o <= 1'b1;
2424
                if (em || isStb)
2425
                        case(wadr2LSB)
2426
                        2'd0:   sel_o <= 4'b0001;
2427
                        2'd1:   sel_o <= 4'b0010;
2428
                        2'd2:   sel_o <= 4'b0100;
2429
                        2'd3:   sel_o <= 4'b1000;
2430
                        endcase
2431
                else
2432
                        sel_o <= 4'hf;
2433
                adr_o <= {wadr,2'b00};
2434
                dat_o <= wdat;
2435
                radr <= wadr;           // Do a cache read to test the hit
2436
                state <= STORE2;
2437
        end
2438
 
2439
// Terminal state for stores. Update the data cache if there was a cache hit.
2440
// Clear any previously set lock status
2441
STORE2:
2442
        if (ack_i) begin
2443
                lock_o <= 1'b0;
2444
                cyc_o <= 1'b0;
2445
                stb_o <= 1'b0;
2446
                we_o <= 1'b0;
2447
                sel_o <= 4'h0;
2448
                adr_o <= 34'h0;
2449
                dat_o <= 32'h0;
2450
                if (dhit) begin
2451
                        wrsel <= sel_o;
2452
                        wr <= 1'b1;
2453
                end
2454
                state <= IFETCH;
2455
        end
2456
 
2457
`include "byte_ix.v"
2458
`include "byte_iy.v"
2459
 
2460
// Indirect and indirect X addressing mode eg. LDA ($12,x) : (zp)
2461
IX1:
2462
        if (unCachedData) begin
2463
                cyc_o <= 1'b1;
2464
                stb_o <= 1'b1;
2465
                sel_o <= 4'hf;
2466
                adr_o <= {radr,2'b00};
2467
                state <= IX2;
2468
        end
2469
        else if (dhit) begin
2470
                radr <= rdat;
2471
                state <= IX3;
2472
        end
2473
        else
2474
                dmiss <= `TRUE;
2475
IX2:
2476
        if (ack_i) begin
2477
                cyc_o <= 1'b0;
2478
                stb_o <= 1'b0;
2479
                sel_o <= 4'h0;
2480
                adr_o <= 34'h0;
2481
                radr <= dat_i;
2482
                state <= IX3;
2483
        end
2484
IX3:
2485
        if (ir[7:0]==`ST_IX || ir[7:0]==`ST_RIND) begin
2486
                wadr <= radr;
2487
                wdat <= rfoa;
2488
                state <= STORE1;
2489
        end
2490
        else if (unCachedData) begin
2491
                cyc_o <= 1'b1;
2492
                stb_o <= 1'b1;
2493
                sel_o <= 4'hf;
2494
                adr_o <= {radr,2'b00};
2495
                state <= IX4;
2496
        end
2497
        else if (dhit) begin
2498
                b <= rdat;
2499
                state <= CALC;
2500
        end
2501
        else
2502
                dmiss <= `TRUE;
2503
IX4:
2504
        if (ack_i) begin
2505
                cyc_o <= 1'b0;
2506
                stb_o <= 1'b0;
2507
                sel_o <= 4'h0;
2508
                adr_o <= 34'h0;
2509
                b <= dat_i;
2510
                state <= CALC;
2511
        end
2512
 
2513
 
2514
// Indirect Y addressing mode eg. LDA ($12),y
2515
IY1:
2516
        if (unCachedData) begin
2517
                cyc_o <= 1'b1;
2518
                stb_o <= 1'b1;
2519
                sel_o <= 4'hf;
2520
                adr_o <= {radr,2'b00};
2521
                state <= IY2;
2522
        end
2523
        else if (dhit) begin
2524
                radr <= rdat;
2525
                state <= IY3;
2526
        end
2527
        else
2528
                dmiss <= `TRUE;
2529
IY2:
2530
        if (ack_i) begin
2531
                cyc_o <= 1'b0;
2532
                stb_o <= 1'b0;
2533
                sel_o <= 4'h0;
2534
                adr_o <= 34'h0;
2535
                radr <= dat_i;
2536
                state <= IY3;
2537
        end
2538
IY3:
2539
        begin
2540
                radr <= radr + y;
2541
                wadr <= radr + y;
2542
                wdat <= rfoa;
2543
                if (ir==`ST_IY)
2544
                        state <= STORE1;
2545
                else
2546
                        state <= LOAD1;
2547
        end
2548
 
2549
// Performs the data fetch for both eight bit and 32 bit modes
2550
// Handle the following address modes: zp : zp,Rn : abs : abs,Rn
2551
LOAD1:
2552
        if (unCachedData) begin
2553
                if (isRMW)
2554
                        lock_o <= 1'b1;
2555
                cyc_o <= 1'b1;
2556
                stb_o <= 1'b1;
2557
                sel_o <= 4'hf;
2558
                adr_o <= {radr,2'b00};
2559
                state <= LOAD2;
2560
        end
2561
        else if (dhit) begin
2562
                b8 <= rdat8;
2563
                b <= rdat;
2564
                state <= CALC;
2565
        end
2566
        else
2567
                dmiss <= `TRUE;
2568
LOAD2:
2569
        if (ack_i) begin
2570
                cyc_o <= 1'b0;
2571
                stb_o <= 1'b0;
2572
                sel_o <= 4'h0;
2573
                adr_o <= 34'd0;
2574
                b8 <= dati;
2575
                b <= dat_i;
2576
                state <= CALC;
2577
        end
2578
 
2579
`include "calc.v"
2580
 
2581
JSR1:
2582
        if (ack_i) begin
2583
                cyc_o <= 1'b0;
2584
                stb_o <= 1'b0;
2585
                we_o <= 1'b0;
2586
                sel_o <= 4'h0;
2587
                adr_o <= 34'd0;
2588
                dat_o <= 32'd0;
2589
                pc <= vect;
2590
                isp <= isp_dec;
2591
                if (dhit) begin
2592
                        wrsel <= sel_o;
2593
                        wr <= 1'b1;
2594
                end
2595
                state <= IFETCH;
2596
        end
2597
 
2598
`include "byte_jsr.v"
2599
 
2600
JSR_INDX1:
2601
        if (ack_i) begin
2602
                cyc_o <= 1'b0;
2603
                stb_o <= 1'b0;
2604
                we_o <= 1'b0;
2605
                sel_o <= 4'h0;
2606
                adr_o <= 34'd0;
2607
                dat_o <= 32'd0;
2608
                radr <= ir[39:8] + x;
2609
                isp <= isp_dec;
2610
                if (dhit) begin
2611
                        wrsel <= sel_o;
2612
                        wr <= 1'b1;
2613
                end
2614
                state <= JMP_IND1;
2615
        end
2616
BYTE_JSR_INDX1:
2617
        if (ack_i) begin
2618
                cyc_o <= 1'b0;
2619
                stb_o <= 1'b0;
2620
                we_o <= 1'b0;
2621
                sel_o <= 4'h0;
2622
                if (dhit) begin
2623
                        wrsel <= sel_o;
2624
                        wr <= 1'b1;
2625
                end
2626
                state <= BYTE_JSR_INDX2;
2627
        end
2628
BYTE_JSR_INDX2:
2629
        begin
2630
                radr <= {24'h1,sp[7:2]};
2631
                wadr <= {24'h1,sp[7:2]};
2632
                radr2LSB <= sp[1:0];
2633
                wadr2LSB <= sp[1:0];
2634
                wdat <= {4{pcp2[7:0]}};
2635
                cyc_o <= 1'b1;
2636
                stb_o <= 1'b1;
2637
                we_o <= 1'b1;
2638
                case(sp[1:0])
2639
                2'd0:   sel_o <= 4'b0001;
2640
                2'd1:   sel_o <= 4'b0010;
2641
                2'd2:   sel_o <= 4'b0100;
2642
                2'd3:   sel_o <= 4'b1000;
2643
                endcase
2644
                adr_o <= {24'h1,sp[7:2],2'b00};
2645
                dat_o <= {4{pcp2[7:0]}};
2646
                sp <= sp_dec;
2647
                state <= BYTE_JSR_INDX3;
2648
        end
2649
BYTE_JSR_INDX3:
2650
        if (ack_i) begin
2651
                cyc_o <= 1'b0;
2652
                stb_o <= 1'b0;
2653
                we_o <= 1'b0;
2654
                sel_o <= 4'h0;
2655
                adr_o <= 34'd0;
2656
                dat_o <= 32'd0;
2657
                radr <= absx_address[15:2];
2658
                radr2LSB <= absx_address[1:0];
2659
                if (dhit) begin
2660
                        wrsel <= sel_o;
2661
                        wr <= 1'b1;
2662
                end
2663
                state <= BYTE_JMP_IND1;
2664
        end
2665
JSR161:
2666
        if (ack_i) begin
2667
                cyc_o <= 1'b0;
2668
                stb_o <= 1'b0;
2669
                we_o <= 1'b0;
2670
                sel_o <= 4'h0;
2671
                pc <= {{16{ir[23]}},ir[23:8]};
2672
                isp <= isp_dec;
2673
                if (dhit) begin
2674
                        wrsel <= sel_o;
2675
                        wr <= 1'b1;
2676
                end
2677
                state <= IFETCH;
2678
        end
2679
 
2680
`include "byte_plp.v"
2681
`include "byte_rts.v"
2682
`include "byte_rti.v"
2683
`include "rti.v"
2684
`include "rts.v"
2685
 
2686
PHP1:
2687
        if (ack_i) begin
2688
                cyc_o <= 1'b0;
2689
                stb_o <= 1'b0;
2690
                we_o <= 1'b0;
2691
                sel_o <= 4'h0;
2692
                adr_o <= 34'd0;
2693
                dat_o <= 32'd0;
2694
                pc <= pc + 32'd1;
2695
                if (dhit) begin
2696
                        wr <= 1'b1;
2697
                        wrsel <= sel_o;
2698
                end
2699
                state <= IFETCH;
2700
        end
2701
`include "plp.v"
2702
`include "pla.v"
2703
 
2704
`include "byte_irq.v"
2705
`include "byte_jmp_ind.v"
2706
 
2707
IRQ1:
2708
        if (ack_i) begin
2709
                cyc_o <= 1'b0;
2710
                stb_o <= 1'b0;
2711
                we_o <= 1'b0;
2712
                sel_o <= 4'h0;
2713
                isp <= isp_dec;
2714
                if (dhit) begin
2715
                        wrsel <= sel_o;
2716
                        wr <= 1'b1;
2717
                end
2718
                state <= IRQ2;
2719
        end
2720
IRQ2:
2721
        begin
2722
                cyc_o <= 1'b1;
2723
                stb_o <= 1'b1;
2724
                we_o <= 1'b1;
2725
                sel_o <= 4'hF;
2726
                radr <= isp_dec;
2727
                wadr <= isp_dec;
2728
                wdat <= sr;
2729
                adr_o <= {isp_dec,2'b00};
2730
                dat_o <= sr;
2731
                state <= IRQ3;
2732
        end
2733
IRQ3:
2734
        if (ack_i) begin
2735
                cyc_o <= 1'b0;
2736
                stb_o <= 1'b0;
2737
                we_o <= 1'b0;
2738
                sel_o <= 4'h0;
2739
                isp <= isp_dec;
2740
                if (dhit) begin
2741
                        wrsel <= sel_o;
2742
                        wr <= 1'b1;
2743
                end
2744
                radr <= vect[31:2];
2745
                state <= JMP_IND1;
2746
                if (!bf)
2747
                        im <= 1'b1;
2748
                em <= 1'b0;                     // make sure we process in native mode; we might have been called up during emulation mode
2749
        end
2750
JMP_IND1:
2751
        if (unCachedData) begin
2752
                cyc_o <= 1'b1;
2753
                stb_o <= 1'b1;
2754
                sel_o <= 4'hF;
2755
                adr_o <= {radr,2'b00};
2756
                state <= JMP_IND2;
2757
        end
2758
        else if (dhit) begin
2759
                pc <= rdat;
2760
                state <= IFETCH;
2761
        end
2762
        else
2763
                dmiss <= `TRUE;
2764
JMP_IND2:
2765
        if (ack_i) begin
2766
                cyc_o <= 1'b0;
2767
                stb_o <= 1'b0;
2768
                sel_o <= 4'h0;
2769
                adr_o <= 34'd0;
2770
                pc <= dat_i;
2771
                state <= IFETCH;
2772
        end
2773
endcase
2774
 
2775
`include "cache_controller.v"
2776
 
2777
end
2778
endmodule

powered by: WebSVN 2.1.0

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