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

Subversion Repositories tg68

[/] [tg68/] [trunk/] [VHDL/] [TG68_fast.vhd] - Blame information for rev 6

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

Line No. Rev Author Line
1 2 tobiflex
------------------------------------------------------------------------------
2
------------------------------------------------------------------------------
3
--                                                                          --
4
-- This is the 68000 software compatible Kernal of TG68                     --
5
--                                                                          --
6
-- Copyright (c) 2007 Tobias Gubener <tobiflex@opencores.org>               -- 
7
--                                                                          --
8
-- This source file is free software: you can redistribute it and/or modify --
9
-- it under the terms of the GNU Lesser General Public License as published --
10
-- by the Free Software Foundation, either version 3 of the License, or     --
11
-- (at your option) any later version.                                      --
12
--                                                                          --
13
-- This source file is distributed in the hope that it will be useful,      --
14
-- but WITHOUT ANY WARRANTY; without even the implied warranty of           --
15
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            --
16
-- GNU General Public License for more details.                             --
17
--                                                                          --
18
-- You should have received a copy of the GNU General Public License        --
19
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.    --
20
--                                                                          --
21
------------------------------------------------------------------------------
22
------------------------------------------------------------------------------
23
--
24 4 tobiflex
--
25 6 tobiflex
-- Revision 1.03 2007/12/21
26
-- Thanks to Andreas Ehliar
27
-- Split regfile to use blockram for registers
28
-- insert "WHEN OTHERS => null;" on END CASE; 
29
--
30 5 tobiflex
-- Revision 1.02 2007/12/17
31
-- Bugfix jsr  nn.w
32
--
33 4 tobiflex
-- Revision 1.01 2007/11/28
34
-- add MOVEP
35
-- Bugfix Interrupt in MOVEQ
36
--
37 2 tobiflex
-- Revision 1.0 2007/11/05
38
-- Clean up code and first release
39
--
40
-- known bugs/todo:
41
-- Add CHK INSTRUCTION
42
-- full decode ILLEGAL INSTRUCTIONS
43 6 tobiflex
-- Add FC Output
44 2 tobiflex
-- add odd Address test
45
-- add TRACE
46
-- Movem with regmask==x0000
47
 
48
 
49
library ieee;
50
use ieee.std_logic_1164.all;
51
use ieee.std_logic_unsigned.all;
52
 
53
entity TG68_fast is
54
   port(clk               : in std_logic;
55
        reset             : in std_logic;                       --low active
56
        clkena_in         : in std_logic:='1';
57
        data_in           : in std_logic_vector(15 downto 0);
58
                IPL                               : in std_logic_vector(2 downto 0):="111";
59
        test_IPL          : in std_logic:='0';           --only for debugging
60
        address           : out std_logic_vector(31 downto 0);
61
        data_write        : out std_logic_vector(15 downto 0);
62
        state_out         : out std_logic_vector(1 downto 0);
63
        decodeOPC         : buffer std_logic;
64
                wr                                : out std_logic;
65
                UDS, LDS                  : out std_logic
66
        );
67
end TG68_fast;
68
 
69
architecture logic of TG68_fast is
70
 
71
   signal state           : std_logic_vector(1 downto 0);
72
   signal clkena              : std_logic;
73
   signal TG68_PC         : std_logic_vector(31 downto 0);
74
   signal TG68_PC_add     : std_logic_vector(31 downto 0);
75
   signal memaddr         : std_logic_vector(31 downto 0);
76
   signal memaddr_in      : std_logic_vector(31 downto 0);
77
   signal ea_data         : std_logic_vector(31 downto 0);
78
   signal ea_data_OP1     : std_logic;
79
   signal setaddrlong     : std_logic;
80
   signal OP1out, OP2out  : std_logic_vector(31 downto 0);
81
   signal OP1outbrief     : std_logic_vector(15 downto 0);
82
   signal OP1in           : std_logic_vector(31 downto 0);
83
   signal data_write_tmp  : std_logic_vector(31 downto 0);
84
   signal Xtmp            : std_logic_vector(31 downto 0);
85
   signal PC_dataa, PC_datab, PC_result  : std_logic_vector(31 downto 0);
86
   signal setregstore     : std_logic;
87
   signal datatype        : std_logic_vector(1 downto 0);
88
   signal longread            : std_logic;
89
   signal longreaddirect  : std_logic;
90
   signal long_done           : std_logic;
91
   signal nextpass            : std_logic;
92
   signal setnextpass     : std_logic;
93
   signal setdispbyte     : std_logic;
94
   signal setdisp             : std_logic;
95
   signal setdispbrief    : std_logic;
96
   signal prefix              : std_logic;
97
   signal regdirectsource : std_logic;
98
   signal endOPC              : std_logic;
99
   signal postadd             : std_logic;
100
   signal presub              : std_logic;
101
   signal addsub_a        : std_logic_vector(31 downto 0);
102
   signal addsub_b        : std_logic_vector(31 downto 0);
103
   signal addsub_q        : std_logic_vector(31 downto 0);
104
   signal briefext        : std_logic_vector(31 downto 0);
105
   signal setbriefext     : std_logic;
106
   signal addsub              : std_logic;
107
   signal c_in            : std_logic_vector(3 downto 0);
108
   signal c_out           : std_logic_vector(2 downto 0);
109
   signal add_result      : std_logic_vector(33 downto 0);
110
   signal addsub_ofl      : std_logic_vector(2 downto 0);
111
   signal flag_z          : std_logic_vector(2 downto 0);
112
 
113
   signal last_data_read  : std_logic_vector(15 downto 0);
114
   signal data_read       : std_logic_vector(31 downto 0);
115
   signal microaddr       : std_logic_vector(7 downto 0);
116
   signal micronext       : std_logic_vector(7 downto 0);
117
   signal microstep           : std_logic;
118
   signal microset            : std_logic;
119
 
120
   signal registerin      : std_logic_vector(31 downto 0);
121
   signal reg_QA          : std_logic_vector(31 downto 0);
122
   signal reg_QB          : std_logic_vector(31 downto 0);
123
   signal Hwrena,Lwrena   : std_logic;
124
   signal Regwrena            : std_logic;
125
   signal rf_dest_addr    : std_logic_vector(6 downto 0);
126
   signal rf_source_addr  : std_logic_vector(6 downto 0);
127
   signal rf_dest_addr_tmp              : std_logic_vector(6 downto 0);
128
   signal rf_source_addr_tmp    : std_logic_vector(6 downto 0);
129
   signal opcode                  : std_logic_vector(15 downto 0);
130
   signal laststate               : std_logic_vector(1 downto 0);
131
   signal setstate            : std_logic_vector(1 downto 0);
132
 
133
   signal mem_address     : std_logic_vector(31 downto 0);
134
   signal memaddr_a       : std_logic_vector(31 downto 0);
135
   signal mem_data_read   : std_logic_vector(31 downto 0);
136
   signal mem_data_write  : std_logic_vector(31 downto 0);
137
        signal set_mem_rega   : std_logic;
138
   signal data_read_ram   : std_logic_vector(31 downto 0);
139
   signal data_read_uart  : std_logic_vector(7 downto 0);
140
 
141
   signal counter_reg     : std_logic_vector(31 downto 0);
142
 
143
        signal TG68_PC_br8    : std_logic;
144
        signal TG68_PC_brw    : std_logic;
145
        signal TG68_PC_nop    : std_logic;
146
        signal setgetbrief    : std_logic;
147
        signal getbrief       : std_logic;
148
        signal brief          : std_logic_vector(15 downto 0);
149
        signal dest_areg      : std_logic;
150
        signal source_areg    : std_logic;
151
        signal data_is_source : std_logic;
152
        signal set_store_in_tmp    : std_logic;
153
        signal store_in_tmp   : std_logic;
154
        signal write_back     : std_logic;
155
        signal setaddsub      : std_logic;
156
        signal setstackaddr   : std_logic;
157
        signal writePC        : std_logic;
158
        signal writePC_add    : std_logic;
159
        signal set_TG68_PC_dec: std_logic;
160
        signal TG68_PC_dec    : std_logic_vector(1 downto 0);
161
        signal directPC       : std_logic;
162
        signal set_directPC   : std_logic;
163
        signal execOPC        : std_logic;
164
        signal fetchOPC       : std_logic;
165
        signal Flags          : std_logic_vector(15 downto 0);   --T.S..III ...XNZVC
166
        signal set_Flags      : std_logic_vector(3 downto 0);    --NZVC
167
        signal exec_ADD       : std_logic;
168
        signal exec_OR        : std_logic;
169
        signal exec_AND       : std_logic;
170
        signal exec_EOR       : std_logic;
171
        signal exec_MOVE      : std_logic;
172
        signal exec_MOVEQ     : std_logic;
173
        signal exec_MOVESR    : std_logic;
174
        signal exec_DIRECT    : std_logic;
175
        signal exec_ADDQ      : std_logic;
176
        signal exec_CMP       : std_logic;
177
        signal exec_ROT       : std_logic;
178
        signal exec_exg       : std_logic;
179
        signal exec_swap      : std_logic;
180
        signal exec_write_back: std_logic;
181
        signal exec_tas       : std_logic;
182
        signal exec_EXT       : std_logic;
183
        signal exec_ABCD      : std_logic;
184
        signal exec_SBCD      : std_logic;
185
        signal exec_MULU      : std_logic;
186
        signal exec_DIVU      : std_logic;
187
    signal exec_Scc       : std_logic;
188
    signal exec_CPMAW     : std_logic;
189
        signal set_exec_ADD   : std_logic;
190
        signal set_exec_OR    : std_logic;
191
        signal set_exec_AND   : std_logic;
192
        signal set_exec_EOR   : std_logic;
193
        signal set_exec_MOVE  : std_logic;
194
        signal set_exec_MOVEQ : std_logic;
195
        signal set_exec_MOVESR: std_logic;
196
        signal set_exec_ADDQ  : std_logic;
197
        signal set_exec_CMP   : std_logic;
198
        signal set_exec_ROT   : std_logic;
199
        signal set_exec_tas   : std_logic;
200
        signal set_exec_EXT   : std_logic;
201
        signal set_exec_ABCD  : std_logic;
202
        signal set_exec_SBCD  : std_logic;
203
        signal set_exec_MULU  : std_logic;
204
        signal set_exec_DIVU  : std_logic;
205
    signal set_exec_Scc   : std_logic;
206
    signal set_exec_CPMAW : std_logic;
207
 
208
        signal condition      : std_logic;
209
        signal OP2out_one     : std_logic;
210
        signal OP1out_zero    : std_logic;
211
        signal ea_to_pc       : std_logic;
212
        signal ea_build       : std_logic;
213
        signal ea_only        : std_logic;
214
        signal get_ea_now     : std_logic;
215
        signal source_lowbits : std_logic;
216
        signal dest_hbits     : std_logic;
217
        signal rot_rot        : std_logic;
218
        signal rot_lsb        : std_logic;
219
        signal rot_msb        : std_logic;
220
        signal rot_XC         : std_logic;
221
        signal rot_nop        : std_logic;
222
    signal rot_out        : std_logic_vector(31 downto 0);
223
    signal rot_bits       : std_logic_vector(1 downto 0);
224
    signal rot_cnt        : std_logic_vector(5 downto 0);
225
    signal set_rot_cnt    : std_logic_vector(5 downto 0);
226
        signal movem_busy     : std_logic;
227
        signal set_movem_busy : std_logic;
228
        signal movem_addr     : std_logic;
229
        signal movem_regaddr  : std_logic_vector(3 downto 0);
230
        signal movem_mask     : std_logic_vector(15 downto 0);
231
        signal set_get_movem_mask  : std_logic;
232
        signal get_movem_mask : std_logic;
233
        signal movem_muxa     : std_logic_vector(7 downto 0);
234
        signal movem_muxb     : std_logic_vector(3 downto 0);
235
        signal movem_muxc     : std_logic_vector(1 downto 0);
236
    signal movem_presub   : std_logic;
237
    signal save_memaddr   : std_logic;
238
    signal movem_bits     : std_logic_vector(4 downto 0);
239
    signal ea_calc_b      : std_logic_vector(31 downto 0);
240
    signal set_mem_addsub : std_logic;
241
    signal bit_bits       : std_logic_vector(1 downto 0);
242
    signal bit_number_reg : std_logic_vector(4 downto 0);
243
    signal bit_number     : std_logic_vector(4 downto 0);
244
    signal exec_Bits      : std_logic;
245
    signal bits_out       : std_logic_vector(31 downto 0);
246
    signal one_bit_in     : std_logic;
247
    signal one_bit_out    : std_logic;
248
        signal set_get_bitnumber        : std_logic;
249
        signal get_bitnumber  : std_logic;
250
        signal mem_byte           : std_logic;
251 4 tobiflex
        signal wait_mem_byte  : std_logic;
252
        signal movepl             : std_logic;
253
        signal movepw             : std_logic;
254
        signal set_movepl         : std_logic;
255
        signal set_movepw         : std_logic;
256 2 tobiflex
        signal set_direct_data: std_logic;
257
        signal use_direct_data: std_logic;
258
        signal direct_data        : std_logic;
259
        signal set_get_extendedOPC      : std_logic;
260
        signal get_extendedOPC: std_logic;
261
    signal setstate_delay : std_logic_vector(1 downto 0);
262
    signal setstate_mux   : std_logic_vector(1 downto 0);
263
    signal use_XZFlag     : std_logic;
264
    signal use_XFlag      : std_logic;
265
 
266
    signal dummy_a                : std_logic_vector(8 downto 0);
267
    signal niba_l                 : std_logic_vector(5 downto 0);
268
    signal niba_h                 : std_logic_vector(5 downto 0);
269
    signal niba_lc                : std_logic;
270
    signal niba_hc                : std_logic;
271
    signal bcda_lc                : std_logic;
272
    signal bcda_hc                : std_logic;
273
    signal dummy_s                : std_logic_vector(8 downto 0);
274
    signal nibs_l                 : std_logic_vector(5 downto 0);
275
    signal nibs_h                 : std_logic_vector(5 downto 0);
276
    signal nibs_lc                : std_logic;
277
    signal nibs_hc                : std_logic;
278
    signal dummy_mulu     : std_logic_vector(31 downto 0);
279
    signal dummy_div      : std_logic_vector(31 downto 0);
280
    signal dummy_div_sub  : std_logic_vector(16 downto 0);
281
    signal dummy_div_over : std_logic_vector(16 downto 0);
282
    signal set_V_Flag     : std_logic;
283
    signal OP1sign                : std_logic;
284
    signal set_sign               : std_logic;
285
    signal sign                   : std_logic;
286
    signal sign2                  : std_logic;
287
    signal muls_msb               : std_logic;
288
    signal mulu_reg       : std_logic_vector(31 downto 0);
289
    signal div_reg        : std_logic_vector(31 downto 0);
290
    signal div_sign               : std_logic;
291
    signal div_quot       : std_logic_vector(31 downto 0);
292
    signal div_ovl            : std_logic;
293
    signal pre_V_Flag     : std_logic;
294
    signal set_vectoraddr : std_logic;
295
    signal writeSR            : std_logic;
296
        signal trap_illegal   : std_logic;
297
        signal trap_priv      : std_logic;
298
        signal trap_1010      : std_logic;
299
        signal trap_1111      : std_logic;
300
        signal trap_trap      : std_logic;
301
        signal trap_trapv     : std_logic;
302
        signal trap_interrupt : std_logic;
303 4 tobiflex
        signal trapmake       : std_logic;
304 2 tobiflex
        signal trapd          : std_logic;
305
--   signal trap_PC        : std_logic_vector(31 downto 0);
306
    signal trap_SR        : std_logic_vector(15 downto 0);
307
 
308
    signal set_directSR   : std_logic;
309
    signal directSR           : std_logic;
310
    signal set_stop           : std_logic;
311
    signal stop           : std_logic;
312
    signal trap_vector    : std_logic_vector(31 downto 0);
313
    signal to_USP             : std_logic;
314
    signal from_USP           : std_logic;
315
    signal to_SR              : std_logic;
316
    signal from_SR            : std_logic;
317
    signal illegal_write_mode   : std_logic;
318
    signal illegal_read_mode    : std_logic;
319
    signal illegal_byteaddr         : std_logic;
320
    signal use_SP             : std_logic;
321
 
322
    signal no_Flags           : std_logic;
323
        signal IPL_nr             : std_logic_vector(2 downto 0);
324
        signal rIPL_nr            : std_logic_vector(2 downto 0);
325
    signal interrupt      : std_logic;
326
    signal SVmode             : std_logic;
327 4 tobiflex
        signal trap_chk   : std_logic;
328 2 tobiflex
        signal test_delay         : std_logic_vector(2 downto 0);
329
        signal set_PCmarker       : std_logic;
330
        signal PCmarker       : std_logic;
331
        signal set_Z_error        : std_logic;
332
        signal Z_error        : std_logic;
333
 
334
 
335 6 tobiflex
        type regfile_t is array(0 to 16) of std_logic_vector(15 downto 0);
336
        signal regfile_low        : regfile_t;
337
        signal regfile_high       : regfile_t;
338
        signal RWindex_A          : integer range 0 to 16;
339
        signal RWindex_B          : integer range 0 to 16;
340 2 tobiflex
BEGIN
341
 
342
-----------------------------------------------------------------------------
343
-- Registerfile
344
-----------------------------------------------------------------------------
345
 
346
        RWindex_A <= conv_integer(rf_dest_addr(4)&(rf_dest_addr(3 downto 0) XOR "1111"));
347
        RWindex_B <= conv_integer(rf_source_addr(4)&(rf_source_addr(3 downto 0) XOR "1111"));
348
 
349
        PROCESS (clk)
350
        BEGIN
351
                IF falling_edge(clk) THEN
352
                    IF clkena='1' THEN
353 6 tobiflex
                                reg_QA <= regfile_high(RWindex_A) & regfile_low(RWindex_A);
354
                                reg_QB <= regfile_high(RWindex_B) & regfile_low(RWindex_B);
355 2 tobiflex
                        END IF;
356
                END IF;
357
                IF rising_edge(clk) THEN
358
                    IF clkena='1' THEN
359
                                IF Lwrena='1' THEN
360 6 tobiflex
                                        regfile_low(RWindex_A) <= registerin(15 downto 0);
361 2 tobiflex
                                END IF;
362
                                IF Hwrena='1' THEN
363 6 tobiflex
                                        regfile_high(RWindex_A) <= registerin(31 downto 16);
364 2 tobiflex
                                END IF;
365
                        END IF;
366
                END IF;
367
        END PROCESS;
368
 
369
 
370
 
371
        address <= TG68_PC when state="00" else X"ffffffff" when state="01" else memaddr;
372
        LDS <= '0' WHEN (datatype/="00" OR state="00" OR memaddr(0)='1') AND state/="01" ELSE '1';
373
        UDS <= '0' WHEN (datatype/="00" OR state="00" OR memaddr(0)='0') AND state/="01" ELSE '1';
374
        state_out <= state;
375
        wr <= '0' WHEN state="11" ELSE '1';
376
        IPL_nr <= NOT IPL;
377
 
378
 
379
-----------------------------------------------------------------------------
380
-- "ALU"
381
-----------------------------------------------------------------------------
382
PROCESS (addsub_a, addsub_b, addsub, add_result, c_in)
383
        BEGIN
384
                IF addsub='1' THEN              --ADD
