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

Subversion Repositories tg68

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

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

powered by: WebSVN 2.1.0

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