OpenCores
URL https://opencores.org/ocsvn/6809_6309_compatible_core/6809_6309_compatible_core/trunk

Subversion Repositories 6809_6309_compatible_core

[/] [6809_6309_compatible_core/] [trunk/] [rtl/] [verilog/] [decoders.v] - Blame information for rev 16

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

Line No. Rev Author Line
1 16 ale500
 
2
/*
3
 * Signals which registers have to be read/written for the current opcode
4
 *
5
 *
6
 *
7
 */
8
`include "defs.v"
9
 
10
module decoders(
11
    input wire clk_in,
12
        input wire [7:0] opcode,
13
        input wire [7:0] postbyte0,
14
        input wire page2_valid, // is 1 when the postbyte0 is a valid opcode (after it was loaded)
15
        input wire page3_valid, // is 1 when the postbyte0 is a valid opcode (after it was loaded)
16
 
17
    output wire [3:0] path_left_addr_o,
18
        output wire [3:0] path_right_addr_o,
19
        output wire [3:0] dest_reg_o,
20
        output reg [3:0] path_left_addr_lo,
21
        output reg [3:0] path_right_addr_lo,
22
        output reg [3:0] dest_reg_lo,
23
        output wire write_dest,
24
        output wire source_size,
25
        output wire result_size,
26
        output wire [1:0] path_left_memtype_o,
27
        output wire [1:0] path_right_memtype_o,
28
        output wire [1:0] dest_memtype_o,
29
        output reg [1:0] path_left_memtype_lo,
30
        output reg [1:0] path_right_memtype_lo,
31
        output reg [1:0] dest_memtype_lo,
32
        output wire operand_read_o, // reads 1 operand from memory
33
        output wire operand_write_o, // writes result to memory
34
 
35
    output wire [2:0] mode,
36
        output reg op_SYNC,
37
        output reg op_EXG,
38
        output reg op_TFR,
39
        output reg op_RTS,
40
        output reg op_RTI,
41
        output reg op_CWAI,
42
        output reg op_MUL,
43
        output reg op_SWI,
44
        output reg op_PUSH,
45
        output reg op_PULL,
46
        output reg op_LEA,
47
        output reg op_JMP,
48
        output reg op_JSR,
49
        output wire use_s,
50
 
51
    output wire [4:0] alu_opcode,
52
        output wire dest_flags_o
53
 
54
 
55
    );
56
reg [3:0] lr, rr, dr;
57
reg [1:0] lm, rm, dm;
58
reg ss, sz, p2, p3;
59
reg [2:0] mo;
60
reg [4:0] aop;
61
assign write_dest = (dr != `RN_INV);
62
assign source_size = (lr < `RN_ACCA) | sz | (rm == `MT_WORD);
63
// result size is used to determine the size of the argument
64
// to load, compare has no result, thus the source is used instead,
65
// why do we need the result size ?... because of tfr&exg 
66
assign result_size = (dr == `RN_INV) ? (lr < `RN_ACCA):
67
                     (dr < `RN_ACCA) ? 1:0;
68
 
69
assign path_right_addr_o = rr;
70
assign path_left_addr_o = lr;
71
assign dest_reg_o = dr;
72
 
73
// for registers, memory writes are handled differently
74
 
75
assign operand_read_o = (lm != `MT_NONE) | (rm != `MT_NONE);
76
assign operand_write_o = dm != `MT_NONE;
77
assign path_left_memtype_o = lm;
78
assign path_right_memtype_o = rm;
79
assign dest_memtype_o = dm;
80
assign dest_flags_o = (aop != `NOP) && (opcode != 8'h1a) && (opcode != 8'h1c);
81
assign use_s = ss;
82
assign mode = mo;
83
assign alu_opcode = aop;
84
 
85
always @(*)
86
    begin
87
        lr = `RN_INV;
88
        rr = `RN_INV;
89
        dr = `RN_INV;
90
        lm = `MT_NONE;
91
        rm = `MT_NONE;
92
        dm = `MT_NONE;
93
        mo = `NONE;
94
        aop = `NOP;
95
        ss = 1;
96
        sz = 0;
97
        op_SYNC = 0;
98
                op_EXG = 0;
99
                op_TFR = 0;
100
                op_RTS = 0;
101
                op_RTI = 0;
102
                op_CWAI = 0;
103
                op_MUL = 0;
104
                op_SWI = 0;
105
                op_PUSH = 0;
106
                op_PULL = 0;
107
                op_LEA = 0;
108
                op_JMP = 0;
109
                op_JSR = 0;
110
        p2 = 0;
111
        p3 = 0;
112
        case (opcode[7:4])
113
            4'h0:
114
                begin
115
                    mo = `DIRECT;
116
                    lm = `MT_BYTE;
117
                    dm = `MT_BYTE;
118
                    case (opcode[3:0]) // Direct
119
                        4'h0: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `NEG; end // NEG
120
                        4'h1: begin end
121
                        4'h2: begin end
122
                        4'h3: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `COM; end // COM
123
                        4'h4: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `LSR; end
124
                        4'h5: begin end
125
                        4'h6: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `ROR; end
126
                        4'h7: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `ASR; end
127
                        4'h8: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `LSL; end
128
                        4'h9: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `ROL; end
129
                        4'ha: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `DEC; end
130
                        4'hb: begin end
131
                        4'hc: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `INC; end
132
                        4'hd: begin lm = `MT_BYTE; aop = `TST; end
133
                        4'he: begin op_JMP = 1; end // JMP
134
                        4'hf: begin dm = `MT_BYTE; aop = `CLR; end
135
                    endcase
136
                end
137
            4'h1:
138
                begin
139
                    case (opcode[3:0])
140
                        4'h0: begin p2 = 1; end
141
                        4'h1: begin p3 = 1; end
142
                        4'h2: begin end // nop
143
                        4'h3: begin op_SYNC = 1; end
144
                        4'h4: begin end
145
                        4'h5: begin end
146
                        4'h6: begin mo = `REL16; end // lbra
147
                        4'h7: begin mo = `REL16; op_JSR = 1; end
148
                        4'h8: begin end
149
                        4'h9: begin mo = `INHERENT; lr = `RN_ACCA; dr = `RN_ACCA; aop = `DAA; end
150
                        4'ha: begin mo = `IMMEDIATE; lr = `RN_CC; dr = `RN_CC; aop = `OR; end
151
                        4'hb: begin end
152
                        4'hc: begin mo = `IMMEDIATE; lr = `RN_CC; dr = `RN_CC; aop = `AND; end
153
                        4'hd: begin mo = `INHERENT; lr = `RN_ACCB; dr = `RN_ACCA; aop = `SEXT; end
154
                        4'he: begin op_EXG = 1; lr = postbyte0[7:4]; rr = postbyte0[3:0]; dr = postbyte0[3:0]; end
155
                        4'hf: begin op_TFR = 1; lr = postbyte0[7:4]; rr = postbyte0[3:0]; dr = postbyte0[3:0]; end
156
                    endcase
157
                end
158
            4'h2:
159
                begin
160
                    mo = `REL8;
161
                    case (opcode[3:0])
162
                        4'h0: begin end
163
                        4'h1: begin end
164
                        4'h2: begin end
165
                        4'h3: begin end
166
                        4'h4: begin end
167
                        4'h5: begin end
168
                        4'h6: begin end
169
                        4'h7: begin end
170
                        4'h8: begin end
171
                        4'h9: begin end
172
                        4'ha: begin end
173
                        4'hb: begin end
174
                        4'hc: begin end
175
                        4'hd: begin end
176
                        4'he: begin end
177
                        4'hf: begin end
178
                    endcase
179
                end
180
            4'h3:
181
                begin
182
                    case (opcode[3:0])
183
                        4'h0: begin mo = `INDEXED; op_LEA = 1; dr = `RN_IX; end
184
                        4'h1: begin mo = `INDEXED; op_LEA = 1; dr = `RN_IY; end
185
                        4'h2: begin mo = `INDEXED; op_LEA = 1; dr = `RN_S; end
186
                        4'h3: begin mo = `INDEXED; op_LEA = 1; dr = `RN_U; end
187
                        4'h4: begin op_PUSH = 1; end
188
                        4'h5: begin op_PULL = 1; end
189
                        4'h6: begin op_PUSH = 1; ss = 0; end
190
                        4'h7: begin op_PULL = 1; ss = 0; end
191
                        4'h8: begin end
192
                        4'h9: begin mo = `INHERENT; op_RTS = 1; end
193
                        4'ha: begin mo = `INHERENT; lr = `RN_ACCB; rr = `RN_IX; dr = `RN_IX; aop = `ADD; end // ABX
194
                        4'hb: begin mo = `INHERENT; op_RTI = 1; end
195
                        4'hc: begin op_CWAI = 1; end
196
                        4'hd: begin mo = `INHERENT; lr = `RN_ACCA; rr = `RN_ACCB; dr = `RN_ACCD; aop = `MUL; op_MUL = 1; end
197
                        4'he: begin end
198
                        4'hf: begin op_SWI = 1; end
199
                    endcase
200
                end
201
            4'h4:
202
                begin
203
                    mo = `INHERENT;
204
                    case (opcode[3:0])
205
                        4'h0: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `NEG; end // NEG
206
                        4'h1: begin end
207
                        4'h2: begin end
208
                        4'h3: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `COM; end // COM
209
                        4'h4: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `LSR; end
210
                        4'h5: begin end
211
                        4'h6: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `ROR; end
212
                        4'h7: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `ASR; end
213
                        4'h8: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `LSL; end
214
                        4'h9: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `ROL; end
215
                        4'ha: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `DEC; end
216
                        4'hb: begin end
217
                        4'hc: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `INC; end
218
                        4'hd: begin lr = `RN_ACCA; aop = `TST; end
219
                        4'he: begin end
220
                        4'hf: begin dr = `RN_ACCA; aop = `CLR; end
221
                    endcase
222
                end
223
            4'h5:
224
                begin
225
                    mo = `INHERENT;
226
                    case (opcode[3:0])
227
                        4'h0: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `NEG; end // NEG
228
                        4'h1: begin end
229
                        4'h2: begin end
230
                        4'h3: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `COM; end // COM
231
                        4'h4: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `LSR; end
232
                        4'h5: begin end
233
                        4'h6: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `ROR; end
234
                        4'h7: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `ASR; end
235
                        4'h8: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `LSL; end
236
                        4'h9: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `ROL; end
237
                        4'ha: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `DEC; end
238
                        4'hb: begin end
239
                        4'hc: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `INC; end
240
                        4'hd: begin lr = `RN_ACCB; aop = `TST; end
241
                        4'he: begin end
242
                        4'hf: begin dr = `RN_ACCB; aop = `CLR; end
243
                    endcase
244
                end
245
            4'h6:
246
                begin
247
                    mo = `INDEXED;
248
                    case (opcode[3:0])
249
                        4'h0: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `NEG; end // NEG
250
                        4'h1: begin end
251
                        4'h2: begin end
252
                        4'h3: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `COM; end // COM
253
                        4'h4: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `LSR; end
254
                        4'h5: begin end
255
                        4'h6: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `ROR; end
256
                        4'h7: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `ASR; end
257
                        4'h8: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `LSL; end
258
                        4'h9: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `ROL; end
259
                        4'ha: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `DEC; end
260
                        4'hb: begin end
261
                        4'hc: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `INC; end
262
                        4'hd: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `AND; end// TST FIXME
263
                        4'he: begin op_JMP = 1; end // JMP
264
                        4'hf: begin dm = `MT_BYTE; aop = `CLR; end // CLR FIXME
265
                    endcase
266
                end
267
            4'h7:
268
                begin
269
                    mo = `EXTENDED;
270
                    case (opcode[3:0])
271
                        4'h0: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `NEG; end // NEG
272
                        4'h1: begin end
273
                        4'h2: begin end
274
                        4'h3: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `COM; end // COM
275
                        4'h4: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `LSR; end
276
                        4'h5: begin end
277
                        4'h6: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `ROR; end
278
                        4'h7: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `ASR; end
279
                        4'h8: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `LSL; end
280
                        4'h9: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `ROL; end
281
                        4'ha: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `DEC; end
282
                        4'hb: begin end
283
                        4'hc: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `INC; end
284
                        4'hd: begin lm = `MT_BYTE; dm = `MT_BYTE; aop = `AND; end // TST FIXME
285
                        4'he: begin op_JMP = 1; end // JMP
286
                        4'hf: begin dm = `MT_BYTE; aop = `CLR; end // CLR FIXME
287
                    endcase
288
                end
289
            4'h8:
290
                begin
291
                    mo = `IMMEDIATE; // right path filled in the right-path mux
292
                    case (opcode[3:0])
293
                        4'h0: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `SUB; end
294
                        4'h1: begin lr = `RN_ACCA; aop = `SUB; end // cmpa
295
                        4'h2: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `SBC; end
296
                        4'h3: begin lr = `RN_ACCD; dr = `RN_ACCD; aop = `SUB; end
297
                        4'h4: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `AND; end
298
                        4'h5: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `AND; end
299
                        4'h6: begin dr = `RN_ACCA; aop = `LD; end
300
                        4'h7: begin end
301
                        4'h8: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `EOR; end
302
                        4'h9: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `ADC; end
303
                        4'ha: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `OR; end
304
                        4'hb: begin lr = `RN_ACCA; dr = `RN_ACCA; aop = `ADD; end
305
                        4'hc: begin lr = `RN_IX; aop = `SUB; end // cmpx
306
                        4'hd: begin mo = `REL8; op_JSR = 1; end
307
                        4'he: begin dr = `RN_IX; aop = `LD; end
308
                        4'hf: begin end
309
                    endcase
310
                end
311
            4'h9:
312
                begin
313
                    mo = `DIRECT;
314
                    case (opcode[3:0])
315
                        4'h0: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `SUB; end
316
                        4'h1: begin lr = `RN_ACCA; rm = `MT_BYTE; aop = `SUB; end // cmpa
317
                        4'h2: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `SBC; end
318
                        4'h3: begin lr = `RN_ACCD; rm = `MT_BYTE; dr = `RN_ACCD; aop = `SUB; end
319
                        4'h4: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `AND; end
320
                        4'h5: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `AND; end
321
                        4'h6: begin rm = `MT_BYTE; dr = `RN_ACCA; aop = `LD; end
322
                        4'h7: begin lr = `RN_ACCA; dm = `MT_BYTE; aop = `ST; end
323
                        4'h8: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `EOR; end
324
                        4'h9: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `ADC; end
325
                        4'ha: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `OR; end
326
                        4'hb: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `ADD; end
327
                        4'hc: begin lr = `RN_IX; rm = `MT_WORD; aop = `SUB; end // cmpx
328
                        4'hd: begin op_JSR = 1; end
329
                        4'he: begin rm = `MT_WORD; dr = `RN_IX; aop = `LD; end
330
                        4'hf: begin lr = `RN_IX; dm = `MT_WORD; aop = `ST; end
331
                    endcase
332
                end
333
            4'ha:
334
                begin
335
                    mo = `INDEXED;
336
                    case (opcode[3:0])
337
                        4'h0: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `SUB; end
338
                        4'h1: begin lr = `RN_ACCA; rm = `MT_BYTE; aop = `SUB; end // cmpa
339
                        4'h2: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `SBC; end
340
                        4'h3: begin lr = `RN_ACCD; rm = `MT_BYTE; dr = `RN_ACCD; aop = `SUB; end
341
                        4'h4: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `AND; end
342
                        4'h5: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `AND; end
343
                        4'h6: begin rm = `MT_BYTE; dr = `RN_ACCA; aop = `LD; end
344
                        4'h7: begin lr = `RN_ACCA; dm = `MT_BYTE; aop = `ST; end
345
                        4'h8: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `EOR; end
346
                        4'h9: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `ADC; end
347
                        4'ha: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `OR; end
348
                        4'hb: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `ADD; end
349
                        4'hc: begin lr = `RN_IX; rm = `MT_WORD; aop = `SUB; end // cmpx
350
                        4'hd: begin op_JSR = 1; end
351
                        4'he: begin rm = `MT_WORD; dr = `RN_IX; aop = `LD; end
352
                        4'hf: begin lr = `RN_IX; dm = `MT_WORD; aop = `ST; end
353
                    endcase
354
                end
355
            4'hb:
356
                begin
357
                    mo = `EXTENDED;
358
                    case (opcode[3:0])
359
                        4'h0: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `SUB; end
360
                        4'h1: begin lr = `RN_ACCA; rm = `MT_BYTE; aop = `SUB; end // cmpa
361
                        4'h2: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `SBC; end
362
                        4'h3: begin lr = `RN_ACCD; rm = `MT_BYTE; dr = `RN_ACCD; aop = `SUB; end
363
                        4'h4: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `AND; end
364
                        4'h5: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `AND; end
365
                        4'h6: begin rm = `MT_BYTE; dr = `RN_ACCA; aop = `LD; end
366
                        4'h7: begin lr = `RN_ACCA; dm = `MT_BYTE; aop = `ST; end
367
                        4'h8: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `EOR; end
368
                        4'h9: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `ADC; end
369
                        4'ha: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `OR; end
370
                        4'hb: begin lr = `RN_ACCA; rm = `MT_BYTE; dr = `RN_ACCA; aop = `ADD; end
371
                        4'hc: begin lr = `RN_IX; rm = `MT_WORD; aop = `SUB; end // cmpx
372
                        4'hd: begin op_JSR = 1; end
373
                        4'he: begin rm = `MT_WORD; dr = `RN_IX; aop = `LD; end
374
                        4'hf: begin lr = `RN_IX; dm = `MT_WORD; aop = `ST; end
375
                    endcase
376
                end
377
            4'hc:
378
                begin
379
                    mo = `IMMEDIATE; // right path filled in the right-path mux
380
                    case (opcode[3:0])
381
                        4'h0: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `SUB; end
382
                        4'h1: begin lr = `RN_ACCB; aop = `SUB; end // cmp
383
                        4'h2: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `SBC; end
384
                        4'h3: begin sz = 1; lr = `RN_ACCD; dr = `RN_ACCD; aop = `ADD; end
385
                        4'h4: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `AND; end
386
                        4'h5: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `AND; end // bit
387
                        4'h6: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `LD; end
388
                        4'h7: begin end
389
                        4'h8: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `EOR; end
390
                        4'h9: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `ADC; end
391
                        4'ha: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `OR; end
392
                        4'hb: begin lr = `RN_ACCB; dr = `RN_ACCB; aop = `ADD; end
393
                        4'hc: begin sz = 1; dr = `RN_ACCD; aop = `LD; end
394
                        4'hd: begin end
395
                        4'he: begin sz = 1; dr = `RN_U; aop = `LD; end
396
                        4'hf: begin end
397
                    endcase
398
                end
399
            4'hd:
400
                begin
401
                    mo = `DIRECT;
402
                    case (opcode[3:0])
403
                        4'h0: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `SUB; end
404
                        4'h1: begin lr = `RN_ACCB; rm = `MT_BYTE; aop = `SUB; end // cmp
405
                        4'h2: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `SBC; end
406
                        4'h3: begin lr = `RN_ACCD; rm = `MT_BYTE; dr = `RN_ACCD; aop = `ADD; end
407
                        4'h4: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `AND; end
408
                        4'h5: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `AND; end // bit
409
                        4'h6: begin rm = `MT_BYTE; dr = `RN_ACCB; aop = `LD; end
410
                        4'h7: begin lr = `RN_ACCB; dm = `MT_BYTE; aop = `ST; end
411
                        4'h8: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `EOR; end
412
                        4'h9: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `ADC; end
413
                        4'ha: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `OR; end
414
                        4'hb: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `ADD; end
415
                        4'hc: begin rm = `MT_WORD; dr = `RN_ACCD; aop = `LD; end
416
                        4'hd: begin lr = `RN_ACCD; dm = `MT_WORD; aop = `ST; end
417
                        4'he: begin rm = `MT_WORD; dr = `RN_U; aop = `LD; end
418
                        4'hf: begin lr = `RN_U; dm = `MT_WORD; aop = `ST; end
419
                    endcase
420
 
421
                end
422
            4'he:
423
                begin
424
                    mo = `INDEXED;
425
                    case (opcode[3:0])
426
                        4'h0: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `SUB; end
427
                        4'h1: begin lr = `RN_ACCB; rm = `MT_BYTE; aop = `SUB; end // cmp
428
                        4'h2: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `SBC; end
429
                        4'h3: begin lr = `RN_ACCD; rm = `MT_BYTE; dr = `RN_ACCD; aop = `ADD; end
430
                        4'h4: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `AND; end
431
                        4'h5: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `AND; end // bit
432
                        4'h6: begin rm = `MT_BYTE; dr = `RN_ACCB; aop = `LD; end
433
                        4'h7: begin lr = `RN_ACCB; dm = `MT_BYTE; aop = `ST; end
434
                        4'h8: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `EOR; end
435
                        4'h9: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `ADC; end
436
                        4'ha: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `OR; end
437
                        4'hb: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `ADD; end
438
                        4'hc: begin rm = `MT_WORD; dr = `RN_ACCD; aop = `LD; end
439
                        4'hd: begin lr = `RN_ACCD; dm = `MT_WORD; aop = `ST; end
440
                        4'he: begin rm = `MT_WORD; dr = `RN_U; aop = `LD; end
441
                        4'hf: begin lr = `RN_U; dm = `MT_WORD; aop = `ST; end
442
                    endcase
443
 
444
                end
445
            4'hf:
446
                 begin
447
                    mo = `EXTENDED;
448
                    case (opcode[3:0])
449
                        4'h0: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `SUB; end
450
                        4'h1: begin lr = `RN_ACCB; rm = `MT_BYTE; aop = `SUB; end // cmp
451
                        4'h2: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `SBC; end
452
                        4'h3: begin lr = `RN_ACCD; rm = `MT_BYTE; dr = `RN_ACCD; aop = `ADD; end
453
                        4'h4: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `AND; end
454
                        4'h5: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `AND; end // bit
455
                        4'h6: begin rm = `MT_BYTE; dr = `RN_ACCB; aop = `LD; end
456
                        4'h7: begin lr = `RN_ACCB; dm = `MT_BYTE; aop = `ST; end
457
                        4'h8: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `EOR; end
458
                        4'h9: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `ADC; end
459
                        4'ha: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `OR; end
460
                        4'hb: begin lr = `RN_ACCB; rm = `MT_BYTE; dr = `RN_ACCB; aop = `ADD; end
461
                        4'hc: begin rm = `MT_WORD; dr = `RN_ACCD; aop = `LD; end
462
                        4'hd: begin lr = `RN_ACCD; dm = `MT_WORD; aop = `ST; end
463
                        4'he: begin rm = `MT_WORD; dr = `RN_U; aop = `LD; end
464
                        4'hf: begin lr = `RN_U; dm = `MT_WORD; aop = `ST; end
465
                    endcase
466
                end
467
        endcase
468
        if (p2)
469
            case (postbyte0[7:4])
470
                4'h0, 4'h1, 4'h4, 4'h5, 4'h6, 4'h7: begin end
471
                4'h2: mo = `REL16;
472
                4'h3: if (postbyte0[3:0] == 4'hf) op_SWI = 1;
473
                4'h8:
474
                    begin
475
                        case (postbyte0[3:0])
476
                            4'h0: begin end
477
                            4'h1: begin end
478
                            4'h2: begin end
479
                            4'h3: begin mo = `IMMEDIATE; sz = 1; lr = `RN_ACCD; aop = `SUB; end // cmpd
480
                            4'h4: begin end
481
                            4'h5: begin end
482
                            4'h6: begin end
483
                            4'h7: begin end
484
                            4'h8: begin end
485
                            4'h9: begin end
486
                            4'ha: begin end
487
                            4'hb: begin end
488
                            4'hc: begin mo = `IMMEDIATE; sz = 1; lr = `RN_IY; aop = `SUB; end
489
                            4'hd: begin end
490
                            4'he: begin mo = `IMMEDIATE; sz = 1; dr = `RN_IY; aop = `LD; end
491
                            4'hf: begin end
492
                        endcase
493
                    end
494
                4'h9:
495
                    begin
496
                        case (postbyte0[3:0])
497
                            4'h0: begin end
498
                            4'h1: begin end
499
                            4'h2: begin end
500
                            4'h3: begin mo = `DIRECT; lr = `RN_ACCD; rm = `MT_WORD; aop = `SUB; end // cmpd
501
                            4'h4: begin end
502
                            4'h5: begin end
503
                            4'h6: begin end
504
                            4'h7: begin end
505
                            4'h8: begin end
506
                            4'h9: begin end
507
                            4'ha: begin end
508
                            4'hb: begin end
509
                            4'hc: begin mo = `DIRECT; lr = `RN_IY; rm = `MT_WORD; aop = `SUB; end
510
                            4'hd: begin end
511
                            4'he: begin mo = `DIRECT; rm = `MT_WORD; dr = `RN_IY; aop = `LD; end
512
                            4'hf: begin mo = `DIRECT; lr = `RN_IY; dm = `MT_WORD; aop = `ST; end
513
                        endcase
514
                    end
515
                4'ha:
516
                    begin
517
                        case (postbyte0[3:0])
518
                            4'h0: begin end
519
                            4'h1: begin end
520
                            4'h2: begin end
521
                            4'h3: begin mo = `INDEXED; lr = `RN_ACCD; rm = `MT_WORD; aop = `SUB; end // cmpd
522
                            4'h4: begin end
523
                            4'h5: begin end
524
                            4'h6: begin end
525
                            4'h7: begin end
526
                            4'h8: begin end
527
                            4'h9: begin end
528
                            4'ha: begin end
529
                            4'hb: begin end
530
                            4'hc: begin mo = `INDEXED; lr = `RN_IY; rm = `MT_WORD; aop = `SUB; end
531
                            4'hd: begin end
532
                            4'he: begin mo = `INDEXED; rm = `MT_WORD; dr = `RN_IY; aop = `LD; end
533
                            4'hf: begin mo = `INDEXED; lr = `RN_IY; dm = `MT_WORD; aop = `ST; end
534
                        endcase
535
                    end
536
                4'hb:
537
                    begin
538
                        case (postbyte0[3:0])
539
                            4'h0: begin end
540
                            4'h1: begin end
541
                            4'h2: begin end
542
                            4'h3: begin mo = `EXTENDED; lr = `RN_ACCD; rm = `MT_WORD; aop = `SUB; end // cmpd
543
                            4'h4: begin end
544
                            4'h5: begin end
545
                            4'h6: begin end
546
                            4'h7: begin end
547
                            4'h8: begin end
548
                            4'h9: begin end
549
                            4'ha: begin end
550
                            4'hb: begin end
551
                            4'hc: begin mo = `EXTENDED; lr = `RN_IY; rm = `MT_WORD; aop = `SUB; end
552
                            4'hd: begin end
553
                            4'he: begin mo = `EXTENDED; rm = `MT_WORD; dr = `RN_IY; aop = `LD; end
554
                            4'hf: begin mo = `EXTENDED; lr = `RN_IY; dm = `MT_WORD; aop = `ST; end
555
                        endcase
556
                    end
557
                 4'hc:
558
                    begin
559
                        case (postbyte0[3:0])
560
                            4'h0: begin end
561
                            4'h1: begin end
562
                            4'h2: begin end
563
                            4'h3: begin end
564
                            4'h4: begin end
565
                            4'h5: begin end
566
                            4'h6: begin end
567
                            4'h7: begin end
568
                            4'h8: begin end
569
                            4'h9: begin end
570
                            4'ha: begin end
571
                            4'hb: begin end
572
                            4'hc: begin end
573
                            4'hd: begin end
574
                            4'he: begin mo = `IMMEDIATE; sz = 1; dr = `RN_S; aop = `LD; end
575
                            4'hf: begin end
576
                        endcase
577
                    end
578
                4'hd:
579
                    begin
580
                        case (postbyte0[3:0])
581
                            4'h0: begin end
582
                            4'h1: begin end
583
                            4'h2: begin end
584
                            4'h3: begin end
585
                            4'h4: begin end
586
                            4'h5: begin end
587
                            4'h6: begin end
588
                            4'h7: begin end
589
                            4'h8: begin end
590
                            4'h9: begin end
591
                            4'ha: begin end
592
                            4'hb: begin end
593
                            4'hc: begin end
594
                            4'hd: begin end
595
                            4'he: begin mo = `DIRECT; rm = `MT_WORD; dr = `RN_S; aop = `LD; end
596
                            4'hf: begin mo = `DIRECT; lr = `RN_S; dm = `MT_WORD; aop = `ST; end
597
                        endcase
598
                    end
599
                4'he:
600
                    begin
601
                        case (postbyte0[3:0])
602
                            4'h0: begin end
603
                            4'h1: begin end
604
                            4'h2: begin end
605
                            4'h3: begin end
606
                            4'h4: begin end
607
                            4'h5: begin end
608
                            4'h6: begin end
609
                            4'h7: begin end
610
                            4'h8: begin end
611
                            4'h9: begin end
612
                            4'ha: begin end
613
                            4'hb: begin end
614
                            4'hc: begin end
615
                            4'hd: begin end
616
                            4'he: begin mo = `INDEXED; rm = `MT_WORD; dr = `RN_S; aop = `LD; end
617
                            4'hf: begin mo = `INDEXED; lr = `RN_S; dm = `MT_WORD; aop = `ST; end
618
                        endcase
619
                    end
620
                4'hf:
621
                    begin
622
                        case (postbyte0[3:0])
623
                            4'h0: begin end
624
                            4'h1: begin end
625
                            4'h2: begin end
626
                            4'h3: begin end // cmpd
627
                            4'h4: begin end
628
                            4'h5: begin end
629
                            4'h6: begin end
630
                            4'h7: begin end
631
                            4'h8: begin end
632
                            4'h9: begin end
633
                            4'ha: begin end
634
                            4'hb: begin end
635
                            4'hc: begin end
636
                            4'hd: begin end
637
                            4'he: begin mo = `EXTENDED; rm = `MT_WORD; dr = `RN_S; aop = `LD; end
638
                            4'hf: begin mo = `EXTENDED; lr = `RN_S; dm = `MT_WORD; aop = `ST; end
639
                        endcase
640
                    end
641
            endcase
642
        if (p3)
643
            case (postbyte0[7:4])
644
                4'h0, 4'h1, 4'h4, 4'h5, 4'h6, 4'h7,
645
                4'hc, 4'hd, 4'he, 4'hf: begin end
646
                4'h3: if (postbyte0[3:0] == 4'hf) op_SWI = 1;