385
                        add_result <= (('0'&addsub_a&c_in(0))+('0'&addsub_b&c_in(0)));
386
                ELSE                                    --SUB
387
                        add_result <= (('0'&addsub_a&'0')-('0'&addsub_b&c_in(0)));
388
                END IF;
389
                addsub_q <= add_result(32 downto 1);
390
                c_in(1) <= add_result(9) XOR addsub_a(8) XOR addsub_b(8);
391
                c_in(2) <= add_result(17) XOR addsub_a(16) XOR addsub_b(16);
392
                c_in(3) <= add_result(33);
393
                addsub_ofl(0) <= (c_in(1) XOR add_result(8) XOR addsub_a(7) XOR addsub_b(7));    --V Byte
394
                addsub_ofl(1) <= (c_in(2) XOR add_result(16) XOR addsub_a(15) XOR addsub_b(15));        --V Word
395
                addsub_ofl(2) <= (c_in(3) XOR add_result(32) XOR addsub_a(31) XOR addsub_b(31));        --V Long
396
                c_out <= c_in(3 downto 1);
397
END PROCESS;
398
 
399
-----------------------------------------------------------------------------
400
-- MEM_IO 
401
-----------------------------------------------------------------------------
402 4 tobiflex
PROCESS (clk, reset, clkena_in, opcode, rIPL_nr, longread, get_extendedOPC, memaddr, memaddr_a, set_mem_addsub, movem_presub,
403
         movem_busy, state, PCmarker, execOPC, datatype, setdisp, setdispbrief, briefext, setdispbyte, brief,
404
         set_mem_rega, reg_QA, setaddrlong, data_read, decodeOPC, TG68_PC, data_in, long_done, last_data_read, mem_byte,
405 5 tobiflex
         data_write_tmp, addsub_q, set_vectoraddr, trap_vector, interrupt)
406 2 tobiflex
        BEGIN
407
                clkena <= clkena_in AND NOT longread AND NOT get_extendedOPC;
408
 
409 4 tobiflex
                IF rising_edge(clk) THEN
410
                        IF clkena='1' THEN
411
                                trap_vector(31 downto 8) <= (others => '0');
412
                --              IF trap_addr_fault='1' THEN
413
                --                      trap_vector(7 downto 0) <= X"08";
414
                --              END IF; 
415
                --              IF trap_addr_error='1' THEN
416
                --                      trap_vector(7 downto 0) <= X"0C";
417
                --              END IF; 
418
                                IF trap_illegal='1' THEN
419
                                        trap_vector(7 downto 0) <= X"10";
420
                                END IF;
421
                                IF z_error='1' THEN
422
                                        trap_vector(7 downto 0) <= X"14";
423
                                END IF;
424
--                              IF trap_chk='1' THEN
425
--                                      trap_vector(7 downto 0) <= X"18";
426
--                              END IF; 
427
                                IF trap_trapv='1' THEN
428
                                        trap_vector(7 downto 0) <= X"1C";
429
                                END IF;
430
                                IF trap_priv='1' THEN
431
                                        trap_vector(7 downto 0) <= X"20";
432
                                END IF;
433
                --              IF trap_trace='1' THEN
434
                --                      trap_vector(7 downto 0) <= X"24";
435
                --              END IF; 
436
                                IF trap_1010='1' THEN
437
                                        trap_vector(7 downto 0) <= X"28";
438
                                END IF;
439
                                IF trap_1111='1' THEN
440
                                        trap_vector(7 downto 0) <= X"2C";
441
                                END IF;
442
                                IF trap_trap='1' THEN
443
                                        trap_vector(7 downto 2) <= "10"&opcode(3 downto 0);
444
                                END IF;
445
                                IF interrupt='1' THEN
446
                                        trap_vector(7 downto 2) <= "011"&rIPL_nr;
447
                                END IF;
448
                        END IF;
449 2 tobiflex
                END IF;
450
 
451
                memaddr_a(3 downto 0) <= "0000";
452
                memaddr_a(7 downto 4) <= (OTHERS=>memaddr_a(3));
453
                memaddr_a(15 downto 8) <= (OTHERS=>memaddr_a(7));
454
                memaddr_a(31 downto 16) <= (OTHERS=>memaddr_a(15));
455
                IF movem_presub='1' THEN
456
                        IF movem_busy='1' OR longread='1' THEN
457
                                memaddr_a(3 downto 0) <= "1110";
458
                        END IF;
459
                ELSIF state(1)='1' OR (get_extendedOPC='1' AND PCmarker='1') THEN
460
                        memaddr_a(1) <= '1';
461
                ELSIF execOPC='1' THEN
462
                        IF datatype="10" THEN
463
                                memaddr_a(3 downto 0) <= "1100";
464
                        ELSE
465
                                memaddr_a(3 downto 0) <= "1110";
466
                        END IF;
467
                ELSIF setdisp='1' THEN
468
                        IF setdispbrief='1' THEN
469
                                memaddr_a <= briefext;
470
                        ELSIF setdispbyte='1' THEN
471
                                memaddr_a(7 downto 0) <= brief(7 downto 0);
472
                        ELSE
473
                                memaddr_a(15 downto 0) <= brief;
474
                        END IF;
475
                END IF;
476
 
477
                memaddr_in <= memaddr+memaddr_a;
478
                IF longread='0' THEN
479
                        IF set_mem_addsub='1' THEN
480
                                memaddr_in <= addsub_q;
481
                        ELSIF set_vectoraddr='1' THEN
482
                                memaddr_in <= trap_vector;
483
                        ELSIF interrupt='1' THEN
484
                                memaddr_in <= "1111111111111111111111111111"&rIPL_nr&'0';
485
                        ELSIF set_mem_rega='1' THEN
486
                                memaddr_in <= reg_QA;
487
                        ELSIF setaddrlong='1' AND longread='0' THEN
488
                                memaddr_in <= data_read;
489
                        ELSIF decodeOPC='1' THEN
490
                                memaddr_in <= TG68_PC;
491
                        END IF;
492
                END IF;
493
 
494
                data_read(15 downto 0) <= data_in;
495
                data_read(31 downto 16) <= (OTHERS=>data_in(15));
496
                IF long_done='1' THEN
497
                        data_read(31 downto 16) <= last_data_read;
498
                END IF;
499
                IF mem_byte='1' AND memaddr(0)='0' THEN
500
                        data_read(7 downto 0) <= data_in(15 downto 8);
501
                END IF;
502
 
503
                IF longread='1' THEN
504
                        data_write <= data_write_tmp(31 downto 16);
505
                ELSE
506
                        data_write(7 downto 0) <= data_write_tmp(7 downto 0);
507
                        IF mem_byte='1' THEN
508
                                data_write(15 downto 8) <= data_write_tmp(7 downto 0);
509
                        ELSE
510
                                data_write(15 downto 8) <= data_write_tmp(15 downto 8);
511
                                IF datatype="00" THEN
512
                                        data_write(7 downto 0) <= data_write_tmp(15 downto 8);
513
                                END IF;
514
                        END IF;
515
                END IF;
516
 
517
                IF reset='0' THEN
518
                        longread <= '0';
519
                        long_done <= '0';
520
                ELSIF rising_edge(clk) THEN
521
                IF clkena_in='1' THEN
522
                                last_data_read <= data_in;
523
                                        long_done <= longread;
524
                                IF get_extendedOPC='0' OR (get_extendedOPC='1' AND PCmarker='1') THEN
525
                                                memaddr <= memaddr_in;
526
                                END IF;
527
                                IF get_extendedOPC='0' THEN
528
 
529
                                        IF ((setstate_mux(1)='1' AND datatype="10") OR longreaddirect='1') AND longread='0' AND interrupt='0' THEN
530
                                                longread <= '1';
531
                                        ELSE
532
                                                longread <= '0';
533
                                        END IF;
534
                                END IF;
535
 
536
                        END IF;
537
                END IF;
538
    END PROCESS;
539
-----------------------------------------------------------------------------
540
-- brief
541
-----------------------------------------------------------------------------
542
process (clk, brief, OP1out)
543
        begin
544
                IF brief(11)='1' THEN
545
                        OP1outbrief <= OP1out(31 downto 16);
546
                ELSE
547
                        OP1outbrief <= (OTHERS=>OP1out(15));
548
                END IF;
549
                IF rising_edge(clk) THEN
550
                IF clkena='1' THEN
551 5 tobiflex
                                briefext <= OP1outbrief&OP1out(15 downto 0);
552
--                              CASE brief(10 downto 9) IS
553
--                                      WHEN "00" => briefext <= OP1outbrief&OP1out(15 downto 0);
554
--                                      WHEN "01" => briefext <= OP1outbrief(14 downto 0)&OP1out(15 downto 0)&'0';
555
--                                      WHEN "10" => briefext <= OP1outbrief(13 downto 0)&OP1out(15 downto 0)&"00";
556
--                                      WHEN "11" => briefext <= OP1outbrief(12 downto 0)&OP1out(15 downto 0)&"000";
557
--                              END CASE;
558 2 tobiflex
                end if;
559
        end if;
560
   end process;
561
 
562
-----------------------------------------------------------------------------
563
-- PC Calc + fetch opcode
564
-----------------------------------------------------------------------------
565
process (clk, reset, opcode, TG68_PC, TG68_PC_dec, TG68_PC_br8, TG68_PC_brw, PC_dataa, PC_datab, execOPC, last_data_read, get_extendedOPC,
566
                 setstate_delay, setstate)
567
        begin
568
                PC_dataa <= TG68_PC;
569
                PC_datab(2 downto 0) <= "010";
570
                PC_datab(7 downto 3) <= (others => PC_datab(2));
571
                PC_datab(15 downto 8) <= (others => PC_datab(7));
572
                PC_datab(31 downto 16) <= (others => PC_datab(15));
573
                IF execOPC='0' THEN
574
                        IF TG68_PC_br8='1' THEN
575
                                PC_datab(7 downto 0) <= opcode(7 downto 0);
576
                        END IF;
577
                        IF TG68_PC_dec(1)='1' THEN
578
                                PC_datab(2) <= '1';
579
                        END IF;
580
                        IF TG68_PC_brw = '1' THEN
581
                                PC_datab(15 downto 0) <= last_data_read(15 downto 0);
582
                        END IF;
583
                END IF;
584
                TG68_PC_add <= PC_dataa+PC_datab;
585
 
586
                IF get_extendedOPC='1' THEN
587
                        setstate_mux <= setstate_delay;
588
                ELSE
589
                        setstate_mux <= setstate;
590
                END IF;
591
 
592
 
593
        IF reset = '0' THEN
594
                        opcode(15 downto 12) <= X"7";           --moveq
595
                        opcode(8 downto 6) <= "010";            --long
596
                        TG68_PC <= (others =>'0');
597
                        state <= "01";
598
                        decodeOPC <= '0';
599
                        fetchOPC <= '0';
600
                        endOPC <= '0';
601
                        interrupt <= '0';
602
                        trap_interrupt <= '1';
603
                        execOPC <= '0';
604
                        getbrief <= '0';
605
                        TG68_PC_dec <= "00";
606
                        directPC <= '0';
607
                        directSR <= '0';
608
                        stop <= '0';
609
                        exec_ADD <= '0';
610
                        exec_OR <= '0';
611
                        exec_AND <= '0';
612
                        exec_EOR <= '0';
613
                        exec_MOVE <= '0';
614
                        exec_MOVEQ <= '0';
615
                        exec_MOVESR <= '0';
616
                        exec_ADDQ <= '0';
617
                        exec_CMP <= '0';
618
                        exec_ROT <= '0';
619
                        exec_EXT <= '0';
620
                        exec_ABCD <= '0';
621
                        exec_SBCD <= '0';
622
                        exec_MULU <= '0';
623
                        exec_DIVU <= '0';
624
                        exec_Scc <= '0';
625
                        exec_CPMAW <= '0';
626
                        mem_byte <= '0';
627
                        rot_cnt <="000001";
628
                        get_extendedOPC <= '0';
629
                        get_bitnumber <= '0';
630
                        get_movem_mask <= '0';
631 4 tobiflex
                        movepl <= '0';
632
                        movepw <= '0';
633 2 tobiflex
                        test_delay <= "000";
634
                        PCmarker <= '0';
635
                ELSIF rising_edge(clk) THEN
636
                IF clkena_in='1' THEN
637
                                get_extendedOPC <= set_get_extendedOPC;
638
                                get_bitnumber <= set_get_bitnumber;
639
                                get_movem_mask <= set_get_movem_mask;
640
                                setstate_delay <= setstate;
641
 
642
                                TG68_PC_dec <= TG68_PC_dec(0)&set_TG68_PC_dec;
643
                                IF directPC='1' AND clkena='1' THEN
644
                                        TG68_PC <= data_read;
645
                                ELSIF ea_to_pc='1' AND longread='0' THEN
646
                                        TG68_PC <= memaddr_in;
647
                                ELSIF (state ="00" AND TG68_PC_nop='0') OR TG68_PC_br8='1' OR TG68_PC_brw='1' OR TG68_PC_dec(1)='1' THEN
648
                                        TG68_PC <= TG68_PC_add;
649
                                END IF;
650
 
651
                                IF get_bitnumber='1' THEN
652
                                        bit_number_reg <= data_read(4 downto 0);
653
                                END IF;
654
 
655
                        IF clkena='1' OR get_extendedOPC='1' THEN
656
                                        IF set_get_extendedOPC='1' THEN
657
                                                state <= "00";
658
                                        ELSIF get_extendedOPC='1' THEN
659
                                                state <= setstate_mux;
660
                                        ELSIF fetchOPC='1' OR (state="10" AND write_back='1' AND setstate/="10") OR set_rot_cnt/="000001" OR stop='1' THEN
661
                                                state <= "01";          --decode cycle, execute cycle
662
                                        ELSE
663
                                                state <= setstate_mux;
664
                                        END IF;
665 4 tobiflex
                                        IF setstate_mux(1)='1' AND datatype="00" AND set_get_extendedOPC='0' AND wait_mem_byte='0' THEN
666 2 tobiflex
                                                mem_byte <= '1';
667
                                        ELSE
668
                                                mem_byte <= '0';
669
                                        END IF;
670
 
671
                                END IF;
672
                        END IF;
673
 
674
                IF clkena='1' THEN
675
                                exec_ADD <= '0';
676
                                exec_OR <= '0';
677
                                exec_AND <= '0';
678
                                exec_EOR <= '0';
679
                                exec_MOVE <= '0';
680
                                exec_MOVEQ <= '0';
681
                                exec_MOVESR <= '0';
682
                                exec_ADDQ <= '0';
683
                                exec_CMP <= '0';
684
                                exec_ROT <= '0';
685
                                exec_ABCD <= '0';
686
                                exec_SBCD <= '0';
687
                                fetchOPC <= '0';
688
                                exec_CPMAW <= '0';
689
                                endOPC <= '0';
690
                                interrupt <= '0';
691
                                execOPC <= '0';
692
                                exec_EXT <= '0';
693
                                exec_Scc <= '0';
694
                                decodeOPC <= fetchOPC;
695
                                directPC <= set_directPC;
696
                                directSR <= set_directSR;
697
                                exec_MULU <= set_exec_MULU;
698
                                exec_DIVU <= set_exec_DIVU;
699 4 tobiflex
                                movepl <= '0';
700
                                movepw <= '0';
701 2 tobiflex
 
702
                                stop <= set_stop OR (stop AND NOT interrupt);
703
                                IF      set_PCmarker='1' THEN
704
                                        PCmarker <= '1';
705
                                ELSIF (state="10" AND longread='0') OR (ea_only='1' AND get_ea_now='1') THEN
706
                                        PCmarker <= '0';
707
                                END IF;
708
                                IF (decodeOPC OR execOPC)='1' THEN
709
                                        rot_cnt <= set_rot_cnt;
710
                                END IF;
711
                                IF microstep='0' AND setstate_mux="00" AND (setnextpass='0' OR ea_only='1') AND endOPC='0' AND movem_busy='0' AND set_movem_busy='0' AND set_get_bitnumber='0' THEN
712
                                        nextpass <= '0';
713 4 tobiflex
                                        IF (exec_write_back='0' OR state="11") AND set_rot_cnt="000001" THEN
714
                                                endOPC <= '1';
715
                                                IF Flags(10 downto 8)<IPL_nr OR IPL_nr="111" THEN
716
                                                        interrupt <= '1';
717
                                                        rIPL_nr <= IPL_nr;
718
                                                ELSE
719 2 tobiflex
                                                        IF stop='0' THEN
720 4 tobiflex
                                                                fetchOPC <= '1';
721 2 tobiflex
                                                        END IF;
722 4 tobiflex
                                                END IF;
723
                                        END IF;
724
                                        IF exec_write_back='0' OR state/="11" THEN
725
                                                IF stop='0' THEN
726
                                                        execOPC <= '1';
727 2 tobiflex
                                                END IF;
728 4 tobiflex
                                                exec_ADD <= set_exec_ADD;
729
                                                exec_OR <= set_exec_OR;
730
                                                exec_AND <= set_exec_AND;
731
                                                exec_EOR <= set_exec_EOR;
732
                                                exec_MOVE <= set_exec_MOVE;
733
                                                exec_MOVEQ <= set_exec_MOVEQ;
734
                                                exec_MOVESR <= set_exec_MOVESR;
735
                                                exec_ADDQ <= set_exec_ADDQ;
736
                                                exec_CMP <= set_exec_CMP;
737
                                                exec_ROT <= set_exec_ROT;
738
                                                exec_tas <= set_exec_tas;
739
                                                exec_EXT <= set_exec_EXT;
740
                                                exec_ABCD <= set_exec_ABCD;
741
                                                exec_SBCD <= set_exec_SBCD;
742
                                                exec_Scc <= set_exec_Scc;
743
                                                exec_CPMAW <= set_exec_CPMAW;
744
                                        END IF;
745 2 tobiflex
                                ELSE
746
                                        IF endOPC='0' AND (setnextpass='1' OR (regdirectsource='1' AND decodeOPC='1')) THEN
747
                                                nextpass <= '1';
748
                                        END IF;
749
                                END IF;
750
                                IF interrupt='1' THEN
751
                                        opcode(15 downto 12) <= X"7";           --moveq
752
                                        opcode(8 downto 6) <= "010";            --long
753
--                                      trap_PC <= TG68_PC;
754 4 tobiflex
                                        trap_interrupt <= '1';
755 2 tobiflex
                                END IF;
756
                                IF fetchOPC='1' THEN
757
                                        trap_interrupt <= '0';
758
                                        IF (test_IPL='1' AND (Flags(10 downto 8)<IPL_nr OR IPL_nr="111")) OR to_SR='1' THEN
759
--                                      IF (test_IPL='1' AND (Flags(10 downto 8)<IPL_nr OR IPL_nr="111")) OR to_SR='1' OR opcode(15 downto 6)="0100111011" THEN  --nur für Validator
760
                                                opcode <= X"60FE";
761
                                                IF to_SR='0' THEN
762
                                                        test_delay <= "001";
763
                                                END IF;
764
                                        ELSE
765
                                                opcode <= data_read(15 downto 0);
766
                                        END IF;
767
                                        getbrief <= '0';
768
--                                      trap_PC <= TG68_PC;
769
                                ELSE
770
                                        test_delay <= test_delay(1 downto 0)&'0';
771
                                        getbrief <= setgetbrief;
