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

Subversion Repositories tg68

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

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

powered by: WebSVN 2.1.0

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