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

Subversion Repositories c16

[/] [c16/] [trunk/] [vhdl/] [opcode_decoder.vhd] - Blame information for rev 9

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

Line No. Rev Author Line
1 2 jsauermann
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
 
6
--  Uncomment the following lines to use the declarations that are
7
--  provided for instantiating Xilinx primitive components.
8
--library UNISIM;
9
--use UNISIM.VComponents.all;
10
 
11
use work.cpu_pack.ALL;
12
 
13
entity opcode_decoder is
14
        PORT(   CLK_I  : IN  std_logic;
15
                        T2     : IN  std_logic;
16
                        CLR    : IN  std_logic;
17
                        CE     : IN  std_logic;
18
                        OPCODE : IN  std_logic_vector(7 downto 0);
19 9 jsauermann
                        OP_CYC : IN  cycle;                                     -- current cycle (M1, M2, ...)
20
                        INT    : IN  std_logic;                         -- interrupt
21
                        RRZ    : IN  std_logic;                         -- RR is zero
22 2 jsauermann
 
23
                        OP_CAT : OUT op_category;
24
 
25
                        -- select signals
26
                        D_SX    : out std_logic_vector(1 downto 0);              -- ALU select X
27
                        D_SY    : out std_logic_vector(3 downto 0);              -- ALU select Y
28
                        D_OP    : out std_logic_vector(4 downto 0);              -- ALU operation
29
                        D_SA    : out std_logic_vector(4 downto 0);              -- select address
30
                        D_SMQ   : out std_logic;
31
 
32
                        -- write enable/select signal
33
                        D_WE_RR  : out std_logic;
34
                        D_WE_LL  : out std_logic;
35
                        D_WE_SP  : out SP_OP;
36
 
37 9 jsauermann
                        D_RD_O   : out std_logic;
38
                        D_WE_O   : out std_logic;
39
                        D_LOCK   : out std_logic;
40
 
41 2 jsauermann
                        -- input/output
42 9 jsauermann
                        D_IO     : out std_logic;
43 2 jsauermann
 
44
                        PC_OP  : out std_logic_vector(2 downto 0);
45
 
46
                        LAST_M : out std_logic;         -- last M cycle of an opcode
47
                        HLT    : out std_logic
48
                );
49
end opcode_decoder;
50
 
51
architecture Behavioral of opcode_decoder is
52
 
53
        function pc(A : std_logic;
54
                                OP : std_logic_vector(2 downto 0)) return std_logic_vector is
55
        begin
56
                if (A = '1') then       return OP;
57
                else                            return PC_NEXT;
58
                end if;
59
        end;
60
 
61
        function hadr(  A   : std_logic;
62
                                        ADR : std_logic_vector(4 downto 0)) return std_logic_vector is
63
        begin
64
                return ADR(4 downto 1) & A;
65
        end;
66
 
67
        function mix(A : std_logic) return std_logic_vector is
68
        begin
69
                if (A = '1') then       return ALU_X_MIX_Y;
70
                else                            return ALU_MOVE_Y;
71
                end if;
72
        end;
73
 
74
        function sp(A : std_logic;
75
                                OP : SP_OP) return SP_OP is
76
        begin
77
                if (A = '1') then       return OP;
78
                else                            return SP_NOP;
79
                end if;
80
        end;
81
 
82
        signal LAST         : cycle;
83
 
84
        signal ENABLE_INT   : std_logic;
85
        signal DISABLE_INT  : std_logic;
86
        signal DISABLE_CNT  : std_logic_vector(3 downto 0);
87
 
88
        signal HALT_REQ     : std_logic;
89
        signal UNHALT_REQ   : std_logic;
90
        signal HALTED       : std_logic;
91
        signal SERVE_INT    : std_logic;
92
        signal INT_ACK      : std_logic;
93
 
94
begin
95
 
96
        LAST_M <= '1' when (OP_CYC = LAST) else '0';
97
 
98
        HLT    <= HALTED;
99
 
100
        process(CLK_I)
101
        begin
102
                if (rising_edge(CLK_I)) then
103 9 jsauermann
                        if (CLR = '1') then
104
                                DISABLE_CNT <= "0001";  -- 1 x disabled
105
                                INT_ACK     <= '0';
106
                                HALTED      <= '0';
107
                        elsif (CE = '1' and T2 = '1') then
108
                                if (DISABLE_INT = '1') then
109
                                        DISABLE_CNT <= DISABLE_CNT + 1;
110
                                elsif (ENABLE_INT  = '1' and DISABLE_CNT /= 0) then
111
                                        DISABLE_CNT <= DISABLE_CNT - 1;
112
                                end if;
113 2 jsauermann
 
114 9 jsauermann
                                if (UNHALT_REQ = '1') then
115
                                        HALTED <= '0';
116
                                elsif (HALT_REQ = '1') then
117
                                        HALTED <= '1';
118
                                end if;
119 2 jsauermann
 
120 9 jsauermann
                                INT_ACK <= SERVE_INT;
121 2 jsauermann
                        end if;
122
                end if;
123
        end process;
124
 
125
        process(OPCODE, OP_CYC, INT, RRZ, INT_ACK, DISABLE_CNT, HALTED)
126
 
127
                variable        IS_M1                   : std_logic;
128
                variable        IS_M2, IS_M1_M2 : std_logic;
129
                variable        IS_M3, IS_M2_M3 : std_logic;
130
                variable        IS_M4, IS_M3_M4 : std_logic;
131
                variable        IS_M5                   : std_logic;
132
 
133
        begin
134
                if (OP_CYC = M1) then   IS_M1 := '1';   else    IS_M1 := '0';    end if;
135
                if (OP_CYC = M2) then   IS_M2 := '1';   else    IS_M2 := '0';    end if;
136
                if (OP_CYC = M3) then   IS_M3 := '1';   else    IS_M3 := '0';    end if;
137
                if (OP_CYC = M4) then   IS_M4 := '1';   else    IS_M4 := '0';    end if;
138
                if (OP_CYC = M5) then   IS_M5 := '1';   else    IS_M5 := '0';    end if;
139
 
140
                IS_M1_M2                := IS_M1 or IS_M2;
141
                IS_M2_M3                :=          IS_M2 or IS_M3;
142
                IS_M3_M4                :=                   IS_M3 or IS_M4;
143
 
144
                -- default: NOP
145
                --
146
                OP_CAT      <= undef;
147
                D_SX        <= SX_ANY;
148
                D_SY        <= SY_ANY;
149
                D_OP        <= "00000";
150
                D_SA        <= "00000";
151
                D_SMQ       <= '0';
152
                D_WE_RR     <= '0';
153
                D_WE_LL     <= '0';
154
                D_WE_SP     <= SP_NOP;
155 9 jsauermann
                D_WE_O      <= '0';
156
                D_RD_O      <= '0';
157
                D_LOCK      <= '0';
158
                D_IO        <= '0';
159 2 jsauermann
                PC_OP       <= PC_NEXT;
160
                LAST        <= M1;                      -- default: single cycle opcode (M1 only)
161
                ENABLE_INT  <= '0';
162
                DISABLE_INT <= '0';
163
                HALT_REQ    <= '0';
164
                UNHALT_REQ  <= '0';
165
                SERVE_INT   <= '0';
166
 
167
                if ((IS_M1 = '1' and INT = '1' and DISABLE_CNT = "0000")        -- new INT or
168
                        or INT_ACK = '1' ) then                                                                 -- continue INT
169
                        OP_CAT      <= INTR;
170
                        LAST        <= M2;
171
                        SERVE_INT   <= IS_M1;   -- assert INT_ACK in M2
172
                        D_OP        <= ALU_X_ADD_Y;
173
                        D_SX        <= SX_PC;
174
                        D_SY        <= SY_SY0;          -- PC + 0 (current PC)
175
                        D_SA        <= ADR_dSP;
176 9 jsauermann
                        D_WE_O      <= IS_M1_M2;
177
                        D_LOCK      <= IS_M1;
178 2 jsauermann
                        PC_OP       <= pc(IS_M1, PC_INT);
179
                        D_SMQ       <= IS_M1;
180
                        D_WE_SP     <= sp(IS_M1_M2, SP_LOAD);
181
                        DISABLE_INT <= '1';
182
                        UNHALT_REQ  <= '1';
183
 
184
                elsif (HALTED = '1') then
185
                        OP_CAT      <= HALT_WAIT;
186
                        LAST        <= M2;
187
                        PC_OP       <= PC_WAIT;
188
 
189
                elsif (OPCODE(7) = '1') then
190
                        case OPCODE(6 downto 4) is
191
                                when "010" =>
192
                                        OP_CAT  <= ADD_RR_I;