772 4 tobiflex
                                        movepl <= set_movepl;
773
                                        movepw <= set_movepw;
774 2 tobiflex
                                END IF;
775
                                IF decodeOPC='1' OR interrupt='1' THEN
776
                                        trap_SR <= Flags;
777
                                END IF;
778
 
779
                                IF getbrief='1' THEN
780
                                        brief <= data_read(15 downto 0);
781
                                END IF;
782
                end if;
783
        end if;
784
   end process;
785
 
786
-----------------------------------------------------------------------------
787
-- handle EA_data, data_write_tmp
788
-----------------------------------------------------------------------------
789
PROCESS (clk, reset, opcode)
790
        BEGIN
791
        IF reset = '0' THEN
792
                        set_store_in_tmp <='0';
793
                        exec_DIRECT <= '0';
794
                        exec_write_back <= '0';
795
                        direct_data <= '0';
796
                        use_direct_data <= '0';
797
                        Z_error <= '0';
798
                ELSIF rising_edge(clk) THEN
799
                        IF clkena='1' THEN
800
                                direct_data <= '0';
801
                                IF endOPC='1' THEN
802
                                        set_store_in_tmp <='0';
803
                                        exec_DIRECT <= '0';
804
                                        exec_write_back <= '0';
805
                                        use_direct_data <= '0';
806
                                        Z_error <= '0';
807
                                ELSE
808
                                        IF set_Z_error='1'  THEN
809
                                                Z_error <= '1';
810
                                        END IF;
811
                                        exec_DIRECT <= set_exec_MOVE;
812
                                        IF setstate_mux="10" AND write_back='1' THEN
813
                                                exec_write_back <= '1';
814
                                        END IF;
815
                                END IF;
816
                                IF set_direct_data='1' THEN
817
                                        direct_data <= '1';
818
                                        use_direct_data <= '1';
819
                                END IF;
820
                                IF set_exec_MOVE='1' AND state="11" THEN
821
                                        use_direct_data <= '1';
822
                                END IF;
823
 
824
                                IF (exec_DIRECT='1' AND state="00" AND getbrief='0' AND endOPC='0') OR state="10" THEN
825
                                        set_store_in_tmp <= '1';
826
                                        ea_data <= data_read;
827
                                END IF;
828
 
829
                                IF writePC_add='1' THEN
830
                                        data_write_tmp <= TG68_PC_add;
831
                                ELSIF writePC='1' OR fetchOPC='1' OR interrupt='1' OR (trap_trap='1' AND decodeOPC='1') THEN            --fetchOPC für Trap
832
                                        data_write_tmp <= TG68_PC;
833
                                ELSIF execOPC='1' OR (get_ea_now='1' AND ea_only='1') THEN              --get_ea_now='1' AND ea_only='1' ist für pea
834
                                        data_write_tmp <= registerin(31 downto 8)&(registerin(7)OR exec_tas)&registerin(6 downto 0);
835
                                ELSIF (exec_DIRECT='1' AND state="10") OR direct_data='1' THEN
836
                                        data_write_tmp <= data_read;
837 4 tobiflex
                                        IF  movepl='1' THEN
838
                                                data_write_tmp(31 downto 8) <= data_write_tmp(23 downto 0);
839
                                        END IF;
840
                                ELSIF (movem_busy='1' AND datatype="10" AND movem_presub='1') OR movepl='1' THEN
841 2 tobiflex
                                        data_write_tmp <= OP2out(15 downto 0)&OP2out(31 downto 16);
842 4 tobiflex
                                ELSIF (NOT trapmake AND decodeOPC)='1' OR movem_busy='1' OR movepw='1' THEN
843 2 tobiflex
                                        data_write_tmp <= OP2out;
844
                                ELSIF writeSR='1'THEN
845
                                        data_write_tmp(15 downto 0) <= trap_SR(15 downto 8)& Flags(7 downto 0);
846
                                END IF;
847
                        END IF;
848
                END IF;
849
        END PROCESS;
850
 
851
-----------------------------------------------------------------------------
852
-- set dest regaddr
853
-----------------------------------------------------------------------------
854 4 tobiflex
PROCESS (opcode, rf_dest_addr_tmp, to_USP, Flags, trapmake, movem_addr, movem_presub, movem_regaddr, setbriefext, brief, setstackaddr, dest_hbits, dest_areg, data_is_source)
855 2 tobiflex
        BEGIN
856
                rf_dest_addr <= rf_dest_addr_tmp;
857
                IF rf_dest_addr_tmp(3 downto 0)="1111" AND to_USP='0' THEN
858 4 tobiflex
                        rf_dest_addr(4) <= Flags(13) OR trapmake;
859 2 tobiflex
                END IF;
860
                IF movem_addr='1' THEN
861
                        IF movem_presub='1' THEN
862
                                rf_dest_addr_tmp <= "000"&(movem_regaddr XOR "1111");
863
                        ELSE
864
                                rf_dest_addr_tmp <= "000"&movem_regaddr;
865
                        END IF;
866
                ELSIF setbriefext='1' THEN
867
                        rf_dest_addr_tmp <= ("000"&brief(15 downto 12));
868
                ELSIF setstackaddr='1' THEN
869
                        rf_dest_addr_tmp <= "0001111";
870
                ELSIF dest_hbits='1' THEN
871
                        rf_dest_addr_tmp <= "000"&dest_areg&opcode(11 downto 9);
872
                ELSE
873
                        IF opcode(5 downto 3)="000" OR data_is_source='1' THEN
874
                                rf_dest_addr_tmp <= "000"&dest_areg&opcode(2 downto 0);
875
                        ELSE
876
                                rf_dest_addr_tmp <= "0001"&opcode(2 downto 0);
877
                        END IF;
878
                END IF;
879
        END PROCESS;
880
 
881
-----------------------------------------------------------------------------
882
-- set OP1
883
-----------------------------------------------------------------------------
884
PROCESS (reg_QA, OP1out_zero, from_SR, Flags, ea_data_OP1, set_store_in_tmp, ea_data)
885
        BEGIN
886
                OP1out <= reg_QA;
887
                IF OP1out_zero='1' THEN
888
                        OP1out <= (OTHERS => '0');
889
                ELSIF from_SR='1' THEN
890
                        OP1out(15 downto 0) <= Flags;
891
                ELSIF ea_data_OP1='1' AND set_store_in_tmp='1' THEN
892
                        OP1out <= ea_data;
893
                END IF;
894
        END PROCESS;
895
 
896
-----------------------------------------------------------------------------
897
-- set source regaddr
898
-----------------------------------------------------------------------------
899
PROCESS (opcode, Flags, movem_addr, movem_presub, movem_regaddr, source_lowbits, source_areg, from_USP, rf_source_addr_tmp)
900
        BEGIN
901
                rf_source_addr <= rf_source_addr_tmp;
902
                IF rf_source_addr_tmp(3 downto 0)="1111" AND from_USP='0' THEN
903
                        rf_source_addr(4) <= Flags(13);
904
                END IF;
905
                IF movem_addr='1' THEN
906
                        IF movem_presub='1' THEN
907
                                rf_source_addr_tmp <= "000"&(movem_regaddr XOR "1111");
908
                        ELSE
909
                                rf_source_addr_tmp <= "000"&movem_regaddr;
910
                        END IF;
911
                ELSIF from_USP='1' THEN
912
                        rf_source_addr_tmp <= "0001111";
913
                ELSIF source_lowbits='1' THEN
914
                        rf_source_addr_tmp <= "000"&source_areg&opcode(2 downto 0);
915
                ELSE
916
                        rf_source_addr_tmp <= "000"&source_areg&opcode(11 downto 9);
917
                END IF;
918
        END PROCESS;
919
 
920
-----------------------------------------------------------------------------
921
-- set OP2
922
-----------------------------------------------------------------------------
923 5 tobiflex
PROCESS (OP2out, reg_QB, opcode, datatype, OP2out_one, exec_EXT, exec_MOVEQ, EXEC_ADDQ, use_direct_data, data_write_tmp,
924
             ea_data_OP1, set_store_in_tmp, ea_data, movepl)
925 2 tobiflex
        BEGIN
926
                OP2out(15 downto 0) <= reg_QB(15 downto 0);
927
                OP2out(31 downto 16) <= (OTHERS => OP2out(15));
928
                IF OP2out_one='1' THEN
929
                        OP2out(15 downto 0) <= "1111111111111111";
930
                ELSIF exec_EXT='1' THEN
931
                        IF opcode(6)='0' THEN    --ext.w
932
                                OP2out(15 downto 8) <= (OTHERS => OP2out(7));
933
                        END IF;
934
                ELSIF use_direct_data='1' THEN
935
                        OP2out <= data_write_tmp;
936
                ELSIF ea_data_OP1='0' AND set_store_in_tmp='1' THEN
937
                        OP2out <= ea_data;
938
                ELSIF exec_MOVEQ='1' THEN
939
                        OP2out(7 downto 0) <= opcode(7 downto 0);
940
                        OP2out(15 downto 8) <= (OTHERS => opcode(7));
941
                ELSIF exec_ADDQ='1' THEN
942
                        OP2out(2 downto 0) <= opcode(11 downto 9);
943
                        IF opcode(11 downto 9)="000" THEN
944
                                OP2out(3) <='1';
945
                        ELSE
946
                                OP2out(3) <='0';
947
                        END IF;
948
                        OP2out(15 downto 4) <= (OTHERS => '0');
949 4 tobiflex
                ELSIF datatype="10" OR movepl='1' THEN
950 2 tobiflex
                        OP2out(31 downto 16) <= reg_QB(31 downto 16);
951
                END IF;
952
        END PROCESS;
953
 
954
-----------------------------------------------------------------------------
955
-- addsub
956
-----------------------------------------------------------------------------
957
PROCESS (OP1out, OP2out, presub, postadd, execOPC, OP2out_one, datatype, use_SP, use_XZFlag, use_XFlag, Flags, setaddsub)
958
        BEGIN
959
                addsub_a <= OP1out;
960
                addsub_b <= OP2out;
961
                addsub <= NOT presub;
962
                c_in(0) <='0';
963
                IF execOPC='0' AND OP2out_one='0' THEN
964
                        IF datatype="00" AND use_SP='0' THEN
965
                                addsub_b <= "00000000000000000000000000000001";
966
                        ELSIF datatype="10" AND (presub OR postadd)='1' THEN
967
                                addsub_b <= "00000000000000000000000000000100";
968
                        ELSE
969
                                addsub_b <= "00000000000000000000000000000010";
970
                        END IF;
971
                ELSE
972
                        IF (use_XZFlag='1' OR use_XFlag='1') AND Flags(4)='1' THEN
973
                                c_in(0) <= '1';
974
                        END IF;
975
                        addsub <= setaddsub;
976
                END IF;
977
    END PROCESS;
978
 
979
-----------------------------------------------------------------------------
980
-- Write Reg
981
-----------------------------------------------------------------------------
982
PROCESS (clkena, OP1in, datatype, presub, postadd, endOPC, regwrena, state, execOPC, last_data_read, movem_addr, rf_dest_addr, reg_QA)
983
        BEGIN
984
                Lwrena <= '0';
985
                Hwrena <= '0';
986
                registerin <= OP1in;
987
 
988
                IF (presub='1' OR postadd='1') AND endOPC='0' THEN               -- -(An)+
989
                        Hwrena <= '1';
990
                        Lwrena <= '1';
991
                ELSIF Regwrena='1' THEN         --read (mem)
992
                        Lwrena <= '1';
993
                        CASE datatype IS
994
                                WHEN "00" =>            --BYTE
995
                                        registerin(15 downto 8) <= reg_QA(15 downto 8);
996
                                WHEN "01" =>            --WORD
997
                                        IF rf_dest_addr(3)='1' OR movem_addr='1' THEN
998
                                                Hwrena <='1';
999
                                        END IF;
1000
                                WHEN OTHERS =>          --LONG
1001
                                        Hwrena <= '1';
1002
                        END CASE;
1003
                END IF;
1004
        END PROCESS;
1005
 
1006
------------------------------------------------------------------------------
1007
--ALU
1008
------------------------------------------------------------------------------          
1009
PROCESS (opcode, OP1in, OP1out, OP2out, datatype, c_out, exec_ABCD, exec_SBCD, exec_CPMAW, exec_MOVESR, bits_out, Flags, flag_z, use_XZFlag, addsub_ofl,
1010
        dummy_s, dummy_a, niba_hc, niba_h, niba_l, niba_lc, nibs_hc, nibs_h, nibs_l, nibs_lc, addsub_q, movem_addr, data_read, exec_MULU, exec_DIVU, exec_OR,
1011
        exec_AND, exec_Scc, exec_EOR, exec_MOVE, exec_exg, exec_ROT, execOPC, exec_swap, exec_Bits, rot_out, dummy_mulu, dummy_div, save_memaddr, memaddr,
1012
        memaddr_in, ea_only, get_ea_now)
1013
        BEGIN
1014
 
1015
--BCD_ARITH-------------------------------------------------------------------
1016
                --ADC
1017
                        dummy_a <= niba_hc&(niba_h(4 downto 1)+('0',niba_hc,niba_hc,'0'))&(niba_l(4 downto 1)+('0',niba_lc,niba_lc,'0'));
1018
                        niba_l <= ('0'&OP1out(3 downto 0)&'1') + ('0'&OP2out(3 downto 0)&Flags(4));
1019
                        niba_lc <= niba_l(5) OR (niba_l(4) AND niba_l(3)) OR (niba_l(4) AND niba_l(2));
1020
 
1021
                        niba_h <= ('0'&OP1out(7 downto 4)&'1') + ('0'&OP2out(7 downto 4)&niba_lc);
1022
                        niba_hc <= niba_h(5) OR (niba_h(4) AND niba_h(3)) OR (niba_h(4) AND niba_h(2));
1023
                --SBC                   
1024
                        dummy_s <= nibs_hc&(nibs_h(4 downto 1)-('0',nibs_hc,nibs_hc,'0'))&(nibs_l(4 downto 1)-('0',nibs_lc,nibs_lc,'0'));
1025
                        nibs_l <= ('0'&OP1out(3 downto 0)&'0') - ('0'&OP2out(3 downto 0)&Flags(4));
1026
                        nibs_lc <= nibs_l(5);
1027
 
1028
                        nibs_h <= ('0'&OP1out(7 downto 4)&'0') - ('0'&OP2out(7 downto 4)&nibs_lc);
1029
                        nibs_hc <= nibs_h(5);
1030
------------------------------------------------------------------------------          
1031
 
1032
                        flag_z <= "000";
1033
 
1034
                        OP1in <= addsub_q;
1035
                        IF movem_addr='1' THEN
1036
                                OP1in <= data_read;
1037
                        ELSIF exec_ABCD='1' THEN
1038
                                OP1in(7 downto 0) <= dummy_a(7 downto 0);
1039
                        ELSIF exec_SBCD='1' THEN
1040
                                OP1in(7 downto 0) <= dummy_s(7 downto 0);
1041
                        ELSIF exec_MULU='1' THEN
1042
                                OP1in <= dummy_mulu;
1043
                        ELSIF exec_DIVU='1' AND execOPC='1' THEN
1044
                                OP1in <= dummy_div;
1045
                        ELSIF exec_OR='1' THEN
1046
                                OP1in <= OP2out OR OP1out;
1047
                        ELSIF exec_AND='1' OR exec_Scc='1' THEN
1048
                                OP1in <= OP2out AND OP1out;
1049
                        ELSIF exec_EOR='1' THEN
1050
                                OP1in <= OP2out XOR OP1out;
1051
                        ELSIF exec_MOVE='1' OR exec_exg='1' THEN
1052
                                OP1in <= OP2out;
1053
                        ELSIF exec_ROT='1' THEN
1054
                                OP1in <= rot_out;
1055
                        ELSIF save_memaddr='1' THEN
1056
                                OP1in <= memaddr;
1057
                        ELSIF get_ea_now='1' AND ea_only='1' THEN
1058
                                OP1in <= memaddr_in;
1059
                        ELSIF exec_swap='1' THEN
1060
                                OP1in <= OP1out(15 downto 0)& OP1out(31 downto 16);
1061
                        ELSIF exec_bits='1' THEN
1062
                                OP1in <= bits_out;
1063
                        ELSIF exec_MOVESR='1' THEN
1064
                                OP1in(15 downto 0) <= Flags;
1065
                        END IF;
1066
 
1067
                        IF use_XZFlag='1' AND flags(2)='0' THEN
1068
                                flag_z <= "000";
1069
                        ELSIF OP1in(7 downto 0)="00000000" THEN
1070
                                flag_z(0) <= '1';
1071
                                IF OP1in(15 downto 8)="00000000" THEN
1072
                                        flag_z(1) <= '1';
1073
                                        IF OP1in(31 downto 16)="0000000000000000" THEN
1074
                                                flag_z(2) <= '1';
1075
                                        END IF;
1076
                                END IF;
1077
                        END IF;
1078
 
1079
--                                      --Flags NZVC
1080
                        IF datatype="00" THEN                                           --Byte
1081
                                set_flags <= OP1IN(7)&flag_z(0)&addsub_ofl(0)&c_out(0);
1082
                                IF exec_ABCD='1' THEN
1083
                                        set_flags(0) <= dummy_a(8);
1084
                                ELSIF exec_SBCD='1' THEN
1085
                                        set_flags(0) <= dummy_s(8);
1086
                                END IF;
1087
                        ELSIF datatype="10" OR exec_CPMAW='1' THEN                                              --Long
1088
                                set_flags <= OP1IN(31)&flag_z(2)&addsub_ofl(2)&c_out(2);
1089
                        ELSE                                            --Word
1090
                                set_flags <= OP1IN(15)&flag_z(1)&addsub_ofl(1)&c_out(1);
1091
                        END IF;
1092
        END PROCESS;
1093
 
1094
------------------------------------------------------------------------------
1095
--Flags
1096
------------------------------------------------------------------------------          
1097
PROCESS (clk, reset, opcode)
1098
        BEGIN
1099
                IF reset='0' THEN
1100
                        Flags(13) <= '1';
1101
                        SVmode <= '1';
1102
                        Flags(10 downto 8) <= "111";
1103
                ELSIF rising_edge(clk) THEN
1104
 
1105
                IF clkena = '1' THEN
1106
                                IF directSR='1' THEN
1107
                                        Flags <= data_read(15 downto 0);
1108
                                END IF;
1109
                                IF interrupt='1' THEN
1110
                                        Flags(10 downto 8) <=rIPL_nr;
1111
                                        SVmode <= '1';
1112
                                END IF;
1113
                                IF writeSR='1' OR interrupt='1' THEN
1114
                                        Flags(13) <='1';
1115
                                END IF;
1116
                                IF endOPC='1' AND to_SR='0' THEN
1117
                                        SVmode <= Flags(13);
1118
                                END IF;
1119
                                IF execOPC='1' AND to_SR='1' THEN
1120
                                        Flags(7 downto 0) <= OP1in(7 downto 0);                   --CCR
1121
                                        IF datatype="01" AND (opcode(14)='0' OR opcode(9)='1') THEN              --move to CCR wird als word gespeichert
1122
                                                Flags(15 downto 8) <= OP1in(15 downto 8);       --SR
1123
                                                SVmode <= OP1in(13);
1124
                                        END IF;
1125
                                ELSIF Z_error='1' THEN
