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

Subversion Repositories rtf65002

[/] [rtf65002/] [trunk/] [rtl/] [verilog/] [decode.v] - Blame information for rev 21

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

Line No. Rev Author Line
1 20 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2013  Robert Finch, Stratford
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@opencores.org
6
//       ||
7
//
8
// This source file is free software: you can redistribute it and/or modify 
9
// it under the terms of the GNU Lesser General Public License as published 
10
// by the Free Software Foundation, either version 3 of the License, or     
11
// (at your option) any later version.                                      
12
//                                                                          
13
// This source file is distributed in the hope that it will be useful,      
14
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
15
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
16
// GNU General Public License for more details.                             
17
//                                                                          
18
// You should have received a copy of the GNU General Public License        
19
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
20
//                                                                          
21
// ============================================================================
22
//
23
DECODE:
24
        begin
25
                first_ifetch <= `TRUE;
26
                Rt <= 4'h0;             // Default
27
                state <= IFETCH;
28
                case(ir[7:0])
29
                `STP:   begin clk_en <= 1'b0; pc <= pc + 32'd1; end
30
                `NOP:   begin pc <= pc + 32'd1; end
31
                `CLC:   begin cf <= 1'b0; pc <= pc + 32'd1; end
32
                `SEC:   begin cf <= 1'b1; pc <= pc + 32'd1; end
33
                `CLV:   begin vf <= 1'b0; pc <= pc + 32'd1; end
34
                `CLI:   begin im <= 1'b0; pc <= pc + 32'd1; end
35
                `CLD:   begin df <= 1'b0; pc <= pc + 32'd1; end
36
                `SED:   begin df <= 1'b1; pc <= pc + 32'd1; end
37
                `SEI:   begin im <= 1'b1; pc <= pc + 32'd1; end
38
                `WAI:   begin wai <= 1'b1; pc <= pc + 32'd1; end
39
                `EMM:   begin em <= 1'b1; pc <= pc + 32'd1; end
40
                `DEX:   begin res <= x - 32'd1; pc <= pc + 32'd1; end
41
                `INX:   begin res <= x + 32'd1; pc <= pc + 32'd1; end
42
                `DEY:   begin res <= y - 32'd1; pc <= pc + 32'd1; end
43
                `INY:   begin res <= y + 32'd1; pc <= pc + 32'd1; end
44
                `DEA:   begin res <= acc - 32'd1; pc <= pc + 32'd1; end
45
                `INA:   begin res <= acc + 32'd1; pc <= pc + 32'd1; end
46
                `TSX:   begin res <= isp; pc <= pc + 32'd1; end
47
                `TXS,`TXA,`TXY: begin res <= x; pc <= pc + 32'd1; end
48
                `TAX,`TAY,`TAS: begin res <= acc; pc <= pc + 32'd1; end
49
                `TYA,`TYX:      begin res <= y; pc <= pc + 32'd1; end
50
                `TRS:           begin
51
                                                res <= rfoa; pc <= pc + 32'd2; end
