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

Subversion Repositories tg68

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

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

powered by: WebSVN 2.1.0

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