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

Subversion Repositories rtf65002

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

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

powered by: WebSVN 2.1.0

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