193
                                        D_OP    <= ALU_X_ADD_Y;
194
                                        D_SX    <= SX_RR;
195
                                        D_SY    <= SY_UQ;
196
                                        D_WE_RR <= IS_M1;
197
 
198
                                when "011" =>
199
                                        OP_CAT  <= SUB_RR_I;
200
                                        D_OP    <= ALU_X_SUB_Y;
201
                                        D_SX    <= SX_RR;
202
                                        D_SY    <= SY_UQ;
203
                                        D_WE_RR <= IS_M1;
204
 
205
                                when "100" =>
206
                                        OP_CAT  <= MOVE_I_RR;
207
                                        D_OP    <= ALU_MOVE_Y;
208
                                        D_SX    <= SX_ANY;
209
                                        D_SY    <= SY_SQ;
210
                                        D_WE_RR <= IS_M1;
211
 
212
                                when "101" =>
213
                                        OP_CAT  <= SEQ_LL_I;
214
                                        D_OP    <= ALU_X_EQ_Y;
215
                                        D_SX    <= SX_LL;
216
                                        D_SY    <= SY_SQ;
217
                                        D_WE_RR <= IS_M1;               -- !! RR
218
 
219
                                when "110" =>
220
                                        OP_CAT  <= MOVE_I_LL;
221
                                        D_OP    <= ALU_MOVE_Y;
222
                                        D_SX    <= SX_ANY;
223
                                        D_SY    <= SY_UQ;
224
                                        D_WE_LL <= IS_M1;
225
 
226
                                when "111" =>
227
                                        case OPCODE(3 downto 0) is
228
                                                when "0100" =>
229
                                                        OP_CAT  <= ADD_RR_I;
230
                                                        D_OP    <= ALU_X_ADD_Y;
231
                                                        D_SX    <= SX_RR;
232
                                                        D_SY    <= SY_I16;
233
                                                        LAST    <= M3;
234
                                                        D_WE_RR <= IS_M3;
235
 
236
                                                when "0101" =>
237
                                                        OP_CAT  <= ADD_RR_I;
238
                                                        D_OP    <= ALU_X_ADD_Y;
239
                                                        D_SX    <= SX_RR;
240
                                                        D_SY    <= SY_UI8;
241
                                                        LAST    <= M2;
242
                                                        D_WE_RR <= IS_M2;
243
 
244
                                                when "0110" =>
245
                                                        OP_CAT  <= SUB_RR_I;
246
                                                        D_OP    <= ALU_X_SUB_Y;
247
                                                        D_SX    <= SX_RR;
248
                                                        D_SY    <= SY_I16;
249
                                                        LAST    <= M3;
250
                                                        D_WE_RR <= IS_M3;
251
 
252
                                                when "0111" =>
253
                                                        OP_CAT  <= SUB_RR_I;
254
                                                        D_OP    <= ALU_X_SUB_Y;
255
                                                        D_SX    <= SX_RR;
256
                                                        D_SY    <= SY_UI8;
257
                                                        LAST    <= M2;
258
                                                        D_WE_RR <= IS_M2;
259
 
260
                                                when "1000" =>
261
                                                        OP_CAT <= MOVE_I_RR;
262
                                                        D_OP   <= ALU_MOVE_Y;
263
                                                        D_SX   <= SX_ANY;
264
                                                        D_SY   <= SY_I16;
265
                                                        LAST    <= M3;
266
                                                        D_WE_RR <= IS_M3;
267
 
268
                                                when "1001" =>
269
                                                        OP_CAT  <= MOVE_I_RR;
270
                                                        D_OP    <= ALU_MOVE_Y;
271
                                                        D_SX    <= SX_ANY;
272
                                                        D_SY    <= SY_SI8;
273
                                                        LAST    <= M2;
274
                                                        D_WE_RR <= IS_M2;
275
 
276
                                                when "1010" =>
277
                                                        OP_CAT <= SEQ_LL_I;
278
                                                        D_OP   <= ALU_X_EQ_Y;
279
                                                        D_SX   <= SX_LL;
280
                                                        D_SY   <= SY_I16;
281
                                                        LAST    <= M3;
282
                                                        D_WE_RR <= IS_M3;                       -- SEQ sets RR !
283
 
284
                                                when "1011" =>
285
                                                        OP_CAT  <= SEQ_LL_I;
286
                                                        D_OP    <= ALU_X_EQ_Y;
287
                                                        D_SX    <= SX_LL;
288
                                                        D_SY    <= SY_SI8;
289
                                                        LAST    <= M2;
290
                                                        D_WE_RR <= IS_M2;                       -- SEQ sets RR !
291
 
292
                                                when "1100" =>
293
                                                        OP_CAT <= MOVE_I_LL;
294
                                                        D_OP   <= ALU_MOVE_Y;
295
                                                        D_SX   <= SX_ANY;
296
                                                        D_SY   <= SY_I16;
297
                                                        LAST    <= M3;
298
                                                        D_WE_LL <= IS_M3;
299
 
300
                                                when "1101" =>
301
                                                        OP_CAT  <= MOVE_I_LL;
302
                                                        D_OP    <= ALU_MOVE_Y;
303
                                                        D_SX    <= SX_ANY;
304
                                                        D_SY    <= SY_SI8;
305
                                                        LAST    <= M2;
306
                                                        D_WE_LL <= IS_M2;
307
 
308
                                        when others =>  -- undefined
309
                                end case;
310
 
311
                                when others =>  -- undefined
312
                        end case;
313
                else
314
                        case OPCODE(6 downto 0) is
315
                                -- 00000000000000000000000000000000000000000000000000000000000000000000
316
                                when "0000000" =>
317
                                        OP_CAT   <= HALT;
318
                                        HALT_REQ <= '1';
319
                                        PC_OP    <= PC_WAIT;
320
 
321
                                when "0000001" =>
322
                                        OP_CAT <= NOP;
323
 
324
                                when "0000010" =>
325
                                        OP_CAT <= JMP_i;
326
                                        LAST   <= M3;
327
                                        PC_OP  <= pc(IS_M2, PC_JMP);
328
 
329
                                when "0000011" =>
330
                                        OP_CAT <= JMP_RRNZ_i;
331
                                        LAST   <= M3;
332
                                        PC_OP  <= pc(IS_M2 and not RRZ, PC_JMP);
333
 
334
                                when "0000100" =>
335
                                        OP_CAT <= JMP_RRZ_i;
336
                                        LAST   <= M3;
337
                                        PC_OP  <= pc(IS_M2 and RRZ, PC_JMP);
338
 
339
                                when "0000101" =>
340
                                        OP_CAT  <= CALL_i;
341
                                        LAST    <= M3;
342
                                        D_OP    <= ALU_X_ADD_Y;
343
                                        D_SX    <= SX_PC;
344
                                        D_SY    <= SY_SY3;              -- PC + 3
345
                                        D_SA    <= ADR_dSP;
346 9 jsauermann
                                        D_WE_O  <= IS_M1_M2;
347
                                        D_LOCK  <= IS_M1;
348 2 jsauermann
                                        PC_OP   <= pc(IS_M2, PC_JMP);
349
                                        D_SMQ   <= IS_M1;
350
                                        D_WE_SP <= sp(IS_M1_M2, SP_LOAD);
351
 
352
                                when "0000110" =>
353
                                        OP_CAT  <= CALL_RR;
354
                                        LAST    <= M2;
355
                                        D_OP    <= ALU_X_ADD_Y;
356
                                        D_SX    <= SX_PC;
357
                                        D_SY    <= SY_SY1;              -- PC + 1
358
                                        D_SA    <= ADR_dSP;
359 9 jsauermann
                                        D_WE_O  <= IS_M1_M2;
360
                                        D_LOCK  <= IS_M1;
361 2 jsauermann
                                        PC_OP   <= pc(IS_M1, PC_JPRR);
362
                                        D_SMQ   <= IS_M1;
363
                                        D_WE_SP <= sp(IS_M1_M2, SP_LOAD);
364
 
365
                                when "0000111" | "1111000" =>
366
                                        if (OPCODE(0) = '1') then
367
                                                OP_CAT      <= RET;
368
                                        else
369
                                                OP_CAT      <= RETI;
370
                                                ENABLE_INT  <= '1';
371
                                        end if;
372
 
373
                                        LAST    <= M5;
374
                                        D_SA    <= ADR_SPi;             -- read address: (SP)+
375 9 jsauermann
                                        D_RD_O  <= IS_M1_M2;
376
                                        D_LOCK  <= IS_M1;
377 2 jsauermann
                                        D_WE_SP <= sp(IS_M1_M2, SP_INC);
378
                                        case OP_CYC is