647
                4'h8:
648
                    begin
649
                        case (postbyte0[3:0])
650
                            4'h0: begin end
651
                            4'h1: begin end
652
                            4'h2: begin end
653
                            4'h3: begin mo = `IMMEDIATE; sz = 1; lr = `RN_U; aop = `SUB; end // cmpd
654
                            4'h4: begin end
655
                            4'h5: begin end
656
                            4'h6: begin end
657
                            4'h7: begin end
658
                            4'h8: begin end
659
                            4'h9: begin end
660
                            4'ha: begin end
661
                            4'hb: begin end
662
                            4'hc: begin mo = `IMMEDIATE; sz = 1; lr = `RN_S; aop = `SUB; end
663
                            4'hd: begin end
664
                            4'he: begin end
665
                            4'hf: begin end
666
                        endcase
667
                    end
668
                4'h9:
669
                    begin
670
                        case (postbyte0[3:0])
671
                            4'h0: begin end
672
                            4'h1: begin end
673
                            4'h2: begin end
674
                            4'h3: begin mo = `DIRECT; lr = `RN_U; rm = `MT_WORD; aop = `SUB; end // cmpd
675
                            4'h4: begin end
676
                            4'h5: begin end
677
                            4'h6: begin end
678
                            4'h7: begin end
679
                            4'h8: begin end