1126
                                        IF opcode(8)='0' THEN
1127
                                                Flags(3 downto 0) <= "1000";
1128
                                        ELSE
1129
                                                Flags(3 downto 0) <= "0100";
1130
                                        END IF;
1131 4 tobiflex
                                ELSIF no_Flags='0' AND trapmake='0' THEN
1132 2 tobiflex
                                        IF exec_ADD='1' THEN
1133
                                                Flags(4) <= set_flags(0);
1134
                                        ELSIF exec_ROT='1' AND rot_bits/="11" AND rot_nop='0' THEN
1135
                                                Flags(4) <= rot_XC;
1136
                                        END IF;
1137
 
1138
                                        IF (exec_ADD OR exec_CMP)='1' THEN
1139
                                                Flags(3 downto 0) <= set_flags;
1140
                                        ELSIF decodeOPC='1' and set_exec_ROT='1' THEN
1141
                                                Flags(1) <= '0';
1142
                                        ELSIF exec_DIVU='1' THEN
1143
                                                IF set_V_Flag='1' THEN
1144
                                                        Flags(3 downto 0) <= "1010";
1145
                                                ELSE
1146
                                                        Flags(3 downto 0) <= OP1IN(15)&flag_z(1)&"00";
1147
                                                END IF;
1148
                                        ELSIF exec_OR='1' OR exec_AND='1' OR exec_EOR='1' OR exec_MOVE='1' OR exec_swap='1' OR exec_MULU='1' THEN
1149
                                                Flags(3 downto 0) <= set_flags(3 downto 2)&"00";
1150
                                        ELSIF exec_ROT='1' THEN
1151
                                                Flags(3 downto 2) <= set_flags(3 downto 2);
1152
                                                Flags(0) <= rot_XC;
1153
                                                IF rot_bits="00" THEN           --ASL/ASR
1154
                                                        Flags(1) <= ((set_flags(3) XOR rot_rot) OR Flags(1));
1155
                                                END IF;
1156
                                        ELSIF exec_bits='1' THEN
1157
                                                Flags(2) <= NOT one_bit_in;
1158
                                        END IF;
1159
                                END IF;
1160
                        END IF;
1161
                END IF;
1162
        END PROCESS;
1163
 
1164
-----------------------------------------------------------------------------
1165
-- execute opcode
1166
-----------------------------------------------------------------------------
1167 4 tobiflex
PROCESS (clk, reset, OP2out, opcode, fetchOPC, decodeOPC, execOPC, endOPC, prefix, nextpass, condition, set_V_flag, trapmake, trapd, interrupt, trap_interrupt,
1168 2 tobiflex
             Z_error, microaddr, c_in, rot_cnt, one_bit_in, bit_number_reg, bit_number, ea_only, get_ea_now, ea_build, datatype, exec_write_back, get_extendedOPC,
1169 5 tobiflex
             Flags, SVmode, movem_addr, movem_busy, getbrief, set_exec_AND, set_exec_OR, set_exec_EOR, TG68_PC_dec, c_out, OP1out)
1170 2 tobiflex
        BEGIN
1171
                TG68_PC_br8 <= '0';
1172
                TG68_PC_brw <= '0';
1173
                TG68_PC_nop <= '0';
1174
                setstate <= "00";
1175
                Regwrena <= '0';
1176
                microstep <= '0';
1177
                microset <= '0';
1178
                postadd <= '0';
1179
                presub <= '0';
1180
                movem_presub <= '0';
1181
                setaddsub <= '1';
1182
                micronext <= "00000001";
1183
                setaddrlong <= '0';
1184
                setnextpass <= '0';
1185
                regdirectsource <= '0';
1186
                setdisp <= '0';
1187
                setdispbyte <= '0';
1188
                setdispbrief <= '0';
1189
                setbriefext <= '0';
1190
                setgetbrief <= '0';
1191
                longreaddirect <= '0';
1192
                dest_areg <= '0';
1193
                source_areg <= '0';
1194
                data_is_source <= '0';
1195
                write_back <= '0';
1196
                setstackaddr <= '0';
1197
                writePC <= '0';
1198
                writePC_add <= '0';
1199
                set_TG68_PC_dec <= '0';
1200
                set_directPC <= '0';
1201
                set_exec_ADD <= '0';
1202
                set_exec_OR <= '0';
1203
                set_exec_AND <= '0';
1204
                set_exec_EOR <= '0';
1205
                set_exec_MOVE <= '0';
1206
                set_exec_MOVEQ <= '0';
1207
                set_exec_MOVESR <= '0';
1208
                set_exec_ADDQ <= '0';
1209
                set_exec_CMP <= '0';
1210
                set_exec_ROT <= '0';
1211
                set_exec_EXT <= '0';
1212
                set_exec_CPMAW <= '0';
1213
                OP2out_one <= '0';
1214
                ea_to_pc <= '0';
1215
                ea_build <= '0';
1216
                get_ea_now <= '0';
1217
                rot_bits <= "XX";
1218
                rot_nop <= '0';
1219
                set_rot_cnt <= "000001";
1220
                set_movem_busy <= '0';
1221
                set_get_movem_mask <= '0';
1222
                save_memaddr <= '0';
1223
                set_mem_addsub <= '0';
1224
                exec_exg <= '0';
1225
                exec_swap <= '0';
1226
                exec_Bits <= '0';
1227
                set_get_bitnumber <= '0';
1228
                dest_hbits <= '0';
1229
                source_lowbits <= '0';
1230
                set_mem_rega <= '0';
1231
                ea_data_OP1 <= '0';
1232
                ea_only <= '0';
1233
                set_direct_data <= '0';
1234
                set_get_extendedOPC <= '0';
1235
                set_exec_tas <= '0';
1236
                OP1out_zero <= '0';
1237
                use_XZFlag <= '0';
1238
                use_XFlag <= '0';
1239
                set_exec_ABCD <= '0';
1240
                set_exec_SBCD <= '0';
1241
                set_exec_MULU <= '0';
1242
                set_exec_DIVU <= '0';
1243
                set_exec_Scc <= '0';
1244
                trap_illegal <='0';
1245
                trap_priv <='0';
1246
                trap_1010 <='0';
1247
                trap_1111 <='0';
1248
                trap_trap <='0';
1249
                trap_trapv <= '0';
1250 4 tobiflex
                trapmake <='0';
1251 2 tobiflex
                set_vectoraddr <='0';
1252
                writeSR <= '0';
1253
                set_directSR <= '0';
1254
                set_stop <= '0';
1255
                from_SR <= '0';
1256
                to_SR <= '0';
1257
                from_USP <= '0';
1258
                to_USP <= '0';
1259
                illegal_write_mode <= '0';
1260
                illegal_read_mode <= '0';
1261
                illegal_byteaddr <= '0';
1262
                no_Flags <= '0';
1263
                set_PCmarker <= '0';
1264
                use_SP <= '0';
1265
                set_Z_error <= '0';
1266 4 tobiflex
                wait_mem_byte <= '0';
1267
                set_movepl <= '0';
1268
                set_movepw <= '0';
1269 2 tobiflex
 
1270 4 tobiflex
                trap_chk <= '0';
1271 2 tobiflex
 
1272
------------------------------------------------------------------------------
1273
--Sourcepass
1274
------------------------------------------------------------------------------          
1275
                IF ea_only='0' AND get_ea_now='1' THEN
1276
                        setstate <= "10";
1277
                END IF;
1278
 
1279
                IF ea_build='1' THEN
1280
                        CASE opcode(5 downto 3) IS              --source
1281
                                WHEN "010"|"011"|"100" =>                                               -- -(An)+
1282
                                        get_ea_now <='1';
1283
                                        setnextpass <= '1';
1284
                                        IF opcode(4)='1' THEN
1285
                                                set_mem_rega <= '1';
1286
                                        ELSE
1287
                                                set_mem_addsub <= '1';
1288
                                        END IF;
1289
                                        IF opcode(3)='1' THEN   --(An)+
1290
                                                postadd <= '1';
1291
                                                IF opcode(2 downto 0)="111" THEN
1292
                                                        use_SP <= '1';
1293
                                                END IF;
1294
                                        END IF;
1295
                                        IF opcode(5)='1' THEN   -- -(An)
1296
                                                presub <= '1';
1297
                                                IF opcode(2 downto 0)="111" THEN
1298
                                                        use_SP <= '1';
1299
                                                END IF;
1300
                                        END IF;
1301
                                        IF opcode(4 downto 3)/="10" THEN
1302
                                                regwrena <= '1';
1303
                                        END IF;
1304
                                WHEN "101" =>                           --(d16,An)
1305
                                        microstep <='1';
1306
                                        micronext <="00000110";
1307
                                        setgetbrief <='1';
1308
                                        set_mem_regA <= '1';
1309
                                WHEN "110" =>                           --(d8,An,Xn)
1310
                                        microstep <='1';
1311
                                        micronext <="00001000";
1312
                                        setgetbrief <='1';
1313
                                        set_mem_regA <= '1';
1314
                                WHEN "111" =>
1315
                                        CASE opcode(2 downto 0) IS
1316
                                                WHEN "000" =>                           --(xxxx).w
1317
                                                        micronext <="00000010";
1318
                                                        microstep <='1';
1319
                                                WHEN "001" =>                           --(xxxx).l
1320
                                                        longreaddirect <= '1';
1321
                                                        micronext <="00000010";
1322
                                                        microstep <='1';
1323
                                                WHEN "010" =>                           --(d16,PC)
1324
                                                        microstep <='1';
1325
                                                        micronext <="00000110";
1326
                                                        setgetbrief <= '1';
1327
                                                        set_PCmarker <= '1';
1328
                                                WHEN "011" =>                           --(d8,PC,Xn)
1329
                                                        microstep <='1';
1330
                                                        micronext <="00001000";
1331
                                                        setgetbrief <= '1';
1332
                                                        set_PCmarker <= '1';
1333
                                                WHEN "100" =>                           --#data
1334
                                                        setnextpass <= '1';
1335
                                                        set_direct_data <= '1';
1336
                                                        IF datatype="10" THEN
1337
                                                                longreaddirect <= '1';
1338
                                                        END IF;
1339
                                                WHEN OTHERS =>
1340
                                        END CASE;
1341
                                WHEN OTHERS =>
1342
                        END CASE;
1343
                END IF;
1344
------------------------------------------------------------------------------
1345
--prepere opcode
1346
------------------------------------------------------------------------------          
1347
                CASE opcode(7 downto 6) IS
1348
                        WHEN "00" => datatype <= "00";          --Byte
1349
                        WHEN "01" => datatype <= "01";          --Word
1350
                        WHEN OTHERS => datatype <= "10";        --Long
1351
                END CASE;
1352
 
1353
                IF execOPC='1' AND endOPC='0' AND exec_write_back='1' THEN
1354
                        setstate <="11";
1355
                END IF;
1356
 
1357
------------------------------------------------------------------------------
1358
--test illegal mode
1359
------------------------------------------------------------------------------  
1360
                IF (opcode(5 downto 3)="111" AND opcode(2 downto 1)/="00") OR (opcode(5 downto 3)="001" AND datatype="00") THEN
1361
                        illegal_write_mode <= '1';
1362
                END IF;
1363
                IF (opcode(5 downto 2)="1111" AND opcode(1 downto 0)/="00") OR (opcode(5 downto 3)="001" AND datatype="00") THEN
1364
                        illegal_read_mode <= '1';
1365
                END IF;
1366
                IF opcode(5 downto 3)="001" AND datatype="00" THEN
1367
                        illegal_byteaddr <= '1';
1368
                END IF;
1369
 
1370
 
1371
                CASE opcode(15 downto 12) IS
1372
-- 0000 ----------------------------------------------------------------------------            
1373
                        WHEN "0000" =>
1374
                        IF opcode(8)='1' AND opcode(5 downto 3)="001" THEN --movep
1375 4 tobiflex
                                datatype <= "00";                               --Byte
1376
                                use_SP <= '1';
1377
                                no_Flags <='1';
1378
                                IF opcode(7)='0' THEN
1379
                                        set_exec_move <= '1';
1380
                                        set_movepl <= '1';
1381
                                END IF;
1382
                                IF decodeOPC='1' THEN
1383
                                        IF opcode(7)='0' THEN
1384
                                                set_direct_data <= '1';
1385
                                        END IF;
1386
                                        microstep <='1';
1387
                                        micronext <="01010110";
1388
                                        setgetbrief <='1';
1389
                                        set_mem_regA <= '1';
1390
                                END IF;
1391
                                IF opcode(7)='0' AND endOPC='1' THEN
1392
                                        IF opcode(6)='1' THEN
1393
                                                datatype <= "10";               --Long
1394
                                        ELSE
1395
                                                datatype <= "01";               --Word
1396
                                        END IF;
1397
                                        dest_hbits <='1';
1398
                                        regwrena <= '1';
1399
                                END IF;
1400 2 tobiflex
                        ELSE
1401
                                IF opcode(8)='1' OR opcode(11 downto 8)="1000" THEN                             --Bits
1402
                                        IF execOPC='1' AND get_extendedOPC='0' THEN
1403
                                                IF opcode(7 downto 6)/="00" AND endOPC='1' THEN
1404
                                                        regwrena <= '1';
1405
                                                END IF;
1406
                                                exec_Bits <= '1';
1407
                                                ea_data_OP1 <= '1';
1408
                                        END IF;
1409
--                                      IF get_extendedOPC='1' THEN
1410
--                                              datatype <= "01";                       --Word
1411
--                                      ELS
1412
                                        IF opcode(5 downto 4)="00" THEN
1413
                                                datatype <= "10";                       --Long
1414
                                        ELSE
1415
                                                datatype <= "00";                       --Byte
1416
                                                IF opcode(7 downto 6)/="00" THEN
1417
                                                        write_back <= '1';
1418
                                                END IF;
1419
                                        END IF;
1420
                                        IF decodeOPC='1' THEN
1421
                                                ea_build <= '1';
1422
                                                IF opcode(8)='0' THEN
1423
                                                        IF opcode(5 downto 4)/="00" THEN        --Dn, An
1424
                                                                set_get_extendedOPC <= '1';
1425
                                                        END IF;
1426
                                                        set_get_bitnumber <= '1';
1427
                                                END IF;
1428
                                        END IF;
1429
                                ELSE                                                            --andi, ...xxxi 
1430
                                        IF opcode(11 downto 8)="0000" THEN      --ORI
1431
                                                set_exec_OR <= '1';
1432
                                        END IF;
1433
                                        IF opcode(11 downto 8)="0010" THEN      --ANDI
1434
                                                set_exec_AND <= '1';
1435
                                        END IF;
1436
                                        IF opcode(11 downto 8)="0100" OR opcode(11 downto 8)="0110" THEN        --SUBI, ADDI
1437
                                                set_exec_ADD <= '1';
1438
                                        END IF;
1439
                                        IF opcode(11 downto 8)="1010" THEN      --EORI
1440
                                                set_exec_EOR <= '1';
1441
                                        END IF;
1442
                                        IF opcode(11 downto 8)="1100" THEN      --CMPI
1443
                                                set_exec_CMP <= '1';
1444 4 tobiflex
                                        ELSIF trapmake='0' THEN
1445 2 tobiflex
                                                write_back <= '1';
1446
                                        END IF;
1447
                                        IF opcode(7)='0' AND opcode(5 downto 0)="111100" AND (set_exec_AND OR set_exec_OR OR set_exec_EOR)='1' THEN               --SR
1448
--                                      IF opcode(7)='0' AND opcode(5 downto 0)="111100" AND (opcode(11 downto 8)="0010" OR opcode(11 downto 8)="0000" OR opcode(11 downto 8)="1010") THEN              --SR
1449
                                                IF SVmode='0' AND opcode(6)='1' THEN  --SR
1450
                                                        trap_priv <= '1';
1451 4 tobiflex
                                                        trapmake <= '1';
1452 2 tobiflex
                                                ELSE
1453
                                                        from_SR <= '1';
1454
                                                        to_SR <= '1';
1455
                                                        IF decodeOPC='1' THEN
1456
                                                                setnextpass <= '1';
1457
                                                                set_direct_data <= '1';
1458
                                                        END IF;
1459
                                                END IF;
1460
                                        ELSE
1461
                                                IF decodeOPC='1' THEN
1462
                                                        IF opcode(11 downto 8)="0010" OR opcode(11 downto 8)="0000" OR opcode(11 downto 8)="0100"       --ANDI, ORI, SUBI
1463
                                                           OR opcode(11 downto 8)="0110" OR opcode(11 downto 8)="1010" OR opcode(11 downto 8)="1100" THEN       --ADDI, EORI, CMPI
1464
        --                                              IF (set_exec_AND OR set_exec_OR OR set_exec_ADD         --ANDI, ORI, SUBI
1465
        --                                                 OR set_exec_EOR OR set_exec_CMP)='1' THEN    --ADDI, EORI, CMPI
1466
 
1467
                                                                microstep <='1';
1468
                                                                micronext <="00101000";
1469
                                                                set_direct_data <= '1';
1470
                                                                IF datatype="10" THEN
1471
                                                                        longreaddirect <= '1';
1472
                                                                END IF;
1473
                                                        END IF;
1474
                                                END IF;
1475
 
1476
                                                IF execOPC='1' THEN
1477
                                                        ea_data_OP1 <= '1';
1478
                                                        IF opcode(11 downto 8)/="1100" THEN     --CMPI 
1479
                                                                IF endOPC='1' THEN
1480
                                                                        Regwrena <= '1';
1481
                                                                END IF;
1482
                                                        END IF;
1483
                                                        IF opcode(11 downto 8)="1100"  OR opcode(11 downto 8)="0100" THEN       --CMPI, SUBI
1484
                                                                setaddsub <= '0';
1485
                                                        END IF;
1486
                                                END IF;
1487
                                        END IF;
1488
                                END IF;
1489
                        END IF;
1490
 
1491
-- 0001, 0010, 0011 -----------------------------------------------------------------           
1492
                        WHEN "0001"|"0010"|"0011" =>                            --move.b, move.l, move.w
1493
                                set_exec_MOVE <= '1';
1494
                                IF opcode(8 downto 6)="001" THEN
1495
                                        no_Flags <= '1';
1496
                                END IF;
1497
                                IF opcode(5 downto 4)="00" THEN --Dn, An
1498
                                        regdirectsource <= '1';
1499
                                END IF;
1500
                                CASE opcode(13 downto 12) IS
1501
                                        WHEN "01" => datatype <= "00";          --Byte
1502
                                        WHEN "10" => datatype <= "10";          --Long
1503
                                        WHEN OTHERS => datatype <= "01";        --Word
1504
                                END CASE;
1505
                                source_lowbits <= '1';                                  -- Dn=>  An=>
1506
                                IF opcode(3)='1' THEN
1507
                                        source_areg <= '1';
1508
                                END IF;
1509
                                IF getbrief='1' AND nextpass='1' THEN   -- =>(d16,An)  =>(d8,An,Xn)
1510
                                        set_mem_rega <= '1';
1511
                                END IF;
1512
 
1513
                                IF execOPC='1' AND opcode(8 downto 7)="00" THEN
1514
                                        Regwrena <= '1';
1515
                                END IF;
1516
 
1517
                                IF nextpass='1' OR execOPC='1' OR opcode(5 downto 4)="00" THEN
1518
                                        dest_hbits <= '1';
1519
                                        IF opcode(8 downto 6)/="000" THEN