379
                                                when M1 =>      PC_OP   <= PC_WAIT;
380
                                                when M2 =>      PC_OP   <= PC_WAIT;
381
                                                when M3 =>      PC_OP   <= PC_RETL;
382
                                                when M4 =>      PC_OP   <= PC_RETH;
383
                                                when others =>
384
                                        end case;
385
 
386
                                when "0001000" =>
387 9 jsauermann
                                        OP_CAT  <= MOVE_SPi_RR;
388
                                        D_SX    <= SX_RR;
389
                                        D_SY    <= SY_UM;
390
                                        D_SA    <= ADR_SPi;
391
                                        D_RD_O  <= IS_M1_M2;
392
                                        D_LOCK  <= IS_M1;
393
                                        LAST    <= M3;
394
                                        PC_OP   <= pc(IS_M1_M2, PC_WAIT);
395 2 jsauermann
                                        D_WE_RR <= IS_M2_M3;
396
                                        D_WE_SP <= sp(IS_M1_M2, SP_INC);
397
                                        D_OP    <= mix(IS_M3);
398
 
399
                                when "0001001" =>
400
                                        OP_CAT  <= MOVE_SPi_RS;
401
                                        LAST    <= M2;
402
                                        D_OP    <= ALU_MOVE_Y;
403
                                        D_SX    <= SX_ANY;
404
                                        D_SY    <= SY_SM;
405
                                        D_SA    <= ADR_SPi;
406 9 jsauermann
                                        D_RD_O  <= IS_M1;
407 2 jsauermann
                                        D_WE_RR <= IS_M2;
408
                                        PC_OP   <= pc(IS_M1, PC_WAIT);
409
                                        D_WE_SP <= sp(IS_M1, SP_INC);
410
 
411
                                when "0001010" =>
412
                                        OP_CAT  <= MOVE_SPi_RU;
413
                                        LAST    <= M2;
414
                                        D_OP    <= ALU_MOVE_Y;
415
                                        D_SX    <= SX_ANY;
416
                                        D_SY    <= SY_UM;
417
                                        D_SA    <= ADR_SPi;
418 9 jsauermann
                                        D_RD_O  <= IS_M1;
419 2 jsauermann
                                        PC_OP   <= pc(IS_M1, PC_WAIT);
420
                                        D_WE_SP <= sp(IS_M1, SP_INC);
421
                                        D_WE_RR <= IS_M2;
422
 
423
                                when "0001011" =>
424
                                        OP_CAT  <= MOVE_SPi_LL;
425
                                        LAST    <= M3;
426
                                        D_SX    <= SX_LL;
427
                                        D_SY    <= SY_UM;
428
                                        D_SA    <= ADR_SPi;
429 9 jsauermann
                                        D_RD_O  <= IS_M1_M2;
430
                                        D_LOCK  <= IS_M1;
431 2 jsauermann
                                        PC_OP   <= pc(IS_M1_M2, PC_WAIT);
432
                                        D_WE_SP <= sp(IS_M1_M2, SP_INC);
433
                                        D_WE_LL <= IS_M2_M3;
434
                                        D_OP    <= mix(IS_M3);
435
 
436
                                when "0001100" =>
437
                                        OP_CAT  <= MOVE_SPi_LS;
438
                                        LAST    <= M2;
439
                                        D_OP    <= ALU_MOVE_Y;
440
                                        D_SX    <= SX_ANY;
441
                                        D_SY    <= SY_SM;
442
                                        D_SA    <= ADR_SPi;
443 9 jsauermann
                                        D_RD_O  <= IS_M1;
444 2 jsauermann
                                        PC_OP   <= pc(IS_M1, PC_WAIT);
445
                                        D_WE_SP <= sp(IS_M1, SP_INC);
446
                                        D_WE_LL <= IS_M2;
447
 
448
                                when "0001101" =>
449
                                        OP_CAT  <= MOVE_SPi_LU;
450
                                        LAST    <= M2;
451
                                        D_OP    <= ALU_MOVE_Y;
452
                                        D_SX    <= SX_ANY;
453
                                        D_SY    <= SY_UM;
454
                                        D_SA    <= ADR_SPi;
455 9 jsauermann
                                        D_RD_O  <= IS_M1;
456 2 jsauermann
                                        PC_OP   <= pc(IS_M1, PC_WAIT);
457
                                        D_WE_SP <= sp(IS_M1, SP_INC);
458
                                        D_WE_LL <= IS_M2;
459
 
460
                                when "0001110" =>
461
                                        OP_CAT  <= MOVE_RR_dSP;
462
                                        LAST    <= M2;
463
                                        D_OP    <= ALU_X_OR_Y;
464
                                        D_SX    <= SX_RR;
465
                                        D_SY    <= SY_SY0;
466
                                        D_SA    <= ADR_dSP;
467 9 jsauermann
                                        D_WE_O  <= IS_M1_M2;
468
                                        D_LOCK  <= IS_M1;
469 2 jsauermann
                                        PC_OP   <= pc(IS_M1, PC_WAIT);
470
                                        D_WE_SP <= sp(IS_M1_M2, SP_LOAD);
471
                                        D_SMQ   <= IS_M1;
472
 
473
                                when "0001111" =>
474
                                        OP_CAT  <= MOVE_R_dSP;
475
                                        D_OP    <= ALU_X_OR_Y;
476
                                        D_SX    <= SX_RR;
477
                                        D_SY    <= SY_SY0;
478
                                        D_SA    <= ADR_dSP;
479 9 jsauermann
                                        D_WE_O  <= '1';
480 2 jsauermann
                                        D_WE_SP <= SP_LOAD;
481
 
482
                                -- 11111111111111111111111111111111111111111111111111111111111111111111
483
                                when "0010000" =>
484
                                        OP_CAT  <= AND_RR_i;
485
                                        LAST    <= M3;          -- wait for ##
486
                                        D_OP    <= ALU_X_AND_Y;
487
                                        D_SX    <= SX_RR;
488
                                        D_SY    <= SY_I16;
489
                                        D_WE_RR <= IS_M2;
490
 
491
                                when "0010001" =>
492
                                        OP_CAT  <= AND_RR_i;
493
                                        LAST    <= M2;                  -- wait for #
494
                                        D_OP    <= ALU_X_AND_Y;
495
                                        D_SX    <= SX_RR;
496
                                        D_SY    <= SY_UI8;
497
                                        D_WE_RR <= IS_M1;
498
 
499
                                when "0010010" =>
500
                                        OP_CAT  <= OR_RR_i;
501
                                        LAST    <= M3;          -- wait for ##
502
                                        D_OP    <= ALU_X_OR_Y;
503
                                        D_SX    <= SX_RR;
504
                                        D_SY    <= SY_I16;
505
                                        D_WE_RR <= IS_M2;
506
 
507
                                when "0010011" =>
508
                                        OP_CAT  <= OR_RR_i;
509
                                        LAST    <= M2;                  -- wait for #
510
                                        D_OP    <= ALU_X_OR_Y;
511
                                        D_SX    <= SX_RR;
512
                                        D_SY    <= SY_UI8;
513
                                        D_WE_RR <= IS_M1;
514
 
515
                                when "0010100" =>
516
                                        OP_CAT  <= XOR_RR_i;
517
                                        LAST    <= M3;          -- wait for ##
518
                                        D_OP    <= ALU_X_XOR_Y;
519
                                        D_SX    <= SX_RR;
520
                                        D_SY    <= SY_I16;
521
                                        D_WE_RR <= IS_M2;
522
 
523
                                when "0010101" =>
524
                                        OP_CAT  <= XOR_RR_i;
525
                                        LAST    <= M2;                  -- wait for #
526
                                        D_OP    <= ALU_X_XOR_Y;
527
                                        D_SX    <= SX_RR;
528
                                        D_SY    <= SY_UI8;
529
                                        D_WE_RR <= IS_M1;
530
 
531
                                when "0010110" =>
532
                                        OP_CAT  <= SEQ_RR_i;
533
                                        LAST    <= M3;          -- wait for ##
534
                                        D_OP    <= ALU_X_EQ_Y;
535
                                        D_SX    <= SX_RR;
536
                                        D_SY    <= SY_I16;
537
                                        D_WE_RR <= IS_M2;
538
 
539
                                when "0010111" =>
540
                                        OP_CAT  <= SEQ_RR_i;
541
                                        LAST    <= M2;                  -- wait for #
542
                                        D_OP    <= ALU_X_EQ_Y;
543
                                        D_SX    <= SX_RR;
544
                                        D_SY    <= SY_UI8;
545
                                        D_WE_RR <= IS_M1;
546
 
547
                                when "0011000" =>