52
                `TSR:           begin
53
                                                Rt <= ir[15:12];
54
                                                case(ir[11:8])
55
                                                4'h0:   res <= {write_allocate,dcacheOn,icacheOn};
56
                                                4'h1:   res <= dp;
57
                                                4'h2:   res <= prod[31:0];
58
                                                4'h3:   res <= prod[63:32];
59
                                                4'h4:   res <= tick;
60
                                                4'h5:   begin res <= lfsr; lfsr <= {lfsr[30:0],lfsr_fb}; end
61
                                                4'h6:   res <= dp8;
62
                                                4'h7:   res <= abs8;
63
                                                4'h8:   res <= {vbr[31:1],nmoi};
64
                                                4'hE:   res <= {spage[31:8],sp};
65
                                                4'hF:   res <= isp;
66
                                                endcase
67
                                                pc <= pc + 32'd2;
68
                                        end
69
                `ASL_ACC:       begin res <= {acc,1'b0}; pc <= pc + 32'd1; end
70
                `ROL_ACC:       begin res <= {acc,cf}; pc <= pc + 32'd1; end
71
                `LSR_ACC:       begin res <= {acc[0],1'b0,acc[31:1]}; pc <= pc + 32'd1; end
72
                `ROR_ACC:       begin res <= {acc[0],cf,acc[31:1]}; pc <= pc + 32'd1; end
73
 
74
                `RR:
75
                        begin
76
                                state <= IFETCH;
77
                                case(ir[23:20])
78 21 robfinch
                                `ADD_RR:        begin res <= rfoa + rfob + {31'b0,df&cf}; a <= rfoa; b <= rfob; end
79
                                `SUB_RR:        begin res <= rfoa - rfob - {31'b0,df&~cf&|ir[19:16]}; a <= rfoa; b <= rfob; end
80 20 robfinch
                                `AND_RR:        begin res <= rfoa & rfob; a <= rfoa; b <= rfob; end     // for bit flags
81
                                `OR_RR:         begin res <= rfoa | rfob; a <= rfoa; b <= rfob; end
82
                                `EOR_RR:        begin res <= rfoa ^ rfob; a <= rfoa; b <= rfob; end
83
                                `MUL_RR:        begin state <= MULDIV1; end
84
                                `MULS_RR:       begin state <= MULDIV1; end
85
                                `DIV_RR:        begin state <= MULDIV1; end
86
                                `DIVS_RR:       begin state <= MULDIV1; end
87
                                `MOD_RR:        begin state <= MULDIV1; end
88
                                `MODS_RR:       begin state <= MULDIV1; end
89
                                `ASL_RRR:       begin a <= rfoa; b <= rfob; state <= CALC; end
90
                                `LSR_RRR:       begin a <= rfoa; b <= rfob; state <= CALC; end
91
                                endcase
92
                                Rt <= ir[19:16];
93
                                pc <= pc + 32'd3;
94
                        end
95
                `LD_RR:         begin res <= rfoa; Rt <= ir[15:12]; pc <= pc + 32'd2; end
96
                `ASL_RR:        begin res <= {rfoa,1'b0}; pc <= pc + 32'd2; Rt <= ir[15:12]; end
97
                `ROL_RR:        begin res <= {rfoa,cf}; pc <= pc + 32'd2; Rt <= ir[15:12]; end
98
                `LSR_RR:        begin res <= {rfoa[0],1'b0,rfoa[31:1]}; pc <= pc + 32'd2; Rt <= ir[15:12]; end
99
                `ROR_RR:        begin res <= {rfoa[0],cf,rfoa[31:1]}; pc <= pc + 32'd2; Rt <= ir[15:12]; end
100
                `DEC_RR:        begin res <= rfoa - 32'd1; pc <= pc + 32'd2; Rt <= ir[15:12]; end
101
                `INC_RR:        begin res <= rfoa + 32'd1; pc <= pc + 32'd2; Rt <= ir[15:12]; end
102
 
103 21 robfinch
                `ADD_IMM8:      begin res <= rfoa + {{24{ir[23]}},ir[23:16]} + {31'b0,df&cf}; Rt <= ir[15:12]; pc <= pc + 32'd3; a <= rfoa; b <= {{24{ir[23]}},ir[23:16]}; end
104
                `SUB_IMM8:      begin res <= rfoa - {{24{ir[23]}},ir[23:16]} - {31'b0,df&~cf&|ir[15:12]}; Rt <= ir[15:12]; pc <= pc + 32'd3; a <= rfoa; b <= {{24{ir[23]}},ir[23:16]}; end
105 20 robfinch
                `OR_IMM8:       begin res <= rfoa | {{24{ir[23]}},ir[23:16]}; Rt <= ir[15:12]; pc <= pc + 32'd3; b <= {{24{ir[23]}},ir[23:16]}; end
106
                `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
107
                `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
108
                `CMP_IMM8:      begin res <= acc - {{24{ir[15]}},ir[15:8]}; Rt <= 4'h0; pc <= pc + 32'd2; b <= {{24{ir[15]}},ir[15:8]}; end
109
                `ASL_IMM8:      begin a <= rfoa; b <= ir[20:16]; Rt <= ir[15:12]; pc <= pc + 32'd3; state <= CALC; end
110
                `LSR_IMM8:      begin a <= rfoa; b <= ir[20:16]; Rt <= ir[15:12]; pc <= pc + 32'd3; state <= CALC; end
111
 
112 21 robfinch
                `ADD_IMM16:     begin res <= rfoa + {{16{ir[31]}},ir[31:16]} + {31'b0,df&cf}; Rt <= ir[15:12]; pc <= pc + 32'd4; a <= rfoa; b <= {{16{ir[31]}},ir[31:16]}; end
113
                `SUB_IMM16:     begin res <= rfoa - {{16{ir[31]}},ir[31:16]} - {31'b0,df&~cf&|ir[15:12]}; Rt <= ir[15:12]; pc <= pc + 32'd4; a <= rfoa; b <= {{16{ir[31]}},ir[31:16]}; end
114 20 robfinch
                `OR_IMM16:      begin res <= rfoa | {{16{ir[31]}},ir[31:16]}; Rt <= ir[15:12]; pc <= pc + 32'd4; b <= {{16{ir[31]}},ir[31:16]}; end
115
                `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
116
                `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
117
 
118 21 robfinch
                `ADD_IMM32:     begin res <= rfoa + ir[47:16]; Rt <= ir[15:12] + {31'b0,df&cf}; pc <= pc + 32'd6; a <= rfoa; b <= ir[47:16]; end
119
                `SUB_IMM32:     begin res <= rfoa - ir[47:16]; Rt <= ir[15:12] - {31'b0,df&~cf&|ir[15:12]}; pc <= pc + 32'd6; a <= rfoa; b <= ir[47:16]; end
120 20 robfinch
                `OR_IMM32:      begin res <= rfoa | ir[47:16]; Rt <= ir[15:12]; pc <= pc + 32'd6; b <= ir[47:16]; end
121
                `AND_IMM32:     begin res <= rfoa & ir[47:16]; Rt <= ir[15:12]; pc <= pc + 32'd6; b <= ir[47:16]; end
122
                `EOR_IMM32:     begin res <= rfoa ^ ir[47:16]; Rt <= ir[15:12]; pc <= pc + 32'd6; b <= ir[47:16]; end
123
 
124
                `LDX_IMM32,`LDY_IMM32,`LDA_IMM32:       begin res <= ir[39:8]; pc <= pc + 32'd5; end
125
                `LDX_IMM16,`LDA_IMM16:  begin res <= {{16{ir[23]}},ir[23:8]}; pc <= pc + 32'd3; end
126
                `LDX_IMM8,`LDA_IMM8: begin res <= {{24{ir[15]}},ir[15:8]}; pc <= pc + 32'd2; end
127
 
128
                `LDX_ZPX,`LDY_ZPX:
129
                        begin
130
                                radr <= zpx32xy_address;
131
                                pc <= pc + 32'd3;
132 21 robfinch
                                load_what <= `WORD_311;
133
                                state <= LOAD_MAC1;
134 20 robfinch
                        end
135
                `ORB_ZPX:
136
                        begin
137
                                a <= rfoa;
138
                                Rt <= ir[19:16];
139
                                radr <= zpx32_address[31:2];
140
                                radr2LSB <= zpx32_address[1:0];
141
                                pc <= pc + 32'd4;
142 21 robfinch
                                load_what <= `WORD_310;
143
                                state <= LOAD_MAC1;
144 20 robfinch
                        end
145
                `LDX_ABS,`LDY_ABS:
146
                        begin
147
                                radr <= ir[39:8];
148
                                pc <= pc + 32'd5;
149 21 robfinch
                                load_what <= `WORD_311;
150
                                state <= LOAD_MAC1;
151 20 robfinch
                        end
152
                `ORB_ABS:
153
                        begin
154
                                a <= rfoa;
155
                                Rt <= ir[15:12];
156
                                radr <= ir[47:18];
157
                                radr2LSB <= ir[17:16];
158
                                pc <= pc + 32'd6;
159 21 robfinch
                                load_what <= `WORD_310;
160
                                state <= LOAD_MAC1;
161 20 robfinch
                        end
162
                `LDX_ABSY,`LDY_ABSX:
163
                        begin
164
                                radr <= absx32xy_address;
165
                                pc <= pc + 32'd6;
166 21 robfinch
                                load_what <= `WORD_311;
167
                                state <= LOAD_MAC1;
168 20 robfinch
                        end
169
                `ORB_ABSX:
170
                        begin
171
                                a <= rfoa;
172
                                Rt <= ir[19:16];
173
                                radr <= absx32_address[31:2];
174
                                radr2LSB <= absx32_address[1:0];
175
                                pc <= pc + 32'd7;
176 21 robfinch
                                load_what <= `WORD_310;
177
                                state <= LOAD_MAC1;
178 20 robfinch
                        end
179
                `ST_ZPX:
180
                        begin
181
                                wadr <= zpx32_address;
182
                                wdat <= rfoa;
183
                                pc <= pc + 32'd4;
184
                                state <= STORE1;
185
                        end
186
                `STB_ZPX:
187
                        begin
188
                                wadr <= zpx32_address[31:2];
189
                                wadr2LSB <= zpx32_address[1:0];
190
                                pc <= pc + 32'd4;
191
                                state <= STORE1;
192
                        end
193
                `ST_ABS:
194
                        begin
195
                                wadr <= ir[47:16];
196
                                wdat <= rfoa;
197
                                pc <= pc + 32'd6;
198
                                state <= STORE1;
199
                        end
200
                `STB_ABS:
201
                        begin
202
                                wadr <= ir[47:18];
203
                                wadr2LSB <= ir[17:16];
204
                                wdat <= {4{rfoa[7:0]}};
205
                                pc <= pc + 32'd6;
206
                                state <= STORE1;
207
                        end
208
                `ST_ABSX:
209
                        begin
210
                                wadr <= absx32_address;
211
                                wdat <= rfoa;
212
                                pc <= pc + 32'd7;
213
                                state <= STORE1;
214
                        end
215
                `STB_ABSX:
216
                        begin
217
                                wadr <= absx32_address[31:2];
218
                                wadr2LSB <= absx32_address[1:0];
219
                                wdat <= {4{rfoa[7:0]}};
220
                                pc <= pc + 32'd7;
221
                                state <= STORE1;
222
                        end
223
                `STX_ZPX:
224
                        begin
225
                                wadr <= dp + ir[23:12] + rfoa;
226
                                wdat <= x;
227
                                pc <= pc + 32'd3;
228
                                state <= STORE1;
229
                        end
230
                `STX_ABS:
231
                        begin
232
                                wadr <= ir[39:8];
233
                                wdat <= x;
234
                                pc <= pc + 32'd5;
235
                                state <= STORE1;
236
                        end
237
                `STY_ZPX:
238
                        begin
239
                                wadr <= dp + ir[23:12] + rfoa;
240
                                wdat <= y;
241
                                pc <= pc + 32'd3;
242
                                state <= STORE1;
243
                        end
244
                `STY_ABS:
245
                        begin
246
                                wadr <= ir[39:8];
247
                                wdat <= y;
248
                                pc <= pc + 32'd5;
249
                                state <= STORE1;
250
                        end
251
                `ADD_ZPX,`SUB_ZPX,`OR_ZPX,`AND_ZPX,`EOR_ZPX:
252
                        begin
253
                                a <= rfoa;
254
                                Rt <= ir[19:16];
255
                                radr <= zpx32_address;
256
                                pc <= pc + 32'd4;
257 21 robfinch
                                load_what <= `WORD_310;
258
                                state <= LOAD_MAC1;
259 20 robfinch
                        end
260
                `ASL_ZPX,`ROL_ZPX,`LSR_ZPX,`ROR_ZPX,`INC_ZPX,`DEC_ZPX:
261
                        begin
262
                                radr <= dp + rfoa + ir[23:12];
263
                                pc <= pc + 32'd3;
264 21 robfinch
                                load_what <= `WORD_310;
265
                                state <= LOAD_MAC1;
266 20 robfinch
                        end
267
                `ADD_IX,`SUB_IX,`OR_IX,`AND_IX,`EOR_IX,`ST_IX:
268
                        begin
269
                                a <= rfoa;
270
                                if (ir[7:0]==`ST_IX)
271
                                        res <= rfoa;            // for ST_IX, Rt=0
272
                                else
273
                                        Rt <= ir[19:16];
274
                                pc <= pc + 32'd4;
275
                                radr <= dp + ir[31:20] + rfob;
276 21 robfinch
                                load_what <= `IA_310;
277
                                state <= LOAD_MAC1;
278 20 robfinch
                        end
279
                `ADD_RIND,`SUB_RIND,`OR_RIND,`AND_RIND,`EOR_RIND,`ST_RIND:
280
                        begin
281
                                radr <= rfob;
282
                                wadr <= rfob;           // for store
283
                                wdat <= rfoa;
284
                                a <= rfoa;
285
                                if (ir[7:0]==`ST_RIND) begin
286
                                        res <= rfoa;            // for ST_IX, Rt=0
287
                                        pc <= pc + 32'd2;
288
                                        state <= STORE1;
289
                                end
290
                                else begin
291
                                        Rt <= ir[19:16];
292
                                        pc <= pc + 32'd3;
293 21 robfinch
                                        load_what <= `WORD_310;
294
                                        state <= LOAD_MAC1;
295 20 robfinch
                                end
296
                        end
297
                `ADD_IY,`SUB_IY,`OR_IY,`AND_IY,`EOR_IY,`ST_IY:
298
                        begin
299
                                a <= rfoa;
300
                                if (ir[7:0]==`ST_IY)
301
                                        res <= rfoa;            // for ST_IY, Rt=0
302
                                else
303
                                        Rt <= ir[19:16];
304
                                pc <= pc + 32'd4;
305 21 robfinch
                                isIY <= 1'b1;
306 20 robfinch
                                radr <= dp + ir[31:20];
307 21 robfinch
                                load_what <= `IA_310;
308
                                state <= LOAD_MAC1;
309 20 robfinch
                        end
310
                `ADD_ABS,`SUB_ABS,`OR_ABS,`AND_ABS,`EOR_ABS:
311
                        begin
312
                                a <= rfoa;
313
                                radr <= ir[47:16];
314
                                Rt <= ir[15:12];
315
                                pc <= pc + 32'd6;
316 21 robfinch
                                load_what <= `WORD_310;
317
                                state <= LOAD_MAC1;
318 20 robfinch
                        end
319
                `ASL_ABS,`ROL_ABS,`LSR_ABS,`ROR_ABS,`INC_ABS,`DEC_ABS:
320
                        begin
321
                                radr <= ir[39:8];
322
                                pc <= pc + 32'd5;
323 21 robfinch
                                load_what <= `WORD_310;
324
                                state <= LOAD_MAC1;
325 20 robfinch
                        end
326
                `ADD_ABSX,`SUB_ABSX,`OR_ABSX,`AND_ABSX,`EOR_ABSX:
327
                        begin
328
                                a <= rfoa;
329
                                radr <= ir[55:24] + rfob;
330
                                Rt <= ir[19:16];
331
                                pc <= pc + 32'd7;
332 21 robfinch
                                load_what <= `WORD_310;
333
                                state <= LOAD_MAC1;
334 20 robfinch
                        end
335
                `ASL_ABSX,`ROL_ABSX,`LSR_ABSX,`ROR_ABSX,`INC_ABSX,`DEC_ABSX:
336
                        begin
337
                                radr <= ir[47:16] + rfob;
338
                                pc <= pc + 32'd6;
339 21 robfinch
                                load_what <= `WORD_310;
340
                                state <= LOAD_MAC1;
341 20 robfinch
                        end
342
                `CPX_IMM32:
343
                        begin
344
                                res <= x - ir[39:8];
345
                                pc <= pc + 32'd5;
346
                                state <= IFETCH;
347
                        end
348
                `CPY_IMM32:
349
                        begin
350
                                res <= y - ir[39:8];
351
                                pc <= pc + 32'd5;
352
                                state <= IFETCH;
353
                        end
354
                `CPX_ZPX:
355
                        begin
356
                                radr <= dp + ir[23:12] + rfoa;
357
                                pc <= pc + 32'd3;
358 21 robfinch
                                load_what <= `WORD_310;
359
                                state <= LOAD_MAC1;
360 20 robfinch
                        end
361
                `CPY_ZPX:
362
                        begin
363
                                radr <= dp + ir[23:12] + rfoa;
364
                                pc <= pc + 32'd3;
365 21 robfinch
                                load_what <= `WORD_310;
366
                                state <= LOAD_MAC1;
367 20 robfinch
                        end
368
                `CPX_ABS:
369
                        begin
370
                                radr <= ir[39:8];
371
                                pc <= pc + 32'd5;
372 21 robfinch
                                load_what <= `WORD_310;
373
                                state <= LOAD_MAC1;
374 20 robfinch
                        end
375
                `CPY_ABS:
376
                        begin
377
                                radr <= ir[39:8];
378
                                pc <= pc + 32'd5;
379 21 robfinch
                                load_what <= `WORD_310;
380
                                state <= LOAD_MAC1;
381 20 robfinch
                        end
382
                `BRK:
383
                        begin
384
                                bf <= 1'b1;
385
                                radr <= isp_dec;
386
                                wadr <= isp_dec;
387
                                wdat <= pc + 32'd1;
388
                                cyc_o <= 1'b1;
389
                                stb_o <= 1'b1;
390
                                we_o <= 1'b1;
391
                                sel_o <= 4'hF;
392
                                adr_o <= {isp_dec,2'b00};
393
                                dat_o <= pc + 32'd1;
394
                                vect <= {vbr[31:9],`BRK_VECTNO,2'b00};
395
                                state <= IRQ1;
396
                        end
397 21 robfinch
                `INT0,`INT1:
398
                        begin
399
                                radr <= isp_dec;
400
                                wadr <= isp_dec;
401
                                wdat <= pc + 32'd2;
402
                                cyc_o <= 1'b1;
403
                                stb_o <= 1'b1;
404
                                we_o <= 1'b1;
405
                                sel_o <= 4'hF;
406
                                adr_o <= {isp_dec,2'b00};
407
                                dat_o <= pc + 32'd2;
408
                                vect <= {vbr[31:9],ir[15:7],2'b00};
409
                                state <= IRQ1;
410
                        end
411 20 robfinch
                `JMP:
412
                        begin
413
                                pc[15:0] <= ir[23:8];
414
                                state <= IFETCH;
415
                        end
416
                `JML:
417
                        begin
418
                                pc <= ir[39:8];
419
                                state <= IFETCH;
420
                        end
421
                `JMP_IND:
422
                        begin
423
                                radr <= ir[39:8];
424 21 robfinch
                                load_what <= `PC_310;
425
                                state <= LOAD_MAC1;
426 20 robfinch
                        end
427
                `JMP_INDX:
428
                        begin
429
                                radr <= ir[39:8] + x;
430 21 robfinch
                                load_what <= `PC_310;
431
                                state <= LOAD_MAC1;
432 20 robfinch
                        end
433
                `JMP_RIND:
434
                        begin
435
                                pc <= rfoa;
436
                                res <= pc + 32'd2;
437
                                Rt <= ir[15:12];
438
                                state <= IFETCH;
439
                        end
440
                `JSR:
441
                        begin
442
                                radr <= isp_dec;
443
                                wadr <= isp_dec;
444
                                wdat <= pc + 32'd3;
445
                                cyc_o <= 1'b1;
446
                                stb_o <= 1'b1;
447
                                we_o <= 1'b1;
448
                                sel_o <= 4'hF;
449
                                adr_o <= {isp_dec,2'b00};
450
                                dat_o <= pc + 32'd3;
451
                                vect <= {pc[31:16],ir[23:8]};
452
                                state <= JSR1;
453
                        end
454
                `JSR_RIND:
455
                        begin
456
                                radr <= isp_dec;
457
                                wadr <= isp_dec;
458
                                wdat <= pc + 32'd2;
459
                                cyc_o <= 1'b1;
460
                                stb_o <= 1'b1;
461
                                we_o <= 1'b1;
462
                                sel_o <= 4'hF;
463
                                adr_o <= {isp_dec,2'b00};
464
                                dat_o <= pc + 32'd2;
465
                                vect <= rfoa;
466
                                state <= JSR1;
467
                                $stop;
468
                        end
469
                `JSL:
470
                        begin
471
                                radr <= isp_dec;
472
                                wadr <= isp_dec;
473
                                wdat <= pc + 32'd5;
474
                                cyc_o <= 1'b1;
475
                                stb_o <= 1'b1;
476
                                we_o <= 1'b1;
477
                                sel_o <= 4'hF;
478
                                adr_o <= {isp_dec,2'b00};
479
                                dat_o <= pc + 32'd5;
480
                                vect <= ir[39:8];
481
                                state <= JSR1;
482
                        end
483
                `BSR:
484
                        begin
485
                                radr <= isp_dec;
486
                                wadr <= isp_dec;
487
                                wdat <= pc + 32'd3;
488
                                cyc_o <= 1'b1;
489
                                stb_o <= 1'b1;
490
                                we_o <= 1'b1;
491
                                sel_o <= 4'hF;
492
                                adr_o <= {isp_dec,2'b00};
493
                                dat_o <= pc + 32'd3;
494
                                vect <= pc + {{16{ir[23]}},ir[23:8]};
495
                                state <= JSR1;
496
                        end
497
                `JSR_INDX:
498
                        begin
499
                                radr <= isp - 32'd1;
500
                                wadr <= isp - 32'd1;
501
                                wdat <= pc + 32'd5;
502
                                cyc_o <= 1'b1;
503
                                stb_o <= 1'b1;
504
                                we_o <= 1'b1;
505
                                sel_o <= 4'hF;
506
                                adr_o <= {isp-32'd1,2'b00};
507
                                dat_o <= pc + 32'd5;
508
                                state <= JSR_INDX1;
509
                        end
510
//              `JSR16:
511
//                      begin
512
//                              radr <= isp - 32'd1;
513
//                              wadr <= isp - 32'd1;
514
//                              wdat <= pc + 32'd3;
515
//                              cyc_o <= 1'b1;
516
//                              stb_o <= 1'b1;
517
//                              we_o <= 1'b1;
518
//                              sel_o <= 4'hF;
519
//                              adr_o <= {isp-32'd1,2'b00};
520
//                              dat_o <= pc + 32'd3;
521
//                              state <= JSR161;
522
//                      end
523
                `RTS,`RTL:
524
                                begin
525
                                radr <= isp;
526 21 robfinch
                                load_what <= `PC_310;
527
                                state <= LOAD_MAC1;
528 20 robfinch
                                end
529
                `RTI:   begin
530
                                radr <= isp;
531 21 robfinch
                                load_what <= `SR_310;
532
                                state <= LOAD_MAC1;
533 20 robfinch
                                end
534
                `BEQ,`BNE,`BPL,`BMI,`BCC,`BCS,`BVC,`BVS,`BRA:
535
                        begin
536
                                state <= IFETCH;
537
                                if (ir[15:8]==8'h00) begin
538
                                        radr <= isp_dec;
539
                                        wadr <= isp_dec;
540
                                        wdat <= pc + 32'd2;
541
                                        cyc_o <= 1'b1;
542
                                        stb_o <= 1'b1;
543
                                        we_o <= 1'b1;
544
                                        sel_o <= 4'hF;
545
                                        adr_o <= {isp_dec,2'b00};
546
                                        dat_o <= pc + 32'd2;
547
                                        vect <= {vbr[31:9],`SLP_VECTNO,2'b00};
548
                                        state <= IRQ1;
549
                                end
550
                                else if (ir[15:8]==8'h1) begin
551
                                        if (takb)
552
                                                pc <= pc + {{16{ir[31]}},ir[31:16]};
553
                                        else
554
                                                pc <= pc + 32'd4;
555
                                end
556
                                else begin
557
                                        if (takb)
558
                                                pc <= pc + {{24{ir[15]}},ir[15:8]};
559
                                        else
560
                                                pc <= pc + 32'd2;
561
                                end
562
                        end
563
/*              `BEQ_RR:
564
                        begin
565
                                state <= IFETCH;
566
                                if (ir[23:16]==8'h00) begin
567
                                        radr <= isp_dec;
568
                                        wadr <= isp_dec;
569
                                        wdat <= pc + 32'd2;
570
                                        cyc_o <= 1'b1;
571
                                        stb_o <= 1'b1;
572
                                        we_o <= 1'b1;
573
                                        sel_o <= 4'hF;
574
                                        adr_o <= {isp_dec,2'b00};
575
                                        dat_o <= pc + 32'd2;
576
                                        vect <= `SLP_VECT;
577
                                        state <= IRQ1;
578
                                end
579
                                else if (ir[23:16]==8'h1) begin
580
                                        if (rfoa==rfob)
581
                                                pc <= pc + {{16{ir[39]}},ir[39:24]};
582
                                        else
583
                                                pc <= pc + 32'd5;
584
                                end
585
                                else begin
586
                                        if (takb)
587
                                                pc <= pc + {{24{ir[23]}},ir[23:16]};
588
                                        else
589
                                                pc <= pc + 32'd3;
590
                                end
591
                        end*/
592
                `BRL:
593
                        begin
594
                                if (ir[23:8]==16'h0000) begin
595
                                        radr <= isp_dec;
596
                                        wadr <= isp_dec;
597
                                        wdat <= pc + 32'd3;
598
                                        cyc_o <= 1'b1;
599
                                        stb_o <= 1'b1;
600
                                        we_o <= 1'b1;
601
                                        sel_o <= 4'hF;
602
                                        adr_o <= {isp_dec,2'b00};
603
                                        dat_o <= pc + 32'd3;
604
                                        vect <= {vbr[31:9],`SLP_VECTNO,2'b00};
605
                                        state <= IRQ1;
606
                                end
607
                                else begin
608
                                        pc <= pc + {{16{ir[23]}},ir[23:8]};
609
                                        state <= IFETCH;
610
                                end
611
                        end
612
                `PHP:
613
                        begin
614
                                cyc_o <= 1'b1;
615
                                stb_o <= 1'b1;
616
                                sel_o <= 4'hF;
617
                                we_o <= 1'b1;
618
                                radr <= isp_dec;
619
                                wadr <= isp_dec;
620
                                wdat <= sr;
621
                                adr_o <= {isp_dec,2'b00};
622
                                dat_o <= sr;
623
                                isp <= isp_dec;
624
                                state <= PHP1;
625
                        end
626
                `PHA:
627
                        begin
628
                                cyc_o <= 1'b1;
629
                                stb_o <= 1'b1;
630
                                sel_o <= 4'hF;
631
                                we_o <= 1'b1;
632
                                radr <= isp_dec;
633
                                wadr <= isp_dec;
634
                                wdat <= acc;
635
                                adr_o <= {isp_dec,2'b00};
636
                                dat_o <= acc;
637
                                isp <= isp_dec;
638
                                state <= PHP1;
639
                        end
640
                `PHX:
641
                        begin
642
                                cyc_o <= 1'b1;
643
                                stb_o <= 1'b1;
644
                                sel_o <= 4'hF;
645
                                we_o <= 1'b1;
646
                                radr <= isp_dec;
647
                                wadr <= isp_dec;
648
                                wdat <= x;
649
                                adr_o <= {isp_dec,2'b00};
650
                                dat_o <= x;
651
                                isp <= isp_dec;
652
                                state <= PHP1;
653
                        end
654
                `PHY:
655
                        begin
656
                                cyc_o <= 1'b1;
657
                                stb_o <= 1'b1;
658
                                sel_o <= 4'hF;
659
                                we_o <= 1'b1;
660
                                radr <= isp_dec;
661
                                wadr <= isp_dec;
662
                                wdat <= y;
663
                                adr_o <= {isp_dec,2'b00};
664
                                dat_o <= y;
665
                                isp <= isp_dec;
666
                                state <= PHP1;
667
                        end
668
                `PUSH:
669
                        begin
670
                                cyc_o <= 1'b1;
671
                                stb_o <= 1'b1;
672
                                sel_o <= 4'hF;
673
                                we_o <= 1'b1;
674
                                radr <= isp_dec;
675
                                wadr <= isp_dec;
676
                                wdat <= rfoa;
677
                                adr_o <= {isp_dec,2'b00};
678
                                dat_o <= rfoa;
679
                                state <= PHP1;
680
                                isp <= isp_dec;
681
                                pc <= pc + 32'd1;
682
                        end
683
                `PLP:
684
                        begin
685
                                radr <= isp;
686
                                pc <= pc + 32'd1;
687 21 robfinch
                                load_what <= `SR_310;
688
                                state <= LOAD_MAC1;
689 20 robfinch
                        end
690
                `PLA,`PLX,`PLY:
691
                        begin
692
                                radr <= isp;
693
                                isp <= isp_inc;
694 21 robfinch
                                load_what <= `WORD_311;
695
                                state <= LOAD_MAC1;
696 20 robfinch
                                pc <= pc + 32'd1;
697
                        end
698
                `POP:
699
                        begin
700
                                Rt <= ir[15:12];
701
                                radr <= isp;
702
                                isp <= isp_inc;
703 21 robfinch
                                load_what <= `WORD_311;
704
                                state <= LOAD_MAC1;
705 20 robfinch
                                pc <= pc + 32'd2;
706
                        end
707
                default:        // unimplemented opcode
708 21 robfinch
                        begin
709
                                radr <= isp_dec;
710
                                wadr <= isp_dec;
711
                                wdat <= pc + 32'd1;
712
                                cyc_o <= 1'b1;
713
                                stb_o <= 1'b1;
714
                                we_o <= 1'b1;
715
                                sel_o <= 4'hF;
716
                                adr_o <= {isp_dec,2'b00};
717
                                dat_o <= pc + 32'd1;
718
                                vect <= {vbr[31:9],9'd495,2'b00};
719
                                state <= IRQ1;
720
                        end
721 20 robfinch
                endcase
722
        end

powered by: WebSVN 2.1.0

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