680
                            4'h9: begin end
681
                            4'ha: begin end
682
                            4'hb: begin end
683
                            4'hc: begin mo = `DIRECT; lr = `RN_S; rm = `MT_WORD; aop = `SUB; end
684
                            4'hd: begin end
685
                            4'he: begin end
686
                            4'hf: begin end
687
                        endcase
688
                    end
689
                4'ha:
690
                    begin
691
                        case (postbyte0[3:0])
692
                            4'h0: begin end
693
                            4'h1: begin end
694
                            4'h2: begin end
695
                            4'h3: begin mo = `INDEXED; lr = `RN_U; rm = `MT_WORD; aop = `SUB; end // cmpd
696
                            4'h4: begin end
697
                            4'h5: begin end
698
                            4'h6: begin end
699
                            4'h7: begin end
700
                            4'h8: begin end
701
                            4'h9: begin end
702
                            4'ha: begin end
703
                            4'hb: begin end
704
                            4'hc: begin mo = `INDEXED; lr = `RN_S; rm = `MT_WORD; aop = `SUB; end
705
                            4'hd: begin end
706
                            4'he: begin end
707
                            4'hf: begin end
708
                        endcase
709
                    end
710
                4'hb:
711
                    begin
712
                        case (postbyte0[3:0])
713
                            4'h0: begin end