548
                                        OP_CAT  <= SNE_RR_i;
549
                                        LAST    <= M3;          -- wait for ##
550
                                        D_OP    <= ALU_X_NE_Y;
551
                                        D_SX    <= SX_RR;
552
                                        D_SY    <= SY_I16;
553
                                        D_WE_RR <= IS_M2;
554
 
555
                                when "0011001" =>
556
                                        OP_CAT  <= SNE_RR_i;
557
                                        LAST    <= M2;                  -- wait for #
558
                                        D_OP    <= ALU_X_NE_Y;
559
                                        D_SX    <= SX_RR;
560
                                        D_SY    <= SY_UI8;
561
                                        D_WE_RR <= IS_M1;
562
 
563
                                when "0011010" =>
564
                                        OP_CAT  <= SGE_RR_i;
565
                                        LAST    <= M3;          -- wait for ##
566
                                        D_OP    <= ALU_X_GE_Y;
567
                                        D_SX    <= SX_RR;
568
                                        D_SY    <= SY_I16;
569
                                        D_WE_RR <= IS_M2;
570
 
571
                                when "0011011" =>
572
                                        OP_CAT  <= SGE_RR_i;
573
                                        LAST    <= M2;                  -- wait for #
574
                                        D_OP    <= ALU_X_GE_Y;
575
                                        D_SX    <= SX_RR;
576
                                        D_SY    <= SY_SI8;
577
                                        D_WE_RR <= IS_M1;
578
 
579
                                when "0011100" =>
580
                                        OP_CAT  <= SGT_RR_i;
581
                                        LAST    <= M3;          -- wait for ##
582
                                        D_OP    <= ALU_X_GT_Y;
583
                                        D_SX    <= SX_RR;
584
                                        D_SY    <= SY_I16;
585
                                        D_WE_RR <= IS_M2;
586
 
587
                                when "0011101" =>
588
                                        OP_CAT  <= SGT_RR_i;
589
                                        LAST    <= M2;                  -- wait for #
590
                                        D_OP    <= ALU_X_GT_Y;
591
                                        D_SX    <= SX_RR;
592
                                        D_SY    <= SY_SI8;
593
                                        D_WE_RR <= IS_M1;
594
 
595
                                when "0011110" =>
596
                                        OP_CAT  <= SLE_RR_i;
597
                                        LAST    <= M3;          -- wait for ##
598
                                        D_OP    <= ALU_X_LE_Y;
599
                                        D_SX    <= SX_RR;
600
                                        D_SY    <= SY_I16;
601
                                        D_WE_RR <= IS_M2;
602
 
603
                                when "0011111" =>
604
                                        OP_CAT  <= SLE_RR_i;
605
                                        LAST    <= M2;                  -- wait for #
606
                                        D_OP    <= ALU_X_LE_Y;
607
                                        D_SX    <= SX_RR;
608
                                        D_SY    <= SY_SI8;
609
                                        D_WE_RR <= IS_M1;
610
 
611
                                -- 22222222222222222222222222222222222222222222222222222222222222222222
612
                                when "0100000" =>
613
                                        OP_CAT  <= SLT_RR_i;
614
                                        LAST    <= M3;          -- wait for ##
615
                                        D_OP    <= ALU_X_LT_Y;
616
                                        D_SX    <= SX_RR;
617
                                        D_SY    <= SY_I16;
618
                                        D_WE_RR <= IS_M2;
619
 
620
                                when "0100001" =>
621
                                        OP_CAT  <= SLT_RR_i;
622
                                        LAST    <= M2;                  -- wait for #
623
                                        D_OP    <= ALU_X_LT_Y;
624
                                        D_SX    <= SX_RR;
625
                                        D_SY    <= SY_SI8;
626
                                        D_WE_RR <= IS_M1;
627
 
628
                                when "0100010" =>
629
                                        OP_CAT  <= SHS_RR_i;
630
                                        LAST    <= M3;          -- wait for ##
631
                                        D_OP    <= ALU_X_HS_Y;
632
                                        D_SX    <= SX_RR;
633
                                        D_SY    <= SY_I16;
634
                                        D_WE_RR <= IS_M2;
635
 
636
                                when "0100011" =>
637
                                        OP_CAT  <= SHS_RR_i;
638
                                        LAST    <= M2;                  -- wait for #
639
                                        D_OP    <= ALU_X_HS_Y;
640
                                        D_SX    <= SX_RR;
641
                                        D_SY    <= SY_UI8;
642
                                        D_WE_RR <= IS_M1;
643
 
644
                                when "0100100" =>
645
                                        OP_CAT  <= SHI_RR_i;
646
                                        LAST    <= M3;          -- wait for ##
647
                                        D_OP    <= ALU_X_HI_Y;
648
                                        D_SX    <= SX_RR;
649
                                        D_SY    <= SY_I16;
650
                                        D_WE_RR <= IS_M2;
651
 
652
                                when "0100101" =>
653
                                        OP_CAT  <= SHI_RR_i;
654
                                        LAST    <= M2;                  -- wait for #
655
                                        D_OP    <= ALU_X_HI_Y;
656
                                        D_SX    <= SX_RR;
657
                                        D_SY    <= SY_UI8;
658
                                        D_WE_RR <= IS_M1;
659
 
660
                                when "0100110" =>
661
                                        OP_CAT <= SLS_RR_i;
662
                                        LAST    <= M3;          -- wait for ##
663
                                        D_OP   <= ALU_X_LS_Y;
664
                                        D_SX   <= SX_RR;
665
                                        D_SY   <= SY_I16;
666
                                        D_WE_RR <= IS_M2;
667
 
668
                                when "0100111" =>
669
                                        OP_CAT  <= SLS_RR_i;
670
                                        LAST    <= M2;                  -- wait for #
671
                                        D_OP    <= ALU_X_LS_Y;
672
                                        D_SX    <= SX_RR;
673
                                        D_SY    <= SY_UI8;
674
                                        D_WE_RR <= IS_M1;
675
 
676
                                when "0101000" =>
677
                                        OP_CAT  <= SLO_RR_i;
678
                                        LAST    <= M3;          -- wait for ##
679
                                        D_OP    <= ALU_X_LO_Y;
680
                                        D_SX    <= SX_RR;
681
                                        D_SY    <= SY_I16;
682
                                        D_WE_RR <= IS_M2;
683
 
684
                                when "0101001" =>
685
                                        OP_CAT  <= SLO_RR_i;
686
                                        LAST    <= M2;                  -- wait for #
687
                                        D_OP    <= ALU_X_LO_Y;
688
                                        D_SX    <= SX_RR;
689
                                        D_SY    <= SY_UI8;
690
                                        D_WE_RR <= IS_M1;
691
 
692
                                when "0101010" =>
693
                                        OP_CAT  <= ADD_SP_I;
694
                                        LAST    <= M3;          -- wait for ##
695
                                        D_OP    <= ALU_ANY;
696
                                        D_SX    <= SX_ANY;
697
                                        D_SY    <= SY_ANY;
698
                                        D_SA    <= ADR_16SP_L;
699
                                        D_WE_SP <= sp(IS_M2, SP_LOAD);
700
 
701
                                when "0101011" =>
702
                                        OP_CAT  <= ADD_SP_I;
703
                                        LAST    <= M2;                  -- wait for #
704
                                        D_OP    <= ALU_ANY;
705
                                        D_SX    <= SX_ANY;
706
                                        D_SY    <= SY_ANY;
707
                                        D_SA    <= ADR_8SP_L;
708
                                        D_WE_SP <= sp(IS_M1, SP_LOAD);
709
 
710
                                when "0101100" =>
711
                                        OP_CAT  <= CLRW_dSP;
712
                                        LAST    <= M2;
713
                                        D_OP    <= ALU_X_AND_Y;
714
                                        D_SX    <= SX_ANY;
715
                                        D_SY    <= SY_SY0;
716
                                        D_SA    <= ADR_dSP;
717 9 jsauermann
                                        D_WE_O  <= '1';
718
                                        D_LOCK  <= IS_M1;
719 2 jsauermann
                                        D_WE_SP <= SP_LOAD;
720
                                        PC_OP   <= pc(IS_M1, PC_WAIT);
721
 
722
                                when "0101101" =>
723
                                        OP_CAT  <= CLRB_dSP;
724
                                        D_OP    <= ALU_X_AND_Y;
725
                                        D_SX    <= SX_ANY;
726
                                        D_SY    <= SY_SY0;
727
                                        D_SA    <= ADR_dSP;
728 9 jsauermann
                                        D_WE_O  <= IS_M1;
729 2 jsauermann
                                        D_WE_SP <= SP_LOAD;
730
 
731
                                when "0101110" =>
