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

Subversion Repositories rtf65002

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

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

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

powered by: WebSVN 2.1.0

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