1520
                                                dest_areg <= '1';
1521
                                        END IF;
1522
                                END IF;
1523
 
1524
                                IF decodeOPC='1' THEN
1525
                                        ea_build <= '1';
1526
                                END IF;
1527
 
1528
                                IF prefix='0' AND (nextpass='1' OR (opcode(5 downto 4)="00" AND decodeOPC='1')) THEN
1529
                                        CASE opcode(8 downto 6) IS              --destination
1530
--                                              WHEN "000" =>                                           --Dn
1531
--                                              WHEN "001" =>                                           --An
1532
                                                WHEN "010"|"011"|"100" =>                                       --destination -(an)+
1533
                                                        IF opcode(7)='1' THEN
1534
                                                                set_mem_rega <= '1';
1535
                                                        ELSE
1536
                                                                set_mem_addsub <= '1';
1537
                                                        END IF;
1538
                                                        IF opcode(6)='1' THEN   --(An)+
1539
                                                                postadd <= '1';
1540
                                                                IF opcode(11 downto 9)="111" THEN
1541
                                                                        use_SP <= '1';
1542
                                                                END IF;
1543
                                                        END IF;
1544
                                                        IF opcode(8)='1' THEN   -- -(An)
1545
                                                                presub <= '1';
1546
                                                                IF opcode(11 downto 9)="111" THEN
1547
                                                                        use_SP <= '1';
1548
                                                                END IF;
1549
                                                        END IF;
1550
                                                        IF opcode(7 downto 6)/="10" THEN
1551
                                                                regwrena <= '1';
1552
                                                        END IF;
1553
                                                        setstate <= "11";
1554
                                                        microstep <='1';                --nop
1555
                                                WHEN "101" =>                           --(d16,An)
1556
                                                        microstep <='1';
1557
                                                        micronext <="00001011";
1558
                                                        set_mem_regA <= '1';
1559
                                                        setgetbrief <= '1';
1560
                                                WHEN "110" =>                           --(d8,An,Xn)
1561
                                                        microstep <='1';
1562
                                                        micronext <="00001110";
1563
                                                        set_mem_regA <= '1';
1564
                                                        setgetbrief <= '1';
1565
                                                WHEN "111" =>
1566
                                                        CASE opcode(11 downto 9) IS
1567
                                                                WHEN "000" =>                           --(xxxx).w
1568
                                                                        microstep <='1';
1569
                                                                        micronext <="00000011";
1570
                                                                WHEN "001" =>                           --(xxxx).l
1571
                                                                        longreaddirect <= '1';
1572
                                                                        microstep <='1';
1573
                                                                        micronext <="00000011";
1574
                                                                WHEN OTHERS =>
1575
                                                        END CASE;
1576
                                                WHEN OTHERS =>
1577
                                        END CASE;
1578
                                END IF;
1579
-- 0100 ----------------------------------------------------------------------------            
1580
                        WHEN "0100" =>                          --rts_group
1581
                                IF opcode(8)='1' THEN           --lea
1582
                                        IF opcode(6)='1' THEN           --lea
1583
                                                IF opcode(7)='1' THEN
1584
                                                        ea_only <= '1';
1585
                                                        IF opcode(5 downto 3)="010" THEN        --lea (Am),An
1586
                                                                set_exec_move <='1';
1587
                                                                no_Flags <='1';
1588
                                                                dest_areg <= '1';
1589
                                                                dest_hbits <= '1';
1590
                                                                source_lowbits <= '1';
1591
                                                                source_areg <= '1';
1592
                                                                IF execOPC='1' THEN
1593
                                                                        Regwrena <= '1';
1594
                                                                END IF;
1595
                                                        ELSE
1596
                                                                IF decodeOPC='1' THEN
1597
                                                                        ea_build <= '1';
1598
                                                                END IF;
1599
                                                        END IF;
1600
                                                        IF get_ea_now='1' THEN
1601
                                                                dest_areg <= '1';
1602
                                                                dest_hbits <= '1';
1603
                                                                regwrena <= '1';
1604
                                                        END IF;
1605
                                                ELSE
1606
                                                        trap_illegal <= '1';
1607 4 tobiflex
                                                        trapmake <= '1';
1608 2 tobiflex
                                                END IF;
1609 4 tobiflex
                                        ELSE                                                            --chk
1610
                                                IF opcode(7)='1' THEN
1611
                                                        set_exec_ADD <= '1';
1612
                                                        IF decodeOPC='1' THEN
1613
                                                                ea_build <= '1';
1614
                                                        END IF;
1615
                                                        datatype <= "01";       --Word
1616
                                                        IF execOPC='1' THEN
1617
                                                                setaddsub <= '0';
1618
--first alternative
1619
                                                                ea_data_OP1 <= '1';
1620
                                                                IF c_out(1)='1' OR OP1out(15)='1' OR OP2out(15)='1' THEN
1621
                                        --                              trap_chk <= '1';        --first I must change the Trap System
1622
                                        --                              trapmake <= '1';
1623
                                                                END IF;
1624
--second alternative                                                                    
1625
--                                                              IF (c_out(1)='0' AND flag_z(1)='0') OR OP1out(15)='1' OR OP2out(15)='1' THEN
1626
--                                      --                              trap_chk <= '1';        --first I must change the Trap System
1627
--                                      --                              trapmake <= '1';
1628
--                                                              END IF;
1629
--                                                              dest_hbits <= '1';
1630
--                                                              source_lowbits <='1';
1631
                                                        END IF;
1632
                                                ELSE
1633
                                                        trap_illegal <= '1';            -- chk long for 68020
1634
                                                        trapmake <= '1';
1635
                                                END IF;
1636 2 tobiflex
                                        END IF;
1637
                                ELSE
1638
                                        CASE opcode(11 downto 9) IS
1639
                                                WHEN "000"=>
1640
                                                        IF decodeOPC='1' THEN
1641
                                                                ea_build <= '1';
1642
                                                        END IF;
1643 6 tobiflex
                                                        IF opcode(7 downto 6)="11" THEN                                 --move from SR
1644 2 tobiflex
                                                                set_exec_MOVESR <= '1';
1645
                                                                datatype <= "01";
1646
                                                                write_back <='1';                                                       -- im 68000 wird auch erst gelesen
1647
                                                                IF execOPC='1' THEN
1648
                                                                        IF endOPC='1' THEN
1649
                                                                                Regwrena <= '1';
1650
                                                                        END IF;
1651
                                                                END IF;
1652
                                                        ELSE                                                                                    --negx
1653
                                                                use_XFlag <= '1';
1654
                                                                write_back <='1';
1655
                                                                set_exec_ADD <= '1';
1656
                                                                setaddsub <='0';
1657
                                                                IF execOPC='1' THEN
1658
                                                                        source_lowbits <= '1';
1659
                                                                        OP1out_zero <= '1';
1660
                                                                        IF endOPC='1' THEN
1661
                                                                                Regwrena <= '1';
1662
                                                                        END IF;
1663
                                                                END IF;
1664
                                                        END IF;
1665
                                                WHEN "001"=>
1666 6 tobiflex
                                                        IF opcode(7 downto 6)="11" THEN                                 --move from CCR 68010
1667 2 tobiflex
                                                                trap_illegal <= '1';
1668 4 tobiflex
                                                                trapmake <= '1';
1669 2 tobiflex
                                                        ELSE                                                                                    --clr
1670
                                                                IF decodeOPC='1' THEN
1671
                                                                        ea_build <= '1';
1672
                                                                END IF;
1673
                                                                write_back <='1';
1674
                                                                set_exec_AND <= '1';
1675
                                                                IF execOPC='1' THEN
1676
                                                                        OP1out_zero <= '1';
1677
                                                                        IF endOPC='1' THEN
1678
                                                                                Regwrena <= '1';
1679
                                                                        END IF;
1680
                                                                END IF;
1681
                                                        END IF;
1682
                                                WHEN "010"=>
1683
                                                        IF decodeOPC='1' THEN
1684
                                                                ea_build <= '1';
1685
                                                        END IF;
1686 6 tobiflex
                                                        IF opcode(7 downto 6)="11" THEN                                 --move to CCR
1687 2 tobiflex
                                                                set_exec_MOVE <= '1';
1688
                                                                datatype <= "01";
1689
                                                                IF execOPC='1' THEN
1690
                                                                        source_lowbits <= '1';
1691
                                                                        to_SR <= '1';
1692
                                                                END IF;
1693
                                                        ELSE                                                                                    --neg
1694
                                                                write_back <='1';
1695
                                                                set_exec_ADD <= '1';
1696
                                                                setaddsub <='0';
1697
                                                                IF execOPC='1' THEN
1698
                                                                        source_lowbits <= '1';
1699
                                                                        OP1out_zero <= '1';
1700
                                                                        IF endOPC='1' THEN
1701
                                                                                Regwrena <= '1';
1702
                                                                        END IF;
1703
                                                                END IF;
1704
                                                        END IF;
1705
                                                WHEN "011"=>                                                                            --not, move toSR
1706 6 tobiflex
                                                        IF opcode(7 downto 6)="11" THEN                                 --move to SR
1707 2 tobiflex
                                                                IF SVmode='1' THEN
1708
                                                                        IF decodeOPC='1' THEN
1709
                                                                                ea_build <= '1';
1710
                                                                        END IF;
1711
                                                                        set_exec_MOVE <= '1';
1712
                                                                        datatype <= "01";
1713
                                                                        IF execOPC='1' THEN
1714
                                                                                source_lowbits <= '1';
1715
                                                                                to_SR <= '1';
1716
                                                                        END IF;
1717
                                                                ELSE
1718
                                                                        trap_priv <= '1';
1719 4 tobiflex
                                                                        trapmake <= '1';
1720 2 tobiflex
                                                                END IF;
1721
                                                        ELSE                                                                                    --not
1722
                                                                IF decodeOPC='1' THEN
1723
                                                                        ea_build <= '1';
1724
                                                                END IF;
1725
                                                                write_back <='1';
1726
                                                                set_exec_EOR <= '1';
1727
                                                                IF execOPC='1' THEN
1728
                                                                        OP2out_one <= '1';
1729
                                                                        ea_data_OP1 <= '1';
1730
                                                                        IF endOPC='1' THEN
1731
                                                                                Regwrena <= '1';
1732
                                                                        END IF;
1733
                                                                END IF;
1734
                                                        END IF;
1735
                                                WHEN "100"|"110"=>
1736
                                                        IF opcode(7)='1' THEN                   --movem, ext
1737
                                                                IF opcode(5 downto 3)="000" AND opcode(10)='0' THEN              --ext
1738
                                                                        source_lowbits <= '1';
1739
                                                                        IF decodeOPC='1' THEN
1740
                                                                                set_exec_EXT <= '1';
1741
                                                                                set_exec_move <= '1';
1742
                                                                        END IF;
1743
                                                                        IF opcode(6)='0' THEN
1744
                                                                                datatype <= "01";               --WORD
1745
                                                                        END IF;
1746
                                                                        IF execOPC='1' THEN
1747
                                                                                regwrena <= '1';
1748
                                                                        END IF;
1749
                                                                ELSE                                                                                                    --movem
1750
--                                                              IF opcode(11 downto 7)="10001" OR opcode(11 downto 7)="11001" THEN      --MOVEM
1751
                                                                        ea_only <= '1';
1752
                                                                        IF decodeOPC='1' THEN
1753
                                                                                datatype <= "01";               --Word
1754
                                                                                set_get_movem_mask <='1';
1755
                                                                                set_get_extendedOPC <='1';
1756
 
1757
                                                                                IF opcode(5 downto 3)="010" OR opcode(5 downto 3)="011" OR opcode(5 downto 3)="100" THEN
1758
                                                                                        set_mem_rega <= '1';
1759
                                                                                        setstate <= "01";
1760
                                                                                        IF opcode(10)='0' THEN
1761
                                                                                                set_movem_busy <='1';
1762
                                                                                        ELSE
1763
                                                                                                micronext <="00100010";
1764
                                                                                                microstep <='1';
1765
                                                                                        END IF;
1766
                                                                                ELSE
1767
                                                                                        ea_build <= '1';
1768
                                                                                END IF;
1769
 
1770
                                                                        ELSE
1771
                                                                                IF opcode(6)='0' THEN
1772
                                                                                        datatype <= "01";               --Word
1773
                                                                                END IF;
1774
                                                                        END IF;
1775
                                                                        IF execOPC='1' THEN
1776
                                                                                IF opcode(5 downto 3)="100" OR opcode(5 downto 3)="011" THEN
1777
                                                                                        regwrena <= '1';
1778
                                                                                        save_memaddr <= '1';
1779
                                                                                END IF;
1780
                                                                        END IF;
1781
                                                                        IF get_ea_now='1' THEN
1782
                                                                                set_movem_busy <= '1';
1783
                                                                                IF opcode(10)='0' THEN
1784
                                                                                        setstate <="01";
1785
                                                                                ELSE
1786
                                                                                        setstate <="10";
1787
                                                                                END IF;
1788
                                                                        END IF;
1789
                                                                                IF opcode(5 downto 3)="100" THEN
1790
                                                                                        movem_presub <= '1';
1791
                                                                                END IF;
1792
                                                                                IF movem_addr='1' THEN
1793
                                                                                        IF opcode(10)='1' THEN
1794
                                                                                                regwrena <= '1';
1795
                                                                                        END IF;
1796
                                                                                END IF;
1797
                                                                                IF movem_busy='1' THEN
1798
                                                                                        IF opcode(10)='0' THEN
1799
                                                                                                setstate <="11";
1800
                                                                                        ELSE
1801
                                                                                                setstate <="10";
1802
                                                                                        END IF;
1803
                                                                                END IF;
1804
                                                                END IF;
1805
                                                        ELSE
1806
                                                                IF opcode(10)='1' THEN                                          --MUL, DIV 68020
1807
                                                                        trap_illegal <= '1';
1808 4 tobiflex
                                                                        trapmake <= '1';
1809 2 tobiflex
                                                                ELSE                                                    --pea, swap
1810
                                                                        IF opcode(6)='1' THEN
1811
                                                                                datatype <= "10";
1812
                                                                                IF opcode(5 downto 3)="000" THEN                --swap
1813
                                                                                        IF execOPC='1' THEN
1814
                                                                                                exec_swap <= '1';
1815
                                                                                                regwrena <= '1';
1816
                                                                                        END IF;
1817
                                                                                ELSIF opcode(5 downto 3)="001" THEN             --bkpt
1818
 
1819
                                                                                ELSE                                                                    --pea
1820
                                                                                        ea_only <= '1';
1821
                                                                                        IF decodeOPC='1' THEN
1822
                                                                                                ea_build <= '1';
1823
                                                                                        END IF;
1824
                                                                                        IF nextpass='1' AND prefix='0' THEN
1825
                                                                                                presub <= '1';
1826
                                                                                                setstackaddr <='1';
1827
                                                                                                set_mem_addsub <= '1';
1828
                                                                                                setstate <="11";
1829
                                                                                                microstep <='1';
1830
                                                                                        END IF;
1831
                                                                                        IF get_ea_now='1' THEN
1832
                                                                                                setstate <="01";
1833
                                                                                        END IF;
1834
                                                                                END IF;
1835
                                                                        ELSE                                                            --nbcd  
1836
                                                                                IF decodeOPC='1' THEN           --nbcd
1837
                                                                                        ea_build <= '1';
1838
                                                                                END IF;
1839
                                                                                use_XFlag <= '1';
1840
                                                                                write_back <='1';
1841
                                                                                set_exec_ADD <= '1';
1842
                                                                                set_exec_SBCD <= '1';
1843
                                                                                IF execOPC='1' THEN
1844
                                                                                        source_lowbits <= '1';
1845
                                                                                        OP1out_zero <= '1';
1846
                                                                                        IF endOPC='1' THEN
1847
                                                                                                Regwrena <= '1';
1848
                                                                                        END IF;
1849
                                                                                END IF;
1850
                                                                        END IF;
1851
                                                                END IF;
1852
                                                        END IF;
1853
 
1854
                                                WHEN "101"=>                                            --tst, tas
1855
                                                        IF decodeOPC='1' THEN
1856
                                                                ea_build <= '1';
1857
                                                        END IF;
1858
                                                        IF execOPC='1' THEN
1859
                                                                dest_hbits <= '1';                              --for Flags
1860
                                                                source_lowbits <= '1';
1861
                --                                              IF opcode(3)='1' THEN                   --MC68020...
1862
                --                                                      source_areg <= '1';
1863
                --                                              END IF;
1864
                                                        END IF;
1865
                                                        set_exec_MOVE <= '1';
1866
                                                        IF opcode(7 downto 6)="11" THEN         --tas
1867
                                                                set_exec_tas <= '1';
1868
                                                                write_back <= '1';
1869
                                                                datatype <= "00";                               --Byte
1870
                                                                IF execOPC='1' AND endOPC='1' THEN
1871
                                                                        regwrena <= '1';
1872
                                                                END IF;
1873
                                                        END IF;
1874
--                                              WHEN "110"=>
1875
                                                WHEN "111"=>                                    --4EXX
1876
                                                        IF opcode(7)='1' THEN           --jsr, jmp
1877
                                                                datatype <= "10";
1878
                                                                ea_only <= '1';
1879
                                                                IF nextpass='1' AND prefix='0' THEN
1880
                                                                        presub <= '1';
1881
                                                                        setstackaddr <='1';
1882
                                                                        set_mem_addsub <= '1';
1883
                                                                        setstate <="11";
1884
                                                                        microstep <='1';
1885
                                                                END IF;
1886
                                                                IF decodeOPC='1' THEN
1887
                                                                        ea_build <= '1';
1888
                                                                END IF;
1889
                                                                IF get_ea_now='1' THEN                                  --jsr
1890
                                                                        IF opcode(6)='0' THEN
1891
                                                                                setstate <="01";
1892
                                                                        END IF;
1893
                                                                        ea_to_pc <= '1';
1894 5 tobiflex
                                                                        IF opcode(5 downto 1)="11100" THEN
1895 2 tobiflex
                                                                                writePC_add <= '1';
1896
                                                                        ELSE
1897
                                                                                writePC <= '1';
1898
                                                                        END IF;
1899
                                                                END IF;
1900
                                                        ELSE                                            --
1901
                                                                CASE opcode(6 downto 0) IS
1902
                                                                        WHEN "1000000"|"1000001"|"1000010"|"1000011"|"1000100"|"1000101"|"1000110"|"1000111"|           --trap
1903
                                                                             "1001000"|"1001001"|"1001010"|"1001011"|"1001100"|"1001101"|"1001110"|"1001111" =>         --trap
1904
                                                                                        trap_trap <='1';
1905 4 tobiflex
                                                                                        trapmake <= '1';
1906 2 tobiflex
                                                                        WHEN "1010000"|"1010001"|"1010010"|"1010011"|"1010100"|"1010101"|"1010110"|"1010111" =>         --link
1907
                                                                                datatype <= "10";
1908
                                                                                IF decodeOPC='1' THEN
1909
                                                                                        micronext <="01000000";
1910
                                                                                        microstep <='1';
1911
                                                                                        set_exec_MOVE <= '1';                                           --für displacement
1912
                                                                                        presub <= '1';
1913
                                                                                        setstackaddr <='1';
1914
                                                                                        set_mem_addsub <= '1';
1915
                                                                                        source_lowbits <= '1';