714
                            4'h1: begin end
715
                            4'h2: begin end
716
                            4'h3: begin mo = `EXTENDED; lr = `RN_U; rm = `MT_WORD; aop = `SUB; end // cmpd
717
                            4'h4: begin end
718
                            4'h5: begin end
719
                            4'h6: begin end
720
                            4'h7: begin end
721
                            4'h8: begin end
722
                            4'h9: begin end
723
                            4'ha: begin end
724
                            4'hb: begin end
725
                            4'hc: begin mo = `EXTENDED; lr = `RN_S; rm = `MT_WORD; aop = `SUB; end
726
                            4'hd: begin end
727
                            4'he: begin end
728
                            4'hf: begin end
729
                        endcase
730
                    end
731
            endcase
732
 
733
    end
734
 always @(posedge clk_in)
735
        begin
736
                path_right_addr_lo <= rr;
737
                path_left_addr_lo <= lr;
738
                dest_reg_lo <= dr;
739
        path_right_memtype_lo <= rm;
740
                path_left_memtype_lo <= lm;
741
                dest_memtype_lo <= dm;
742
        end
743
 
744
endmodule
745
 
746
module decode_ea(
747
    input wire [7:0]    eapostbyte,
748
        output reg [3:0]    eabase_o, // base register
749
    output reg [3:0]    eaindex_o, // index register
750
    output reg          ea_ofs5_o,
751
    output reg          ea_ofs8_o,
752
    output reg          ea_ofs16_o,
753
    output wire         ea_is_indirect_o,
754
    output reg          ea_write_back_o
755
    );
