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

Subversion Repositories rtf65002

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

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

powered by: WebSVN 2.1.0

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