1916
                                                                                        source_areg <= '1';
1917
                                                                                END IF;
1918
                                                                                IF execOPC='1' THEN
1919
                                                                                        setstackaddr <='1';
1920
                                                                                        regwrena <= '1';
1921
                                                                                END IF;
1922
 
1923
                                                                        WHEN "1011000"|"1011001"|"1011010"|"1011011"|"1011100"|"1011101"|"1011110"|"1011111" =>         --unlink
1924
                                                                                datatype <= "10";
1925
                                                                                IF decodeOPC='1' THEN
1926
                                                                                        setstate <= "10";
1927
                                                                                        set_mem_rega <= '1';
1928
                                                                                ELSIF execOPC='1' THEN
1929
                                                                                        regwrena <= '1';
1930
                                                                                        exec_exg <= '1';
1931
                                                                                ELSE
1932
                                                                                        setstackaddr <='1';
1933
                                                                                        regwrena <= '1';
1934
                                                                                        get_ea_now <= '1';
1935
                                                                                        ea_only <= '1';
1936
                                                                                END IF;
1937
 
1938
                                                                        WHEN "1100000"|"1100001"|"1100010"|"1100011"|"1100100"|"1100101"|"1100110"|"1100111" =>         --move An,USP
1939
                                                                                IF SVmode='1' THEN
1940
                                                                                        no_Flags <= '1';
1941
                                                                                        to_USP <= '1';
1942
                                                                                        setstackaddr <= '1';
1943
                                                                                        source_lowbits <= '1';
1944
                                                                                        source_areg <= '1';
1945
                                                                                        set_exec_MOVE <= '1';
1946
                                                                                        datatype <= "10";
1947
                                                                                        IF execOPC='1' THEN
1948
                                                                                                regwrena <= '1';
1949
                                                                                        END IF;
1950
                                                                                ELSE
1951
                                                                                        trap_priv <= '1';
1952 4 tobiflex
                                                                                        trapmake <= '1';
1953 2 tobiflex
                                                                                END IF;
1954
                                                                        WHEN "1101000"|"1101001"|"1101010"|"1101011"|"1101100"|"1101101"|"1101110"|"1101111" =>         --move USP,An
1955
                                                                                IF SVmode='1' THEN
1956
                                                                                        no_Flags <= '1';
1957
                                                                                        from_USP <= '1';
1958
                                                                                        set_exec_MOVE <= '1';
1959
                                                                                        datatype <= "10";
1960
                                                                                        IF execOPC='1' THEN
1961
                                                                                                regwrena <= '1';
1962
                                                                                        END IF;
1963
                                                                                ELSE
1964
                                                                                        trap_priv <= '1';
1965 4 tobiflex
                                                                                        trapmake <= '1';
1966 2 tobiflex
                                                                                END IF;
1967
 
1968
                                                                        WHEN "1110000" =>                                       --reset
1969
                                                                                IF SVmode='0' THEN
1970
                                                                                        trap_priv <= '1';
1971 4 tobiflex
                                                                                        trapmake <= '1';
1972 2 tobiflex
                                                                                END IF;
1973
 
1974
                                                                        WHEN "1110001" =>                                       --nop
1975
 
1976
                                                                        WHEN "1110010" =>                                       --stop
1977
                                                                                IF SVmode='0' THEN
1978
                                                                                        trap_priv <= '1';
1979 4 tobiflex
                                                                                        trapmake <= '1';
1980 2 tobiflex
                                                                                ELSE
1981
                                                                                        IF decodeOPC='1' THEN
1982
                                                                                                setnextpass <= '1';
1983
                                                                                                set_directSR <= '1';
1984
                                                                                                set_stop <= '1';
1985
                                                                                        END IF;
1986
                                                                                END IF;
1987
 
1988
                                                                        WHEN "1110011" =>                                                                       --rte
1989
                                                                                IF SVmode='1' THEN
1990
                                                                                        IF decodeOPC='1' THEN
1991
                                                                                                datatype <= "01";
1992
                                                                                                setstate <= "10";
1993
                                                                                                postadd <= '1';
1994
                                                                                                setstackaddr <= '1';
1995
                                                                                                set_mem_rega <= '1';
1996
                                                                                                set_directSR <= '1';
1997
                                                                                                microstep <='1';
1998
                                                                                                micronext <= "01001000";
1999
                                                                                        END IF;
2000
                                                                                ELSE
2001
                                                                                        trap_priv <= '1';
2002 4 tobiflex
                                                                                        trapmake <= '1';
2003 2 tobiflex
                                                                                END IF;
2004
 
2005
                                                                        WHEN "1110101" =>                                                                       --rts
2006
                                                                                IF decodeOPC='1' THEN
2007
                                                                                        datatype <= "10";
2008
                                                                                        setstate <= "10";
2009
                                                                                        postadd <= '1';
2010
                                                                                        setstackaddr <= '1';
2011
                                                                                        set_mem_rega <= '1';
2012
                                                                                        set_directPC <= '1';
2013
                                                                                        microstep <='1';
2014
                                                                                END IF;
2015
 
2016
                                                                        WHEN "1110110" =>                                                                       --trapv
2017
                                                                                IF Flags(1)='1' THEN
2018
                                                                                        trap_trapv <= '1';
2019 4 tobiflex
                                                                                        trapmake <= '1';
2020 2 tobiflex
                                                                                END IF;
2021
 
2022
                                                                        WHEN OTHERS =>
2023
                                                                                trap_illegal <= '1';
2024 4 tobiflex
                                                                                trapmake <= '1';
2025 2 tobiflex
                                                                END CASE;
2026
                                                        END IF;
2027 6 tobiflex
                                                WHEN OTHERS => null;
2028 2 tobiflex
                                        END CASE;
2029
                                END IF;
2030
 
2031
-- 0101 ----------------------------------------------------------------------------            
2032
                        WHEN "0101" =>                                                          --subq, addq    
2033
 
2034
                                        IF opcode(7 downto 6)="11" THEN --dbcc
2035
                                                IF opcode(5 downto 3)="001" THEN --dbcc
2036
                                                        datatype <= "01";                       --Word
2037
                                                        IF decodeOPC='1' THEN
2038
                                                                OP2out_one <= '1';
2039
                                                                IF condition='0' THEN
2040
                                                                        Regwrena <= '1';
2041
                                                                        IF c_in(2)='1' THEN
2042
                                                                                micronext <="00011110";
2043
                                                                        END IF;
2044
                                                                END IF;
2045
                                                                data_is_source <= '1';
2046
                                                                microstep <='1';
2047
                                                        END IF;
2048
                                                ELSE                            --Scc
2049
                                                        datatype <= "00";                       --Byte
2050
                                                        write_back <= '1';
2051
                                                        IF decodeOPC='1' THEN
2052
                                                                ea_build <= '1';
2053
                                                        END IF;
2054
                                                        IF condition='0' THEN
2055
                                                                set_exec_Scc <= '1';
2056
                                                        END IF;
2057
                                                        IF execOPC='1' THEN
2058
                                                                IF condition='1' THEN
2059
                                                                        OP2out_one <= '1';
2060
                                                                        exec_EXG <= '1';
2061
                                                                ELSE
2062
                                                                        OP1out_zero <= '1';
2063
                                                                END IF;
2064
                                                                IF endOPC='1' THEN
2065
                                                                        Regwrena <= '1';
2066
                                                                END IF;
2067
                                                        END IF;
2068
                                                END IF;
2069
                                        ELSE                                    --addq, subq
2070
                                                IF decodeOPC='1' THEN
2071
                                                        ea_build <= '1';
2072
                                                END IF;
2073
                                                IF opcode(5 downto 3)="001" THEN
2074
                                                        no_Flags <= '1';
2075
                                                END IF;
2076
                                                write_back <= '1';
2077
                                                set_exec_ADDQ <= '1';
2078
                                                set_exec_ADD <= '1';
2079
                                                IF execOPC='1' THEN
2080
                                                        ea_data_OP1 <= '1';
2081
                                                        IF endOPC='1' THEN
2082
                                                                Regwrena <= '1';
2083
                                                        END IF;
2084
                                                        IF opcode(8)='1' THEN
2085
                                                                setaddsub <= '0';
2086
                                                        END IF;
2087
                                                END IF;
2088
                                        END IF;
2089
 
2090
-- 0110 ----------------------------------------------------------------------------            
2091
                        WHEN "0110" =>                          --bra,bsr,bcc
2092
                                datatype <= "10";
2093
 
2094
                                IF prefix='0' THEN
2095
                                        IF opcode(11 downto 8)="0001" THEN              --bsr
2096
                                                IF opcode(7 downto 0)="00000000" THEN
2097
                                                        micronext <="00011000";
2098
                                                ELSE
2099
                                                        micronext <="00011001";
2100
                                                        setstate <= "01";
2101
                                                END IF;
2102
                                                microstep <='1';
2103
                                                presub <= '1';
2104
                                                setstackaddr <='1';
2105
                                                set_mem_addsub <= '1';
2106
                                        ELSE                                                                    --bra
2107
                                                IF opcode(7 downto 0)="00000000" THEN
2108
                                                        microstep <='1';
2109
                                                        micronext <="00010010";
2110
                                                END IF;
2111
                                                IF condition='1' THEN
2112
                                                        TG68_PC_br8 <= '1';
2113
                                                END IF;
2114
                                        END IF;
2115
                                END IF;
2116
 
2117
-- 0111 ----------------------------------------------------------------------------            
2118
                        WHEN "0111" =>                          --moveq
2119
                                IF opcode(8)='0' THEN
2120
                                        IF trap_interrupt='0' THEN
2121
                                                datatype <= "10";               --Long
2122
                                                Regwrena <= '1';
2123
                                                set_exec_MOVEQ <= '1';
2124
                                                set_exec_MOVE <= '1';
2125
                                                dest_hbits <= '1';
2126
                                        END IF;
2127
                                ELSE
2128
                                        trap_illegal <= '1';
2129 4 tobiflex
                                        trapmake <= '1';
2130 2 tobiflex
                                END IF;
2131
 
2132
-- 1000 ----------------------------------------------------------------------------            
2133
                        WHEN "1000" =>                                                          --or    
2134
                                IF opcode(7 downto 6)="11" THEN --divu, divs
2135
                                        IF opcode(5 downto 4)="00" THEN --Dn, An
2136
                                                regdirectsource <= '1';
2137
                                        END IF;
2138
                                        IF (prefix='0' AND nextpass='1') OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
2139
                                                set_exec_DIVU <= '1';
2140
                                                setstate <="01";
2141
                                                microstep <='1';
2142
                                                micronext <="10100000";
2143
                                        END IF;
2144
                                        IF decodeOPC='1' THEN
2145
                                                ea_build <= '1';
2146
                                        END IF;
2147
                                        IF execOPC='1' AND z_error='0' AND set_V_Flag='0' THEN
2148
                                                regwrena <= '1';
2149
                                        END IF;
2150
                                        IF (prefix='1' AND nextpass='1') OR execOPC='1' THEN
2151
                                                dest_hbits <= '1';
2152
                                                source_lowbits <='1';
2153
                                        ELSE
2154
                                                datatype <= "01";
2155
                                        END IF;
2156
 
2157
 
2158
                                ELSIF opcode(8)='1' AND opcode(5 downto 4)="00" THEN    --sbcd, pack , unpack
2159
                                        IF opcode(7 downto 6)="00" THEN --sbcd
2160
                                                use_XZFlag <= '1';
2161
                                                set_exec_ADD <= '1';
2162
                                                set_exec_SBCD <= '1';
2163
                                                IF opcode(3)='1' THEN
2164
                                                        write_back <= '1';
2165
                                                        IF decodeOPC='1' THEN
2166
                                                                set_direct_data <= '1';
2167
                                                                setstate <= "10";
2168
                                                                set_mem_addsub <= '1';
2169
                                                                presub <= '1';
2170
                                                                microstep <='1';
2171
                                                                micronext <="00110000";
2172
                                                        END IF;
2173
                                                END IF;
2174
                                                IF execOPC='1' THEN
2175
                                                        ea_data_OP1 <= '1';
2176
                                                        dest_hbits <= '1';
2177
                                                        source_lowbits <='1';
2178
                                                        IF endOPC='1' THEN
2179
                                                                Regwrena <= '1';
2180
                                                        END IF;
2181
                                                END IF;
2182
                                        ELSE                                                                    --pack, unpack
2183
                                                trap_illegal <= '1';
2184 4 tobiflex
                                                trapmake <= '1';
2185 2 tobiflex
                                        END IF;
2186
                                ELSE                                                                    --or
2187
                                        set_exec_OR <= '1';
2188
                                        IF opcode(8)='1' THEN
2189
                                                 write_back <= '1';
2190
                                        END IF;
2191
                                        IF decodeOPC='1' THEN
2192
                                                ea_build <= '1';
2193
                                        END IF;
2194
                                        IF execOPC='1' THEN
2195
                                                IF endOPC='1' THEN
2196
                                                        Regwrena <= '1';
2197
                                                END IF;
2198
                                                IF opcode(8)='1' THEN
2199
                                                        ea_data_OP1 <= '1';
2200
                                                ELSE
2201
                                                        dest_hbits <= '1';
2202
                                                        source_lowbits <='1';
2203
                                                        IF opcode(3)='1' THEN
2204
                                                                source_areg <= '1';
2205
                                                        END IF;
2206
                                                END IF;
2207
                                        END IF;
2208
                                END IF;
2209
 
2210
-- 1001, 1101 -----------------------------------------------------------------------           
2211
                        WHEN "1001"|"1101" =>                                           --sub, add      
2212
                                set_exec_ADD <= '1';
2213
                                IF decodeOPC='1' THEN
2214
                                        ea_build <= '1';
2215
                                END IF;
2216
                                IF opcode(8 downto 6)="011" THEN        --adda.w, suba.w
2217
                                        datatype <= "01";       --Word
2218
                                END IF;
2219
                                IF execOPC='1' THEN
2220
                                        IF endOPC='1' THEN
2221
                                                Regwrena <= '1';
2222
                                        END IF;
2223
                                        IF opcode(14)='0' THEN
2224
                                                setaddsub <= '0';
2225
                                        END IF;
2226
                                END IF;
2227
                                IF opcode(8)='1' AND opcode(5 downto 4)="00" AND opcode(7 downto 6)/="11" THEN          --addx, subx
2228
                                        use_XZFlag <= '1';
2229
                                        IF opcode(3)='1' THEN
2230
                                                write_back <= '1';
2231
                                                IF decodeOPC='1' THEN
2232
                                                        set_direct_data <= '1';
2233
                                                        setstate <= "10";
2234
                                                        set_mem_addsub <= '1';
2235
                                                        presub <= '1';
2236
                                                        microstep <='1';
2237
                                                        micronext <="00110000";
2238
                                                END IF;
2239
                                        END IF;
2240
                                        IF execOPC='1' THEN
2241
                                                ea_data_OP1 <= '1';
2242
                                                dest_hbits <= '1';
2243
                                                source_lowbits <='1';
2244
                                        END IF;
2245
                                ELSE                                                                                                    --sub, add
2246
                                        IF opcode(8)='1' AND opcode(7 downto 6)/="11" THEN
2247
                                                 write_back <= '1';
2248
                                        END IF;
2249
                                        IF execOPC='1' THEN
2250
                                                IF      opcode(7 downto 6)="11" THEN    --adda, suba
2251
                                                        no_Flags <= '1';
2252
                                                        dest_areg <='1';
2253
                                                        dest_hbits <= '1';
2254
                                                        source_lowbits <='1';
2255
                                                        IF opcode(3)='1' THEN
2256
                                                                source_areg <= '1';
2257
                                                        END IF;
2258
                                                ELSE
2259
                                                        IF opcode(8)='1' THEN
2260
                                                                ea_data_OP1 <= '1';
2261
                                                        ELSE
2262
                                                                dest_hbits <= '1';
2263
                                                                source_lowbits <='1';
2264
                                                                IF opcode(3)='1' THEN
2265
                                                                        source_areg <= '1';
2266
                                                                END IF;
2267
                                                        END IF;
2268
                                                END IF;
2269
                                        END IF;
2270
                                END IF;
2271
 
2272
-- 1010 ----------------------------------------------------------------------------            
2273
                        WHEN "1010" =>                                                  --Trap 1010
2274
                                trap_1010 <= '1';
2275 4 tobiflex
                                trapmake <= '1';
2276 2 tobiflex
-- 1011 ----------------------------------------------------------------------------            
2277
                        WHEN "1011" =>                                                  --eor, cmp
2278
                                IF decodeOPC='1' THEN
2279
                                        ea_build <= '1';
2280
                                END IF;
2281
                                IF opcode(8 downto 6)="011" THEN        --cmpa.w
2282
                                        datatype <= "01";       --Word
2283
                                        set_exec_CPMAW <= '1';
2284
                                END IF;
2285
                                IF opcode(8)='1' AND opcode(5 downto 3)="001" AND opcode(7 downto 6)/="11" THEN         --cmpm
2286
                                        set_exec_CMP <= '1';
2287
                                        IF decodeOPC='1' THEN
2288
                                                set_direct_data <= '1';
2289
                                                setstate <= "10";
2290
                                                set_mem_rega <= '1';
2291
                                                postadd <= '1';
2292
                                                microstep <='1';
2293
                                                micronext <="00110010";
2294
                                        END IF;
2295
                                        IF execOPC='1' THEN
2296
                                                ea_data_OP1 <= '1';
2297
                                                setaddsub <= '0';
2298
                                        END IF;
2299
                                ELSE                                                                                                    --sub, add
2300
                                        IF opcode(8)='1' AND opcode(7 downto 6)/="11" THEN      --eor
2301
                                                set_exec_EOR <= '1';
2302
                                                 write_back <= '1';
2303
                                        ELSE                                    --cmp
2304
                                                set_exec_CMP <= '1';
2305
                                        END IF;
2306
 
2307
                                        IF execOPC='1' THEN
2308
                                                IF opcode(8)='1' AND opcode(7 downto 6)/="11" THEN      --eor
2309
                                                        ea_data_OP1 <= '1';
2310
                                                        IF endOPC='1' THEN
2311
                                                                Regwrena <= '1';
2312
                                                        END IF;
2313
                                                ELSE                                                                    --cmp
2314
                                                        source_lowbits <='1';
2315
                                                        IF opcode(3)='1' THEN
2316
                                                                source_areg <= '1';
2317
                                                        END IF;
2318
                                                        IF      opcode(7 downto 6)="11" THEN    --cmpa
2319
                                                                dest_areg <='1';
2320
                                                        END IF;
2321
                                                        dest_hbits <= '1';
2322
                                                        setaddsub <= '0';
2323
                                                END IF;
2324
                                        END IF;
2325
                                END IF;
2326
 
2327
-- 1100 ----------------------------------------------------------------------------            
2328
                        WHEN "1100" =>                                                          --and, exg
2329
                                IF opcode(7 downto 6)="11" THEN --mulu, muls
2330
                                        IF opcode(5 downto 4)="00" THEN --Dn, An
2331
                                                regdirectsource <= '1';
2332
                                        END IF;
2333
                                        IF (prefix='0' AND nextpass='1') OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
2334
                                                set_exec_MULU <= '1';
2335
                                                setstate <="01";
2336
                                                microstep <='1';
2337
                                                micronext <="10000000";
2338
                                        END IF;
