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

Subversion Repositories rtf65002

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

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

powered by: WebSVN 2.1.0

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