732
                                        OP_CAT  <= IN_ci_RU;
733
                                        LAST    <= M2;
734
                                        D_OP    <= ALU_MOVE_Y;
735
                                        D_SX    <= SX_ANY;
736 9 jsauermann
                                        D_SY    <= SY_UM;
737 2 jsauermann
                                        D_SA    <= ADR_IO;
738 9 jsauermann
                                        D_RD_O  <= IS_M1;
739
                                        D_IO    <= IS_M1;
740 2 jsauermann
                                        D_WE_RR <= IS_M2;
741
 
742
                                when "0101111" =>
743
                                        OP_CAT  <= OUT_R_ci;
744
                                        LAST    <= M2;
745
                                        D_OP    <= ALU_X_OR_Y;
746
                                        D_SX    <= SX_RR;
747
                                        D_SY    <= SY_SY0;
748
                                        D_SA    <= ADR_IO;
749 9 jsauermann
                                        D_WE_O  <= IS_M1;
750
                                        D_IO    <= IS_M1;
751 2 jsauermann
 
752
                                -- 33333333333333333333333333333333333333333333333333333333333333333333
753
                                when "0110000" =>
754
                                        OP_CAT  <= AND_LL_RR;
755
                                        D_OP    <= ALU_X_AND_Y;
756
                                        D_SX    <= SX_LL;
757
                                        D_SY    <= SY_RR;
758
                                        D_WE_RR <= IS_M1;
759
 
760
                                when "0110001" =>
761
                                        OP_CAT  <= OR_LL_RR;
762
                                        D_OP    <= ALU_X_OR_Y;
763
                                        D_SX    <= SX_LL;
764
                                        D_SY    <= SY_RR;
765
                                        D_WE_RR <= IS_M1;
766
 
767
                                when "0110010" =>
768
                                        OP_CAT  <= XOR_LL_RR;
769
                                        D_OP    <= ALU_X_XOR_Y;
770
                                        D_SX    <= SX_LL;
771
                                        D_SY    <= SY_RR;
772
                                        D_WE_RR <= IS_M1;
773
 
774
                                when "0110011" =>
775
                                        OP_CAT  <= SEQ_LL_RR;
776
                                        D_OP    <= ALU_X_EQ_Y;
777
                                        D_SX    <= SX_LL;
778
                                        D_SY    <= SY_RR;
779
                                        D_WE_RR <= IS_M1;
780
 
781
                                when "0110100" =>
782
                                        OP_CAT  <= SNE_LL_RR;
783
                                        D_OP    <= ALU_X_NE_Y;
784
                                        D_SX    <= SX_LL;
785
                                        D_SY    <= SY_RR;
786
                                        D_WE_RR <= IS_M1;
787
 
788
                                when "0110101" =>
789
                                        OP_CAT  <= SGE_LL_RR;
790
                                        D_OP    <= ALU_X_GE_Y;
791
                                        D_SX    <= SX_LL;
792
                                        D_SY    <= SY_RR;
793
                                        D_WE_RR <= IS_M1;
794
 
795
                                when "0110110" =>
796
                                        OP_CAT  <= SGT_LL_RR;
797
                                        D_OP    <= ALU_X_GT_Y;
798
                                        D_SX    <= SX_LL;
799
                                        D_SY    <= SY_RR;
800
                                        D_WE_RR <= IS_M1;
801
 
802
                                when "0110111" =>
803
                                        OP_CAT  <= SLE_LL_RR;
804
                                        D_OP    <= ALU_X_LE_Y;
805
                                        D_SX    <= SX_LL;
806
                                        D_SY    <= SY_RR;
807
                                        D_WE_RR <= IS_M1;
808
 
809
                                when "0111000" =>
810
                                        OP_CAT  <= SLT_LL_RR;
811
                                        D_OP    <= ALU_X_LT_Y;
812
                                        D_SX    <= SX_LL;
813
                                        D_SY    <= SY_RR;
814
                                        D_WE_RR <= IS_M1;
815
 
816
                                when "0111001" =>
817
                                        OP_CAT  <= SHS_LL_RR;
818
                                        D_OP    <= ALU_X_HS_Y;
819
                                        D_SX    <= SX_LL;
820
                                        D_SY    <= SY_RR;
821
                                        D_WE_RR <= IS_M1;
822
 
823
                                when "0111010" =>
824
                                        OP_CAT  <= SHI_LL_RR;
825
                                        D_OP    <= ALU_X_HI_Y;
826
                                        D_SX    <= SX_LL;
827
                                        D_SY    <= SY_RR;
828
                                        D_WE_RR <= IS_M1;
829
 
830
                                when "0111011" =>
831
                                        OP_CAT  <= SLS_LL_RR;
832
                                        D_OP    <= ALU_X_LS_Y;
833
                                        D_SX    <= SX_LL;
834
                                        D_SY    <= SY_RR;
835
                                        D_WE_RR <= IS_M1;
836
 
837
                                when "0111100" =>
838
                                        OP_CAT  <= SLO_LL_RR;
839
                                        D_OP    <= ALU_X_LO_Y;
840
                                        D_SX    <= SX_LL;
841
                                        D_SY    <= SY_RR;
842
                                        D_WE_RR <= IS_M1;
843
 
844
                                when "0111101" =>
845
                                        OP_CAT  <= LNOT_RR;
846
                                        D_OP    <= ALU_X_EQ_Y;
847
                                        D_SX    <= SX_RR;
848
                                        D_SY    <= SY_SY0;
849
                                        D_WE_RR <= IS_M1;
850
 
851
                                when "0111110" =>
852
                                        OP_CAT  <= NEG_RR;
853
                                        D_OP    <= ALU_NEG_Y;
854
                                        D_SX    <= SX_ANY;
855
                                        D_SY    <= SY_RR;
856
                                        D_WE_RR <= IS_M1;
857
 
858
                                when "0111111" =>
859
                                        OP_CAT  <= NOT_RR;
860
                                        D_OP    <= ALU_NOT_Y;
861
                                        D_SX    <= SX_ANY;
862
                                        D_SY    <= SY_RR;
863
                                        D_WE_RR <= IS_M1;
864
 
865
                                -- 44444444444444444444444444444444444444444444444444444444444444444444
866
                                when "1000000" =>
867
                                        OP_CAT  <= MOVE_LL_RR;
868
                                        D_OP    <= ALU_X_OR_Y;
869
                                        D_SX    <= SX_LL;
870
                                        D_SY    <= SY_SY0;
871
                                        D_WE_RR <= IS_M1;
872
 
873
                                when "1000001" =>
874
                                        OP_CAT  <= MOVE_LL_cRR;
875
                                        LAST    <= M2;
876
                                        PC_OP   <= pc(IS_M1, PC_WAIT);
877
                                        D_OP    <= ALU_X_OR_Y;
878
                                        D_SX    <= SX_LL;
879
                                        D_SY    <= SY_SY0;
880
                                        D_SA    <= hadr(IS_M2, ADR_cRR_H);
881 9 jsauermann
                                        D_WE_O  <= IS_M1_M2;
882
                                        D_LOCK  <= IS_M1;
883 2 jsauermann
                                        D_SMQ   <= IS_M2;
884
 
885
                                when "1000010" =>
886
                                        OP_CAT  <= MOVE_L_cRR;
887
                                        D_OP    <= ALU_X_OR_Y;
888
                                        D_SX    <= SX_LL;
889
                                        D_SY    <= SY_SY0;
890
                                        D_SA    <= ADR_cRR_L;
891 9 jsauermann
                                        D_WE_O  <= IS_M1;
892 2 jsauermann
 
893
                                when "1000011" =>
894
                                        OP_CAT  <= MOVE_RR_LL;
895
                                        D_OP    <= ALU_X_OR_Y;
896
                                        D_SX    <= SX_RR;
897
                                        D_SY    <= SY_SY0;
898
                                        D_WE_LL <= IS_M1;
899
 
900
                                when "1000100" =>
901
                                        OP_CAT  <= MOVE_RR_cLL;
902
                                        LAST    <= M2;
903
                                        PC_OP   <= pc(IS_M1, PC_WAIT);
904
                                        D_OP    <= ALU_X_OR_Y;
905
                                        D_SX    <= SX_RR;
906
                                        D_SY    <= SY_SY0;
907
                                        D_SA    <= hadr(IS_M2, ADR_cLL_H);
908 9 jsauermann
                                        D_WE_O  <= IS_M1_M2;
909
                                        D_LOCK  <= IS_M1;
910 2 jsauermann
                                        D_SMQ   <= IS_M2;
911
 
912
                                when "1000101" =>
913
                                        OP_CAT  <= MOVE_R_cLL;
