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 18

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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