2339
                                        IF decodeOPC='1' THEN
2340
                                                ea_build <= '1';
2341
                                        END IF;
2342
                                        IF      execOPC='1' THEN
2343
                                                regwrena <= '1';
2344
                                        END IF;
2345
                                        IF (prefix='1' AND nextpass='1') OR execOPC='1' THEN
2346
                                                dest_hbits <= '1';
2347
                                                source_lowbits <='1';
2348
                                        ELSE
2349
                                                datatype <= "01";
2350
                                        END IF;
2351
 
2352
                                ELSIF opcode(8)='1' AND opcode(5 downto 4)="00" THEN    --exg, abcd
2353
                                        IF opcode(7 downto 6)="00" THEN --abcd
2354
                                                use_XZFlag <= '1';
2355
--                                              datatype <= "00";               --ist schon default
2356
                                                set_exec_ADD <= '1';
2357
                                                set_exec_ABCD <= '1';
2358
                                                IF opcode(3)='1' THEN
2359
                                                        write_back <= '1';
2360
                                                        IF decodeOPC='1' THEN
2361
                                                                set_direct_data <= '1';
2362
                                                                setstate <= "10";
2363
                                                                set_mem_addsub <= '1';
2364
                                                                presub <= '1';
2365
                                                                microstep <='1';
2366
                                                                micronext <="00110000";
2367
                                                        END IF;
2368
                                                END IF;
2369
                                                IF execOPC='1' THEN
2370
                                                        ea_data_OP1 <= '1';
2371
                                                        dest_hbits <= '1';
2372
                                                        source_lowbits <='1';
2373
                                                        IF endOPC='1' THEN
2374
                                                                Regwrena <= '1';
2375
                                                        END IF;
2376
                                                END IF;
2377
                                        ELSE                                                                    --exg
2378
                                                datatype <= "10";
2379
                                                regwrena <= '1';
2380
                                                IF opcode(6)='1' AND opcode(3)='1' THEN
2381
                                                        dest_areg <= '1';
2382
                                                        source_areg <= '1';
2383
                                                END IF;
2384
                                                IF decodeOPC='1' THEN
2385
                                                        set_mem_rega <= '1';
2386
                                                        exec_exg <= '1';
2387
                                                ELSE
2388
                                                        save_memaddr <= '1';
2389
                                                        dest_hbits <= '1';
2390
                                                END IF;
2391
                                        END IF;
2392
                                ELSE                                                                    --and
2393
                                        set_exec_AND <= '1';
2394
                                        IF opcode(8)='1' THEN
2395
                                                 write_back <= '1';
2396
                                        END IF;
2397
                                        IF decodeOPC='1' THEN
2398
                                                ea_build <= '1';
2399
                                        END IF;
2400
 
2401
                                        IF execOPC='1' THEN
2402
                                                IF endOPC='1' THEN
2403
                                                        Regwrena <= '1';
2404
                                                END IF;
2405
                                                IF opcode(8)='1' THEN
2406
                                                        ea_data_OP1 <= '1';
2407
                                                ELSE
2408
                                                        dest_hbits <= '1';
2409
                                                        source_lowbits <='1';
2410
                                                        IF opcode(3)='1' THEN
2411
                                                                source_areg <= '1';
2412
                                                        END IF;
2413
                                                END IF;
2414
                                        END IF;
2415
                                END IF;
2416
 
2417
-- 1110 ----------------------------------------------------------------------------            
2418
                        WHEN "1110" =>                                                          --rotation      
2419
                                set_exec_ROT <= '1';
2420
                                IF opcode(7 downto 6)="11" THEN
2421
                                        datatype <= "01";
2422
                                        rot_bits <= opcode(10 downto 9);
2423
                                        ea_data_OP1 <= '1';
2424
                                        write_back <= '1';
2425
                                ELSE
2426
                                        rot_bits <= opcode(4 downto 3);
2427
                                        data_is_source <= '1';
2428
                                END IF;
2429
 
2430
                                IF decodeOPC='1' THEN
2431
                                        IF opcode(7 downto 6)="11" THEN
2432
                                                ea_build <= '1';
2433
                                        ELSE
2434
                                                IF opcode(5)='1' THEN
2435
                                                        IF OP2out(5 downto 0)/="000000" THEN
2436
                                                                set_rot_cnt <= OP2out(5 downto 0);
2437
--                                                      ELSE
2438
--                                                              set_no_Flags <='1';
2439
                                                        END IF;
2440
                                                ELSE
2441
                                                        set_rot_cnt(2 downto 0) <= opcode(11 downto 9);
2442
                                                        IF opcode(11 downto 9)="000" THEN
2443
                                                                set_rot_cnt(3) <='1';
2444
                                                        ELSE
2445
                                                                set_rot_cnt(3) <='0';
2446
                                                        END IF;
2447
                                                END IF;
2448
                                        END IF;
2449
                                END IF;
2450
                                IF opcode(7 downto 6)/="11" THEN
2451
                                        IF opcode(5)='1' AND OP2out(5 downto 0)="000000" THEN            --Macht Fehler wenn mit sich selbst geschoben wird
2452
--                                              no_Flags <= '1';
2453
                                                rot_nop <= '1';
2454
                                        ELSIF execOPC='1' THEN
2455
                                                Regwrena <= '1';
2456
                                                set_rot_cnt <= rot_cnt-1;
2457
                                        END IF;
2458
                                END IF;
2459
 
2460
--      ----------------------------------------------------------------------------            
2461
                        WHEN OTHERS =>
2462
                                trap_1111 <= '1';
2463 4 tobiflex
                                trapmake <= '1';
2464 2 tobiflex
 
2465
                END CASE;
2466
 
2467
--      END PROCESS;
2468
 
2469
-----------------------------------------------------------------------------
2470
-- execute microcode
2471
-----------------------------------------------------------------------------
2472
--PROCESS (microaddr)
2473
--      BEGIN
2474
                IF Z_error='1'  THEN            -- divu by zero
2475 4 tobiflex
                        trapmake <= '1';                        --wichtig für USP
2476 2 tobiflex
                        IF trapd='0' THEN
2477
                                writePC <= '1';
2478
                                microset <= '1';
2479
                        END IF;
2480
                END IF;
2481
 
2482 4 tobiflex
                IF trapmake='1' AND trapd='0' THEN
2483 2 tobiflex
                        microstep <= '1';
2484
                        micronext <= "01010000";
2485
                        presub <= '1';
2486
                        setstackaddr <='1';
2487
                        set_mem_addsub <= '1';
2488
                        setstate <= "11";
2489
                        datatype <= "10";
2490
                END IF;
2491
 
2492
                IF interrupt='1' THEN
2493
                        microstep <= '1';
2494
                        micronext <= "01000100";
2495
                        setstate <= "10";
2496
--                      datatype <= "01";               --wirkt sich auf Flags aus
2497
                END IF;
2498
 
2499
 
2500
                IF reset='0' THEN
2501
                        microaddr <= "01100000";                --init
2502
                        prefix <= '1';
2503
                ELSIF rising_edge(clk) THEN
2504
                IF clkena='1' THEN
2505 4 tobiflex
                                trapd <= trapmake;
2506 2 tobiflex
                                prefix <= (prefix AND ea_build) OR (microstep AND NOT fetchOPC);
2507
                                IF prefix='1' AND ea_build='0' AND microset='0' THEN
2508
                                        microaddr <= microaddr + micronext;
2509
                                ELSE
2510
                                        microaddr <= micronext;
2511
                                END IF;
2512
                        END IF;
2513
                END IF;
2514
                IF prefix='1' THEN
2515
                        CASE microaddr IS
2516
                                WHEN "00000001" =>              -- nop
2517
 
2518
                                WHEN "00000010" =>              -- (nnnn).w/l=>
2519
                                        get_ea_now <='1';
2520
                                        setnextpass <= '1';
2521
                                        setaddrlong <= '1';
2522
 
2523
                                WHEN "00000011" =>              -- =>(nnnn).w/l
2524
                                        setstate <= "11";
2525
                                        setaddrlong <= '1';
2526
                                        microstep <='1';
2527
 
2528
                                WHEN "00000110" =>              -- d(An)=>, --d(PC)=>
2529
                                        microstep <='1';
2530
                                        setstate <= "01";
2531
                                WHEN "00000111" =>              -- d(An)=>, --d(PC)=>
2532
                                        get_ea_now <='1';
2533
                                        setdisp <= '1';         --word
2534
                                        setnextpass <= '1';
2535
 
2536
                                WHEN "00001000" =>              -- d(An,Xn)=>, --d(PC,Xn)=>
2537
                                        microstep <='1';
2538
                                        setstate <= "01";
2539
                                WHEN "00001001" =>              -- d(An,Xn)=>, --d(PC,Xn)=>
2540
                                        setdisp <= '1';         --byte  
2541
                                        setdispbyte <= '1';
2542
                                        microstep <='1';
2543
                                        setstate <= "01";
2544
                                        setbriefext <= '1';
2545
                                WHEN "00001010" =>
2546
                                        get_ea_now <='1';
2547
                                        setdisp <= '1';         --brief
2548
                                        setdispbrief <= '1';
2549
                                        setnextpass <= '1';
2550
 
2551
                                WHEN "00001011" =>              -- =>d(An)
2552
                                        microstep <='1';
2553
                                        setstate <= "01";
2554
                                WHEN "00001100" =>              -- =>d(An)
2555
                                        setstate <= "11";
2556
                                        setdisp <= '1';         --word
2557
                                        microstep <='1';
2558
                                WHEN "00001101" =>
2559
 
2560
                                WHEN "00001110" =>              -- =>d(An,Xn)
2561
                                        microstep <='1';
2562
                                        setstate <= "01";
2563
                                WHEN "00001111" =>              -- =>d(An,Xn)
2564
                                        setdisp <= '1';         --byte
2565
                                        setdispbyte <= '1';
2566
                                        microstep <='1';
2567
                                        setstate <= "01";
2568
                                        setbriefext <= '1';
2569
                                WHEN "00010000" =>
2570
                                        setstate <= "11";
2571
                                        setdisp <= '1';         --brief 
2572
                                        setdispbrief <= '1';
2573
                                        microstep <='1';
2574
                                WHEN "00010001" =>
2575
 
2576
                                WHEN "00010010" =>              --bra
2577
                                        IF condition='1' THEN
2578
                                                TG68_PC_br8 <= '1';     --pc+0000
2579
                                                microstep <='1';
2580
                                                setstate <= "01";
2581
                                        END IF;
2582
                                WHEN "00010011" =>              --bra
2583
                                        TG68_PC_brw <= '1';
2584
 
2585
                                WHEN "00011000" =>              --bsr
2586
                                        set_TG68_PC_dec <= '1';         --in 2 Takten -2
2587
                                        microstep <='1';
2588
                                        setstate <= "01";
2589
                                WHEN "00011001" =>              --bsr
2590
                                        IF TG68_PC_dec(0)='1' THEN
2591
                                                TG68_PC_brw <= '1';
2592
                                        ELSE
2593
                                                TG68_PC_br8 <= '1';
2594
                                        END IF;
2595
                                        writePC <= '1';
2596
                                        setstate <= "11";
2597
                                        microstep <='1';
2598
                                WHEN "00011010" =>              --bsr
2599
 
2600
                                WHEN "00011110" =>              --dbcc
2601
                                        TG68_PC_nop <= '1';
2602
                                        microstep <='1';
2603
                                        setstate <= "01";
2604
                                WHEN "00011111" =>              --dbcc
2605
                                        TG68_PC_brw <= '1';
2606
 
2607
                                WHEN "00100010" =>              --movem
2608
                                        set_movem_busy <='1';
2609
                                        setstate <= "10";
2610
 
2611
                                WHEN "00101000" =>              --andi
2612
                                        IF opcode(5 downto 4)/="00" THEN
2613
                                                ea_build <= '1';
2614
                                                setnextpass <= '1';
2615
                                        END IF;
2616
 
2617
                                WHEN "00101100" =>              --jsr
2618
                                        presub <= '1';
2619
                                        setstackaddr <='1';
2620
                                        set_mem_addsub <= '1';
2621
                                        setstate <= "11";
2622
 
2623
                                WHEN "00110000" =>              -- op -(Ax),-(Ay)
2624
                                        presub <= '1';
2625
                                        dest_hbits <= '1';
2626
                                        dest_areg <= '1';
2627
                                        set_mem_addsub <= '1';
2628
                                        setstate <= "10";
2629
 
2630
                                WHEN "00110010" =>              -- cmpm (Ay)+,(Ax)+
2631
                                        postadd <= '1';
2632
                                        dest_hbits <= '1';
2633
                                        dest_areg <= '1';
2634
                                        set_mem_rega <= '1';
2635
                                        setstate <= "10";
2636
 
2637
                                WHEN "01000000" =>              -- link
2638
                                        setstate <="11";
2639
                                        save_memaddr <= '1';
2640
                                        regwrena <= '1';
2641
 
2642
                                WHEN "01000100" =>              -- interrupt
2643
                                        microstep <= '1';
2644
                                        presub <= '1';
2645
                                        setstackaddr <='1';
2646
                                        set_mem_addsub <= '1';
2647
                                        setstate <= "11";
2648
                                        datatype <= "10";
2649
                                WHEN "01000101" =>              -- interrupt
2650
                                        microstep <= '1';
2651
                                        presub <= '1';
2652
                                        setstackaddr <='1';
2653
                                        set_mem_addsub <= '1';
2654
                                        setstate <= "11";
2655
                                        datatype <= "01";
2656
                                        writeSR <= '1';
2657
                                WHEN "01000110" =>              -- interrupt
2658
                                        set_vectoraddr <= '1';
2659
                                        datatype <= "10";
2660
                                        set_directPC <= '1';
2661
                                        microstep <='1';
2662
 
2663
                                        setstate <= "10";
2664
                                WHEN "01000111" =>              -- interrupt
2665
                                        datatype <= "10";
2666
 
2667
                                WHEN "01001000" =>              -- RTE
2668
                                        datatype <= "10";
2669
                                        setstate <= "10";
2670
                                        postadd <= '1';
2671
                                        setstackaddr <= '1';
2672
                                        set_mem_rega <= '1';
2673
                                        set_directPC <= '1';
2674
                                        microstep <='1';
2675
 
2676
                                WHEN "01010000" =>              -- TRAP
2677
                                        microstep <= '1';
2678
                                        presub <= '1';
2679
                                        setstackaddr <='1';
2680
                                        set_mem_addsub <= '1';
2681
                                        setstate <= "11";
2682
                                        datatype <= "01";
2683
                                        writeSR <= '1';
2684
                                WHEN "01010001" =>              -- TRAP
2685
                                        set_vectoraddr <= '1';
2686
                                        datatype <= "10";
2687
                                        set_directPC <= '1';
2688
                                        microstep <='1';
2689
--                                      longreaddirect <= '1';
2690
                                        setstate <= "10";
2691
                                WHEN "01010010" =>              -- TRAP
2692
                                        datatype <= "10";
2693
 
2694 4 tobiflex
                                WHEN "01010110" =>              -- MOVEP d(An)
2695
                                        microstep <='1';
2696
                                        setstate <= "01";
2697
                                        IF opcode(6)='1' THEN
2698
                                                set_movepl <= '1';
2699
                                        END IF;
2700
                                WHEN "01010111" =>
2701
                                        microstep <='1';
2702
                                        setdisp <= '1';
2703
                                        IF opcode(7)='0' THEN
2704
                                                setstate <= "10";
2705
                                        ELSE
2706
                                                setstate <= "11";
2707
                                                wait_mem_byte <= '1';
2708
                                        END IF;
2709
                                WHEN "01011000" =>
2710
                                        IF opcode(6)='1' THEN
2711
                                                microstep <='1';
2712
                                                set_movepw <= '1';
2713
                                        END IF;
2714
                                        IF opcode(7)='0' THEN
2715
                                                setstate <= "10";
2716
                                        ELSE
2717
                                                setstate <= "11";
2718
                                        END IF;
2719
                                WHEN "01011001" =>
2720
                                        microstep <='1';
2721 2 tobiflex
 
2722 4 tobiflex
                                        IF opcode(7)='0' THEN
2723
                                                setstate <= "10";
2724
                                        ELSE
2725
                                                wait_mem_byte <= '1';
2726
                                                setstate <= "11";
2727
                                        END IF;
2728
                                WHEN "01011010" =>
2729
                                        IF opcode(7)='0' THEN
2730
                                                setstate <= "10";
2731
                                        ELSE
2732
                                                setstate <= "11";
2733
                                        END IF;
2734
 
2735 2 tobiflex
 
2736 4 tobiflex
 
2737 2 tobiflex
 
2738 4 tobiflex
 
2739 2 tobiflex
                                WHEN "01100000" =>              -- init SP
2740
                                        microstep <='1';
2741
                                        longreaddirect <= '1';
2742
                                WHEN "01100001" =>              -- init PC
2743
                                        get_ea_now <='1';       --\
2744
                                        ea_only <= '1';         ---  OP1in <= memaddr_in
2745
                                        setaddrlong <= '1';     --   memaddr_in <= data_read
2746
                                        regwrena <= '1';
2747
                                        setstackaddr <='1';     --   dest_addr <= SP
2748
                                        set_directPC <= '1';
2749
                                        microstep <='1';
2750
                                        longreaddirect <= '1';
2751
--                              WHEN "01100010" =>              -- wr SP
2752
 
2753
 
2754
 
2755
 
2756
                                WHEN "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|
2757
                                         "10000111"|"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"   =>              -- mulu
2758
                                        microstep <='1';
2759
                                        set_exec_MULU <= '1';
2760
                                        setstate <="01";
2761
                                WHEN "10001110" =>              -- mulu
2762
                                        set_exec_MULU <= '1';
2763
 
2764
 
2765
                                WHEN "10100000" =>              -- divu
2766
                                        IF OP2out(15 downto 0)=x"0000" THEN              --div zero
2767
                                                set_Z_error <= '1';
2768
                                                microset <= '1';
2769
                                        ELSE
2770
                                                set_exec_DIVU <= '1';
2771
                                        END IF;
2772
                                        setstate <="01";
2773
                                        microstep <='1';
2774
                                WHEN "10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100110"|"10100111"|
2775
                                         "10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101" =>           -- divu
2776
                                        microstep <='1';
2777
                                        set_exec_DIVU <= '1';
2778
                                        setstate <="01";
2779
                                WHEN "10101110" =>              -- divu
2780
                                        set_exec_DIVU <= '1';
2781
 
2782
 
2783 6 tobiflex
                                WHEN OTHERS => null;
2784 2 tobiflex
                        END CASE;
2785
                END IF;
2786
        END PROCESS;
2787
 
2788
-----------------------------------------------------------------------------
2789
-- Conditions
2790
-----------------------------------------------------------------------------
2791
PROCESS (opcode, Flags)
2792
        BEGIN
2793
                CASE opcode(11 downto 8) IS
2794
                        WHEN X"0" => condition <= '1';
2795
                        WHEN X"1" => condition <= '0';
2796
                        WHEN X"2" => condition <=  NOT Flags(0) AND NOT Flags(2);
2797
                        WHEN X"3" => condition <= Flags(0) OR Flags(2);
2798
                        WHEN X"4" => condition <= NOT Flags(0);
2799
                        WHEN X"5" => condition <= Flags(0);
2800
                        WHEN X"6" => condition <= NOT Flags(2);