914
                                        D_OP    <= ALU_X_OR_Y;
915
                                        D_SX    <= SX_RR;
916
                                        D_SY    <= SY_SY0;
917
                                        D_SA    <= ADR_cLL_L;
918 9 jsauermann
                                        D_WE_O  <= IS_M1;
919 2 jsauermann
 
920
                                when "1000110" =>
921
                                        OP_CAT  <= MOVE_cRR_RR;
922
                                        LAST    <= M3;
923
                                        D_SX    <= SX_ANY;
924
                                        D_SY    <= SY_UM;
925
                                        D_WE_RR <= not IS_M1;           -- M2 or M3
926
                                        PC_OP   <= pc(IS_M1_M2, PC_WAIT);
927
                                        D_OP    <= mix(IS_M3);
928
                                        D_SA    <= hadr(IS_M2, ADR_cRR_H);
929 9 jsauermann
                                        D_RD_O  <= IS_M1_M2;
930
                                        D_LOCK  <= IS_M1;
931 2 jsauermann
 
932
                                when "1000111" =>
933
                                        OP_CAT  <= MOVE_cRR_RS;
934
                                        LAST    <= M2;
935
                                        D_OP    <= ALU_MOVE_Y;
936
                                        D_SX    <= SX_ANY;
937
                                        D_SY    <= SY_SM;
938
                                        D_SA    <= ADR_cRR_L;
939 9 jsauermann
                                        D_RD_O  <= IS_M1;
940 2 jsauermann
                                        D_WE_RR <= IS_M2;
941
                                        PC_OP   <= pc(IS_M1, PC_WAIT);
942
 
943
                                when "1001000" =>
944
                                        OP_CAT  <= MOVE_cRR_RU;
945
                                        LAST    <= M2;
946
                                        D_OP    <= ALU_MOVE_Y;
947
                                        D_SX    <= SX_ANY;
948
                                        D_SY    <= SY_UM;
949
                                        D_SA    <= ADR_cRR_L;
950 9 jsauermann
                                        D_RD_O  <= IS_M1;
951 2 jsauermann
                                        D_WE_RR <= IS_M2;
952
                                        PC_OP  <= pc(IS_M1, PC_WAIT);
953
 
954
                                when "1001001" =>
955
                                        OP_CAT  <= MOVE_ci_RR;
956
                                        LAST    <= M4;
957
                                        D_SX    <= SX_RR;
958
                                        D_SY    <= SY_UM;
959
                                        PC_OP   <= pc(IS_M3, PC_WAIT);
960
                                        D_OP    <= mix(IS_M4);
961
                                        D_WE_RR <= IS_M3_M4;
962
                                        D_SA    <= hadr(IS_M3, ADR_cI16_H);
963 9 jsauermann
                                        D_RD_O  <= IS_M2_M3;
964
                                        D_LOCK  <= IS_M2;
965 2 jsauermann
 
966
                                when "1001010" =>
967
                                        OP_CAT  <= MOVE_ci_RS;
968
                                        LAST    <= M3;
969
                                        D_OP    <= ALU_MOVE_Y;
970
                                        D_SX    <= SX_ANY;
971
                                        D_SY    <= SY_SM;
972
                                        D_SA    <= ADR_cI16_L;
973 9 jsauermann
                                        D_RD_O  <= IS_M2;
974 2 jsauermann
                                        D_WE_RR <= IS_M3;
975
 
976
                                when "1001011" =>
977
                                        OP_CAT  <= MOVE_ci_RU;
978
                                        LAST    <= M3;
979
                                        D_OP    <= ALU_MOVE_Y;
980
                                        D_SX    <= SX_ANY;
981
                                        D_SY    <= SY_UM;
982
                                        D_SA    <= ADR_cI16_L;
983 9 jsauermann
                                        D_RD_O  <= IS_M2;
984 2 jsauermann
                                        D_WE_RR <= IS_M3;
985
 
986
                                when "1001100" =>
987
                                        OP_CAT  <= MOVE_ci_LL;
988
                                        LAST    <= M4;
989
                                        D_SX    <= SX_LL;
990
                                        D_SY    <= SY_UM;
991
                                        PC_OP   <= pc(IS_M3, PC_WAIT);
992
                                        D_OP    <= mix(IS_M4);
993
                                        D_SA    <= hadr(IS_M3, ADR_cI16_H);
994 9 jsauermann
                                        D_RD_O  <= IS_M2_M3;
995
                                        D_LOCK  <= IS_M2;
996 2 jsauermann
                                        D_WE_LL <= IS_M3_M4;
997
 
998
                                when "1001101" =>
999
                                        OP_CAT  <= MOVE_ci_LS;
1000
                                        LAST    <= M3;
1001
                                        D_OP    <= ALU_MOVE_Y;
1002
                                        D_SX    <= SX_ANY;
1003
                                        D_SY    <= SY_SM;
1004
                                        D_SA    <= ADR_cI16_L;
1005 9 jsauermann
                                        D_RD_O  <= IS_M2;
1006 2 jsauermann
                                        D_WE_LL <= IS_M3;
1007
 
1008
                                when "1001110" =>
1009
                                        OP_CAT  <= MOVE_ci_LU;
1010
                                        LAST    <= M3;
1011
                                        D_OP    <= ALU_MOVE_Y;
1012
                                        D_SX    <= SX_ANY;
1013
                                        D_SY    <= SY_UM;
1014
                                        D_SA    <= ADR_cI16_L;
1015 9 jsauermann
                                        D_RD_O  <= IS_M2;
1016 2 jsauermann
                                        D_WE_LL <= IS_M3;
1017
 
1018
                                when "1001111" =>
1019
                                        OP_CAT  <= MOVE_RR_SP;
1020
                                        D_SA    <= ADR_cRR_L;
1021
                                        D_WE_SP <= SP_LOAD;
1022
 
1023
                                -- 55555555555555555555555555555555555555555555555555555555555555555555
1024
                                when "1010000" =>
1025
                                        -- spare
1026
 
1027
                                when "1010001" =>
1028
                                        -- spare
1029
 
1030
                                when "1010010" =>
1031
                                        OP_CAT  <= LSL_RR_i;
1032
                                        LAST    <= M2;
1033
                                        D_OP    <= ALU_X_LSL_Y;
1034
                                        D_SX    <= SX_RR;
1035
                                        D_SY    <= SY_UI8;
1036
                                        D_WE_RR <= IS_M1;
1037
 
1038
                                when "1010011" =>
1039
                                        OP_CAT  <= ASR_RR_i;
1040
                                        LAST    <= M2;
1041
                                        D_OP    <= ALU_X_ASR_Y;
1042
                                        D_SX    <= SX_RR;
1043
                                        D_SY    <= SY_UI8;
1044
                                        D_WE_RR <= IS_M1;
1045
 
1046
                                when "1010100" =>
1047
                                        OP_CAT  <= LSR_RR_i;
1048
                                        LAST    <= M2;
1049
                                        D_OP    <= ALU_X_LSR_Y;
1050
                                        D_SX    <= SX_RR;
1051
                                        D_SY    <= SY_UI8;
1052
                                        D_WE_RR <= IS_M1;
1053
 
1054
                                when "1010101" =>
1055
                                        OP_CAT  <= LSL_LL_RR;
1056
                                        D_OP    <= ALU_X_LSL_Y;
1057
                                        D_SX    <= SX_LL;
1058
                                        D_SY    <= SY_RR;
1059
                                        D_WE_RR <= IS_M1;
1060
 
1061
                                when "1010110" =>
1062
                                        OP_CAT  <= ASR_LL_RR;
1063
                                        D_OP    <= ALU_X_ASR_Y;
1064
                                        D_SX    <= SX_LL;
1065
                                        D_SY    <= SY_RR;
1066
                                        D_WE_RR <= IS_M1;
1067
 
1068
                                when "1010111" =>
1069
                                        OP_CAT  <= LSR_LL_RR;
1070
                                        D_OP    <= ALU_X_LSR_Y;
1071
                                        D_SX    <= SX_LL;
1072
                                        D_SY    <= SY_RR;
1073
                                        D_WE_RR <= IS_M1;
1074
 
1075
                                when "1011000" =>
1076
                                        OP_CAT  <= ADD_LL_RR;
1077
                                        D_OP    <= ALU_X_ADD_Y;
1078
                                        D_SX    <= SX_LL;
1079
                                        D_SY    <= SY_RR;
1080
                                        D_WE_RR <= IS_M1;
1081
 
1082
                                when "1011001" =>
1083
                                        OP_CAT  <= SUB_LL_RR;
1084
                                        D_OP    <= ALU_X_SUB_Y;