756
 
757
assign ea_is_indirect_o = eapostbyte[7] & eapostbyte[4];
758
 
759
always @(*)
760
        begin
761
        eabase_o = `RN_PC;
762
                if (eapostbyte[7] & eapostbyte[3] & eapostbyte[2] & (!eapostbyte[1]))
763
            eabase_o = `RN_PC;
764
        else
765
            casex (eapostbyte)
766
                8'bx00_x_xxxx: eabase_o = `RN_IX;
767
                8'bx01_x_xxxx: eabase_o = `RN_IY;
768
                8'bx10_x_xxxx: eabase_o = `RN_U;
769
                8'bx11_x_xxxx: eabase_o = `RN_S;
770
            endcase
771
    end
772
 
773
always @(*)
774
        begin
775
        ea_ofs5_o = 1'b0;
776
        ea_ofs8_o = 1'b0;
777
        ea_ofs16_o = 1'b0;
778
        ea_write_back_o = 1'b0;
779
                casex (eapostbyte)
780
                        8'b0xx0xxxx: // base + 5 bit signed offset +
781
                                ea_ofs5_o = 1'b1;
782
                        8'b0xx1xxxx: // 5 bit signed offset -
783
                                ea_ofs5_o = 1'b1;
784
                        8'b1xx_x_0000, // post increment, increment occurs at a later stage