2801
                        WHEN X"7" => condition <= Flags(2);
2802
                        WHEN X"8" => condition <= NOT Flags(1);
2803
                        WHEN X"9" => condition <= Flags(1);
2804
                        WHEN X"a" => condition <= NOT Flags(3);
2805
                        WHEN X"b" => condition <= Flags(3);
2806
                        WHEN X"c" => condition <= (Flags(3) AND Flags(1)) OR (NOT Flags(3) AND NOT Flags(1));
2807
                        WHEN X"d" => condition <= (Flags(3) AND NOT Flags(1)) OR (NOT Flags(3) AND Flags(1));
2808
                        WHEN X"e" => condition <= (Flags(3) AND Flags(1) AND NOT Flags(2)) OR (NOT Flags(3) AND NOT Flags(1) AND NOT Flags(2));
2809
                        WHEN X"f" => condition <= (Flags(3) AND NOT Flags(1)) OR (NOT Flags(3) AND Flags(1)) OR Flags(2);
2810 6 tobiflex
                        WHEN OTHERS => null;
2811 2 tobiflex
                END CASE;
2812
        END PROCESS;
2813
 
2814
-----------------------------------------------------------------------------
2815
-- Bits
2816
-----------------------------------------------------------------------------
2817
PROCESS (opcode, OP1out, OP2out, one_bit_in, one_bit_out, bit_Number, bit_number_reg)
2818
        BEGIN
2819
                CASE opcode(7 downto 6) IS
2820
                        WHEN "00" =>                                    --btst
2821
                                                one_bit_out <= one_bit_in;
2822
                        WHEN "01" =>                                    --bchg
2823
                                                one_bit_out <= NOT one_bit_in;
2824
                        WHEN "10" =>                                    --bclr
2825
                                                one_bit_out <= '0';
2826
                        WHEN "11" =>                                    --bset
2827
                                                one_bit_out <= '1';
2828 6 tobiflex
                        WHEN OTHERS => null;
2829 2 tobiflex
                END CASE;
2830
 
2831
                IF opcode(8)='0' THEN
2832
                        IF opcode(5 downto 4)="00" THEN
2833
                                bit_number <= bit_number_reg(4 downto 0);
2834
                        ELSE
2835
                                bit_number <= "00"&bit_number_reg(2 downto 0);
2836
                        END IF;
2837
                ELSE
2838
                        IF opcode(5 downto 4)="00" THEN
2839
                                bit_number <= OP2out(4 downto 0);
2840
                        ELSE
2841
                                bit_number <= "00"&OP2out(2 downto 0);
2842
                        END IF;
2843
                END IF;
2844
 
2845
                bits_out <= OP1out;
2846
                CASE bit_Number IS
2847
                        WHEN "00000" => one_bit_in <= OP1out(0);
2848
                                                        bits_out(0) <= one_bit_out;
2849
                        WHEN "00001" => one_bit_in <= OP1out(1);
2850
                                                        bits_out(1) <= one_bit_out;
2851
                        WHEN "00010" => one_bit_in <= OP1out(2);
2852
                                                        bits_out(2) <= one_bit_out;
2853
                        WHEN "00011" => one_bit_in <= OP1out(3);
2854
                                                        bits_out(3) <= one_bit_out;
2855
                        WHEN "00100" => one_bit_in <= OP1out(4);
2856
                                                        bits_out(4) <= one_bit_out;
2857
                        WHEN "00101" => one_bit_in <= OP1out(5);
2858
                                                        bits_out(5) <= one_bit_out;
2859
                        WHEN "00110" => one_bit_in <= OP1out(6);
2860
                                                        bits_out(6) <= one_bit_out;
2861
                        WHEN "00111" => one_bit_in <= OP1out(7);
2862
                                                        bits_out(7) <= one_bit_out;
2863
                        WHEN "01000" => one_bit_in <= OP1out(8);
2864
                                                        bits_out(8) <= one_bit_out;
2865
                        WHEN "01001" => one_bit_in <= OP1out(9);
2866
                                                        bits_out(9) <= one_bit_out;
2867
                        WHEN "01010" => one_bit_in <= OP1out(10);
2868
                                                        bits_out(10) <= one_bit_out;
2869
                        WHEN "01011" => one_bit_in <= OP1out(11);
2870
                                                        bits_out(11) <= one_bit_out;
2871
                        WHEN "01100" => one_bit_in <= OP1out(12);
2872
                                                        bits_out(12) <= one_bit_out;
2873
                        WHEN "01101" => one_bit_in <= OP1out(13);
2874
                                                        bits_out(13) <= one_bit_out;
2875
                        WHEN "01110" => one_bit_in <= OP1out(14);
2876
                                                        bits_out(14) <= one_bit_out;
2877
                        WHEN "01111" => one_bit_in <= OP1out(15);
2878
                                                        bits_out(15) <= one_bit_out;
2879
                        WHEN "10000" => one_bit_in <= OP1out(16);
2880
                                                        bits_out(16) <= one_bit_out;
2881
                        WHEN "10001" => one_bit_in <= OP1out(17);
2882
                                                        bits_out(17) <= one_bit_out;
2883
                        WHEN "10010" => one_bit_in <= OP1out(18);
2884
                                                        bits_out(18) <= one_bit_out;
2885
                        WHEN "10011" => one_bit_in <= OP1out(19);
2886
                                                        bits_out(19) <= one_bit_out;
2887
                        WHEN "10100" => one_bit_in <= OP1out(20);
2888
                                                        bits_out(20) <= one_bit_out;
2889
                        WHEN "10101" => one_bit_in <= OP1out(21);
2890
                                                        bits_out(21) <= one_bit_out;
2891
                        WHEN "10110" => one_bit_in <= OP1out(22);
2892
                                                        bits_out(22) <= one_bit_out;
2893
                        WHEN "10111" => one_bit_in <= OP1out(23);
2894
                                                        bits_out(23) <= one_bit_out;
2895
                        WHEN "11000" => one_bit_in <= OP1out(24);
2896
                                                        bits_out(24) <= one_bit_out;
2897
                        WHEN "11001" => one_bit_in <= OP1out(25);
2898
                                                        bits_out(25) <= one_bit_out;
2899
                        WHEN "11010" => one_bit_in <= OP1out(26);
2900
                                                        bits_out(26) <= one_bit_out;
2901
                        WHEN "11011" => one_bit_in <= OP1out(27);
2902
                                                        bits_out(27) <= one_bit_out;
2903
                        WHEN "11100" => one_bit_in <= OP1out(28);
2904
                                                        bits_out(28) <= one_bit_out;
2905
                        WHEN "11101" => one_bit_in <= OP1out(29);
2906
                                                        bits_out(29) <= one_bit_out;
2907
                        WHEN "11110" => one_bit_in <= OP1out(30);
2908
                                                        bits_out(30) <= one_bit_out;
2909
                        WHEN "11111" => one_bit_in <= OP1out(31);
2910
                                                        bits_out(31) <= one_bit_out;
2911 6 tobiflex
                        WHEN OTHERS =>  null;
2912 2 tobiflex
                END CASE;
2913
        END PROCESS;
2914
 
2915
-----------------------------------------------------------------------------
2916
-- Rotation
2917
-----------------------------------------------------------------------------
2918
PROCESS (opcode, OP1out, Flags, rot_bits, rot_msb, rot_lsb, rot_rot, rot_nop)
2919
        BEGIN
2920
                CASE opcode(7 downto 6) IS
2921
                        WHEN "00" =>                                    --Byte
2922
                                                rot_rot <= OP1out(7);
2923
                        WHEN "01"|"11" =>                               --Word
2924
                                                rot_rot <= OP1out(15);
2925
                        WHEN "10" =>                                    --Long
2926
                                                rot_rot <= OP1out(31);
2927 6 tobiflex
                        WHEN OTHERS => null;
2928 2 tobiflex
                END CASE;
2929
 
2930
                CASE rot_bits IS
2931
                        WHEN "00" =>                                    --ASL, ASR
2932
                                                rot_lsb <= '0';
2933
                                                rot_msb <= rot_rot;
2934
                        WHEN "01" =>                                    --LSL, LSR
2935
                                                rot_lsb <= '0';
2936
                                                rot_msb <= '0';
2937
                        WHEN "10" =>                                    --ROXL, ROXR
2938
                                                rot_lsb <= Flags(4);
2939
                                                rot_msb <= Flags(4);
2940
                        WHEN "11" =>                                    --ROL, ROR
2941
                                                rot_lsb <= rot_rot;
2942
                                                rot_msb <= OP1out(0);
2943 6 tobiflex
                        WHEN OTHERS => null;
2944 2 tobiflex
                END CASE;
2945
 
2946
                IF rot_nop='1' THEN
2947
                        rot_out <= OP1out;
2948
                        rot_XC <= Flags(0);
2949
                ELSE
2950
                        IF opcode(8)='1' THEN           --left
2951
                                rot_out <= OP1out(30 downto 0)&rot_lsb;
2952
                                rot_XC <= rot_rot;
2953
                        ELSE                                            --right
2954
                                rot_XC <= OP1out(0);
2955
                                rot_out <= rot_msb&OP1out(31 downto 1);
2956
                                CASE opcode(7 downto 6) IS
2957
                                        WHEN "00" =>                                    --Byte
2958
                                                rot_out(7) <= rot_msb;
2959
                                        WHEN "01"|"11" =>                               --Word
2960
                                                rot_out(15) <= rot_msb;
2961
                                        WHEN OTHERS =>
2962
                                END CASE;
2963
                        END IF;
2964
                END IF;
2965
        END PROCESS;
2966
 
2967
-----------------------------------------------------------------------------
2968
-- MULU/MULS
2969
-----------------------------------------------------------------------------
2970
PROCESS (clk, opcode, OP2out, muls_msb, mulu_reg, OP1sign, sign2)
2971
        BEGIN
2972
                IF rising_edge(clk) THEN
2973
                        IF clkena='1' THEN
2974
                                IF decodeOPC='1' THEN
2975
                                        IF opcode(8)='1' AND reg_QB(15)='1' THEN                                --MULS Neg faktor
2976
                                                OP1sign <= '1';
2977
                                                mulu_reg <= "0000000000000000"&(0-reg_QB(15 downto 0));
2978
                                        ELSE
2979
                                                OP1sign <= '0';
2980
                                                mulu_reg <= "0000000000000000"&reg_QB(15 downto 0);
2981
                                        END IF;
2982
                                ELSIF exec_MULU='1' THEN
2983
                                        mulu_reg <= dummy_mulu;
2984
                                END IF;
2985
                        END IF;
2986
                END IF;
2987
 
2988
                IF (opcode(8)='1' AND OP2out(15)='1') OR OP1sign='1' THEN
2989
                        muls_msb <= mulu_reg(31);
2990
                ELSE
2991
                        muls_msb <= '0';
2992
                END IF;
2993
 
2994
                IF opcode(8)='1' AND OP2out(15)='1' THEN
2995
                        sign2 <= '1';
2996
                ELSE
2997
                        sign2 <= '0';
2998
                END IF;
2999
 
3000
                IF mulu_reg(0)='1' THEN
3001
                        IF OP1sign='1' THEN
3002
                                dummy_mulu <= (muls_msb&mulu_reg(31 downto 16))-(sign2&OP2out(15 downto 0))& mulu_reg(15 downto 1);
3003
                        ELSE
3004
                                dummy_mulu <= (muls_msb&mulu_reg(31 downto 16))+(sign2&OP2out(15 downto 0))& mulu_reg(15 downto 1);
3005
                        END IF;
3006
                ELSE
3007
                        dummy_mulu <= muls_msb&mulu_reg(31 downto 1);
3008
                END IF;
3009
        END PROCESS;
3010
 
3011
-----------------------------------------------------------------------------
3012
-- DIVU
3013
-----------------------------------------------------------------------------
3014
PROCESS (clk, execOPC, opcode, OP1out, OP2out, div_reg, dummy_div_sub, div_quot, div_sign, dummy_div_over, dummy_div)
3015
        BEGIN
3016
                set_V_Flag <= '0';
3017
 
3018
                IF rising_edge(clk) THEN
3019
                        IF clkena='1' THEN
3020
                                IF decodeOPC='1' THEN
3021
                                        IF opcode(8)='1' AND reg_QB(31)='1' THEN                                -- Neg divisor
3022
                                                div_sign <= '1';
3023
                                                div_reg <= 0-reg_QB;
3024
                                        ELSE
3025
                                                div_sign <= '0';
3026
                                                div_reg <= reg_QB;
3027
                                        END IF;
3028
                                ELSIF exec_DIVU='1' THEN
3029
                                        div_reg <= div_quot;
3030
                                END IF;
3031
                        END IF;
3032
                END IF;
3033
 
3034
                dummy_div_over <= ('0'&OP1out(31 downto 16))-('0'&OP2out(15 downto 0));
3035
 
3036
                IF opcode(8)='1' AND OP2out(15) ='1' THEN
3037
                        dummy_div_sub <= (div_reg(31 downto 15))+('1'&OP2out(15 downto 0));
3038
                ELSE
3039
                        dummy_div_sub <= (div_reg(31 downto 15))-('0'&OP2out(15 downto 0));
3040
                END IF;
3041
 
3042
                IF (dummy_div_sub(16))='1' THEN
3043
                        div_quot(31 downto 16) <= div_reg(30 downto 15);
3044
                ELSE
3045
                        div_quot(31 downto 16) <= dummy_div_sub(15 downto 0);
3046
                END IF;
3047
 
3048
                div_quot(15 downto 0) <= div_reg(14 downto 0)&NOT dummy_div_sub(16);
3049
 
3050
                IF execOPC='1' AND opcode(8)='1' AND (OP2out(15) XOR div_sign)='1' THEN
3051
                        dummy_div(15 downto 0) <= 0-div_quot(15 downto 0);
3052
                ELSE
3053
                        dummy_div(15 downto 0) <= div_quot(15 downto 0);
3054
                END IF;
3055
 
3056
                IF div_sign='1' THEN
3057
                        dummy_div(31 downto 16) <= 0-div_quot(31 downto 16);
3058
                ELSE
3059
                        dummy_div(31 downto 16) <= div_quot(31 downto 16);
3060
                END IF;
3061
 
3062
                IF (opcode(8)='1' AND (OP2out(15) XOR div_sign XOR dummy_div(15))='1' AND dummy_div(15 downto 0)/=X"0000")       --Overflow DIVS
3063
                        OR (opcode(8)='0' AND dummy_div_over(16)='0') THEN        --Overflow DIVU
3064
                        set_V_Flag <= '1';
3065
                END IF;
3066
        END PROCESS;
3067
 
3068
-----------------------------------------------------------------------------
3069
-- Movem
3070
-----------------------------------------------------------------------------
3071
PROCESS (reset, clk, movem_mask, movem_muxa ,movem_muxb, movem_muxc)
3072
        BEGIN
3073
                IF movem_mask(7 downto 0)="00000000" THEN
3074
                        movem_muxa <= movem_mask(15 downto 8);
3075
                        movem_regaddr(3) <= '1';
3076
                ELSE
3077
                        movem_muxa <= movem_mask(7 downto 0);
3078
                        movem_regaddr(3) <= '0';
3079
                END  IF;
3080
                IF movem_muxa(3 downto 0)="0000" THEN
3081
                        movem_muxb <= movem_muxa(7 downto 4);
3082
                        movem_regaddr(2) <= '1';
3083
                ELSE
3084
                        movem_muxb <= movem_muxa(3 downto 0);
3085
                        movem_regaddr(2) <= '0';
3086
                END  IF;
3087
                IF movem_muxb(1 downto 0)="00" THEN
3088
                        movem_muxc <= movem_muxb(3 downto 2);
3089
                        movem_regaddr(1) <= '1';
3090
                ELSE
3091
                        movem_muxc <= movem_muxb(1 downto 0);
3092
                        movem_regaddr(1) <= '0';
3093
                END  IF;
3094
                IF movem_muxc(0)='0' THEN
3095
                        movem_regaddr(0) <= '1';
3096
                ELSE
3097
                        movem_regaddr(0) <= '0';
3098
                END  IF;
3099
 
3100
                movem_bits <= ("0000"&movem_mask(0))+("0000"&movem_mask(1))+("0000"&movem_mask(2))+("0000"&movem_mask(3))+
3101
                                                ("0000"&movem_mask(4))+("0000"&movem_mask(5))+("0000"&movem_mask(6))+("0000"&movem_mask(7))+
3102
                                                ("0000"&movem_mask(8))+("0000"&movem_mask(9))+("0000"&movem_mask(10))+("0000"&movem_mask(11))+
3103
                                                ("0000"&movem_mask(12))+("0000"&movem_mask(13))+("0000"&movem_mask(14))+("0000"&movem_mask(15));
3104
 
3105
        IF reset = '0' THEN
3106
                        movem_busy <= '0';
3107
                        movem_addr <= '0';
3108
                ELSIF rising_edge(clk) THEN
3109
                        IF clkena_in='1' AND get_movem_mask='1' THEN
3110
                                movem_mask <= data_read(15 downto 0);
3111
                        END IF;
3112
                IF clkena='1' THEN
3113
                                IF set_movem_busy='1' THEN
3114
                                        IF movem_bits(3 downto 1) /= "000" OR opcode(10)='0' THEN
3115
                                                movem_busy <= '1';
3116
                                        END IF;
3117
                                        movem_addr <= '1';
3118
                                END IF;
3119
                                IF movem_addr='1' THEN
3120
                                        CASE movem_regaddr IS
3121
                                                WHEN "0000" => movem_mask(0)  <= '0';
3122
                                                WHEN "0001" => movem_mask(1)  <= '0';
3123
                                                WHEN "0010" => movem_mask(2)  <= '0';
3124
                                                WHEN "0011" => movem_mask(3)  <= '0';
3125
                                                WHEN "0100" => movem_mask(4)  <= '0';
3126
                                                WHEN "0101" => movem_mask(5)  <= '0';
3127
                                                WHEN "0110" => movem_mask(6)  <= '0';
3128
                                                WHEN "0111" => movem_mask(7)  <= '0';
3129
                                                WHEN "1000" => movem_mask(8)  <= '0';
3130
                                                WHEN "1001" => movem_mask(9)  <= '0';
3131
                                                WHEN "1010" => movem_mask(10) <= '0';
3132
                                                WHEN "1011" => movem_mask(11) <= '0';
3133
                                                WHEN "1100" => movem_mask(12) <= '0';
3134
                                                WHEN "1101" => movem_mask(13) <= '0';
3135
                                                WHEN "1110" => movem_mask(14) <= '0';
3136
                                                WHEN "1111" => movem_mask(15) <= '0';
3137 6 tobiflex
                                                WHEN OTHERS => null;
3138 2 tobiflex
                                        END CASE;
3139
                                        IF opcode(10)='1' THEN
3140
                                                IF movem_bits="00010" OR movem_bits="00001" OR movem_bits="00000" THEN
3141
                                                        movem_busy <= '0';
3142
                                                END IF;
3143
                                        END IF;
3144
                                        IF movem_bits="00001" OR movem_bits="00000" THEN
3145
                                                movem_busy <= '0';
3146
                                                movem_addr <= '0';
3147
                                        END IF;
3148
                                END IF;
3149
                        END IF;
3150
                END IF;
3151
        END PROCESS;
3152
END;

powered by: WebSVN 2.1.0

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