1085
                                        D_SX    <= SX_LL;
1086
                                        D_SY    <= SY_RR;
1087
                                        D_WE_RR <= IS_M1;
1088
 
1089
                                when "1011010" =>
1090
                                        OP_CAT  <= MOVE_RR_ci;
1091
                                        LAST    <= M3;
1092
                                        D_SX    <= SX_RR;
1093
                                        D_SY    <= SY_SY0;
1094
                                        D_OP    <= ALU_X_OR_Y;
1095
                                        D_SA    <= hadr(IS_M3, ADR_cI16_H);
1096 9 jsauermann
                                        D_WE_O  <= IS_M2_M3;
1097
                                        D_LOCK  <= IS_M2;
1098 2 jsauermann
                                        D_SMQ   <= IS_M3;
1099
 
1100
                                when "1011011" =>
1101
                                        OP_CAT  <= MOVE_R_ci;
1102
                                        LAST    <= M3;
1103
                                        D_SX    <= SX_RR;
1104
                                        D_SY    <= SY_SY0;
1105
                                        D_OP    <= ALU_X_OR_Y;
1106
                                        D_SA    <= ADR_cI16_L;
1107 9 jsauermann
                                        D_WE_O  <= IS_M2;
1108 2 jsauermann
 
1109
                                when "1011100" =>               -- long offset / long move
1110
                                        OP_CAT  <= MOVE_RR_uSP;
1111
                                        LAST    <= M3;
1112
                                        D_SX    <= SX_RR;
1113
                                        D_SY    <= SY_SY0;
1114
                                        D_OP    <= ALU_X_OR_Y;
1115 9 jsauermann
                                        D_SA    <= hadr(IS_M3, ADR_16SP_H);
1116
                                        D_WE_O  <= IS_M2_M3;
1117
                                        D_LOCK  <= IS_M2;
1118 2 jsauermann
                                        D_SMQ   <= IS_M3;
1119
 
1120
                                when "1011101" =>               -- short offset / long move
1121
                                        OP_CAT  <= MOVE_RR_uSP;
1122
                                        LAST    <= M2;
1123
                                        D_SX    <= SX_RR;
1124
                                        D_SY    <= SY_SY0;
1125
                                        D_OP    <= ALU_X_OR_Y;
1126 9 jsauermann
                                        D_SA    <= hadr(IS_M2, ADR_8SP_H);
1127
                                        D_WE_O  <= IS_M1_M2;
1128
                                        D_LOCK  <= IS_M1;
1129 2 jsauermann
                                        D_SMQ   <= IS_M2;
1130
 
1131
                                when "1011110" =>               -- long offset / short move
1132
                                        OP_CAT  <= MOVE_R_uSP;
1133
                                        LAST    <= M3;
1134
                                        D_SX    <= SX_RR;
1135
                                        D_SY    <= SY_SY0;
1136
                                        D_OP    <= ALU_X_OR_Y;
1137 9 jsauermann
                                        D_SA    <= ADR_16SP_L;
1138
                                        D_WE_O  <= IS_M2;
1139 2 jsauermann
                                        D_OP    <= ALU_X_OR_Y;
1140
 
1141
                                when "1011111" =>               -- short offset / short move
1142
                                        OP_CAT  <= MOVE_R_uSP;
1143
                                        LAST    <= M2;
1144
                                        D_SX    <= SX_RR;
1145
                                        D_SY    <= SY_SY0;
1146
                                        D_OP    <= ALU_X_OR_Y;
1147 9 jsauermann
                                        D_SA    <= ADR_8SP_L;
1148
                                        D_WE_O  <= IS_M1;
1149 2 jsauermann
                                        D_OP    <= ALU_X_OR_Y;
1150
 
1151
                                -- 66666666666666666666666666666666666666666666666666666666666666666666
1152
                                when "1100000" =>       -- long offset, long move
1153
                                        OP_CAT <= MOVE_uSP_RR;
1154
                                        LAST   <= M4;
1155
                                        D_SX   <= SX_RR;
1156
                                        D_SY   <= SY_UM;
1157
                                        PC_OP   <= pc(IS_M3, PC_WAIT);
1158
                                        D_OP    <= mix(IS_M3_M4);
1159 9 jsauermann
                                        D_SA    <= hadr(IS_M3, ADR_16SP_H);
1160
                                        D_RD_O  <= IS_M2_M3;
1161
                                        D_LOCK  <= IS_M2;
1162 2 jsauermann
                                        D_WE_RR <= IS_M3_M4;
1163
 
1164
                                when "1100001" =>       -- short offset, long move
1165
                                        OP_CAT  <= MOVE_uSP_RR;
1166
                                        LAST    <= M3;
1167
                                        D_SX    <= SX_RR;
1168
                                        D_SY    <= SY_UM;
1169
                                        PC_OP   <= pc(IS_M2, PC_WAIT);
1170
                                        D_OP    <= mix(IS_M3);
1171 9 jsauermann
                                        D_SA    <= hadr(IS_M2, ADR_8SP_H);
1172
                                        D_RD_O  <= IS_M1_M2;
1173
                                        D_LOCK  <= IS_M1;
1174 2 jsauermann
                                        D_WE_RR <= IS_M2_M3;
1175
 
1176
                                when "1100010" =>       -- long offset, short move
1177
                                        OP_CAT  <= MOVE_uSP_RS;
1178
                                        LAST    <= M3;
1179
                                        D_OP    <= ALU_MOVE_Y;
1180
                                        D_SX    <= SX_RR;
1181
                                        D_SY    <= SY_SM;
1182
                                        D_SA    <= ADR_16SP_L;
1183 9 jsauermann
                                        D_RD_O  <= IS_M2;
1184 2 jsauermann
                                        D_WE_RR <= IS_M3;
1185
 
1186
                                when "1100011" =>       -- short offset, short move
1187
                                        OP_CAT  <= MOVE_uSP_RS;
1188
                                        LAST    <= M2;
1189
                                        D_OP    <= ALU_MOVE_Y;
1190
                                        D_SX    <= SX_RR;
1191
                                        D_SY    <= SY_SM;
1192
                                        D_SA    <= ADR_8SP_L;
1193 9 jsauermann
                                        D_RD_O  <= IS_M1;
1194 2 jsauermann
                                        D_WE_RR <= IS_M2;
1195
 
1196
                                when "1100100" =>       -- long offset, short move
1197
                                        OP_CAT  <= MOVE_uSP_RU;
1198
                                        LAST    <= M3;
1199
                                        D_OP    <= ALU_MOVE_Y;
1200
                                        D_SX    <= SX_RR;
1201
                                        D_SY    <= SY_UM;
1202
                                        D_SA    <= ADR_16SP_L;
1203 9 jsauermann
                                        D_RD_O  <= IS_M2;
1204 2 jsauermann
                                        D_WE_RR <= IS_M3;
1205
 
1206
                                when "1100101" =>       -- short offset, short move
1207
                                        OP_CAT  <= MOVE_uSP_RU;
1208
                                        LAST    <= M2;
1209
                                        D_OP    <= ALU_MOVE_Y;
1210
                                        D_SX    <= SX_RR;
1211
                                        D_SY    <= SY_UM;
1212
                                        D_SA    <= ADR_8SP_L;
1213 9 jsauermann
                                        D_RD_O  <= IS_M1;
1214 2 jsauermann
                                        D_WE_RR <= IS_M2;
1215
 
1216
                                when "1100110" =>       -- long offset, long move
1217
                                        OP_CAT  <= MOVE_uSP_LL;
1218
                                        LAST    <= M4;
1219
                                        D_SX    <= SX_LL;
1220
                                        D_SY    <= SY_UM;
1221
                                        PC_OP   <= pc(IS_M3, PC_WAIT);
1222
                                        D_OP    <= mix(IS_M4);
1223 9 jsauermann
                                        D_SA    <= hadr(IS_M3, ADR_8SP_H);
1224
                                        D_RD_O  <= IS_M2_M3;
1225
                                        D_LOCK  <= IS_M2;
1226 2 jsauermann
                                        D_WE_LL <= IS_M3_M4;
1227
 
1228
                                when "1100111" =>       -- short offset, long move
1229
                                        OP_CAT  <= MOVE_uSP_LL;
1230
                                        LAST    <= M3;
1231
                                        D_SX    <= SX_LL;
1232
                                        D_SY    <= SY_UM;
1233
                                        PC_OP   <= pc(IS_M2, PC_WAIT);
1234
                                        D_OP    <= mix(IS_M3);
1235 9 jsauermann
                                        D_SA    <= hadr(IS_M2, ADR_8SP_H);
1236
                                        D_RD_O  <= IS_M1_M2;