785
                        8'b1xx_x_0001: ea_write_back_o = 1'b1;
786
                        8'b1xx_x_0100: begin end
787
                        8'b1xx_x_0010, // pre decrement
788
                        8'b1xx_x_0011: ea_write_back_o = 1'b1;
789
                        8'b1xx_x_0101: // B,R
790
                                eaindex_o = `RN_ACCB;
791
                        8'b1xx_x_0110: // A,R
792
                                eaindex_o = `RN_ACCA;
793
                        8'b1xx_x_1011: // D,R
794
                                eaindex_o = `RN_ACCD;
795
                        8'b1xx_x_1000: // n,R 8 bit offset
796
                                ea_ofs8_o = 1'b1;
797
                        8'b1xx_x_1001: // n,R // 16 bit offset
798
                                ea_ofs16_o = 1'b1;
799
                        8'b1xx_x_1100: // n,PC
800
                                ea_ofs8_o = 1'b1;
801
                        8'b1xx_x_1101: // n,PC
802
                                ea_ofs16_o = 1'b1;
803
                endcase
804
        end
805
endmodule
806
 
807
 
808
/* decodes the condition and checks the flags to see if it is met */
809
module test_condition(
810
        input wire [7:0] opcode,
811
        input wire [7:0] postbyte0,
812
        input wire page2_valid,
813
        input wire [7:0] CCR,
814
        output reg cond_taken
815 9 ale500
        );
816 16 ale500
 
817
wire [7:0] op = page2_valid ? postbyte0:opcode;
818
 
819
always @(*)
820 9 ale500
        begin
821 16 ale500
                cond_taken = 1'b0;
822
                if ((op == 8'h16) || (op == 8'h17) || (op == 8'h8D) ||
823
                        (op == 8'h0e) || (op == 8'h6e) || (op == 8'h7e)) // jmp
824
                        cond_taken = 1'b1; // LBRA/LBSR, BSR
825
                if (op[7:4] == 4'h2)
826
                        case (op[3:0])
827
                                4'h0: cond_taken = 1'b1; // BRA
828
                                4'h1: cond_taken = 0; // BRN
829
                                4'h2: cond_taken = !(`DFLAGC & `DFLAGZ); // BHI
830
                                4'h3: cond_taken = `DFLAGC | `DFLAGZ; // BLS
831
                                4'h4: cond_taken = !`DFLAGC; // BCC, BHS
832
                                4'h5: cond_taken = `DFLAGC; // BCS, BLO
833
                                4'h6: cond_taken = !`DFLAGZ; // BNE
834
                                4'h7: cond_taken = `DFLAGZ; // BEQ
835
                                4'h8: cond_taken = !`DFLAGV; // BVC
836
                                4'h9: cond_taken = `DFLAGV; // BVS
837
                                4'ha: cond_taken = !`DFLAGN; // BPL
838
                                4'hb: cond_taken = `DFLAGN; // BMI
839
                                4'hc: cond_taken = `DFLAGN == `DFLAGV; // BGE
840
                                4'hd: cond_taken = `DFLAGN != `DFLAGV; // BLT
841
                                4'he: cond_taken = (`DFLAGN == `DFLAGV) & (!`DFLAGZ); // BGT
842
                                4'hf: cond_taken = (`DFLAGN != `DFLAGV) | (`DFLAGZ); // BLE
843
                endcase
844
        end
845
 
846 2 ale500
endmodule

powered by: WebSVN 2.1.0

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