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

Subversion Repositories rtf65002

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

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

powered by: WebSVN 2.1.0

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