1237
                                        D_LOCK  <= IS_M1;
1238 2 jsauermann
                                        D_WE_LL <= IS_M2_M3;
1239
 
1240
                                when "1101000" =>       -- long offset, short move
1241
                                        OP_CAT  <= MOVE_uSP_LS;
1242
                                        LAST    <= M3;
1243
                                        D_OP    <= ALU_MOVE_Y;
1244
                                        D_SX    <= SX_RR;
1245
                                        D_SY    <= SY_SM;
1246
                                        D_SA    <= ADR_16SP_L;
1247 9 jsauermann
                                        D_RD_O  <= IS_M2;
1248 2 jsauermann
                                        D_WE_LL <= IS_M3;
1249
 
1250
                                when "1101001" =>       -- short offset, short move
1251
                                        OP_CAT  <= MOVE_uSP_LS;
1252
                                        LAST    <= M2;
1253
                                        D_OP    <= ALU_MOVE_Y;
1254
                                        D_SX    <= SX_RR;
1255
                                        D_SY    <= SY_SM;
1256
                                        D_SA    <= ADR_8SP_L;
1257 9 jsauermann
                                        D_RD_O  <= IS_M1;
1258 2 jsauermann
                                        D_WE_LL <= IS_M2;
1259
 
1260
                                when "1101010" =>       -- long offset, short move
1261
                                        OP_CAT  <= MOVE_uSP_LU;
1262
                                        LAST    <= M3;
1263
                                        D_OP    <= ALU_MOVE_Y;
1264
                                        D_SX    <= SX_RR;
1265
                                        D_SY    <= SY_UM;
1266
                                        D_SA    <= ADR_16SP_L;
1267 9 jsauermann
                                        D_RD_O  <= IS_M2;
1268 2 jsauermann
                                        D_WE_LL <= IS_M3;
1269
 
1270
                                when "1101011" =>       -- short offset, short move
1271
                                        OP_CAT  <= MOVE_uSP_LU;
1272
                                        LAST    <= M2;
1273
                                        D_OP    <= ALU_MOVE_Y;
1274
                                        D_SX    <= SX_RR;
1275
                                        D_SY    <= SY_UM;
1276
                                        D_SA    <= ADR_8SP_L;
1277 9 jsauermann
                                        D_RD_O  <= IS_M1;
1278 2 jsauermann
                                        D_WE_LL <= IS_M2;
1279
 
1280
                                when "1101100" =>
1281
                                        OP_CAT  <= LEA_uSP_RR;
1282
                                        LAST    <= M3;
1283
                                        D_OP    <= ALU_X_ADD_Y;
1284
                                        D_SX    <= SX_SP;
1285
                                        D_SY    <= SY_I16;
1286
                                        D_WE_RR <= IS_M2;
1287
 
1288
                                when "1101101" =>
1289
                                        OP_CAT  <= LEA_uSP_RR;
1290
                                        LAST    <= M2;
1291
                                        D_OP    <= ALU_X_ADD_Y;
1292
                                        D_SX    <= SX_SP;
1293
                                        D_SY    <= SY_UI8;
1294
                                        D_WE_RR <= IS_M1;
1295
 
1296
                                when "1101110" =>
1297
                                        OP_CAT  <= MOVE_dRR_dLL;
1298
                                        LAST    <= M3;
1299
                                        D_WE_RR <= IS_M1;
1300 9 jsauermann
                                        D_RD_O  <= IS_M1;
1301
                                        D_WE_O  <= IS_M2;
1302 2 jsauermann
                                        D_WE_LL <= IS_M3;
1303
                                        PC_OP  <= pc(IS_M1_M2, PC_WAIT);
1304
 
1305
                                        case OP_CYC is
1306
                                                when M1 =>      -- decrement RR
1307
                                                        D_OP    <= ALU_X_SUB_Y;
1308
                                                        D_SX    <= SX_RR;
1309
                                                        D_SY    <= SY_SY1;
1310
                                                        D_SA    <= ADR_dRR;
1311
                                                when M2 =>      -- write read memory
1312
                                                        D_OP    <= ALU_MOVE_Y;
1313
                                                        D_SX    <= SX_ANY;
1314
                                                        D_SY    <= SY_UM;
1315
                                                        D_SA    <= ADR_dLL;
1316
                                                when others =>  -- decrement LL
1317
                                                        D_OP    <= ALU_X_SUB_Y;
1318
                                                        D_SX    <= SX_LL;
1319
                                                        D_SY    <= SY_SY1;
1320
                                        end case;
1321
 
1322
                                when "1101111" =>
1323
                                        OP_CAT  <= MOVE_RRi_LLi;
1324
                                        LAST    <= M3;
1325
                                        D_WE_RR <= IS_M1;
1326 9 jsauermann
                                        D_RD_O  <= IS_M1;
1327
                                        D_WE_O  <= IS_M2;
1328 2 jsauermann
                                        D_WE_LL <= IS_M3;
1329
                                        PC_OP  <= pc(IS_M1_M2, PC_WAIT);
1330
 
1331
                                        case OP_CYC is
1332
                                                when M1 =>      -- decrement RR
1333
                                                        D_OP    <= ALU_X_ADD_Y;
1334
                                                        D_SX    <= SX_RR;
1335
                                                        D_SY    <= SY_SY1;
1336
                                                        D_SA    <= ADR_RRi;
1337
                                                when M2 =>      -- write read memory
1338
                                                        D_OP    <= ALU_MOVE_Y;
1339
                                                        D_SX    <= SX_ANY;
1340
                                                        D_SY    <= SY_UM;
1341
                                                        D_SA    <= ADR_dLL;
1342
                                                when others =>  -- decrement LL
1343
                                                        D_OP    <= ALU_X_ADD_Y;
1344
                                                        D_SX    <= SX_LL;
1345
                                                        D_SY    <= SY_SY1;
1346
                                        end case;
1347
 
1348
                                -- 77777777777777777777777777777777777777777777777777777777777777777777
1349
                                when "1110000" =>
1350
                                        OP_CAT  <= MUL_IS;
1351
                                        D_OP    <= ALU_MUL_IS;
1352
                                        D_SX    <= SX_LL;
1353
                                        D_SY    <= SY_RR;
1354
                                        D_WE_RR <= IS_M1;
1355
 
1356
                                when "1110001" =>
1357
                                        OP_CAT  <= MUL_IU;
1358
                                        D_OP    <= ALU_MUL_IU;
1359
                                        D_SX    <= SX_LL;
1360
                                        D_SY    <= SY_RR;
1361
                                        D_WE_RR <= IS_M1;
1362
 
1363
                                when "1110010" =>
1364
                                        OP_CAT  <= DIV_IS;
1365
                                        D_OP    <= ALU_DIV_IS;
1366
                                        D_SX    <= SX_LL;
1367
                                        D_SY    <= SY_RR;
1368
                                        D_WE_RR <= IS_M1;
1369
 
1370
                                when "1110011" =>
1371
                                        OP_CAT  <= DIV_IU;
1372
                                        D_OP    <= ALU_DIV_IU;
1373
                                        D_SX    <= SX_LL;
1374
                                        D_SY    <= SY_RR;
1375
                                        D_WE_RR <= IS_M1;
1376
 
1377
                                when "1110100" =>
1378
                                        OP_CAT  <= MD_STEP;
1379
                                        D_OP    <= ALU_MD_STP;
1380
                                        D_SX    <= SX_LL;
1381
                                        D_SY    <= SY_RR;
1382
                                        D_WE_RR <= IS_M1;
1383
 
1384
                                when "1110101" =>
1385
                                        OP_CAT  <= MD_FIN;
1386
                                        D_OP    <= ALU_MD_FIN;
1387
                                        D_SX    <= SX_LL;
1388
                                        D_SY    <= SY_RR;
1389
                                        D_WE_RR <= IS_M1;
1390
 
1391
                                when "1110110" =>
1392
                                        OP_CAT  <= MOD_FIN;
1393
                                        D_OP    <= ALU_MOD_FIN;
1394
                                        D_SX    <= SX_LL;
1395
                                        D_SY    <= SY_RR;
1396
                                        D_WE_RR <= IS_M1;
1397
 
1398
                                when "1110111" =>
1399
                                        OP_CAT      <= EI;
1400
                                        ENABLE_INT  <= '1';
1401
 
1402
                                when "1111001" =>
1403
                                        OP_CAT      <= DI;
1404
                                        DISABLE_INT <= '1';
1405
 
1406
                                -- undefined --------------------------------------------------------
1407
                                when others =>
1408
                        end case;
1409
                end if;
1410
        end process;
1411
 
1412
end Behavioral;

powered by: WebSVN 2.1.0

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