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

Subversion Repositories tg68kc

[/] [tg68kc/] [trunk/] [TG68KdotC_Kernel.vhd] - Blame information for rev 11

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 tobiflex
------------------------------------------------------------------------------
2
------------------------------------------------------------------------------
3
--                                                                          --
4 4 tobiflex
-- Copyright (c) 2009-2019 Tobias Gubener                                   -- 
5
-- Patches by MikeJ, Till Harbaum, Rok Krajnk, ...                          --
6 2 tobiflex
-- Subdesign fAMpIGA by TobiFlex                                            --
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 10 tobiflex
------------------------------------------------------------------------------
23 2 tobiflex
 
24 11 tobiflex
-- 25.11.2019 TG bugfix ILLEGAL.B handling
25
-- 24.11.2019 TG next try CMP2 and CHK2.l
26
-- 24.11.2019 retrofun(RF) commit ILLEGAL.B handling 
27
-- 18.11.2019 TG insert CMP2 and CHK2.l
28
-- 17.11.2019 TG insert CAS and CAS2
29
-- 10.11.2019 TG insert TRAPcc
30 10 tobiflex
-- 08.11.2019 TG bugfix movem in 68020 mode
31
-- 06.11.2019 TG bugfix CHK
32
-- 06.11.2019 TG bugfix flags and stackframe DIVU
33 9 tobiflex
-- 04.11.2019 TG insert RTE from TH
34 8 tobiflex
-- 03.11.2019 TG insert TrapV from TH 
35
-- 03.11.2019 TG bugfix MUL 64Bit 
36 7 tobiflex
-- 03.11.2019 TG rework barrel shifter - some other tweaks
37
-- 02.11.2019 TG bugfig N-Flag and Z-Flag for DIV
38 4 tobiflex
-- 30.10.2019 TG bugfix RTR in 68020-mode
39
-- 30.10.2019 TG bugfix BFINS again
40
-- 19.10.2019 TG insert some bugfixes from apolkosnik
41 2 tobiflex
-- 05.12.2018 TG insert RTD opcode
42
-- 03.12.2018 TG insert barrel shifter
43
-- 01.11.2017 TG bugfix V-Flag for ASL/ASR - thanks Peter Graf
44
-- 29.05.2017 TG decode 0x4AFB as illegal, needed for QL BKP - thanks Peter Graf
45
-- 21.05.2017 TG insert generic for hardware multiplier for MULU & MULS
46
-- 04.04.2017 TG change GPL to LGPL
47
-- 04.04.2017 TG BCD handling with all undefined behavior! 
48
-- 02.04.2017 TG bugfix Bitfield Opcodes 
49
-- 19.03.2017 TG insert PACK/UNPACK  
50
-- 19.03.2017 TG bugfix CMPI ...(PC) - thanks Till Harbaum
51
--     ???    MJ bugfix non_aligned movem access
52
-- add berr handling 10.03.2013 - needed for ATARI Core
53
 
54
-- bugfix session 07/08.Feb.2013
55
-- movem ,-(an)
56
-- movem (an)+,          - thanks  Gerhard Suttner
57
-- btst dn,#data         - thanks  Peter Graf
58
-- movep                 - thanks  Till Harbaum
59
-- IPL vector            - thanks  Till Harbaum
60
--  
61
 
62
-- optimize Register file
63
 
64 11 tobiflex
-- to do 68010:
65 2 tobiflex
-- (MOVEC)
66
-- BKPT
67
-- MOVES
68
--
69
-- to do 68020:
70
-- (CALLM)
71
-- (RETM)
72
 
73 11 tobiflex
-- bugfix DIVS.W
74
-- bugfix CHK2, CMP2
75
-- rework barrel shifter 
76 2 tobiflex
-- CHK2
77
-- CMP2
78
-- cpXXX Coprozessor stuff
79 10 tobiflex
 
80
-- done 020:
81 11 tobiflex
-- CAS, CAS2
82 2 tobiflex
-- TRAPcc
83
-- PACK
84
-- UNPK
85
-- Bitfields
86
-- address modes
87
-- long bra
88
-- DIVS.L, DIVU.L
89
-- LINK long
90
-- MULS.L, MULU.L
91
-- extb.l
92
 
93
library ieee;
94
use ieee.std_logic_1164.all;
95
use ieee.std_logic_unsigned.all;
96
use work.TG68K_Pack.all;
97
 
98
entity TG68KdotC_Kernel is
99
        generic(
100 10 tobiflex
                SR_Read : integer:= 2;                          --0=>user,              1=>privileged,          2=>switchable with CPU(0)
101
                VBR_Stackframe : integer:= 2;           --0=>no,                        1=>yes/extended,        2=>switchable with CPU(0)
102
                extAddr_Mode : integer:= 2;             --0=>no,                        1=>yes,                         2=>switchable with CPU(1)
103
                MUL_Mode : integer := 2;                        --0=>16Bit,             1=>32Bit,                       2=>switchable with CPU(1),  3=>no MUL,  
104
                DIV_Mode : integer := 2;                        --0=>16Bit,             1=>32Bit,                       2=>switchable with CPU(1),  3=>no DIV,  
105
                BitField : integer := 2;                        --0=>no,                        1=>yes,                         2=>switchable with CPU(1) 
106
 
107
                BarrelShifter : integer := 1;           --0=>no,                        1=>yes,                         2=>switchable with CPU(1)  
108
                MUL_Hardware : integer := 1             --0=>no,                        1=>yes,  
109 2 tobiflex
                );
110 5 tobiflex
        port(clk                                                : in std_logic;
111
                nReset                                  : in std_logic;                 --low active
112
                clkena_in                               : in std_logic:='1';
113
                data_in                                 : in std_logic_vector(15 downto 0);
114
                IPL                                             : in std_logic_vector(2 downto 0):="111";
115
                IPL_autovector                  : in std_logic:='0';
116
                berr                                            : in std_logic:='0';                                     -- only 68000 Stackpointer dummy
117
                CPU                                             : in std_logic_vector(1 downto 0):="00";  -- 00->68000  01->68010  11->68020(only some parts - yet)
118
                addr_out                                        : out std_logic_vector(31 downto 0);
119
                data_write                              : out std_logic_vector(15 downto 0);
120
                nWr                                             : out std_logic;
121
                nUDS                                            : out std_logic;
122
                nLDS                                            : out std_logic;
123
                busstate                                        : out std_logic_vector(1 downto 0);      -- 00-> fetch code 10->read data 11->write data 01->no memaccess
124
                nResetOut                               : out std_logic;
125
                FC                                                      : out std_logic_vector(2 downto 0);
126
                clr_berr                                        : out std_logic;
127
-- for debug
128
                skipFetch                               : out std_logic;
129
                regin_out                               : out std_logic_vector(31 downto 0);
130
                CACR_out                                        : out std_logic_vector( 3 downto 0);
131
                VBR_out                                 : out std_logic_vector(31 downto 0)
132 4 tobiflex
                );
133 2 tobiflex
end TG68KdotC_Kernel;
134
 
135
architecture logic of TG68KdotC_Kernel is
136
 
137
 
138 10 tobiflex
        signal use_VBR_Stackframe       : std_logic;
139
 
140 4 tobiflex
        signal syncReset                        : std_logic_vector(3 downto 0);
141
        signal Reset                            : std_logic;
142
        signal clkena_lw                        : std_logic;
143
        signal TG68_PC                          : std_logic_vector(31 downto 0);
144
        signal tmp_TG68_PC              : std_logic_vector(31 downto 0);
145
        signal TG68_PC_add              : std_logic_vector(31 downto 0);
146
        signal PC_dataa                 : std_logic_vector(31 downto 0);
147
        signal PC_datab                 : std_logic_vector(31 downto 0);
148
        signal memaddr                          : std_logic_vector(31 downto 0);
149
        signal state                            : std_logic_vector(1 downto 0);
150
        signal datatype                 : std_logic_vector(1 downto 0);
151
        signal set_datatype             : std_logic_vector(1 downto 0);
152
        signal exe_datatype             : std_logic_vector(1 downto 0);
153
        signal setstate                 : std_logic_vector(1 downto 0);
154 2 tobiflex
 
155 4 tobiflex
        signal opcode                           : std_logic_vector(15 downto 0);
156
        signal exe_opcode                       : std_logic_vector(15 downto 0);
157
        signal sndOPC                           : std_logic_vector(15 downto 0);
158 2 tobiflex
 
159 10 tobiflex
        signal exe_pc                           : std_logic_vector(31 downto 0);--TH
160
        signal last_opc_pc              : std_logic_vector(31 downto 0);--TH
161 4 tobiflex
        signal last_opc_read            : std_logic_vector(15 downto 0);
162
        signal registerin                       : std_logic_vector(31 downto 0);
163
        signal reg_QA                           : std_logic_vector(31 downto 0);
164
        signal reg_QB                           : std_logic_vector(31 downto 0);
165
        signal Wwrena,Lwrena            : bit;
166
        signal Bwrena                           : bit;
167
        signal Regwrena_now             : bit;
168 2 tobiflex
        signal rf_dest_addr             : std_logic_vector(3 downto 0);
169
        signal rf_source_addr   : std_logic_vector(3 downto 0);
170
        signal rf_source_addrd  : std_logic_vector(3 downto 0);
171
 
172 4 tobiflex
        signal regin                            : std_logic_vector(31 downto 0);
173
        type   regfile_t is array(0 to 15) of std_logic_vector(31 downto 0);
174
        signal regfile                          : regfile_t := (OTHERS => (OTHERS => '0')); -- mikej stops sim X issues;
175
        signal RDindex_A                        : integer range 0 to 15;
176
        signal RDindex_B                        : integer range 0 to 15;
177
        signal WR_AReg                          : std_logic;
178 2 tobiflex
 
179
 
180 4 tobiflex
        signal addr                                     : std_logic_vector(31 downto 0);
181
        signal memaddr_reg              : std_logic_vector(31 downto 0);
182
        signal memaddr_delta            : std_logic_vector(31 downto 0);
183
        signal use_base                 : bit;
184 2 tobiflex
 
185 4 tobiflex
        signal ea_data                          : std_logic_vector(31 downto 0);
186
        signal OP1out                           : std_logic_vector(31 downto 0);
187
        signal OP2out                           : std_logic_vector(31 downto 0);
188
        signal OP1outbrief              : std_logic_vector(15 downto 0);
189
        signal OP1in                            : std_logic_vector(31 downto 0);
190
        signal ALUout   : std_logic_vector(31 downto 0);
191
        signal data_write_tmp   : std_logic_vector(31 downto 0);
192
        signal data_write_muxin : std_logic_vector(31 downto 0);
193
        signal data_write_mux   : std_logic_vector(47 downto 0);
194
        signal nextpass                 : bit;
195
        signal setnextpass              : bit;
196
        signal setdispbyte              : bit;
197
        signal setdisp                          : bit;
198
        signal regdirectsource  :bit;           -- checken !!!
199
        signal addsub_q                 : std_logic_vector(31 downto 0);
200
        signal briefdata                        : std_logic_vector(31 downto 0);
201
--      signal c_in                             : std_logic_vector(3 downto 0);
202
        signal c_out                            : std_logic_vector(2 downto 0);
203 2 tobiflex
 
204 4 tobiflex
        signal mem_address              : std_logic_vector(31 downto 0);
205
        signal memaddr_a                        : std_logic_vector(31 downto 0);
206 2 tobiflex
 
207 4 tobiflex
        signal TG68_PC_brw              : bit;
208
        signal TG68_PC_word             : bit;
209
        signal getbrief                 : bit;
210
        signal brief                            : std_logic_vector(15 downto 0);
211
        signal data_is_source   : bit;
212
        signal store_in_tmp             : bit;
213
        signal write_back                       : bit;
214
        signal exec_write_back  : bit;
215
        signal setstackaddr             : bit;
216
        signal writePC                          : bit;
217
        signal writePCbig                       : bit;
218
        signal set_writePCbig   : bit;
219
        signal setopcode                        : bit;
220
        signal decodeOPC                        : bit;
221
        signal execOPC                          : bit;
222 11 tobiflex
        signal execOPC_ALU              : bit;
223 4 tobiflex
        signal setexecOPC                       : bit;
224
        signal endOPC                           : bit;
225
        signal setendOPC                        : bit;
226
        signal Flags                            : std_logic_vector(7 downto 0);  -- ...XNZVC
227
        signal FlagsSR                          : std_logic_vector(7 downto 0);  -- T.S.0III
228
        signal SRin                                     : std_logic_vector(7 downto 0);
229
        signal exec_DIRECT              : bit;
230
        signal exec_tas                 : std_logic;
231
        signal set_exec_tas             : std_logic;
232 2 tobiflex
 
233 4 tobiflex
        signal exe_condition            : std_logic;
234
        signal ea_only                          : bit;
235 11 tobiflex
        signal source_areg              : std_logic;
236 4 tobiflex
        signal source_lowbits   : bit;
237 11 tobiflex
        signal source_LDRLbits  : bit;
238
        signal source_LDRMbits  : bit;
239 4 tobiflex
        signal source_2ndHbits  : bit;
240 11 tobiflex
        signal source_2ndMbits  : bit;
241 4 tobiflex
        signal source_2ndLbits  : bit;
242 11 tobiflex
        signal dest_areg                        : std_logic;
243
        signal dest_LDRareg             : std_logic;
244
        signal dest_LDRHbits            : bit;
245
        signal dest_LDRLbits            : bit;
246 4 tobiflex
        signal dest_2ndHbits            : bit;
247 11 tobiflex
        signal dest_2ndLbits            : bit;
248 4 tobiflex
        signal dest_hbits                       : bit;
249
        signal rot_bits                 : std_logic_vector(1 downto 0);
250
        signal set_rot_bits             : std_logic_vector(1 downto 0);
251
        signal rot_cnt                          : std_logic_vector(5 downto 0);
252
        signal set_rot_cnt              : std_logic_vector(5 downto 0);
253
        signal movem_actiond            : bit;
254
        signal movem_regaddr            : std_logic_vector(3 downto 0);
255
        signal movem_mux                        : std_logic_vector(3 downto 0);
256
        signal movem_presub             : bit;
257
        signal movem_run                        : bit;
258
        signal ea_calc_b                        : std_logic_vector(31 downto 0);
259
        signal set_direct_data  : bit;
260
        signal use_direct_data  : bit;
261
        signal direct_data              : bit;
262 2 tobiflex
 
263 4 tobiflex
        signal set_V_Flag                       : bit;
264
        signal set_vectoraddr   : bit;
265
        signal writeSR                          : bit;
266
        signal trap_berr                        : bit;
267
        signal trap_illegal             : bit;
268
        signal trap_addr_error  : bit;
269
        signal trap_priv                        : bit;
270
        signal trap_trace                       : bit;
271
        signal trap_1010                        : bit;
272
        signal trap_1111                        : bit;
273
        signal trap_trap                        : bit;
274
        signal trap_trapv                       : bit;
275
        signal trap_interrupt   : bit;
276
        signal trapmake                 : bit;
277
        signal trapd                            : bit;
278
        signal trap_SR                          : std_logic_vector(7 downto 0);
279
        signal make_trace                       : std_logic;
280
        signal make_berr                        : std_logic;
281 10 tobiflex
        signal useStackframe2   : std_logic;
282 2 tobiflex
 
283 4 tobiflex
        signal set_stop                 : bit;
284
        signal stop                                     : bit;
285
        signal trap_vector              : std_logic_vector(31 downto 0);
286
        signal trap_vector_vbr  : std_logic_vector(31 downto 0);
287
        signal USP                                      : std_logic_vector(31 downto 0);
288
--      signal illegal_write_mode       : bit;
289
--      signal illegal_read_mode        : bit;
290
--      signal illegal_byteaddr         : bit;
291 2 tobiflex
 
292 4 tobiflex
        signal IPL_nr                           : std_logic_vector(2 downto 0);
293
        signal rIPL_nr                          : std_logic_vector(2 downto 0);
294
        signal IPL_vec                          : std_logic_vector(7 downto 0);
295
        signal interrupt                        : bit;
296
        signal setinterrupt             : bit;
297
        signal SVmode                           : std_logic;
298
        signal preSVmode                        : std_logic;
299
        signal Suppress_Base            : bit;
300
        signal set_Suppress_Base: bit;
301
        signal set_Z_error              : bit;
302
        signal Z_error                  : bit;
303
        signal ea_build_now             : bit;
304
        signal build_logical            : bit;
305
        signal build_bcd                        : bit;
306 2 tobiflex
 
307 4 tobiflex
        signal data_read                        : std_logic_vector(31 downto 0);
308
        signal bf_ext_in                        : std_logic_vector(7 downto 0);
309
        signal bf_ext_out                       : std_logic_vector(7 downto 0);
310
--      signal byte                                     : bit;
311
        signal long_start                       : bit;
312 2 tobiflex
        signal long_start_alu   : bit;
313 4 tobiflex
        signal non_aligned              : std_logic;
314
        signal long_done                        : bit;
315
        signal memmask                          : std_logic_vector(5 downto 0);
316
        signal set_memmask              : std_logic_vector(5 downto 0);
317
        signal memread                          : std_logic_vector(3 downto 0);
318
        signal wbmemmask                        : std_logic_vector(5 downto 0);
319
        signal memmaskmux                       : std_logic_vector(5 downto 0);
320
        signal oddout                           : std_logic;
321
        signal set_oddout                       : std_logic;
322
        signal PCbase                           : std_logic;
323
        signal set_PCbase                       : std_logic;
324 2 tobiflex
 
325 4 tobiflex
        signal last_data_read   : std_logic_vector(31 downto 0);
326
        signal last_data_in             : std_logic_vector(31 downto 0);
327 2 tobiflex
 
328 4 tobiflex
        signal bf_offset                        : std_logic_vector(5 downto 0);
329
        signal bf_width                 : std_logic_vector(5 downto 0);
330
        signal bf_bhits                 : std_logic_vector(5 downto 0);
331
        signal bf_shift                 : std_logic_vector(5 downto 0);
332
        signal alu_width                        : std_logic_vector(5 downto 0);
333
        signal alu_bf_shift             : std_logic_vector(5 downto 0);
334
        signal bf_loffset                       : std_logic_vector(5 downto 0);
335
        signal bf_full_offset   : std_logic_vector(31 downto 0);
336
        signal alu_bf_ffo_offset: std_logic_vector(31 downto 0);
337
        signal alu_bf_loffset   : std_logic_vector(5 downto 0);
338 2 tobiflex
 
339 4 tobiflex
        signal movec_data                       : std_logic_vector(31 downto 0);
340
        signal VBR                                      : std_logic_vector(31 downto 0);
341
        signal CACR                                     : std_logic_vector(3 downto 0);
342
        signal DFC                                      : std_logic_vector(2 downto 0);
343
        signal SFC                                      : std_logic_vector(2 downto 0);
344 2 tobiflex
 
345
 
346 4 tobiflex
        signal set                                      : bit_vector(lastOpcBit downto 0);
347
        signal set_exec                 : bit_vector(lastOpcBit downto 0);
348
        signal exec                                     : bit_vector(lastOpcBit downto 0);
349 2 tobiflex
 
350
        signal micro_state              : micro_states;
351
        signal next_micro_state : micro_states;
352
 
353
 
354
 
355
BEGIN
356
 
357
ALU: TG68K_ALU
358
        generic map(
359 4 tobiflex
                MUL_Mode => MUL_Mode,                           --0=>16Bit,     1=>32Bit,       2=>switchable with CPU(1),              3=>no MUL,
360
                MUL_Hardware => MUL_Hardware,           --0=>no,                1=>yes,
361
                DIV_Mode => DIV_Mode,                           --0=>16Bit,     1=>32Bit,       2=>switchable with CPU(1),              3=>no DIV,
362
                BarrelShifter => BarrelShifter  --0=>no,                1=>yes,         2=>switchable with CPU(1)  
363 2 tobiflex
                )
364 5 tobiflex
        port map(
365
                clk => clk,                                                             --: in std_logic;
366
                Reset => Reset,                                         --: in std_logic;
367 11 tobiflex
                CPU => CPU,                                                             --: in std_logic_vector(1 downto 0):="00";  -- 00->68000  01->68010  11->68020(only some parts - yet)
368 5 tobiflex
                clkena_lw => clkena_lw,                         --: in std_logic:='1';
369 11 tobiflex
                execOPC => execOPC_ALU,                         --: in bit;
370 5 tobiflex
                decodeOPC => decodeOPC,                         --: in bit;
371
                exe_condition => exe_condition, --: in std_logic;
372
                exec_tas => exec_tas,                           --: in std_logic;
373
                long_start => long_start_alu,           --: in bit;
374
                non_aligned => non_aligned,
375
                movem_presub => movem_presub,           --: in bit;
376
                set_stop => set_stop,                           --: in bit;
377
                Z_error => Z_error,                                     --: in bit;
378 2 tobiflex
 
379 5 tobiflex
                rot_bits => rot_bits,                           --: in std_logic_vector(1 downto 0);
380
                exec => exec,                                                   --: in bit_vector(lastOpcBit downto 0);
381
                OP1out => OP1out,                                               --: in std_logic_vector(31 downto 0);
382
                OP2out => OP2out,                                               --: in std_logic_vector(31 downto 0);
383
                reg_QA => reg_QA,                                               --: in std_logic_vector(31 downto 0);
384
                reg_QB => reg_QB,                                               --: in std_logic_vector(31 downto 0);
385
                opcode => opcode,                                               --: in std_logic_vector(15 downto 0);
386
                exe_opcode => exe_opcode,                       --: in std_logic_vector(15 downto 0);
387
                exe_datatype => exe_datatype,           --: in std_logic_vector(1 downto 0);
388
                sndOPC => sndOPC,                                               --: in std_logic_vector(15 downto 0);
389
                last_data_read => last_data_read(15 downto 0),   --: in std_logic_vector(31 downto 0);
390
                data_read => data_read(15 downto 0),                             --: in std_logic_vector(31 downto 0);
391
                FlagsSR => FlagsSR,                                     --: in std_logic_vector(7 downto 0);
392
                micro_state => micro_state,             --: in micro_states;  
393
                bf_ext_in => bf_ext_in,
394
                bf_ext_out => bf_ext_out,
395
                bf_shift => alu_bf_shift,
396
                bf_width => alu_width,
397
                bf_ffo_offset => alu_bf_ffo_offset,
398
                bf_loffset => alu_bf_loffset(4 downto 0),
399
 
400
                set_V_Flag => set_V_Flag,                       --: buffer bit;
401
                Flags => Flags,                                         --: buffer std_logic_vector(8 downto 0);
402
                c_out => c_out,                                         --: buffer std_logic_vector(2 downto 0);
403
                addsub_q => addsub_q,                           --: buffer std_logic_vector(31 downto 0);
404
                ALUout => ALUout                                                --: buffer std_logic_vector(31 downto 0)
405
        );
406
 
407
        long_start_alu <= to_bit(NOT memmaskmux(3));
408 11 tobiflex
        execOPC_ALU <= execOPC OR exec(alu_exec);
409 5 tobiflex
        process (memmaskmux)
410
        begin
411
                non_aligned <= '0';
412
                if (memmaskmux(5 downto 4) = "01") or (memmaskmux(5 downto 4) = "10") then
413
                        non_aligned <= '1';
414
                end if;
415
        end process;
416 2 tobiflex
-----------------------------------------------------------------------------
417
-- Bus control
418
-----------------------------------------------------------------------------
419 4 tobiflex
   regin_out <= regin;
420
 
421
 
422 2 tobiflex
        nWr <= '0' WHEN state="11" ELSE '1';
423
        busstate <= state;
424
        nResetOut <= '0' WHEN exec(opcRESET)='1' ELSE '1';
425
 
426 5 tobiflex
        -- does shift for byte access. note active low me
427
        -- should produce address error on 68000
428
        memmaskmux <= memmask when addr(0) = '1' else memmask(4 downto 0) & '1';
429 2 tobiflex
        nUDS <= memmaskmux(5);
430
        nLDS <= memmaskmux(4);
431
        clkena_lw <= '1' WHEN clkena_in='1' AND memmaskmux(3)='1' ELSE '0';
432
        clr_berr <= '1' WHEN setopcode='1' AND trap_berr='1' ELSE '0';
433
 
434
        PROCESS (clk, nReset)
435
        BEGIN
436
                IF nReset='0' THEN
437
                        syncReset <= "0000";
438
                        Reset <= '1';
439
                ELSIF rising_edge(clk) THEN
440
                        IF clkena_in='1' THEN
441
                                syncReset <= syncReset(2 downto 0)&'1';
442
                                Reset <= NOT syncReset(3);
443
                        END IF;
444
                END IF;
445 10 tobiflex
                IF rising_edge(clk) THEN
446
                        IF VBR_Stackframe=1 or (cpu(0)='1' and VBR_Stackframe=2) THEN
447
                                use_VBR_Stackframe<='1';
448
                        ELSE
449
                                use_VBR_Stackframe<='0';
450
                        END IF;
451
                END IF;
452
        END PROCESS;
453 2 tobiflex
 
454
PROCESS (clk, long_done, last_data_in, data_in, addr, long_start, memmaskmux, memread, memmask, data_read)
455
        BEGIN
456
                IF memmaskmux(4)='0' THEN
457
                        data_read <= last_data_in(15 downto 0)&data_in;
458
                ELSE
459
                        data_read <= last_data_in(23 downto 0)&data_in(15 downto 8);
460
                END IF;
461
                IF memread(0)='1' OR (memread(1 downto 0)="10" AND memmaskmux(4)='1')THEN
462
                        data_read(31 downto 16) <= (OTHERS=>data_read(15));
463
                END IF;
464
 
465
                IF rising_edge(clk) THEN
466
                        IF clkena_lw='1' AND state="10" THEN
467
                                IF memmaskmux(4)='0' THEN
468
                                        bf_ext_in <= last_data_in(23 downto 16);
469
                                ELSE
470
                                        bf_ext_in <= last_data_in(31 downto 24);
471
                                END IF;
472
                        END IF;
473
                        IF Reset='1' THEN
474
                                last_data_read <= (OTHERS => '0');
475
                        ELSIF clkena_in='1' THEN
476
                                IF state="00" OR exec(update_ld)='1' THEN
477
                                        last_data_read <= data_read;
478
                                        IF state(1)='0' AND memmask(1)='0' THEN
479
                                                last_data_read(31 downto 16) <= last_opc_read;
480
                                        ELSIF state(1)='0' OR memread(1)='1' THEN
481
                                                last_data_read(31 downto 16) <= (OTHERS=>data_in(15));
482
                                        END IF;
483
                                END IF;
484
                                last_data_in <= last_data_in(15 downto 0)&data_in(15 downto 0);
485
 
486
                        END IF;
487
                END IF;
488
                                long_start <= to_bit(NOT memmask(1));
489
                                long_done <= to_bit(NOT memread(1));
490
        END PROCESS;
491
 
492
PROCESS (long_start, reg_QB, data_write_tmp, exec, data_read, data_write_mux, memmaskmux, bf_ext_out,
493
                 data_write_muxin, memmask, oddout, addr)
494
        BEGIN
495
                IF exec(write_reg)='1' THEN
496
                        data_write_muxin <= reg_QB;
497
                ELSE
498
                        data_write_muxin <= data_write_tmp;
499
                END IF;
500
 
501
                IF BitField=0 THEN
502
                        IF oddout=addr(0) THEN
503
                                data_write_mux <= "--------"&"--------"&data_write_muxin;
504
                        ELSE
505
                                data_write_mux <= "--------"&data_write_muxin&"--------";
506
                        END IF;
507
                ELSE
508
                        IF oddout=addr(0) THEN
509
                                data_write_mux <= "--------"&bf_ext_out&data_write_muxin;
510
                        ELSE
511
                                data_write_mux <= bf_ext_out&data_write_muxin&"--------";
512
                        END IF;
513
                END IF;
514
 
515
                IF memmaskmux(1)='0' THEN
516
                        data_write <= data_write_mux(47 downto 32);
517
                ELSIF memmaskmux(3)='0' THEN
518
                        data_write <= data_write_mux(31 downto 16);
519
                ELSE
520
                        data_write <= data_write_mux(15 downto 0);
521
                END IF;
522
                IF exec(mem_byte)='1' THEN      --movep
523
                        data_write(7 downto 0) <= data_write_tmp(15 downto 8);
524
                END IF;
525
        END PROCESS;
526
 
527
-----------------------------------------------------------------------------
528
-- Registerfile
529
-----------------------------------------------------------------------------
530
PROCESS (clk, regfile, RDindex_A, RDindex_B, exec)
531
        BEGIN
532
                reg_QA <= regfile(RDindex_A);
533
                reg_QB <= regfile(RDindex_B);
534
                IF rising_edge(clk) THEN
535
                    IF clkena_lw='1' THEN
536
                                rf_source_addrd <= rf_source_addr;
537
                                WR_AReg <= rf_dest_addr(3);
538
                                RDindex_A <= conv_integer(rf_dest_addr(3 downto 0));
539
                                RDindex_B <= conv_integer(rf_source_addr(3 downto 0));
540
                                IF Wwrena='1' THEN
541
                                        regfile(RDindex_A) <= regin;
542
                                END IF;
543
 
544
                                IF exec(to_USP)='1' THEN
545
                                        USP <= reg_QA;
546
                                END IF;
547
                        END IF;
548
                END IF;
549
        END PROCESS;
550
 
551
-----------------------------------------------------------------------------
552
-- Write Reg
553
-----------------------------------------------------------------------------
554
PROCESS (OP1in, reg_QA, Regwrena_now, Bwrena, Lwrena, exe_datatype, WR_AReg, movem_actiond, exec, ALUout, memaddr, memaddr_a, ea_only, USP, movec_data)
555
        BEGIN
556
                regin <= ALUout;
557
                IF exec(save_memaddr)='1' THEN
558
                        regin <= memaddr;
559
                ELSIF exec(get_ea_now)='1' AND ea_only='1' THEN
560
                        regin <= memaddr_a;
561
                ELSIF exec(from_USP)='1' THEN
562
                        regin <= USP;
563
                ELSIF exec(movec_rd)='1' THEN
564
                        regin <= movec_data;
565
                END IF;
566
 
567
                IF Bwrena='1' THEN
568
                        regin(15 downto 8) <= reg_QA(15 downto 8);
569
                END IF;
570
                IF Lwrena='0' THEN
571
                        regin(31 downto 16) <= reg_QA(31 downto 16);
572
                END IF;
573
 
574
                Bwrena <= '0';
575
                Wwrena <= '0';
576
                Lwrena <= '0';
577
                IF exec(presub)='1' OR exec(postadd)='1' OR exec(changeMode)='1' THEN           -- -(An)+
578
                        Wwrena <= '1';
579
                        Lwrena <= '1';
580
                ELSIF Regwrena_now='1' THEN             --dbcc  
581
                        Wwrena <= '1';
582
                ELSIF exec(Regwrena)='1' THEN           --read (mem)
583
                        Wwrena <= '1';
584
                        CASE exe_datatype IS
585
                                WHEN "00" =>            --BYTE
586
                                        Bwrena <= '1';
587
                                WHEN "01" =>            --WORD
588
                                        IF WR_AReg='1' OR movem_actiond='1' THEN
589
                                                Lwrena <='1';
590
                                        END IF;
591
                                WHEN OTHERS =>          --LONG
592
                                        Lwrena <= '1';
593
                        END CASE;
594
                END IF;
595
        END PROCESS;
596
 
597
-----------------------------------------------------------------------------
598
-- set dest regaddr
599
-----------------------------------------------------------------------------
600 11 tobiflex
PROCESS (opcode, rf_source_addrd, brief, setstackaddr, dest_hbits, dest_areg, dest_LDRareg, data_is_source, sndOPC, exec, set, dest_2ndHbits, dest_2ndLbits, dest_LDRHbits, dest_LDRLbits, last_data_read)
601 2 tobiflex
        BEGIN
602
                IF exec(movem_action) ='1' THEN
603
                        rf_dest_addr <= rf_source_addrd;
604
                ELSIF set(briefext)='1' THEN
605
                        rf_dest_addr <= brief(15 downto 12);
606 4 tobiflex
                ELSIF set(get_bfoffset)='1' THEN
607 5 tobiflex
--                      IF opcode(15 downto 12)="1110" THEN
608 4 tobiflex
                                rf_dest_addr <= '0'&sndOPC(8 downto 6);
609 5 tobiflex
--                      ELSE
610
--                              rf_dest_addr <= sndOPC(9 downto 6);
611
--                      END IF;
612 2 tobiflex
                ELSIF dest_2ndHbits='1' THEN
613 11 tobiflex
                        rf_dest_addr <= dest_LDRareg&sndOPC(14 downto 12);
614
                ELSIF dest_LDRHbits='1' THEN
615
                        rf_dest_addr <= last_data_read(15 downto 12);
616
                ELSIF dest_LDRLbits='1' THEN
617
                        rf_dest_addr <= '0'&last_data_read(2 downto 0);
618
                ELSIF dest_2ndLbits='1' THEN
619 4 tobiflex
                        rf_dest_addr <= '0'&sndOPC(2 downto 0);
620 2 tobiflex
                ELSIF setstackaddr='1' THEN
621
                        rf_dest_addr <= "1111";
622
                ELSIF dest_hbits='1' THEN
623
                        rf_dest_addr <= dest_areg&opcode(11 downto 9);
624
                ELSE
625
                        IF opcode(5 downto 3)="000" OR data_is_source='1' THEN
626
                                rf_dest_addr <= dest_areg&opcode(2 downto 0);
627
                        ELSE
628
                                rf_dest_addr <= '1'&opcode(2 downto 0);
629
                        END IF;
630
                END IF;
631
        END PROCESS;
632
 
633
-----------------------------------------------------------------------------
634
-- set source regaddr
635
-----------------------------------------------------------------------------
636 11 tobiflex
PROCESS (opcode, movem_presub, movem_regaddr, source_lowbits, source_areg, sndOPC, exec, set, source_2ndLbits, source_2ndHbits,         source_LDRLbits, source_LDRMbits, last_data_read, source_2ndMbits)
637 2 tobiflex
        BEGIN
638
                IF exec(movem_action)='1' OR set(movem_action) ='1' THEN
639
                        IF movem_presub='1' THEN
640
                                rf_source_addr <= movem_regaddr XOR "1111";
641
                        ELSE
642
                                rf_source_addr <= movem_regaddr;
643
                        END IF;
644
                ELSIF source_2ndLbits='1' THEN
645 4 tobiflex
                        rf_source_addr <= '0'&sndOPC(2 downto 0);
646 2 tobiflex
                ELSIF source_2ndHbits='1' THEN
647 4 tobiflex
                        rf_source_addr <= '0'&sndOPC(14 downto 12);
648 11 tobiflex
                ELSIF source_2ndMbits='1' THEN
649
                        rf_source_addr <= '0'&sndOPC(8 downto 6);
650
                ELSIF source_LDRLbits='1' THEN
651
                        rf_source_addr <= '0'&last_data_read(2 downto 0);
652
                ELSIF source_LDRMbits='1' THEN
653
                        rf_source_addr <= '0'&last_data_read(8 downto 6);
654 2 tobiflex
                ELSIF source_lowbits='1' THEN
655
                        rf_source_addr <= source_areg&opcode(2 downto 0);
656
                ELSIF exec(linksp)='1' THEN
657
                        rf_source_addr <= "1111";
658
                ELSE
659
                        rf_source_addr <= source_areg&opcode(11 downto 9);
660
                END IF;
661
        END PROCESS;
662
 
663
-----------------------------------------------------------------------------
664
-- set OP1out
665
-----------------------------------------------------------------------------
666
PROCESS (reg_QA, store_in_tmp, ea_data, long_start, addr, exec, memmaskmux)
667
        BEGIN
668
                OP1out <= reg_QA;
669
                IF exec(OP1out_zero)='1' THEN
670
                        OP1out <= (OTHERS => '0');
671
                ELSIF exec(ea_data_OP1)='1' AND store_in_tmp='1' THEN
672
                        OP1out <= ea_data;
673
                ELSIF exec(movem_action)='1' OR memmaskmux(3)='0' OR exec(OP1addr)='1' THEN
674
                        OP1out <= addr;
675
                END IF;
676
        END PROCESS;
677
 
678
-----------------------------------------------------------------------------
679
-- set OP2out
680
-----------------------------------------------------------------------------
681
PROCESS (OP2out, reg_QB, exe_opcode, exe_datatype, execOPC, exec, use_direct_data,
682
             store_in_tmp, data_write_tmp, ea_data)
683
        BEGIN
684
                OP2out(15 downto 0) <= reg_QB(15 downto 0);
685
                OP2out(31 downto 16) <= (OTHERS => OP2out(15));
686
                IF exec(OP2out_one)='1' THEN
687
                        OP2out(15 downto 0) <= "1111111111111111";
688
                ELSIF use_direct_data='1' OR (exec(exg)='1' AND execOPC='1') OR exec(get_bfoffset)='1' THEN
689
                        OP2out <= data_write_tmp;
690
                ELSIF (exec(ea_data_OP1)='0' AND store_in_tmp='1') OR exec(ea_data_OP2)='1' THEN
691
                        OP2out <= ea_data;
692
                ELSIF exec(opcMOVEQ)='1' THEN
693
                        OP2out(7 downto 0) <= exe_opcode(7 downto 0);
694
                        OP2out(15 downto 8) <= (OTHERS => exe_opcode(7));
695
                ELSIF exec(opcADDQ)='1' THEN
696
                        OP2out(2 downto 0) <= exe_opcode(11 downto 9);
697
                        IF exe_opcode(11 downto 9)="000" THEN
698
                                OP2out(3) <='1';
699
                        ELSE
700
                                OP2out(3) <='0';
701
                        END IF;
702
                        OP2out(15 downto 4) <= (OTHERS => '0');
703 11 tobiflex
                ELSIF exe_datatype="10" AND exec(opcEXT)='0'  THEN
704 2 tobiflex
                        OP2out(31 downto 16) <= reg_QB(31 downto 16);
705
                END IF;
706 11 tobiflex
                IF exec(opcEXTB)='1' THEN
707
                        OP2out(31 downto 8) <= (OTHERS => OP2out(7));
708
                END IF;
709 2 tobiflex
        END PROCESS;
710
 
711
 
712
-----------------------------------------------------------------------------
713
-- handle EA_data, data_write
714
-----------------------------------------------------------------------------
715
PROCESS (clk)
716
        BEGIN
717
        IF rising_edge(clk) THEN
718
                        IF Reset = '1' THEN
719
                                store_in_tmp <='0';
720
                                direct_data <= '0';
721
                                use_direct_data <= '0';
722
                                Z_error <= '0';
723
                        ELSIF clkena_lw='1' THEN
724 10 tobiflex
                                useStackframe2<='0';
725 2 tobiflex
                                direct_data <= '0';
726 9 tobiflex
                                IF exec(hold_OP2)='1' THEN
727 8 tobiflex
                                        use_direct_data <= '1';
728
                                END IF;
729 2 tobiflex
                                IF set_direct_data='1' THEN
730
                                        direct_data <= '1';
731
                                        use_direct_data <= '1';
732 11 tobiflex
                                ELSIF endOPC='1' OR set(ea_data_OP2)='1' THEN
733 2 tobiflex
                                        use_direct_data <= '0';
734
                                END IF;
735
                                exec_DIRECT <= set_exec(opcMOVE);
736
 
737
                                IF endOPC='1' THEN
738
                                        store_in_tmp <='0';
739
                                        Z_error <= '0';
740
                                ELSE
741
                                        IF set_Z_error='1'  THEN
742
                                                Z_error <= '1';
743
                                        END IF;
744
                                        IF set_exec(opcMOVE)='1' AND state="11" THEN
745
                                                use_direct_data <= '1';
746
                                        END IF;
747
 
748
                                        IF state="10" OR exec(store_ea_packdata)='1' THEN
749
                                                store_in_tmp <= '1';
750
                                        END IF;
751
                                        IF direct_data='1' AND state="00" THEN
752
                                                store_in_tmp <= '1';
753
                                        END IF;
754
                                END IF;
755
 
756
                                IF state="10" AND exec(hold_ea_data)='0' THEN
757
                                        ea_data <= data_read;
758
                                ELSIF exec(get_2ndOPC)='1' THEN
759
                                        ea_data <= addr;
760
                                ELSIF exec(store_ea_data)='1' OR (direct_data='1' AND state="00") THEN
761
                                        ea_data <= last_data_read;
762
                                END IF;
763
 
764
                                IF writePC='1' THEN
765
                                        data_write_tmp <= TG68_PC;
766
                                ELSIF exec(writePC_add)='1' THEN
767
                                        data_write_tmp <= TG68_PC_add;
768 8 tobiflex
-- paste and copy form TH       ---------       
769
                                elsif micro_state=trap00 THEN
770
                                        data_write_tmp <= exe_pc; --TH
771 10 tobiflex
                                        useStackframe2<='1';
772 8 tobiflex
                                elsif micro_state = trap0 then
773
                  -- this is only active for 010+ since in 000 writePC is
774
                  -- true in state trap0
775 10 tobiflex
--                                      if trap_trace='1' or set_exec(opcTRAPV)='1' or Z_error='1' then
776
                                        IF      useStackframe2='1' THEN
777 8 tobiflex
                                                -- stack frame format #2
778
                                                data_write_tmp(15 downto 0) <= "0010" & trap_vector(11 downto 0); --TH
779
                                        else
780
                                                data_write_tmp(15 downto 0) <= "0000" & trap_vector(11 downto 0);
781
                                        end if;
782
------------------------------------
783
--                              ELSIF micro_state=trap0 THEN    
784
--                                      data_write_tmp(15 downto 0) <= trap_vector(15 downto 0);
785 2 tobiflex
                                ELSIF exec(hold_dwr)='1' THEN
786
                                        data_write_tmp <= data_write_tmp;
787
                                ELSIF exec(exg)='1' THEN
788
                                        data_write_tmp <= OP1out;
789
                                ELSIF exec(get_ea_now)='1' AND ea_only='1' THEN         -- ist for pea
790
                                        data_write_tmp <= addr;
791
                                ELSIF execOPC='1' THEN
792
                                        data_write_tmp <= ALUout;
793
                                ELSIF (exec_DIRECT='1' AND state="10") THEN
794
                                        data_write_tmp <= data_read;
795
                                        IF  exec(movepl)='1' THEN
796
                                                data_write_tmp(31 downto 8) <= data_write_tmp(23 downto 0);
797
                                        END IF;
798
                                ELSIF exec(movepl)='1' THEN
799
                                        data_write_tmp(15 downto 0) <= reg_QB(31 downto 16);
800
                                ELSIF direct_data='1' THEN
801
                                        data_write_tmp <= last_data_read;
802
                                ELSIF writeSR='1'THEN
803
                                        data_write_tmp(15 downto 0) <= trap_SR(7 downto 0)& Flags(7 downto 0);
804
                                ELSE
805
                                        data_write_tmp <= OP2out;
806
                                END IF;
807
                        END IF;
808
                END IF;
809
        END PROCESS;
810
 
811
-----------------------------------------------------------------------------
812
-- brief
813
-----------------------------------------------------------------------------
814
PROCESS (brief, OP1out, OP1outbrief, cpu)
815
        BEGIN
816
                IF brief(11)='1' THEN
817
                        OP1outbrief <= OP1out(31 downto 16);
818
                ELSE
819
                        OP1outbrief <= (OTHERS=>OP1out(15));
820
                END IF;
821
                briefdata <= OP1outbrief&OP1out(15 downto 0);
822
                IF extAddr_Mode=1 OR (cpu(1)='1' AND extAddr_Mode=2) THEN
823
                        CASE brief(10 downto 9) IS
824
                                WHEN "00" => briefdata <= OP1outbrief&OP1out(15 downto 0);
825
                                WHEN "01" => briefdata <= OP1outbrief(14 downto 0)&OP1out(15 downto 0)&'0';
826
                                WHEN "10" => briefdata <= OP1outbrief(13 downto 0)&OP1out(15 downto 0)&"00";
827
                                WHEN "11" => briefdata <= OP1outbrief(12 downto 0)&OP1out(15 downto 0)&"000";
828
                                WHEN OTHERS => NULL;
829
                        END CASE;
830
                END IF;
831
        END PROCESS;
832
 
833
-----------------------------------------------------------------------------
834
-- MEM_IO 
835
-----------------------------------------------------------------------------
836
PROCESS (clk, setdisp, memaddr_a, briefdata, memaddr_delta, setdispbyte, datatype, interrupt, rIPL_nr, IPL_vec,
837 10 tobiflex
         memaddr_reg, reg_QA, use_base, VBR, last_data_read, trap_vector, exec, set, cpu, use_VBR_Stackframe)
838 2 tobiflex
        BEGIN
839
 
840
                IF rising_edge(clk) THEN
841 10 tobiflex
                        IF clkena_lw='1' THEN
842 2 tobiflex
                                trap_vector(31 downto 10) <= (others => '0');
843
                                IF trap_berr='1' THEN
844
                                        trap_vector(9 downto 0) <= "00" & X"08";
845
                                END IF;
846
                                IF trap_addr_error='1' THEN
847
                                        trap_vector(9 downto 0) <= "00" & X"0C";
848
                                END IF;
849
                                IF trap_illegal='1' THEN
850
                                        trap_vector(9 downto 0) <= "00" & X"10";
851
                                END IF;
852 10 tobiflex
                                IF set_Z_error='1' THEN
853 2 tobiflex
                                        trap_vector(9 downto 0) <= "00" & X"14";
854
                                END IF;
855
                                IF exec(trap_chk)='1' THEN
856
                                        trap_vector(9 downto 0) <= "00" & X"18";
857
                                END IF;
858
                                IF trap_trapv='1' THEN
859
                                        trap_vector(9 downto 0) <= "00" & X"1C";
860
                                END IF;
861
                                IF trap_priv='1' THEN
862
                                        trap_vector(9 downto 0) <= "00" & X"20";
863
                                END IF;
864
                                IF trap_trace='1' THEN
865
                                        trap_vector(9 downto 0) <= "00" & X"24";
866
                                END IF;
867
                                IF trap_1010='1' THEN
868
                                        trap_vector(9 downto 0) <= "00" & X"28";
869
                                END IF;
870
                                IF trap_1111='1' THEN
871
                                        trap_vector(9 downto 0) <= "00" & X"2C";
872
                                END IF;
873
                                IF trap_trap='1' THEN
874
                                        trap_vector(9 downto 0) <= "0010" & opcode(3 downto 0) & "00";
875
                                END IF;
876
                                IF trap_interrupt='1' or set_vectoraddr = '1' THEN
877
                                        trap_vector(9 downto 0) <= IPL_vec & "00";      --TH
878
                                END IF;
879
                        END IF;
880
                END IF;
881 10 tobiflex
                IF use_VBR_Stackframe='1' THEN
882
                        trap_vector_vbr <= trap_vector+VBR;
883
                ELSE
884 2 tobiflex
                        trap_vector_vbr <= trap_vector;
885
                END IF;
886
 
887
                memaddr_a(4 downto 0) <= "00000";
888
                memaddr_a(7 downto 5) <= (OTHERS=>memaddr_a(4));
889
                memaddr_a(15 downto 8) <= (OTHERS=>memaddr_a(7));
890
                memaddr_a(31 downto 16) <= (OTHERS=>memaddr_a(15));
891
                IF setdisp='1' THEN
892
                        IF exec(briefext)='1' THEN
893
                                memaddr_a <= briefdata+memaddr_delta;
894
                        ELSIF setdispbyte='1' THEN
895
                                memaddr_a(7 downto 0) <= last_data_read(7 downto 0);
896
                        ELSE
897
                                memaddr_a <= last_data_read;
898
                        END IF;
899
                ELSIF set(presub)='1' THEN
900
                        IF set(longaktion)='1' THEN
901
                                memaddr_a(4 downto 0) <= "11100";
902
                        ELSIF datatype="00" AND set(use_SP)='0' THEN
903
                                memaddr_a(4 downto 0) <= "11111";
904
                        ELSE
905
                                memaddr_a(4 downto 0) <= "11110";
906
                        END IF;
907
                ELSIF interrupt='1' THEN
908
                        memaddr_a(4 downto 0) <= '1'&rIPL_nr&'0';
909
                END IF;
910
 
911
                IF rising_edge(clk) THEN
912
                        IF clkena_in='1' THEN
913
                                IF exec(get_2ndOPC)='1' OR (state="10" AND memread(0)='1') THEN
914
                                        tmp_TG68_PC <= addr;
915
                                END IF;
916
                                use_base <= '0';
917
                                IF memmaskmux(3)='0' OR exec(mem_addsub)='1' THEN
918
                                        memaddr_delta <= addsub_q;
919 11 tobiflex
                                ELSIF set(restore_ADDR)='1' THEN
920 2 tobiflex
                                        memaddr_delta <= tmp_TG68_PC;
921
                                ELSIF exec(direct_delta)='1' THEN
922
                                        memaddr_delta <= data_read;
923
                                ELSIF exec(ea_to_pc)='1' AND setstate="00" THEN
924
                                        memaddr_delta <= addr;
925
                                ELSIF set(addrlong)='1' THEN
926
                                        memaddr_delta <= last_data_read;
927
                                ELSIF setstate="00" THEN
928
                                        memaddr_delta <= TG68_PC_add;
929
                                ELSIF exec(dispouter)='1' THEN
930
                                        memaddr_delta <= ea_data+memaddr_a;
931
                                ELSIF set_vectoraddr='1' THEN
932
                                        memaddr_delta <= trap_vector_vbr;
933
                                ELSE
934
                                        memaddr_delta <= memaddr_a;
935
                                        IF interrupt='0' AND Suppress_Base='0' THEN
936
--                                      IF interrupt='0' AND Suppress_Base='0' AND setstate(1)='1' THEN
937
                                                use_base <= '1';
938
                                        END IF;
939
                                END IF;
940
 
941
                -- only used for movem address update
942
--                                      IF (long_done='0' AND state(1)='1') OR movem_presub='0' THEN
943
                                        if ((memread(0) = '1') and state(1) = '1') or movem_presub = '0' then -- fix for unaligned movem mikej
944
                                                memaddr <= addr;
945
                                        END IF;
946
                        END IF;
947
                END IF;
948
 
949
                -- if access done, and not aligned, don't increment
950
                addr <= memaddr_reg+memaddr_delta;
951 4 tobiflex
                addr_out <= memaddr_reg + memaddr_delta;
952
 
953 2 tobiflex
                IF use_base='0' THEN
954
                        memaddr_reg <= (others=>'0');
955
                ELSE
956
                        memaddr_reg <= reg_QA;
957
                END IF;
958
    END PROCESS;
959
 
960
-----------------------------------------------------------------------------
961
-- PC Calc + fetch opcode
962
-----------------------------------------------------------------------------
963
PROCESS (clk, IPL, setstate, state, exec_write_back, set_direct_data, next_micro_state, stop, make_trace, make_berr, IPL_nr, FlagsSR, set_rot_cnt, opcode, writePCbig, set_exec, exec,
964 11 tobiflex
        PC_dataa, PC_datab, setnextpass, last_data_read, TG68_PC_brw, TG68_PC_word, Z_error, trap_trap, trap_trapv, interrupt, tmp_TG68_PC, TG68_PC)
965 2 tobiflex
        BEGIN
966
 
967
                PC_dataa <= TG68_PC;
968
                IF TG68_PC_brw = '1' THEN
969
                        PC_dataa <= tmp_TG68_PC;
970
                END IF;
971
 
972
                PC_datab(2 downto 0) <= (others => '0');
973
                PC_datab(3) <= PC_datab(2);
974
                PC_datab(7 downto 4) <= (others => PC_datab(3));
975
                PC_datab(15 downto 8) <= (others => PC_datab(7));
976
                PC_datab(31 downto 16) <= (others => PC_datab(15));
977
                IF interrupt='1' THEN
978
                        PC_datab(2 downto 1) <= "11";
979
                END IF;
980
                IF exec(writePC_add) ='1' THEN
981
                        IF writePCbig='1' THEN
982
                                PC_datab(3) <= '1';
983
                                PC_datab(1) <= '1';
984
                        ELSE
985
                                PC_datab(2) <= '1';
986
                        END IF;
987
                        IF trap_trap='1' OR trap_trapv='1' OR exec(trap_chk)='1' OR Z_error='1' THEN
988
                                PC_datab(1) <= '1';
989
                        END IF;
990
                ELSIF state="00" THEN
991
                        PC_datab(1) <= '1';
992
                END IF;
993
                IF TG68_PC_brw = '1' THEN
994
                        IF TG68_PC_word='1' THEN
995
                                PC_datab <= last_data_read;
996
                        ELSE
997
                                PC_datab(7 downto 0) <= opcode(7 downto 0);
998
                        END IF;
999
                END IF;
1000
 
1001
                TG68_PC_add <= PC_dataa+PC_datab;
1002
 
1003
                setopcode <= '0';
1004
                setendOPC <= '0';
1005
                setinterrupt <= '0';
1006
                IF setstate="00" AND next_micro_state=idle AND setnextpass='0' AND (exec_write_back='0' OR state="11") AND set_rot_cnt="000001" AND set_exec(opcCHK)='0'THEN
1007
                        setendOPC <= '1';
1008
                        IF FlagsSR(2 downto 0)<IPL_nr OR IPL_nr="111"  OR make_trace='1' OR make_berr='1' THEN
1009
                                setinterrupt <= '1';
1010
                        ELSIF stop='0' THEN
1011
                                setopcode <= '1';
1012
                        END IF;
1013
                END IF;
1014
                setexecOPC <= '0';
1015
                IF setstate="00" AND next_micro_state=idle AND set_direct_data='0' AND (exec_write_back='0' OR state="10") THEN
1016
                        setexecOPC <= '1';
1017
                END IF;
1018
 
1019
                IPL_nr <= NOT IPL;
1020
                IF rising_edge(clk) THEN
1021 4 tobiflex
                        IF Reset = '1' THEN
1022 2 tobiflex
                                state <= "01";
1023
                                opcode <= X"2E79";                                      --move $0,a7
1024
                                trap_interrupt <= '0';
1025
                                interrupt <= '0';
1026
                                last_opc_read  <= X"4EF9";                      --jmp nn.l
1027
                                TG68_PC <= X"00000004";
1028
                                decodeOPC <= '0';
1029
                                endOPC <= '0';
1030
                                TG68_PC_word <= '0';
1031
                                execOPC <= '0';
1032 11 tobiflex
--                              execOPC_ALU <= '0';
1033 2 tobiflex
                                stop <= '0';
1034
                                rot_cnt <="000001";
1035
--                              byte <= '0';
1036
--                              IPL_nr <= "000";
1037
                                trap_trace <= '0';
1038
                                trap_berr <= '0';
1039
                                writePCbig <= '0';
1040
--                              recall_last <= '0';
1041
                                Suppress_Base <= '0';
1042
                                make_berr <= '0';
1043
                                memmask <= "111111";
1044 11 tobiflex
                                exec_write_back <= '0';
1045 2 tobiflex
                        ELSE
1046
--                              IPL_nr <= NOT IPL;
1047
                                IF clkena_in='1' THEN
1048
                                        memmask <= memmask(3 downto 0)&"11";
1049
                                        memread <= memread(1 downto 0)&memmaskmux(5 downto 4);
1050
--                                      IF wbmemmask(5 downto 4)="11" THEN      
1051
--                                              wbmemmask <= memmask;
1052
--                                      END IF;
1053
                                        IF exec(directPC)='1' THEN
1054
                                                TG68_PC <= data_read;
1055
                                        ELSIF exec(ea_to_pc)='1' THEN
1056
                                                TG68_PC <= addr;
1057
                                        ELSIF (state ="00" OR TG68_PC_brw = '1') AND stop='0'  THEN
1058
                                                TG68_PC <= TG68_PC_add;
1059
                                        END IF;
1060
                                END IF;
1061
                                IF clkena_lw='1' THEN
1062
                                        interrupt <= setinterrupt;
1063
                                        decodeOPC <= setopcode;
1064
                                        endOPC <= setendOPC;
1065 11 tobiflex
                                        execOPC <= setexecOPC;
1066
--                                      IF setexecOPC='1' OR set(alu_exec)='1' THEN
1067
--                                              execOPC_ALU <= '1';
1068
--                                      ELSE
1069
--                                              execOPC_ALU <= '0';
1070
--                                      END IF;
1071 2 tobiflex
 
1072
                                        exe_datatype <= set_datatype;
1073
                                        exe_opcode <= opcode;
1074
 
1075
                                        if(trap_berr='0') then
1076
                                                make_berr <= (berr OR make_berr);
1077
                                        else
1078
                                                make_berr <= '0';
1079
                                        end if;
1080
 
1081
                                        stop <= set_stop OR (stop AND NOT setinterrupt);
1082
                                        IF setinterrupt='1' THEN
1083
                                                trap_interrupt <= '0';
1084
                                                trap_trace <= '0';
1085
--                                              TG68_PC_word <= '0';
1086
                                                make_berr <= '0';
1087
                                                trap_berr <= '0';
1088
                                                IF make_trace='1' THEN
1089
                                                        trap_trace <= '1';
1090
                                                ELSIF make_berr='1' THEN
1091
                                                        trap_berr <= '1';
1092
                                                ELSE
1093
                                                        rIPL_nr <= IPL_nr;
1094
                                                        IPL_vec <= "00011"&IPL_nr;            --        TH              
1095
                                                        trap_interrupt <= '1';
1096
                                                END IF;
1097
                                        END IF;
1098
                                        IF micro_state=trap0 AND IPL_autovector='0' THEN
1099
                                                IPL_vec <= last_data_read(7 downto 0);    --     TH
1100
                                        END IF;
1101
                                        IF state="00" THEN
1102
                                                last_opc_read <= data_read(15 downto 0);
1103 8 tobiflex
                                                last_opc_pc <= tg68_pc;--TH
1104 2 tobiflex
                                        END IF;
1105
                                        IF setopcode='1' THEN
1106
                                                trap_interrupt <= '0';
1107
                                                trap_trace <= '0';
1108
                                                TG68_PC_word <= '0';
1109
                                                trap_berr <= '0';
1110
                                        ELSIF opcode(7 downto 0)="00000000" OR opcode(7 downto 0)="11111111" OR data_is_source='1' THEN
1111
                                                TG68_PC_word <= '1';
1112
                                        END IF;
1113
 
1114
                                        IF exec(get_bfoffset)='1' THEN
1115
                                                alu_width <= bf_width;
1116
                                                alu_bf_shift <= bf_shift;
1117
                                                alu_bf_loffset <= bf_loffset;
1118
                                                alu_bf_ffo_offset <= bf_full_offset+bf_width+1;
1119
                                        END IF;
1120
                                        memread <= "1111";
1121
                                        FC(1) <= NOT setstate(1) OR (PCbase AND NOT setstate(0));
1122
                                        FC(0) <= setstate(1) AND (NOT PCbase OR setstate(0));
1123
                                        IF interrupt='1' THEN
1124
                                                FC(1 downto 0) <= "11";
1125 11 tobiflex
                                        END IF;
1126
 
1127
                                        IF state="11" THEN
1128
                                                exec_write_back <= '0';
1129
                                        ELSIF setstate="10" AND write_back='1' THEN
1130
                                                exec_write_back <= '1';
1131
                                        END IF;
1132 2 tobiflex
                                        IF (state="10" AND write_back='1' AND setstate/="10") OR set_rot_cnt/="000001" OR (stop='1' AND interrupt='0') OR set_exec(opcCHK)='1' THEN
1133
                                                state <= "01";
1134
                                                memmask <= "111111";
1135
                                        ELSIF execOPC='1' AND exec_write_back='1' THEN
1136
                                                state <= "11";
1137
                                                FC(1 downto 0) <= "01";
1138
                                                memmask <= wbmemmask;
1139
                                        ELSE
1140
                                                state <= setstate;
1141
                                                IF setstate="01" THEN
1142
                                                        memmask <= "111111";
1143
                                                        wbmemmask <= "111111";
1144
                                                ELSIF exec(get_bfoffset)='1' THEN
1145
                                                        memmask <= set_memmask;
1146
                                                        wbmemmask <= set_memmask;
1147
                                                        oddout <= set_oddout;
1148
                                                ELSIF set(longaktion)='1' THEN
1149
                                                        memmask <= "100001";
1150
                                                        wbmemmask <= "100001";
1151
                                                        oddout <= '0';
1152
                                                ELSIF set_datatype="00" AND setstate(1)='1' THEN
1153
                                                        memmask <= "101111";
1154
                                                        wbmemmask <= "101111";
1155
                                                        IF set(mem_byte)='1' THEN
1156
                                                                oddout <= '0';
1157
                                                        ELSE
1158
                                                                oddout <= '1';
1159
                                                        END IF;
1160
                                                ELSE
1161
                                                        memmask <= "100111";
1162
                                                        wbmemmask <= "100111";
1163
                                                        oddout <= '0';
1164
                                                END IF;
1165
                                        END IF;
1166
 
1167
                                        IF decodeOPC='1' THEN
1168
                                                rot_bits <= set_rot_bits;
1169
                                                writePCbig <= '0';
1170
                                        ELSE
1171
                                                writePCbig <= set_writePCbig OR writePCbig;
1172
                                        END IF;
1173
                                        IF decodeOPC='1' OR exec(ld_rot_cnt)='1' OR rot_cnt/="000001" THEN
1174
                                                rot_cnt <= set_rot_cnt;
1175
                                        END IF;
1176
 
1177
                                        IF set_Suppress_Base='1' THEN
1178
                                                Suppress_Base <= '1';
1179
                                        ELSIF setstate(1)='1' OR (ea_only='1' AND set(get_ea_now)='1') THEN
1180
                                                Suppress_Base <= '0';
1181
                                        END IF;
1182
                                        IF getbrief='1' THEN
1183
                                                IF state(1)='1' THEN
1184
                                                        brief <= last_opc_read(15 downto 0);
1185
                                                ELSE
1186
                                                        brief <= data_read(15 downto 0);
1187
                                                END IF;
1188
                                        END IF;
1189
 
1190
                                        IF setopcode='1' AND berr='0' THEN
1191
                                                IF state="00" THEN
1192
                                                        opcode <= data_read(15 downto 0);
1193 8 tobiflex
                                                        exe_pc <= tg68_pc;--TH
1194 2 tobiflex
                                                ELSE
1195
                                                        opcode <= last_opc_read(15 downto 0);
1196 8 tobiflex
                                                        exe_pc <= last_opc_pc;--TH
1197 2 tobiflex
                                                END IF;
1198
                                                nextpass <= '0';
1199
                                        ELSIF setinterrupt='1' OR setopcode='1' THEN
1200
                                                opcode <= X"4E71";              --nop
1201
                                                nextpass <= '0';
1202
                                        ELSE
1203
--                                              IF setnextpass='1' OR (regdirectsource='1' AND state="00") THEN
1204
                                                IF setnextpass='1' OR regdirectsource='1' THEN
1205
                                                        nextpass <= '1';
1206
                                                END IF;
1207 10 tobiflex
                                        END IF;
1208
 
1209 2 tobiflex
                                        IF decodeOPC='1' OR interrupt='1' THEN
1210
                                                trap_SR <= FlagsSR;
1211
                                        END IF;
1212
                                END IF;
1213
                        END IF;
1214
                END IF;
1215
 
1216
                IF rising_edge(clk) THEN
1217 5 tobiflex
                        IF Reset = '1' THEN
1218 2 tobiflex
                                PCbase <= '1';
1219
                        ELSIF clkena_lw='1' THEN
1220
                                PCbase <= set_PCbase OR PCbase;
1221
                                IF setexecOPC='1' OR (state(1)='1' AND movem_run='0') THEN
1222
                                        PCbase <= '0';
1223
                                END IF;
1224
                        END IF;
1225
                        IF clkena_lw='1' THEN
1226
                                exec <= set;
1227 11 tobiflex
                                exec(alu_move) <= set(opcMOVE) OR set(alu_move);
1228
                                exec(alu_setFlags) <= set(opcADD) OR set(alu_setFlags);
1229 2 tobiflex
                                exec_tas <= '0';
1230
                                exec(subidx) <= set(presub) or set(subidx);
1231
                                IF setexecOPC='1' THEN
1232 11 tobiflex
                                        exec <= set_exec OR set;
1233
                                        exec(alu_move) <= set_exec(opcMOVE) OR set(opcMOVE) OR set(alu_move);
1234
                                        exec(alu_setFlags) <= set_exec(opcADD) OR set(opcADD) OR set(alu_setFlags);
1235 2 tobiflex
                                        exec_tas <= set_exec_tas;
1236
                                END IF;
1237
                                exec(get_2ndOPC) <= set(get_2ndOPC) OR setopcode;
1238
                        END IF;
1239
                END IF;
1240
        END PROCESS;
1241
 
1242
------------------------------------------------------------------------------
1243
--prepare Bitfield Parameters
1244
------------------------------------------------------------------------------          
1245
PROCESS (clk, Reset, sndOPC, reg_QA, reg_QB, bf_width, bf_offset, bf_bhits, opcode, setstate, bf_shift)
1246
        BEGIN
1247
                IF sndOPC(11)='1' THEN
1248
                        bf_offset <= '0'&reg_QA(4 downto 0);
1249
                ELSE
1250
                        bf_offset <= '0'&sndOPC(10 downto 6);
1251
                END IF;
1252
                IF sndOPC(11)='1' THEN
1253
                        bf_full_offset <= reg_QA;
1254
                ELSE
1255
                        bf_full_offset <= (others => '0');
1256
                        bf_full_offset(4 downto 0) <= sndOPC(10 downto 6);
1257
                END IF;
1258
 
1259
                bf_width(5) <= '0';
1260
                IF sndOPC(5)='1' THEN
1261
                        bf_width(4 downto 0) <= reg_QB(4 downto 0)-1;
1262
                ELSE
1263
                        bf_width(4 downto 0) <= sndOPC(4 downto 0)-1;
1264
                END IF;
1265
                bf_bhits <= bf_width+bf_offset;
1266
                set_oddout <= NOT bf_bhits(3);
1267
 
1268 4 tobiflex
 
1269
-- bf_loffset is used for the shifted_bitmask
1270 2 tobiflex
                IF opcode(10 downto 8)="111" THEN --INS
1271
                        bf_loffset <= 32-bf_shift;
1272
                ELSE
1273
                        bf_loffset <= bf_shift;
1274
                END IF;
1275
                bf_loffset(5) <= '0';
1276
 
1277
                IF opcode(4 downto 3)="00" THEN
1278
                        IF opcode(10 downto 8)="111" THEN --INS
1279
                                bf_shift <= bf_bhits+1;
1280
                        ELSE
1281
                                bf_shift <= 31-bf_bhits;
1282
                        END IF;
1283
                        bf_shift(5) <= '0';
1284
                ELSE
1285 4 tobiflex
                        IF opcode(10 downto 8)="111" THEN --INS
1286
                                bf_shift <= "011001"+("000"&bf_bhits(2 downto 0));
1287
                                bf_shift(5) <= '0';
1288 2 tobiflex
                        ELSE
1289
                                bf_shift <= "000"&("111"-bf_bhits(2 downto 0));
1290
                        END IF;
1291
                        bf_offset(4 downto 3) <= "00";
1292
                END IF;
1293 4 tobiflex
 
1294
                CASE bf_bhits(5 downto 3) IS
1295
                        WHEN "000" =>
1296
                                set_memmask <= "101111";
1297
                        WHEN "001" =>
1298 2 tobiflex
                                set_memmask <= "100111";
1299 4 tobiflex
                        WHEN "010" =>
1300
                                set_memmask <= "100011";
1301
                        WHEN "011" =>
1302
                                set_memmask <= "100001";
1303
                        WHEN OTHERS =>
1304
                                set_memmask <= "100000";
1305
                END CASE;
1306
                IF setstate="00" THEN
1307
                        set_memmask <= "100111";
1308
                END IF;
1309 2 tobiflex
        END PROCESS;
1310
 
1311
------------------------------------------------------------------------------
1312
--SR op
1313
------------------------------------------------------------------------------          
1314
PROCESS (clk, Reset, FlagsSR, last_data_read, OP2out, exec)
1315
        BEGIN
1316
                IF exec(andiSR)='1' THEN
1317
                        SRin <= FlagsSR AND last_data_read(15 downto 8);
1318
                ELSIF exec(eoriSR)='1' THEN
1319
                        SRin <= FlagsSR XOR last_data_read(15 downto 8);
1320
                ELSIF exec(oriSR)='1' THEN
1321
                        SRin <= FlagsSR OR last_data_read(15 downto 8);
1322
                ELSE
1323
                        SRin <= OP2out(15 downto 8);
1324
                END IF;
1325
 
1326
                IF rising_edge(clk) THEN
1327 4 tobiflex
                        IF Reset='1' THEN
1328 2 tobiflex
                                FC(2) <= '1';
1329
                                SVmode <= '1';
1330
                                preSVmode <= '1';
1331 7 tobiflex
                                FlagsSR <= "00100111";
1332 2 tobiflex
                                make_trace <= '0';
1333
                        ELSIF clkena_lw = '1' THEN
1334
                                IF setopcode='1' THEN
1335
                                        make_trace <= FlagsSR(7);
1336
                                        IF set(changeMode)='1' THEN
1337
                                                SVmode <= NOT SVmode;
1338
                                        ELSE
1339
                                                SVmode <= preSVmode;
1340
                                        END IF;
1341
                                END IF;
1342
                                IF set(changeMode)='1' THEN
1343
                                        preSVmode <= NOT preSVmode;
1344
                                        FlagsSR(5) <= NOT preSVmode;
1345
                                        FC(2) <= NOT preSVmode;
1346
                                END IF;
1347
                                IF micro_state=trap3 THEN
1348
                                        FlagsSR(7) <= '0';
1349
                                END IF;
1350
                                IF trap_trace='1' AND state="10" THEN
1351
                                        make_trace <= '0';
1352
                                END IF;
1353
                                IF exec(directSR)='1' OR set_stop='1' THEN
1354
                                        FlagsSR <= data_read(15 downto 8);
1355
                                END IF;
1356
                                IF interrupt='1' AND trap_interrupt='1' THEN
1357
                                        FlagsSR(2 downto 0) <=rIPL_nr;
1358
                                END IF;
1359
                                IF exec(to_SR)='1' THEN
1360
                                        FlagsSR(7 downto 0) <= SRin;     --SR
1361
                                        FC(2) <= SRin(5);
1362
                                ELSIF exec(update_FC)='1' THEN
1363
                                        FC(2) <= FlagsSR(5);
1364
                                END IF;
1365
                                IF interrupt='1' THEN
1366
                                        FC(2) <= '1';
1367 7 tobiflex
                                END IF;
1368
                                IF cpu(1)='0' THEN
1369 11 tobiflex
                                        FlagsSR(4) <= '0';
1370 7 tobiflex
                                        FlagsSR(6) <= '0';
1371
                                END IF;
1372 4 tobiflex
                                FlagsSR(3) <= '0';
1373 2 tobiflex
                        END IF;
1374
                END IF;
1375
        END PROCESS;
1376
 
1377
-----------------------------------------------------------------------------
1378
-- decode opcode
1379
-----------------------------------------------------------------------------
1380
PROCESS (clk, cpu, OP1out, OP2out, opcode, exe_condition, nextpass, micro_state, decodeOPC, state, setexecOPC, Flags, FlagsSR, direct_data, build_logical,
1381
                 build_bcd, set_Z_error, trapd, movem_run, last_data_read, set, set_V_Flag, z_error, trap_trace, trap_interrupt,
1382
                 SVmode, preSVmode, stop, long_done, ea_only, setstate, execOPC, exec_write_back, exe_datatype,
1383 11 tobiflex
                 datatype, interrupt, c_out, trapmake, rot_cnt, brief, addr, trap_trapv, last_data_in, use_VBR_Stackframe,
1384 2 tobiflex
                 long_start, set_datatype, sndOPC, set_exec, exec, ea_build_now, reg_QA, reg_QB, make_berr, trap_berr)
1385
        BEGIN
1386
                TG68_PC_brw <= '0';
1387
                setstate <= "00";
1388
                Regwrena_now <= '0';
1389
                movem_presub <= '0';
1390
                setnextpass <= '0';
1391
                regdirectsource <= '0';
1392
                setdisp <= '0';
1393
                setdispbyte <= '0';
1394
                getbrief <= '0';
1395 11 tobiflex
                dest_LDRareg <= '0';
1396
                dest_areg <= '0';
1397 2 tobiflex
                source_areg <= '0';
1398
                data_is_source <= '0';
1399
                write_back <= '0';
1400
                setstackaddr <= '0';
1401
                writePC <= '0';
1402
                ea_build_now <= '0';
1403
--              set_rot_bits <= "00";
1404
                set_rot_bits <= opcode(4 downto 3);
1405
                set_rot_cnt <= "000001";
1406
                dest_hbits <= '0';
1407 11 tobiflex
                source_lowbits <= '0';
1408
                source_LDRLbits <= '0';
1409
                source_LDRMbits <= '0';
1410 2 tobiflex
                source_2ndHbits <= '0';
1411 11 tobiflex
                source_2ndMbits <= '0';
1412 2 tobiflex
                source_2ndLbits <= '0';
1413 11 tobiflex
                dest_LDRHbits <= '0';
1414
                dest_LDRLbits <= '0';
1415 2 tobiflex
                dest_2ndHbits <= '0';
1416 11 tobiflex
                dest_2ndLbits <= '0';
1417 2 tobiflex
                ea_only <= '0';
1418
                set_direct_data <= '0';
1419
                set_exec_tas <= '0';
1420
                trap_illegal <='0';
1421
                trap_addr_error <= '0';
1422
                trap_priv <='0';
1423
                trap_1010 <='0';
1424
                trap_1111 <='0';
1425
                trap_trap <='0';
1426
                trap_trapv <= '0';
1427
                trapmake <='0';
1428
                set_vectoraddr <='0';
1429
                writeSR <= '0';
1430
                set_stop <= '0';
1431
--              illegal_write_mode <= '0';
1432
--              illegal_read_mode <= '0';
1433
--              illegal_byteaddr <= '0';
1434
                set_Z_error <= '0';
1435
 
1436
                next_micro_state <= idle;
1437
                build_logical <= '0';
1438
                build_bcd <= '0';
1439
                skipFetch <= make_berr;
1440
                set_writePCbig <= '0';
1441
--              set_recall_last <= '0';
1442
                set_Suppress_Base <= '0';
1443
                set_PCbase <= '0';
1444
 
1445
                IF rot_cnt/="000001" THEN
1446
                        set_rot_cnt <= rot_cnt-1;
1447
                END IF;
1448
                set_datatype <= datatype;
1449
 
1450
                set <= (OTHERS=>'0');
1451
                set_exec <= (OTHERS=>'0');
1452
                set(update_ld) <= '0';
1453
--              odd_start <= '0';
1454
------------------------------------------------------------------------------
1455
--Sourcepass
1456
------------------------------------------------------------------------------          
1457
                CASE opcode(7 downto 6) IS
1458
                        WHEN "00" => datatype <= "00";          --Byte
1459
                        WHEN "01" => datatype <= "01";          --Word
1460
                        WHEN OTHERS => datatype <= "10";        --Long
1461
                END CASE;
1462 11 tobiflex
 
1463
                IF execOPC='1' AND exec_write_back='1' THEN
1464
                        set(restore_ADDR) <= '1';
1465
                END IF;
1466 2 tobiflex
 
1467 10 tobiflex
                IF interrupt='1' AND trap_berr='1' THEN
1468
                        next_micro_state <= trap0;
1469
                        IF preSVmode='0' THEN
1470
                                set(changeMode) <= '1';
1471
                        END IF;
1472
                        setstate <= "01";
1473
                END IF;
1474 8 tobiflex
                IF trapmake='1' AND trapd='0' THEN
1475 11 tobiflex
--                      IF use_VBR_Stackframe='1' AND (trap_trapv='1' OR set_Z_error='1' OR exec(opcCHK)='1') THEN
1476
                        IF use_VBR_Stackframe='1' AND (trap_trapv='1' OR set_Z_error='1' OR exec(trap_chk)='1') THEN
1477 8 tobiflex
                                next_micro_state <= trap00;
1478
                        else
1479
                                next_micro_state <= trap0;
1480
                        end if;
1481 10 tobiflex
                        IF use_VBR_Stackframe='0' THEN
1482 2 tobiflex
                                set(writePC_add) <= '1';
1483
--                              set_datatype <= "10";
1484
                        END IF;
1485
                        IF preSVmode='0' THEN
1486
                                set(changeMode) <= '1';
1487
                        END IF;
1488
                        setstate <= "01";
1489
                END IF;
1490
                IF micro_state=int1 OR (interrupt='1' AND trap_trace='1') THEN
1491 8 tobiflex
-- paste and copy form TH       ---------       
1492 10 tobiflex
                        if trap_trace='1' AND use_VBR_Stackframe='1' then
1493 8 tobiflex
                                next_micro_state <= trap00;  --TH
1494
                        else
1495
                                next_micro_state <= trap0;
1496
                        end if;
1497
------------------------------------
1498
--                      next_micro_state <= trap0;
1499 2 tobiflex
--                      IF cpu(0)='0' THEN
1500
--                              set_datatype <= "10";
1501
--                      END IF;
1502
                        IF preSVmode='0' THEN
1503
                                set(changeMode) <= '1';
1504
                        END IF;
1505
                        setstate <= "01";
1506
                END IF;
1507 8 tobiflex
        if micro_state = int1 or (interrupt = '1' and trap_trace = '1') then
1508
          if preSVmode = '0' then
1509
                set(changeMode) <= '1';
1510
          end if;
1511
          setstate <= "01";
1512
        end if;
1513 2 tobiflex
 
1514
                IF setexecOPC='1' AND FlagsSR(5)/=preSVmode THEN
1515
                        set(changeMode) <= '1';
1516
--                      setstate <= "01";
1517
--                      next_micro_state <= nop;
1518
                END IF;
1519
 
1520
                IF interrupt='1' AND trap_interrupt='1'THEN
1521
--                      skipFetch <= '1';
1522
                        next_micro_state <= int1;
1523
                        set(update_ld) <= '1';
1524
                        setstate <= "10";
1525
                END IF;
1526
 
1527
                IF set(changeMode)='1' THEN
1528
                        set(to_USP) <= '1';
1529
                        set(from_USP) <= '1';
1530
                        setstackaddr <='1';
1531
                END IF;
1532
 
1533
                IF ea_only='0' AND set(get_ea_now)='1' THEN
1534
                        setstate <= "10";
1535
--                      set_recall_last <= '1';
1536
--                      set(update_ld) <= '0';
1537
                END IF;
1538
 
1539
                IF setstate(1)='1' AND set_datatype(1)='1' THEN
1540
                        set(longaktion) <= '1';
1541
                END IF;
1542
 
1543
                IF (ea_build_now='1' AND decodeOPC='1') OR exec(ea_build)='1' THEN
1544
                        CASE opcode(5 downto 3) IS              --source
1545
                                WHEN "010"|"011"|"100" =>                                               -- -(An)+
1546
                                        set(get_ea_now) <='1';
1547
                                        setnextpass <= '1';
1548
                                        IF opcode(3)='1' THEN   --(An)+
1549
                                                set(postadd) <= '1';
1550
                                                IF opcode(2 downto 0)="111" THEN
1551
                                                        set(use_SP) <= '1';
1552
                                                END IF;
1553
                                        END IF;
1554
                                        IF opcode(5)='1' THEN   -- -(An)
1555
                                                set(presub) <= '1';
1556
                                                IF opcode(2 downto 0)="111" THEN
1557
                                                        set(use_SP) <= '1';
1558
                                                END IF;
1559
                                        END IF;
1560
                                WHEN "101" =>                           --(d16,An)
1561
                                        next_micro_state <= ld_dAn1;
1562
                                WHEN "110" =>                           --(d8,An,Xn)
1563
                                        next_micro_state <= ld_AnXn1;
1564
                                        getbrief <='1';
1565
                                WHEN "111" =>
1566
                                        CASE opcode(2 downto 0) IS
1567
                                                WHEN "000" =>                           --(xxxx).w
1568
                                                        next_micro_state <= ld_nn;
1569
                                                WHEN "001" =>                           --(xxxx).l
1570
                                                        set(longaktion) <= '1';
1571
                                                        next_micro_state <= ld_nn;
1572
                                                WHEN "010" =>                           --(d16,PC)
1573
                                                        next_micro_state <= ld_dAn1;
1574
                                                        set(dispouter) <= '1';
1575
                                                        set_Suppress_Base <= '1';
1576
                                                        set_PCbase <= '1';
1577
                                                WHEN "011" =>                           --(d8,PC,Xn)
1578
                                                        next_micro_state <= ld_AnXn1;
1579
                                                        getbrief <= '1';
1580
                                                        set(dispouter) <= '1';
1581
                                                        set_Suppress_Base <= '1';
1582
                                                        set_PCbase <= '1';
1583
                                                WHEN "100" =>                           --#data
1584
                                                        setnextpass <= '1';
1585
                                                        set_direct_data <= '1';
1586
                                                        IF datatype="10" THEN
1587
                                                                set(longaktion) <= '1';
1588
                                                        END IF;
1589
                                                WHEN OTHERS => NULL;
1590
                                        END CASE;
1591
                                WHEN OTHERS => NULL;
1592
                        END CASE;
1593
                END IF;
1594
------------------------------------------------------------------------------
1595 11 tobiflex
--prepare opcode
1596
------------------------------------------------------------------------------
1597 2 tobiflex
                CASE opcode(15 downto 12) IS
1598 11 tobiflex
-- 0000 ----------------------------------------------------------------------------
1599
                        WHEN "0000" =>
1600 2 tobiflex
                        IF opcode(8)='1' AND opcode(5 downto 3)="001" THEN --movep
1601
                                datatype <= "00";                               --Byte
1602
                                set(use_SP) <= '1';             --addr+2
1603
                                set(no_Flags) <='1';
1604
                                IF opcode(7)='0' THEN  --to register
1605
                                        set_exec(Regwrena) <= '1';
1606
                                        set_exec(opcMOVE) <= '1';
1607
                                        set(movepl) <= '1';
1608
                                END IF;
1609
                                IF decodeOPC='1' THEN
1610 11 tobiflex
                                        IF opcode(6)='1' THEN
1611
                                                set(movepl) <= '1';
1612
                                        END IF;
1613
                                        IF opcode(7)='0' THEN
1614 2 tobiflex
                                                set_direct_data <= '1';         -- to register
1615
                                        END IF;
1616
                                        next_micro_state <= movep1;
1617
                                END IF;
1618 11 tobiflex
                                IF setexecOPC='1' THEN
1619 2 tobiflex
                                        dest_hbits <='1';
1620
                                END IF;
1621
                        ELSE
1622
                                IF opcode(8)='1' OR opcode(11 downto 9)="100" THEN              --Bits
1623 11 tobiflex
                                        IF opcode(5 downto 3)/="001" AND --ea An illegal mode
1624
                                           (opcode(8 downto 3)/="000111" OR opcode(2)='0') AND --BTST bit number static illegal modes
1625
                                           (opcode(8 downto 2)/="1001111" OR opcode(1 downto 0)="00") AND --BTST bit number dynamic illegal modes
1626
                                           (opcode(7 downto 6)="00" OR opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00") THEN --BCHG, BCLR, BSET illegal modes
1627
                                                set_exec(opcBITS) <= '1';
1628
                                                set_exec(ea_data_OP1) <= '1';
1629
                                                IF opcode(7 downto 6)/="00" THEN
1630
                                                        IF opcode(5 downto 4)="00" THEN
1631
                                                                set_exec(Regwrena) <= '1';
1632
                                                        END IF;
1633
                                                        write_back <= '1';
1634
                                                END IF;
1635 2 tobiflex
                                                IF opcode(5 downto 4)="00" THEN
1636 11 tobiflex
                                                        datatype <= "10";                       --Long
1637
                                                ELSE
1638
                                                        datatype <= "00";                       --Byte
1639 2 tobiflex
                                                END IF;
1640 11 tobiflex
                                                IF opcode(8)='0' THEN
1641
                                                        IF decodeOPC='1' THEN
1642
                                                                next_micro_state <= nop;
1643
                                                                set(get_2ndOPC) <= '1';
1644
                                                                set(ea_build) <= '1';
1645
                                                        END IF;
1646
                                                ELSE
1647
                                                        ea_build_now <= '1';
1648
                                                END IF;
1649
                                        ELSE
1650
                                                trap_illegal <= '1';
1651
                                                trapmake <= '1';
1652 2 tobiflex
                                        END IF;
1653 11 tobiflex
                                ELSIF opcode(8 downto 6)="011" THEN                     --CAS/CAS2/CMP2/CHK2
1654
                                        IF cpu(1)='1' THEN
1655
                                                IF opcode(11)='1' THEN                                  --CAS/CAS2
1656
                                                        IF (opcode(10 downto 9)/="00" AND --CAS illegal size
1657
                                                           opcode(5 downto 4)/="00" AND (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00")) OR --ea illegal modes
1658
                                                           (opcode(10)='1' AND opcode(5 downto 0)="111100") THEN --CAS2
1659
                                                                CASE opcode(10 downto 9) IS
1660
                                                                        WHEN "01" => datatype <= "00";          --Byte
1661
                                                                        WHEN "10" => datatype <= "01";          --Word
1662
                                                                        WHEN OTHERS => datatype <= "10";        --Long
1663
                                                                END CASE;
1664
                                                                IF opcode(10)='1' AND opcode(5 downto 0)="111100" THEN --CAS2
1665
                                                                        IF decodeOPC='1' THEN
1666
                                                                                set(get_2ndOPC) <= '1';
1667
                                                                                next_micro_state <= cas21;
1668
                                                                        END IF;
1669
                                                                ELSE                                                                                    --CAS
1670
                                                                        IF decodeOPC='1' THEN
1671
                                                                                next_micro_state <= nop;
1672
                                                                                set(get_2ndOPC) <= '1';
1673
                                                                                set(ea_build) <= '1';
1674
                                                                        END IF;
1675
                                                                        IF micro_state=idle AND nextpass='1' THEN
1676
                                                                                source_2ndLbits <= '1';
1677
                                                                                set(ea_data_OP1) <= '1';
1678
                                                                                set(addsub) <= '1';
1679
                                                                                set(alu_exec) <= '1';
1680
                                                                                set(alu_setFlags) <= '1';
1681
                                                                                setstate <= "01";
1682
                                                                                next_micro_state <= cas1;
1683
                                                                        END IF;
1684
                                                                END IF;
1685
                                                        ELSE
1686
                                                                trap_illegal <= '1';
1687
                                                                trapmake <= '1';
1688
                                                        END IF;
1689
                                                ELSE                            --CMP2/CHK2
1690
                                                        IF opcode(10 downto 9)/="11" AND --illegal size
1691
                                                           opcode(5 downto 4)/="00" AND opcode(5 downto 3)/="011" AND opcode(5 downto 3)/="100" AND opcode(5 downto 2)/="1111" THEN --ea illegal modes
1692
                                                                set(trap_chk) <= '1';
1693
                                                                datatype <= opcode(10 downto 9);
1694
                                                                IF decodeOPC='1' THEN
1695
                                                                        next_micro_state <= nop;
1696
                                                                        set(get_2ndOPC) <= '1';
1697
                                                                        set(ea_build) <= '1';
1698
                                                                END IF;
1699
                                                                IF set(get_ea_now)='1' THEN
1700
                                                                        set(mem_addsub) <= '1';
1701
                                                                        set(OP1addr) <= '1';
1702
                                                                END IF;
1703
                                                                IF micro_state=idle AND nextpass='1' THEN
1704
                                                                        setstate <= "10";
1705
                                                                        set(hold_OP2) <='1';
1706
                                                                        next_micro_state <= chk20;
1707
                                                                END IF;
1708
                                                        ELSE
1709
                                                                trap_illegal <= '1';
1710
                                                                trapmake <= '1';
1711
                                                        END IF;
1712
                                                END IF;
1713
                                        ELSE
1714
                                                trap_illegal <= '1';
1715
                                                trapmake <= '1';
1716 2 tobiflex
                                        END IF;
1717
                                ELSIF opcode(11 downto 9)="111" THEN            --MOVES not in 68000
1718 11 tobiflex
                                        IF cpu(0)='1' AND opcode(7 downto 6)/="11" AND opcode(5 downto 4)/="00" AND (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00") THEN
1719
                                                IF SVmode='1' THEN
1720
                                                        --TODO: implement MOVES
1721
                                                        trap_illegal <= '1';
1722
                                                        trapmake <= '1';
1723
                                                ELSE
1724 2 tobiflex
                                                        trap_priv <= '1';
1725
                                                        trapmake <= '1';
1726
                                                END IF;
1727
                                        ELSE
1728 11 tobiflex
                                                trap_illegal <= '1';
1729
                                                trapmake <= '1';
1730
                                        END IF;
1731
                                ELSE                                                            --andi, ...xxxi
1732
                                        IF opcode(7 downto 6)/="11" AND opcode(5 downto 3)/="001" THEN --ea An illegal mode
1733
                                                IF opcode(11 downto 9)="000" THEN       --ORI
1734
                                                        IF opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00" OR opcode(2 downto 0)="100" THEN
1735
                                                                set_exec(opcOR) <= '1';
1736
                                                        ELSE
1737
                                                                trap_illegal <= '1';
1738
                                                                trapmake <= '1';
1739 2 tobiflex
                                                        END IF;
1740
                                                END IF;
1741 11 tobiflex
                                                IF opcode(11 downto 9)="001" THEN       --ANDI
1742
                                                        IF opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00" OR opcode(2 downto 0)="100" THEN
1743
                                                                set_exec(opcAND) <= '1';
1744
                                                        ELSE
1745
                                                                trap_illegal <= '1';
1746
                                                                trapmake <= '1';
1747
                                                        END IF;
1748 2 tobiflex
                                                END IF;
1749 11 tobiflex
                                                IF opcode(11 downto 9)="010" OR opcode(11 downto 9)="011" THEN  --SUBI, ADDI
1750
                                                        IF opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00" THEN
1751
                                                                set_exec(opcADD) <= '1';
1752
                                                        ELSE
1753
                                                                trap_illegal <= '1';
1754
                                                                trapmake <= '1';
1755
                                                        END IF;
1756 2 tobiflex
                                                END IF;
1757 11 tobiflex
                                                IF opcode(11 downto 9)="101" THEN       --EORI
1758
                                                        IF opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00" OR opcode(2 downto 0)="100" THEN
1759
                                                                set_exec(opcEOR) <= '1';
1760
                                                        ELSE
1761
                                                                trap_illegal <= '1';
1762
                                                                trapmake <= '1';
1763
                                                        END IF;
1764
                                                END IF;
1765
                                                IF opcode(11 downto 9)="110" THEN       --CMPI
1766
                                                        IF opcode(5 downto 3)/="111" OR opcode(2)='0' THEN
1767
                                                                set_exec(opcCMP) <= '1';
1768
                                                        ELSE
1769
                                                                trap_illegal <= '1';
1770
                                                                trapmake <= '1';
1771
                                                        END IF;
1772
                                                END IF;
1773
                                                IF (set_exec(opcor) OR set_exec(opcand) OR set_exec(opcADD) OR set_exec(opcEor) OR set_exec(opcCMP))='1' THEN
1774
                                                        IF opcode(7)='0' AND opcode(5 downto 0)="111100" AND (set_exec(opcAND) OR set_exec(opcOR) OR set_exec(opcEOR))='1' THEN           --SR
1775
                                                                IF decodeOPC='1' AND SVmode='0' AND opcode(6)='1' THEN  --SR
1776
                                                                        trap_priv <= '1';
1777
                                                                        trapmake <= '1';
1778
                                                                ELSE
1779
                                                                        set(no_Flags) <= '1';
1780
                                                                        IF decodeOPC='1' THEN
1781
                                                                                IF opcode(6)='1' THEN
1782
                                                                                        set(to_SR) <= '1';
1783
                                                                                END IF;
1784
                                                                                set(to_CCR) <= '1';
1785
                                                                                set(andiSR) <= set_exec(opcAND);
1786
                                                                                set(eoriSR) <= set_exec(opcEOR);
1787
                                                                                set(oriSR) <= set_exec(opcOR);
1788
                                                                                setstate <= "01";
1789
                                                                                next_micro_state <= nopnop;
1790
                                                                        END IF;
1791
                                                                END IF;
1792
                                                        ELSIF opcode(7)='0' OR opcode(5 downto 0)/="111100" OR (set_exec(opcand) OR set_exec(opcor) OR set_exec(opcEor))='0' THEN
1793
                                                                IF decodeOPC='1' THEN
1794
                                                                        next_micro_state <= andi;
1795
                                                                        set(get_2ndOPC) <='1';
1796
                                                                        set(ea_build) <= '1';
1797
                                                                        set_direct_data <= '1';
1798
                                                                        IF datatype="10" THEN
1799
                                                                                set(longaktion) <= '1';
1800
                                                                        END IF;
1801
                                                                END IF;
1802
                                                                IF opcode(5 downto 4)/="00" THEN
1803
                                                                        set_exec(ea_data_OP1) <= '1';
1804
                                                                END IF;
1805
                                                                IF opcode(11 downto 9)/="110" THEN      --CMPI
1806
                                                                        IF opcode(5 downto 4)="00" THEN
1807
                                                                                set_exec(Regwrena) <= '1';
1808
                                                                        END IF;
1809
                                                                        write_back <= '1';
1810
                                                                END IF;
1811
                                                                IF opcode(10 downto 9)="10" THEN        --CMPI, SUBI
1812
                                                                        set(addsub) <= '1';
1813
                                                                END IF;
1814
                                                        ELSE
1815
                                                                trap_illegal <= '1';
1816
                                                                trapmake <= '1';
1817
                                                        END IF;
1818
                                                ELSE
1819
                                                        trap_illegal <= '1';
1820
                                                        trapmake <= '1';
1821
                                                END IF;
1822
                                        ELSE
1823
                                                trap_illegal <= '1';
1824
                                                trapmake <= '1';
1825
                                        END IF;
1826
                                END IF;
1827
                        END IF;
1828 2 tobiflex
 
1829 11 tobiflex
-- 0001, 0010, 0011 -----------------------------------------------------------------
1830 2 tobiflex
                        WHEN "0001"|"0010"|"0011" =>                            --move.b, move.l, move.w
1831 11 tobiflex
                                IF ((opcode(11 downto 10)="00" OR opcode(8 downto 6)/="111") AND --illegal dest ea
1832
                                   (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00") AND --illegal src ea
1833
                                   (opcode(13)='1' OR (opcode(8 downto 6)/="001" AND opcode(5 downto 3)/="001"))) THEN --byte src address reg direct, byte movea
1834
                                        set_exec(opcMOVE) <= '1';
1835
                                        ea_build_now <= '1';
1836
                                        IF opcode(8 downto 6)="001" THEN
1837
                                                set(no_Flags) <= '1';
1838 2 tobiflex
                                        END IF;
1839 11 tobiflex
                                        IF opcode(5 downto 4)="00" THEN --Dn, An
1840
                                                IF opcode(8 downto 7)="00" THEN
1841
                                                        set_exec(Regwrena) <= '1';
1842
                                                END IF;
1843
                                        END IF;
1844
                                        CASE opcode(13 downto 12) IS
1845
                                                WHEN "01" => datatype <= "00";          --Byte
1846
                                                WHEN "10" => datatype <= "10";          --Long
1847
                                                WHEN OTHERS => datatype <= "01";        --Word
1848
                                        END CASE;
1849
                                        source_lowbits <= '1';                                  -- Dn=>  An=>
1850
                                        IF opcode(3)='1' THEN
1851
                                                source_areg <= '1';
1852
                                        END IF;
1853
 
1854
                                        IF nextpass='1' OR opcode(5 downto 4)="00" THEN
1855
                                                dest_hbits <= '1';
1856
                                                IF opcode(8 downto 6)/="000" THEN
1857
                                                        dest_areg <= '1';
1858
                                                END IF;
1859
                                        END IF;
1860
--                                      IF setstate="10" THEN
1861
--                                              set(update_ld) <= '0';
1862
--                                      END IF;
1863 2 tobiflex
--
1864 11 tobiflex
                                        IF micro_state=idle AND (nextpass='1' OR (opcode(5 downto 4)="00" AND decodeOPC='1')) THEN
1865
                                                CASE opcode(8 downto 6) IS              --destination
1866
                                                        WHEN "000"|"001" =>                                             --Dn,An
1867
                                                                        set_exec(Regwrena) <= '1';
1868
                                                        WHEN "010"|"011"|"100" =>                                       --destination -(an)+
1869
                                                                IF opcode(6)='1' THEN   --(An)+
1870
                                                                        set(postadd) <= '1';
1871
                                                                        IF opcode(11 downto 9)="111" THEN
1872
                                                                                set(use_SP) <= '1';
1873
                                                                        END IF;
1874 2 tobiflex
                                                                END IF;
1875 11 tobiflex
                                                                IF opcode(8)='1' THEN   -- -(An)
1876
                                                                        set(presub) <= '1';
1877
                                                                        IF opcode(11 downto 9)="111" THEN
1878
                                                                                set(use_SP) <= '1';
1879
                                                                        END IF;
1880 2 tobiflex
                                                                END IF;
1881 11 tobiflex
                                                                setstate <= "11";
1882
                                                                next_micro_state <= nop;
1883
                                                                IF nextpass='0' THEN
1884
                                                                        set(write_reg) <= '1';
1885
                                                                END IF;
1886
                                                        WHEN "101" =>                           --(d16,An)
1887
                                                                next_micro_state <= st_dAn1;
1888
--                                                              getbrief <= '1';
1889
                                                        WHEN "110" =>                           --(d8,An,Xn)
1890
                                                                next_micro_state <= st_AnXn1;
1891
                                                                getbrief <= '1';
1892
                                                        WHEN "111" =>
1893
                                                                CASE opcode(11 downto 9) IS
1894
                                                                        WHEN "000" =>                           --(xxxx).w
1895
                                                                                next_micro_state <= st_nn;
1896
                                                                        WHEN "001" =>                           --(xxxx).l
1897
                                                                                set(longaktion) <= '1';
1898
                                                                                next_micro_state <= st_nn;
1899
                                                                        WHEN OTHERS => NULL;
1900
                                                                END CASE;
1901
                                                        WHEN OTHERS => NULL;
1902
                                                END CASE;
1903
                                        END IF;
1904
                                ELSE
1905
                                        trap_illegal <= '1';
1906
                                        trapmake <= '1';
1907
                                END IF;
1908 2 tobiflex
---- 0100 ----------------------------------------------------------------------------          
1909
                        WHEN "0100" =>                          --rts_group
1910 11 tobiflex
                                IF opcode(8)='1' THEN           --lea, extb.l, chk
1911
                                        IF opcode(6)='1' THEN           --lea, extb.l
1912
                                                IF opcode(11 downto 9)="100" AND opcode(5 downto 3)="000" THEN --extb.l
1913
                                                        IF opcode(7)='1' AND cpu(1)='1' THEN
1914
                                                                source_lowbits <= '1';
1915 2 tobiflex
                                                                set_exec(opcEXT) <= '1';
1916 11 tobiflex
                                                                set_exec(opcEXTB) <= '1';
1917 2 tobiflex
                                                                set_exec(opcMOVE) <= '1';
1918 11 tobiflex
                                                                set_exec(Regwrena) <= '1';
1919
                                                        ELSE
1920
                                                                trap_illegal <= '1';
1921
                                                                trapmake <= '1';
1922
                                                        END IF;
1923
                                                ELSE
1924
                                                        IF opcode(7)='1' AND
1925
                                                           (opcode(5)='1' OR opcode(4 downto 3)="10") AND
1926
                                                           opcode(5 downto 3)/="100" AND opcode(5 downto 2)/="1111" THEN --ea illegal opcodes
1927
                                                                source_lowbits <= '1';
1928 2 tobiflex
                                                                source_areg <= '1';
1929
                                                                ea_only <= '1';
1930
                                                                set_exec(Regwrena) <= '1';
1931
                                                                set_exec(opcMOVE) <='1';
1932
                                                                set(no_Flags) <='1';
1933
                                                                IF opcode(5 downto 3)="010" THEN        --lea (Am),An
1934
                                                                        dest_areg <= '1';
1935
                                                                        dest_hbits <= '1';
1936
                                                                ELSE
1937
                                                                        ea_build_now <= '1';
1938
                                                                END IF;
1939
                                                                IF set(get_ea_now)='1' THEN
1940
                                                                        setstate <= "01";
1941
                                                                        set_direct_data <= '1';
1942
                                                                END IF;
1943
                                                                IF setexecOPC='1' THEN
1944
                                                                        dest_areg <= '1';
1945
                                                                        dest_hbits <= '1';
1946
                                                                END IF;
1947 11 tobiflex
                                                        ELSE
1948
                                                                trap_illegal <='1';
1949
                                                                trapmake <='1';
1950
                                                        END IF;
1951 2 tobiflex
                                                END IF;
1952
                                        ELSE                                                            --chk
1953 11 tobiflex
                                                IF opcode(5 downto 3)/="001" AND --ea An illegal mode
1954
                                                   (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00") THEN --ea illegal modes
1955
                                                        IF opcode(7)='1' THEN
1956
                                                                datatype <= "01";       --Word
1957
                                                                set(trap_chk) <= '1';
1958
                                                                IF (c_out(1)='0' OR OP1out(15)='1' OR OP2out(15)='1') AND exec(opcCHK)='1' THEN
1959
                                                                        trapmake <= '1';
1960
                                                                END IF;
1961
                                                        ELSIF cpu(1)='1' THEN   --chk long for 68020
1962
                                                                datatype <= "10";       --Long
1963
                                                                set(trap_chk) <= '1';
1964
                                                                IF (c_out(2)='0' OR OP1out(31)='1' OR OP2out(31)='1') AND exec(opcCHK)='1' THEN
1965
                                                                        trapmake <= '1';
1966
                                                                END IF;
1967
                                                        ELSE
1968
                                                                trap_illegal <= '1';            -- chk long for 68020
1969 2 tobiflex
                                                                trapmake <= '1';
1970
                                                        END IF;
1971 11 tobiflex
                                                        IF opcode(7)='1' OR cpu(1)='1' THEN
1972
                                                                IF (nextpass='1' OR opcode(5 downto 4)="00") AND exec(opcCHK)='0' AND micro_state=idle THEN
1973
                                                                        set_exec(opcCHK) <= '1';
1974
                                                                END IF;
1975
                                                                ea_build_now <= '1';
1976
                                                                set(addsub) <= '1';
1977
                                                                IF setexecOPC='1' THEN
1978
                                                                        dest_hbits <= '1';
1979
                                                                        source_lowbits <='1';
1980
                                                                END IF;
1981 2 tobiflex
                                                        END IF;
1982
                                                ELSE
1983 11 tobiflex
                                                        trap_illegal <= '1';
1984 2 tobiflex
                                                        trapmake <= '1';
1985
                                                END IF;
1986
                                        END IF;
1987
                                ELSE
1988
                                        CASE opcode(11 downto 9) IS
1989
                                                WHEN "000"=>
1990 11 tobiflex
                                                        IF (opcode(5 downto 3)/="001" AND --ea An illegal mode
1991
                                                           (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00")) THEN --ea illegal modes
1992
                                                                IF opcode(7 downto 6)="11" THEN                                 --move from SR
1993
                                                                        IF SR_Read=0 OR (cpu(0)='0' AND SR_Read=2) OR SVmode='1'  THEN
1994
                                                                                ea_build_now <= '1';
1995
                                                                                set_exec(opcMOVESR) <= '1';
1996
                                                                                datatype <= "01";
1997
                                                                                write_back <='1';                                                       -- im 68000 wird auch erst gelesen
1998
                                                                                IF cpu(0)='1' AND state="10" THEN
1999
                                                                                        skipFetch <= '1';
2000
                                                                                END IF;
2001
                                                                                IF opcode(5 downto 4)="00" THEN
2002
                                                                                        set_exec(Regwrena) <= '1';
2003
                                                                                END IF;
2004
                                                                        ELSE
2005
                                                                                trap_priv <= '1';
2006
                                                                                trapmake <= '1';
2007
                                                                        END IF;
2008
                                                                ELSE                                                                    --negx
2009 2 tobiflex
                                                                        ea_build_now <= '1';
2010 11 tobiflex
                                                                        set_exec(use_XZFlag) <= '1';
2011
                                                                        write_back <='1';
2012
                                                                        set_exec(opcADD) <= '1';
2013
                                                                        set(addsub) <= '1';
2014
                                                                        source_lowbits <= '1';
2015 2 tobiflex
                                                                        IF opcode(5 downto 4)="00" THEN
2016
                                                                                set_exec(Regwrena) <= '1';
2017
                                                                        END IF;
2018 11 tobiflex
                                                                        IF setexecOPC='1' THEN
2019
                                                                                set(OP1out_zero) <= '1';
2020
                                                                        END IF;
2021 2 tobiflex
                                                                END IF;
2022 11 tobiflex
                                                        ELSE
2023
                                                                trap_illegal <= '1';
2024
                                                                trapmake <= '1';
2025 2 tobiflex
                                                        END IF;
2026
                                                WHEN "001"=>
2027 11 tobiflex
                                                        IF (opcode(5 downto 3)/="001" AND --ea An illegal mode
2028
                                                           (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00")) THEN --ea illegal modes
2029
                                                                IF opcode(7 downto 6)="11" THEN                                 --move from CCR 68010
2030
                                                                        IF SR_Read=1 OR (cpu(0)='1' AND SR_Read=2) THEN
2031
                                                                                ea_build_now <= '1';
2032
                                                                                set_exec(opcMOVESR) <= '1';
2033
                                                                                datatype <= "01";
2034
                                                                                write_back <='1';                                                       -- im 68000 wird auch erst gelesen
2035
--                                                                              IF state="10" THEN
2036
--                                                                                      skipFetch <= '1';
2037
--                                                                              END IF;
2038
                                                                                IF opcode(5 downto 4)="00" THEN
2039
                                                                                        set_exec(Regwrena) <= '1';
2040
                                                                                END IF;
2041
                                                                        ELSE
2042
                                                                                trap_illegal <= '1';
2043
                                                                                trapmake <= '1';
2044
                                                                        END IF;
2045
                                                                ELSE                                                                                    --clr
2046 2 tobiflex
                                                                        ea_build_now <= '1';
2047 11 tobiflex
                                                                        write_back <='1';
2048
                                                                        set_exec(opcAND) <= '1';
2049
                                                                IF cpu(0)='1' AND state="10" THEN
2050
                                                                        skipFetch <= '1';
2051
                                                                END IF;
2052
                                                                        IF setexecOPC='1' THEN
2053
                                                                                set(OP1out_zero) <= '1';
2054
                                                                        END IF;
2055 2 tobiflex
                                                                        IF opcode(5 downto 4)="00" THEN
2056
                                                                                set_exec(Regwrena) <= '1';
2057
                                                                        END IF;
2058
                                                                END IF;
2059 11 tobiflex
                                                        ELSE
2060
                                                                trap_illegal <= '1';
2061
                                                                trapmake <= '1';
2062 2 tobiflex
                                                        END IF;
2063
                                                WHEN "010"=>
2064
                                                        IF opcode(7 downto 6)="11" THEN                                 --move to CCR
2065 11 tobiflex
                                                                IF opcode(5 downto 3)/="001" AND --ea An illegal mode
2066
                                                                   (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00") THEN --ea illegal modes
2067
                                                                        ea_build_now <= '1';
2068
                                                                        datatype <= "01";
2069
                                                                        source_lowbits <= '1';
2070
                                                                        IF (decodeOPC='1' AND opcode(5 downto 4)="00") OR state="10" OR direct_data='1' THEN
2071
                                                                                set(to_CCR) <= '1';
2072
                                                                        END IF;
2073
                                                                ELSE
2074
                                                                        trap_illegal <= '1';
2075
                                                                        trapmake <= '1';
2076 2 tobiflex
                                                                END IF;
2077
                                                        ELSE                                                                                    --neg
2078 11 tobiflex
                                                                IF (opcode(5 downto 3)/="001" AND --ea An illegal mode
2079
                                                                   (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00")) THEN --ea illegal modes
2080
                                                                        ea_build_now <= '1';
2081
                                                                        write_back <='1';
2082
                                                                        set_exec(opcADD) <= '1';
2083
                                                                        set(addsub) <= '1';
2084
                                                                        source_lowbits <= '1';
2085
                                                                        IF opcode(5 downto 4)="00" THEN
2086
                                                                                set_exec(Regwrena) <= '1';
2087
                                                                        END IF;
2088
                                                                        IF setexecOPC='1' THEN
2089
                                                                                set(OP1out_zero) <= '1';
2090
                                                                        END IF;
2091
                                                                ELSE
2092
                                                                        trap_illegal <= '1';
2093
                                                                        trapmake <= '1';
2094 2 tobiflex
                                                                END IF;
2095
                                                        END IF;
2096
                                                WHEN "011"=>                                                                            --not, move toSR
2097
                                                        IF opcode(7 downto 6)="11" THEN                                 --move to SR
2098 11 tobiflex
                                                                IF opcode(5 downto 3)/="001" AND --ea An illegal mode
2099
                                                                   (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00") THEN --ea illegal modes
2100
                                                                        IF SVmode='1' THEN
2101
                                                                                ea_build_now <= '1';
2102
                                                                                datatype <= "01";
2103
                                                                                source_lowbits <= '1';
2104
                                                                                IF (decodeOPC='1' AND opcode(5 downto 4)="00") OR state="10" OR direct_data='1' THEN
2105
                                                                                        set(to_SR) <= '1';
2106
                                                                                        set(to_CCR) <= '1';
2107
                                                                                END IF;
2108
                                                                                IF exec(to_SR)='1' OR (decodeOPC='1' AND opcode(5 downto 4)="00") OR state="10" OR direct_data='1' THEN
2109
                                                                                        setstate <="01";
2110
                                                                                END IF;
2111
                                                                        ELSE
2112
                                                                                trap_priv <= '1';
2113
                                                                                trapmake <= '1';
2114
                                                                        END IF;
2115
                                                                ELSE
2116
                                                                        trap_illegal <= '1';
2117
                                                                        trapmake <= '1';
2118
                                                                END IF;
2119
                                                        ELSE                                                                                    --not
2120
                                                                IF opcode(5 downto 3)/="001" AND --ea An illegal mode
2121
                                                                   (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00") THEN --ea illegal modes
2122 2 tobiflex
                                                                        ea_build_now <= '1';
2123 11 tobiflex
                                                                        write_back <='1';
2124
                                                                        set_exec(opcEOR) <= '1';
2125
                                                                        set_exec(ea_data_OP1) <= '1';
2126
                                                                        IF opcode(5 downto 3)="000" THEN
2127
                                                                                set_exec(Regwrena) <= '1';
2128 2 tobiflex
                                                                        END IF;
2129 11 tobiflex
                                                                        IF setexecOPC='1' THEN
2130
                                                                                set(OP2out_one) <= '1';
2131 2 tobiflex
                                                                        END IF;
2132
                                                                ELSE
2133 11 tobiflex
                                                                        trap_illegal <= '1';
2134 2 tobiflex
                                                                        trapmake <= '1';
2135
                                                                END IF;
2136
                                                        END IF;
2137
                                                WHEN "100"|"110"=>
2138
                                                        IF opcode(7)='1' THEN                   --movem, ext
2139
                                                                IF opcode(5 downto 3)="000" AND opcode(10)='0' THEN              --ext
2140
                                                                        source_lowbits <= '1';
2141
                                                                        set_exec(opcEXT) <= '1';
2142
                                                                        set_exec(opcMOVE) <= '1';
2143
                                                                        set_exec(Regwrena) <= '1';
2144
                                                                        IF opcode(6)='0' THEN
2145
                                                                                datatype <= "01";               --WORD
2146 11 tobiflex
                                                                                set_exec(opcEXTB) <= '1';
2147 2 tobiflex
                                                                        END IF;
2148
                                                                ELSE                                                                                                    --movem
2149
--                                                              IF opcode(11 downto 7)="10001" OR opcode(11 downto 7)="11001" THEN      --MOVEM
2150 11 tobiflex
                                                                        IF (opcode(10)='1' OR ((opcode(5)='1' OR opcode(4 downto 3)="10") AND
2151
                                                                           (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00"))) AND
2152
                                                                           (opcode(10)='0' OR (opcode(5 downto 4)/="00" AND
2153
                                                                           opcode(5 downto 3)/="100" AND
2154
                                                                           opcode(5 downto 2)/="1111")) THEN --ea illegal modes
2155
                                                                                ea_only <= '1';
2156
                                                                                set(no_Flags) <= '1';
2157
                                                                                IF opcode(6)='0' THEN
2158
                                                                                        datatype <= "01";               --Word transfer
2159
                                                                                END IF;
2160
                                                                                IF (opcode(5 downto 3)="100" OR opcode(5 downto 3)="011") AND state="01" THEN   -- -(An), (An)+
2161
                                                                                        set_exec(save_memaddr) <= '1';
2162
                                                                                        set_exec(Regwrena) <= '1';
2163
                                                                                END IF;
2164
                                                                                IF opcode(5 downto 3)="100" THEN        -- -(An)
2165
                                                                                        movem_presub <= '1';
2166
                                                                                        set(subidx) <= '1';
2167
                                                                                END IF;
2168
                                                                                IF state="10" THEN
2169
                                                                                        set(Regwrena) <= '1';
2170
                                                                                        set(opcMOVE) <= '1';
2171
                                                                                END IF;
2172
                                                                                IF decodeOPC='1' THEN
2173
                                                                                        set(get_2ndOPC) <='1';
2174
                                                                                        IF opcode(5 downto 3)="010" OR opcode(5 downto 3)="011" OR opcode(5 downto 3)="100" THEN
2175
                                                                                                next_micro_state <= movem1;
2176 2 tobiflex
                                                                                        ELSE
2177 11 tobiflex
                                                                                                next_micro_state <= nop;
2178
                                                                                                set(ea_build) <= '1';
2179 2 tobiflex
                                                                                        END IF;
2180
                                                                                END IF;
2181 11 tobiflex
                                                                                IF set(get_ea_now)='1' THEN
2182
                                                                                        IF movem_run='1' THEN
2183
                                                                                                set(movem_action) <= '1';
2184
                                                                                                IF opcode(10)='0' THEN
2185
                                                                                                        setstate <="11";
2186
                                                                                                        set(write_reg) <= '1';
2187
                                                                                                ELSE
2188
                                                                                                        setstate <="10";
2189
                                                                                                END IF;
2190
                                                                                                next_micro_state <= movem2;
2191
                                                                                                set(mem_addsub) <= '1';
2192
                                                                                        ELSE
2193
                                                                                                setstate <="01";
2194
                                                                                        END IF;
2195
                                                                                END IF;
2196
                                                                        ELSE
2197
                                                                                trap_illegal <= '1';
2198
                                                                                trapmake <= '1';
2199 2 tobiflex
                                                                        END IF;
2200
                                                                END IF;
2201
                                                        ELSE
2202 11 tobiflex
                                                                IF opcode(10)='1' THEN                                          --MUL.L, DIV.L 68020
2203 2 tobiflex
         --FPGA Multiplier for long                                                     
2204 11 tobiflex
                                                                        IF opcode(8 downto 7)="00" AND opcode(5 downto 3)/="001" AND --ea An illegal mode
2205
                                                                           MUL_Hardware=1 AND (opcode(6)='0' AND (MUL_Mode=1 OR (cpu(1)='1' AND MUL_Mode=2))) THEN
2206 2 tobiflex
                                                                                IF decodeOPC='1' THEN
2207
                                                                                        next_micro_state <= nop;
2208
                                                                                        set(get_2ndOPC) <= '1';
2209
                                                                                        set(ea_build) <= '1';
2210 11 tobiflex
                                                                                END IF;
2211
                                                                                IF (micro_state=idle AND nextpass='1') OR (opcode(5 downto 4)="00" AND exec(ea_build)='1') THEN
2212
                                                                                        dest_2ndHbits <= '1';
2213
                                                                                        datatype <= "10";
2214
                                                                                        set(opcMULU) <= '1';
2215
                                                                                        set(write_lowlong) <= '1';
2216
                                                                                        IF sndOPC(10)='1' THEN
2217
                                                                                                setstate <="01";
2218
                                                                                                next_micro_state <= mul_end2;
2219
                                                                                        END IF;
2220
                                                                                        set(Regwrena) <= '1';
2221
                                                                                END IF;
2222
                                                                                source_lowbits <='1';
2223
                                                                                datatype <= "10";
2224
 
2225
         --no FPGA Multiplier
2226
                                                                        ELSIF opcode(8 downto 7)="00" AND opcode(5 downto 3)/="001" AND (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00") AND --ea An illegal mode
2227
                                                                           ((opcode(6)='1' AND (DIV_Mode=1 OR (cpu(1)='1' AND DIV_Mode=2))) OR
2228
                                                                           (opcode(6)='0' AND (MUL_Mode=1 OR (cpu(1)='1' AND MUL_Mode=2)))) THEN
2229
                                                                                IF decodeOPC='1' THEN
2230
                                                                                        next_micro_state <= nop;
2231
                                                                                        set(get_2ndOPC) <= '1';
2232
                                                                                        set(ea_build) <= '1';
2233
                                                                                END IF;
2234 2 tobiflex
                                                                                IF (micro_state=idle AND nextpass='1') OR (opcode(5 downto 4)="00" AND exec(ea_build)='1')THEN
2235
                                                                                        setstate <="01";
2236
                                                                                        dest_2ndHbits <= '1';
2237
                                                                                        source_2ndLbits <= '1';
2238
                                                                                        IF opcode(6)='1' THEN
2239
                                                                                                next_micro_state <= div1;
2240
                                                                                        ELSE
2241
                                                                                                next_micro_state <= mul1;
2242 11 tobiflex
                                                                                                set(ld_rot_cnt) <= '1';
2243 2 tobiflex
                                                                                        END IF;
2244
                                                                                END IF;
2245
                                                                                IF z_error='0' AND set_V_Flag='0' AND set(opcDIVU)='1' THEN
2246
                                                                                        set(Regwrena) <= '1';
2247
                                                                                END IF;
2248
                                                                                source_lowbits <='1';
2249
                                                                                IF nextpass='1' OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
2250
                                                                                        dest_hbits <= '1';
2251
                                                                                END IF;
2252
                                                                                datatype <= "10";
2253
                                                                        ELSE
2254
                                                                                trap_illegal <= '1';
2255
                                                                                trapmake <= '1';
2256
                                                                        END IF;
2257
 
2258
                                                                ELSE                                                    --pea, swap
2259
                                                                        IF opcode(6)='1' THEN
2260
                                                                                datatype <= "10";
2261
                                                                                IF opcode(5 downto 3)="000" THEN                --swap
2262
                                                                                        set_exec(opcSWAP) <= '1';
2263
                                                                                        set_exec(Regwrena) <= '1';
2264
                                                                                ELSIF opcode(5 downto 3)="001" THEN             --bkpt
2265 11 tobiflex
                                                                                        trap_illegal <= '1';
2266
                                                                                        trapmake <= '1';
2267 2 tobiflex
                                                                                ELSE                                                                    --pea
2268 11 tobiflex
                                                                                        IF (opcode(5)='1' OR opcode(4 downto 3)="10") AND
2269
                                                                                           opcode(5 downto 3)/="100" AND
2270
                                                                                           opcode(5 downto 2)/="1111" THEN --ea illegal modes
2271
                                                                                                ea_only <= '1';
2272
                                                                                                ea_build_now <= '1';
2273
                                                                                                IF nextpass='1' AND micro_state=idle THEN
2274
                                                                                                        set(presub) <= '1';
2275
                                                                                                        setstackaddr <='1';
2276
                                                                                                        setstate <="11";
2277
                                                                                                        next_micro_state <= nop;
2278
                                                                                                END IF;
2279
                                                                                                IF set(get_ea_now)='1' THEN
2280
                                                                                                        setstate <="01";
2281
                                                                                                END IF;
2282
                                                                                        ELSE
2283
                                                                                                trap_illegal <= '1';
2284
                                                                                                trapmake <= '1';
2285 2 tobiflex
                                                                                        END IF;
2286 11 tobiflex
                                                                                END IF;
2287
                                                                        ELSE
2288 2 tobiflex
                                                                                IF opcode(5 downto 3)="001" THEN --link.l
2289
                                                                                        datatype <= "10";
2290
                                                                                        set_exec(opcADD) <= '1';                                                --for displacement
2291
                                                                                        set_exec(Regwrena) <= '1';
2292
                                                                                        set(no_Flags) <= '1';
2293
                                                                                        IF decodeOPC='1' THEN
2294
                                                                                                set(linksp) <= '1';
2295
                                                                                                set(longaktion) <= '1';
2296
                                                                                                next_micro_state <= link1;
2297
                                                                                                set(presub) <= '1';
2298
                                                                                                setstackaddr <='1';
2299
                                                                                                set(mem_addsub) <= '1';
2300
                                                                                                source_lowbits <= '1';
2301
                                                                                                source_areg <= '1';
2302
                                                                                                set(store_ea_data) <= '1';
2303
                                                                                        END IF;
2304 11 tobiflex
                                                                                ELSE                                            --nbcd
2305
                                                                                        IF opcode(5 downto 3)/="001" AND --ea An illegal mode
2306
                                                                                           (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00") THEN --ea illegal modes
2307
                                                                                                ea_build_now <= '1';
2308
                                                                                                set_exec(use_XZFlag) <= '1';
2309
                                                                                                write_back <='1';
2310
                                                                                                set_exec(opcADD) <= '1';
2311
                                                                                                set_exec(opcSBCD) <= '1';
2312
                                                                                                set(addsub) <= '1';
2313
                                                                                                source_lowbits <= '1';
2314
                                                                                                IF opcode(5 downto 4)="00" THEN
2315
                                                                                                        set_exec(Regwrena) <= '1';
2316
                                                                                                END IF;
2317
                                                                                                IF setexecOPC='1' THEN
2318
                                                                                                        set(OP1out_zero) <= '1';
2319
                                                                                                END IF;
2320
                                                                                        ELSE
2321
                                                                                                trap_illegal <= '1';
2322
                                                                                                trapmake <= '1';
2323 2 tobiflex
                                                                                        END IF;
2324
                                                                                END IF;
2325
                                                                        END IF;
2326
                                                                END IF;
2327
                                                        END IF;
2328
--0x4AXX                                                        
2329
                                                WHEN "101"=>                                            --tst, tas  4aFC - illegal
2330
--                                                      IF opcode(7 downto 2)="111111" THEN   --illegal
2331 11 tobiflex
                                                        IF opcode(7 downto 3)="11111" AND opcode(2 downto 1)/="00" THEN   --0x4AFC illegal  --0x4AFB BKP Sinclair QL
2332 2 tobiflex
                                                                trap_illegal <= '1';
2333
                                                                trapmake <= '1';
2334
                                                        ELSE
2335 11 tobiflex
                                                                IF (opcode(7 downto 6)/="11" OR --tas
2336
                                                                   (opcode(5 downto 3)/="001" AND --ea An illegal mode
2337
                                                                   (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00"))) AND --ea illegal modes
2338
                                                                   ((opcode(7 downto 6)/="00" OR (opcode(5 downto 3)/="001")) AND
2339
                                                                   (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00")) THEN
2340
                                                                        ea_build_now <= '1';
2341
                                                                        IF setexecOPC='1' THEN
2342
                                                                                source_lowbits <= '1';
2343
                                                                                IF opcode(3)='1' THEN                   --MC68020...
2344
                                                                                        source_areg <= '1';
2345
                                                                                END IF;
2346 2 tobiflex
                                                                        END IF;
2347 11 tobiflex
                                                                        set_exec(opcMOVE) <= '1';
2348
                                                                        IF opcode(7 downto 6)="11" THEN         --tas
2349
                                                                                set_exec_tas <= '1';
2350
                                                                                write_back <= '1';
2351
                                                                                datatype <= "00";                               --Byte
2352
                                                                                IF opcode(5 downto 4)="00" THEN
2353
                                                                                        set_exec(Regwrena) <= '1';
2354
                                                                                END IF;
2355 2 tobiflex
                                                                        END IF;
2356 11 tobiflex
                                                                ELSE
2357
                                                                        trap_illegal <= '1';
2358
                                                                        trapmake <= '1';
2359 2 tobiflex
                                                                END IF;
2360
                                                        END IF;
2361
----                                            WHEN "110"=>
2362
                                                WHEN "111"=>                                    --4EXX
2363
--
2364
--                                                                                      ea_only <= '1';
2365
--                                                                                      ea_build_now <= '1';
2366
--                                                                                      IF nextpass='1' AND micro_state=idle THEN
2367
--                                                                                              set(presub) <= '1';
2368
--                                                                                              setstackaddr <='1';
2369
--                                                                                              set(mem_addsub) <= '1';
2370
--                                                                                              setstate <="11";
2371
--                                                                                              next_micro_state <= nop;
2372
--                                                                                      END IF;
2373
--                                                                                      IF set(get_ea_now)='1' THEN
2374
--                                                                                              setstate <="01";
2375
--                                                                                      END IF;
2376
--                                                              
2377
 
2378
 
2379
 
2380
                                                        IF opcode(7)='1' THEN           --jsr, jmp
2381 11 tobiflex
                                                                IF (opcode(5)='1' OR opcode(4 downto 3)="10") AND
2382
                                                                   opcode(5 downto 3)/="100" AND opcode(5 downto 2)/="1111" THEN --ea illegal modes
2383
                                                                        datatype <= "10";
2384
                                                                        ea_only <= '1';
2385
                                                                        ea_build_now <= '1';
2386
                                                                        IF exec(ea_to_pc)='1' THEN
2387
                                                                                next_micro_state <= nop;
2388
                                                                        END IF;
2389
                                                                        IF nextpass='1' AND micro_state=idle AND opcode(6)='0' THEN
2390
                                                                                set(presub) <= '1';
2391
                                                                                setstackaddr <='1';
2392
                                                                                setstate <="11";
2393
                                                                                next_micro_state <= nopnop;
2394
                                                                        END IF;
2395
 
2396
                                                                        IF micro_state=ld_AnXn1 AND brief(8)='0'THEN                     --JMP/JSR n(Ax,Dn)
2397 2 tobiflex
                                                                                skipFetch <= '1';
2398
                                                                        END IF;
2399 11 tobiflex
                                                                        IF state="00" THEN
2400
                                                                                writePC <= '1';
2401
                                                                        END IF;
2402
                                                                        set(hold_dwr) <= '1';
2403
                                                                        IF set(get_ea_now)='1' THEN                                     --jsr
2404
                                                                                IF exec(longaktion)='0' OR long_done='1' THEN
2405
                                                                                        skipFetch <= '1';
2406
                                                                                END IF;
2407
                                                                                setstate <="01";
2408
                                                                                set(ea_to_pc) <= '1';
2409
                                                                        END IF;
2410
                                                                ELSE
2411
                                                                        trap_illegal <= '1';
2412
                                                                        trapmake <= '1';
2413 2 tobiflex
                                                                END IF;
2414
                                                        ELSE                                            --
2415
                                                                CASE opcode(6 downto 0) IS
2416
                                                                        WHEN "1000000"|"1000001"|"1000010"|"1000011"|"1000100"|"1000101"|"1000110"|"1000111"|           --trap
2417
                                                                             "1001000"|"1001001"|"1001010"|"1001011"|"1001100"|"1001101"|"1001110"|"1001111" =>         --trap
2418
                                                                                        trap_trap <='1';
2419
                                                                                        trapmake <= '1';
2420 11 tobiflex
 
2421 2 tobiflex
                                                                        WHEN "1010000"|"1010001"|"1010010"|"1010011"|"1010100"|"1010101"|"1010110"|"1010111"=>          --link word
2422
                                                                                datatype <= "10";
2423
                                                                                set_exec(opcADD) <= '1';                                                --for displacement
2424
                                                                                set_exec(Regwrena) <= '1';
2425
                                                                                set(no_Flags) <= '1';
2426
                                                                                IF decodeOPC='1' THEN
2427
                                                                                        next_micro_state <= link1;
2428
                                                                                        set(presub) <= '1';
2429
                                                                                        setstackaddr <='1';
2430
                                                                                        set(mem_addsub) <= '1';
2431
                                                                                        source_lowbits <= '1';
2432
                                                                                        source_areg <= '1';
2433
                                                                                        set(store_ea_data) <= '1';
2434
                                                                                END IF;
2435
 
2436
                                                                        WHEN "1011000"|"1011001"|"1011010"|"1011011"|"1011100"|"1011101"|"1011110"|"1011111" =>         --unlink
2437
                                                                                datatype <= "10";
2438
                                                                                set_exec(Regwrena) <= '1';
2439
                                                                                set_exec(opcMOVE) <= '1';
2440
                                                                                set(no_Flags) <= '1';
2441
                                                                                IF decodeOPC='1' THEN
2442
                                                                                        setstate <= "01";
2443
                                                                                        next_micro_state <= unlink1;
2444
                                                                                        set(opcMOVE) <= '1';
2445
                                                                                        set(Regwrena) <= '1';
2446
                                                                                        setstackaddr <='1';
2447
                                                                                        source_lowbits <= '1';
2448
                                                                                        source_areg <= '1';
2449
                                                                                END IF;
2450
 
2451
                                                                        WHEN "1100000"|"1100001"|"1100010"|"1100011"|"1100100"|"1100101"|"1100110"|"1100111" =>         --move An,USP
2452
                                                                                IF SVmode='1' THEN
2453
--                                                                                      set(no_Flags) <= '1';
2454
                                                                                        set(to_USP) <= '1';
2455
                                                                                        source_lowbits <= '1';
2456
                                                                                        source_areg <= '1';
2457
                                                                                        datatype <= "10";
2458
                                                                                ELSE
2459
                                                                                        trap_priv <= '1';
2460
                                                                                        trapmake <= '1';
2461
                                                                                END IF;
2462 11 tobiflex
 
2463 2 tobiflex
                                                                        WHEN "1101000"|"1101001"|"1101010"|"1101011"|"1101100"|"1101101"|"1101110"|"1101111" =>         --move USP,An
2464
                                                                                IF SVmode='1' THEN
2465
--                                                                                      set(no_Flags) <= '1';
2466
                                                                                        set(from_USP) <= '1';
2467
                                                                                        datatype <= "10";
2468
                                                                                        set_exec(Regwrena) <= '1';
2469
                                                                                ELSE
2470
                                                                                        trap_priv <= '1';
2471
                                                                                        trapmake <= '1';
2472
                                                                                END IF;
2473
 
2474
                                                                        WHEN "1110000" =>                                       --reset
2475
                                                                                IF SVmode='0' THEN
2476
                                                                                        trap_priv <= '1';
2477
                                                                                        trapmake <= '1';
2478
                                                                                ELSE
2479
                                                                                        set(opcRESET) <= '1';
2480
                                                                                        IF decodeOPC='1' THEN
2481
                                                                                                set(ld_rot_cnt) <= '1';
2482
                                                                                                set_rot_cnt <= "000000";
2483
                                                                                        END IF;
2484
                                                                                END IF;
2485
 
2486
                                                                        WHEN "1110001" =>                                       --nop
2487
 
2488
                                                                        WHEN "1110010" =>                                       --stop
2489
                                                                                IF SVmode='0' THEN
2490
                                                                                        trap_priv <= '1';
2491
                                                                                        trapmake <= '1';
2492
                                                                                ELSE
2493
                                                                                        IF decodeOPC='1' THEN
2494
                                                                                                setnextpass <= '1';
2495
                                                                                                set_stop <= '1';
2496
                                                                                        END IF;
2497
                                                                                        IF stop='1' THEN
2498
                                                                                                skipFetch <= '1';
2499
                                                                                        END IF;
2500
 
2501
                                                                                END IF;
2502
 
2503
                                                                        WHEN "1110011"|"1110111" =>                                                                     --rte/rtr
2504
                                                                                IF SVmode='1' OR opcode(2)='1' THEN
2505
                                                                                        IF decodeOPC='1' THEN
2506
                                                                                                setstate <= "10";
2507
                                                                                                set(postadd) <= '1';
2508
                                                                                                setstackaddr <= '1';
2509
                                                                                                IF opcode(2)='1' THEN
2510
                                                                                                        set(directCCR) <= '1';
2511
                                                                                                ELSE
2512
                                                                                                        set(directSR) <= '1';
2513
                                                                                                END IF;
2514
                                                                                                next_micro_state <= rte1;
2515
                                                                                        END IF;
2516
                                                                                ELSE
2517
                                                                                        trap_priv <= '1';
2518
                                                                                        trapmake <= '1';
2519 11 tobiflex
                                                                                END IF;
2520 2 tobiflex
 
2521 11 tobiflex
                                                                        WHEN "1110100" =>                                                                       --rtd
2522
                                                                                datatype <= "10";
2523
                                                                                IF decodeOPC='1' THEN
2524
                                                                                        setstate <= "10";
2525
                                                                                        set(postadd) <= '1';
2526
                                                                                        setstackaddr <= '1';
2527
                                                                                        set(direct_delta) <= '1';
2528
                                                                                        set(directPC) <= '1';
2529
                                                                                        set_direct_data <= '1';
2530
                                                                                        next_micro_state <= rtd1;
2531
                                                                                END IF;
2532 2 tobiflex
 
2533 11 tobiflex
 
2534 2 tobiflex
                                                                        WHEN "1110101" =>                                                                       --rts
2535
                                                                                datatype <= "10";
2536
                                                                                IF decodeOPC='1' THEN
2537
                                                                                        setstate <= "10";
2538
                                                                                        set(postadd) <= '1';
2539
                                                                                        setstackaddr <= '1';
2540
                                                                                        set(direct_delta) <= '1';
2541
                                                                                        set(directPC) <= '1';
2542
                                                                                        next_micro_state <= nopnop;
2543
                                                                                END IF;
2544
 
2545
                                                                        WHEN "1110110" =>                                                                       --trapv
2546
                                                                                IF decodeOPC='1' THEN
2547
                                                                                        setstate <= "01";
2548
                                                                                END IF;
2549
                                                                                IF Flags(1)='1' AND state="01" THEN
2550
                                                                                        trap_trapv <= '1';
2551
                                                                                        trapmake <= '1';
2552
                                                                                END IF;
2553
 
2554
                                                                        WHEN "1111010"|"1111011" =>                                                                     --movec
2555 10 tobiflex
                                                                                IF cpu="00" THEN
2556 2 tobiflex
                                                                                        trap_illegal <= '1';
2557
                                                                                        trapmake <= '1';
2558
                                                                                ELSIF SVmode='0' THEN
2559
                                                                                        trap_priv <= '1';
2560
                                                                                        trapmake <= '1';
2561
                                                                                ELSE
2562
                                                                                        datatype <= "10";       --Long
2563
                                                                                        IF last_data_read(11 downto 0)=X"800" THEN
2564
                                                                                                set(from_USP) <= '1';
2565
                                                                                                IF opcode(0)='1' THEN
2566
                                                                                                        set(to_USP) <= '1';
2567
                                                                                                END IF;
2568
                                                                                        END IF;
2569
                                                                                        IF opcode(0)='0' THEN
2570
                                                                                                set_exec(movec_rd) <= '1';
2571
                                                                                        ELSE
2572
                                                                                                set_exec(movec_wr) <= '1';
2573
                                                                                        END IF;
2574
                                                                                        IF decodeOPC='1' THEN
2575
                                                                                                next_micro_state <= movec1;
2576
                                                                                                getbrief <='1';
2577
                                                                                        END IF;
2578
                                                                                END IF;
2579
 
2580
                                                                        WHEN OTHERS =>
2581
                                                                                trap_illegal <= '1';
2582
                                                                                trapmake <= '1';
2583
                                                                END CASE;
2584
                                                        END IF;
2585
                                                WHEN OTHERS => NULL;
2586
                                        END CASE;
2587
                                END IF;
2588
--                                      
2589 11 tobiflex
---- 0101 ----------------------------------------------------------------------------
2590
                        WHEN "0101" =>                                                          --subq, addq
2591 2 tobiflex
                                        IF opcode(7 downto 6)="11" THEN --dbcc
2592
                                                IF opcode(5 downto 3)="001" THEN --dbcc
2593
                                                        IF decodeOPC='1' THEN
2594
                                                                next_micro_state <= dbcc1;
2595
                                                                set(OP2out_one) <= '1';
2596
                                                                data_is_source <= '1';
2597 11 tobiflex
                                                        END IF;
2598
                                                ELSIF opcode(5 downto 3)="111" AND (opcode(2 downto 1)="01" OR opcode(2 downto 0)="100") THEN    --trapcc
2599
                                                        IF cpu(1)='1' THEN                                                      -- only 68020+
2600
                                                                IF opcode(2 downto 1)="01" THEN
2601
                                                                        IF decodeOPC='1' THEN
2602
                                                                                IF opcode(0)='1' THEN                    --long
2603
                                                                                        set(longaktion) <= '1';
2604
                                                                                END IF;
2605
                                                                                next_micro_state <= nop;
2606
                                                                        END IF;
2607
                                                                ELSE
2608
                                                                        IF decodeOPC='1' THEN
2609
                                                                                setstate <= "01";
2610
                                                                        END IF;
2611
                                                                END IF;
2612
                                                                IF exe_condition='1' AND decodeOPC='0' THEN
2613
                                                                        trap_trapv <= '1';
2614
                                                                        trapmake <= '1';
2615
                                                                END IF;
2616
                                                        ELSE
2617
                                                                trap_illegal <= '1';
2618
                                                                trapmake <= '1';
2619
                                                        END IF;
2620 2 tobiflex
                                                ELSE                            --Scc
2621
                                                        datatype <= "00";                       --Byte
2622
                                                        ea_build_now <= '1';
2623
                                                        write_back <= '1';
2624
                                                        set_exec(opcScc) <= '1';
2625
                                                        IF cpu(0)='1' AND state="10" THEN
2626
                                                                skipFetch <= '1';
2627
                                                        END IF;
2628 11 tobiflex
                                                        IF opcode(5 downto 4)="00" THEN
2629 2 tobiflex
                                                                set_exec(Regwrena) <= '1';
2630
                                                        END IF;
2631
                                                END IF;
2632
                                        ELSE                                    --addq, subq
2633 11 tobiflex
                                                IF opcode(7 downto 3)/="00001" AND
2634
                                                   (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00") THEN --ea illegal modes
2635
                                                        ea_build_now <= '1';
2636
                                                        IF opcode(5 downto 3)="001" THEN
2637
                                                                set(no_Flags) <= '1';
2638
                                                        END IF;
2639
                                                        IF opcode(8)='1' THEN
2640
                                                                set(addsub) <= '1';
2641
                                                        END IF;
2642
                                                        write_back <= '1';
2643
                                                        set_exec(opcADDQ) <= '1';
2644
                                                        set_exec(opcADD) <= '1';
2645
                                                        set_exec(ea_data_OP1) <= '1';
2646
                                                        IF opcode(5 downto 4)="00" THEN
2647
                                                                set_exec(Regwrena) <= '1';
2648
                                                        END IF;
2649
                                                ELSE
2650
                                                        trap_illegal <= '1';
2651
                                                        trapmake <= '1';
2652 2 tobiflex
                                                END IF;
2653 11 tobiflex
                                        END IF;
2654 2 tobiflex
--                              
2655
---- 0110 ----------------------------------------------------------------------------          
2656
                        WHEN "0110" =>                          --bra,bsr,bcc
2657
                                datatype <= "10";
2658
 
2659
                                IF micro_state=idle THEN
2660
                                        IF opcode(11 downto 8)="0001" THEN              --bsr
2661
                                                set(presub) <= '1';
2662
                                                setstackaddr <='1';
2663
                                                IF opcode(7 downto 0)="11111111" THEN
2664
                                                        next_micro_state <= bsr2;
2665
                                                        set(longaktion) <= '1';
2666
                                                ELSIF opcode(7 downto 0)="00000000" THEN
2667
                                                        next_micro_state <= bsr2;
2668
                                                ELSE
2669
                                                        next_micro_state <= bsr1;
2670
                                                        setstate <= "11";
2671
                                                        writePC <= '1';
2672
                                                END IF;
2673
                                        ELSE                                                                    --bra
2674
                                                IF opcode(7 downto 0)="11111111" THEN
2675
                                                        next_micro_state <= bra1;
2676
                                                        set(longaktion) <= '1';
2677
                                                ELSIF opcode(7 downto 0)="00000000" THEN
2678
                                                        next_micro_state <= bra1;
2679
                                                ELSE
2680
                                                        setstate <= "01";
2681
                                                        next_micro_state <= bra1;
2682
                                                END IF;
2683
                                        END IF;
2684
                                END IF;
2685
 
2686
-- 0111 ----------------------------------------------------------------------------            
2687
                        WHEN "0111" =>                          --moveq
2688 11 tobiflex
                                IF opcode(8)='0' THEN
2689 2 tobiflex
                                        datatype <= "10";               --Long
2690
                                        set_exec(Regwrena) <= '1';
2691
                                        set_exec(opcMOVEQ) <= '1';
2692
                                        set_exec(opcMOVE) <= '1';
2693
                                        dest_hbits <= '1';
2694 11 tobiflex
                                ELSE
2695
                                        trap_illegal <= '1';
2696
                                        trapmake <= '1';
2697
                                END IF;
2698 2 tobiflex
 
2699
---- 1000 ----------------------------------------------------------------------------          
2700
                        WHEN "1000" =>                                                          --or    
2701
                                IF opcode(7 downto 6)="11" THEN --divu, divs
2702 11 tobiflex
                                        IF DIV_Mode/=3 AND
2703
                                           opcode(5 downto 3)/="001" AND (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00") THEN --ea illegal modes
2704 2 tobiflex
                                                IF opcode(5 downto 4)="00" THEN --Dn, An
2705
                                                        regdirectsource <= '1';
2706
                                                END IF;
2707 11 tobiflex
                                                IF (micro_state=idle AND nextpass='1') OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
2708 2 tobiflex
                                                        setstate <="01";
2709
                                                        next_micro_state <= div1;
2710
                                                END IF;
2711
                                                ea_build_now <= '1';
2712
                                                IF z_error='0' AND set_V_Flag='0' THEN
2713
                                                        set_exec(Regwrena) <= '1';
2714
                                                END IF;
2715
                                                        source_lowbits <='1';
2716 11 tobiflex
                                                IF nextpass='1' OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
2717 2 tobiflex
                                                        dest_hbits <= '1';
2718
                                                END IF;
2719
                                                datatype <= "01";
2720
                                        ELSE
2721
                                                trap_illegal <= '1';
2722
                                                trapmake <= '1';
2723
                                        END IF;
2724
                                ELSIF opcode(8)='1' AND opcode(5 downto 4)="00" THEN    --sbcd, pack , unpack
2725
                                        IF opcode(7 downto 6)="00" THEN --sbcd
2726
                                                build_bcd <= '1';
2727
                                                set_exec(opcADD) <= '1';
2728
                                                set_exec(opcSBCD) <= '1';
2729 11 tobiflex
                                                set(addsub) <= '1';
2730
                                        ELSIF opcode(7 downto 6)="01" OR opcode(7 downto 6)="10" THEN   --pack , unpack
2731
                                                set_exec(ea_data_OP1) <= '1';
2732
                                                set(no_Flags) <= '1';
2733
                                                source_lowbits <='1';
2734
                                                IF opcode(7 downto 6) = "01" THEN       --pack
2735
                                                        set_exec(opcPACK) <= '1';
2736
                                                        datatype <= "01";                               --Word
2737
                                                ELSE                                                            --unpk
2738
                                                        set_exec(opcUNPACK) <= '1';
2739
                                                        datatype <= "00";                               --Byte
2740
                                                END IF;
2741
                                                IF opcode(3)='0' THEN
2742
                                                        IF opcode(7 downto 6) = "01" THEN       --pack
2743
                                                                set_datatype <= "00";           --Byte
2744
                                                        ELSE                                                            --unpk
2745
                                                                set_datatype <= "01";           --Word
2746
                                                        END IF;
2747
                                                        set_exec(Regwrena) <= '1';
2748
                                                        dest_hbits <= '1';
2749
                                                        IF decodeOPC='1' THEN
2750
                                                                next_micro_state <= nop;
2751
--                                                              set_direct_data <= '1';
2752
                                                                set(store_ea_packdata) <= '1';
2753
                                                                set(store_ea_data) <= '1';
2754
                                                        END IF;
2755
                                                ELSE                            -- pack -(Ax),-(Ay)
2756
                                                        write_back <= '1';
2757
                                                        IF decodeOPC='1' THEN
2758
                                                                next_micro_state <= pack1;
2759
                                                                set_direct_data <= '1';
2760
                                                        END IF;
2761
                                                END IF;
2762
                                        ELSE
2763 2 tobiflex
                                                trap_illegal <= '1';
2764
                                                trapmake <= '1';
2765
                                        END IF;
2766
                                ELSE                                                                    --or
2767 11 tobiflex
                                        IF opcode(7 downto 6)/="11" AND --illegal opmode
2768
                                           ((opcode(8)='0' AND opcode(5 downto 3)/="001" AND (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00")) OR --illegal src ea
2769
                                           (opcode(8)='1' AND opcode(5 downto 4)/="00" AND (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00"))) THEN --illegal dst ea
2770
                                                set_exec(opcOR) <= '1';
2771
                                                build_logical <= '1';
2772
                                        ELSE
2773
                                                trap_illegal <= '1';
2774
                                                trapmake <= '1';
2775
                                        END IF;
2776 2 tobiflex
                                END IF;
2777
 
2778
---- 1001, 1101 -----------------------------------------------------------------------         
2779 11 tobiflex
                        WHEN "1001"|"1101" =>                                           --sub, add
2780
                                IF opcode(8 downto 3)/="000001" AND --byte src address reg direct
2781
                                   (((opcode(8)='0' OR opcode(7 downto 6)="11") AND (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00")) OR --illegal src ea
2782
                                   (opcode(8)='1' AND (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00"))) THEN --illegal dst ea
2783
                                        set_exec(opcADD) <= '1';
2784
                                        ea_build_now <= '1';
2785
                                        IF opcode(14)='0' THEN
2786
                                                set(addsub) <= '1';
2787 2 tobiflex
                                        END IF;
2788 11 tobiflex
                                        IF opcode(7 downto 6)="11" THEN --      --adda, suba
2789
                                                IF opcode(8)='0' THEN    --adda.w, suba.w
2790
                                                        datatype <= "01";       --Word
2791
                                                END IF;
2792
                                                set_exec(Regwrena) <= '1';
2793
                                                source_lowbits <='1';
2794
                                                IF opcode(3)='1' THEN
2795
                                                        source_areg <= '1';
2796
                                                END IF;
2797
                                                set(no_Flags) <= '1';
2798
                                                IF setexecOPC='1' THEN
2799
                                                        dest_areg <='1';
2800
                                                        dest_hbits <= '1';
2801
                                                END IF;
2802
                                        ELSE
2803
                                                IF opcode(8)='1' AND opcode(5 downto 4)="00" THEN               --addx, subx
2804
                                                        build_bcd <= '1';
2805
                                                ELSE                                                    --sub, add
2806
                                                        build_logical <= '1';
2807
                                                END IF;
2808 2 tobiflex
                                        END IF;
2809 11 tobiflex
                                ELSE
2810
                                                trap_illegal <= '1';
2811
                                                trapmake <= '1';
2812
                                END IF;
2813 2 tobiflex
--                              
2814
---- 1010 ----------------------------------------------------------------------------          
2815
                        WHEN "1010" =>                                                  --Trap 1010
2816
                                trap_1010 <= '1';
2817
                                trapmake <= '1';
2818
---- 1011 ----------------------------------------------------------------------------          
2819
                        WHEN "1011" =>                                                  --eor, cmp
2820
                                IF opcode(7 downto 6)="11" THEN --CMPA
2821 11 tobiflex
                                        IF opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00" THEN --illegal src ea
2822
                                                ea_build_now <= '1';
2823
                                                IF opcode(8)='0' THEN    --cmpa.w
2824
                                                        datatype <= "01";       --Word
2825
                                                        set_exec(opcCPMAW) <= '1';
2826
                                                END IF;
2827
                                                set_exec(opcCMP) <= '1';
2828
                                                IF setexecOPC='1' THEN
2829
                                                        source_lowbits <='1';
2830
                                                        IF opcode(3)='1' THEN
2831
                                                                source_areg <= '1';
2832
                                                        END IF;
2833
                                                        dest_areg <='1';
2834
                                                        dest_hbits <= '1';
2835
                                                END IF;
2836
                                                set(addsub) <= '1';
2837
                                        ELSE
2838
                                                trap_illegal <= '1';
2839
                                                trapmake <= '1';
2840 2 tobiflex
                                        END IF;
2841 11 tobiflex
                                ELSE    --cmpm, eor, cmp
2842 2 tobiflex
                                        IF opcode(8)='1' THEN
2843
                                                IF opcode(5 downto 3)="001" THEN                --cmpm
2844 11 tobiflex
                                                        ea_build_now <= '1';
2845 2 tobiflex
                                                        set_exec(opcCMP) <= '1';
2846
                                                        IF decodeOPC='1' THEN
2847 11 tobiflex
                                                                IF opcode(2 downto 0)="111" THEN
2848
                                                                        set(use_SP) <= '1';
2849
                                                                END IF;
2850 2 tobiflex
                                                                setstate <= "10";
2851
                                                                set(update_ld) <= '1';
2852
                                                                set(postadd) <= '1';
2853
                                                                next_micro_state <= cmpm;
2854
                                                        END IF;
2855
                                                        set_exec(ea_data_OP1) <= '1';
2856
                                                        set(addsub) <= '1';
2857
                                                ELSE                                            --EOR
2858 11 tobiflex
                                                        IF opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00" THEN --illegal dst ea
2859
                                                                ea_build_now <= '1';
2860
                                                                build_logical <= '1';
2861
                                                                set_exec(opcEOR) <= '1';
2862
                                                        ELSE
2863
                                                                trap_illegal <= '1';
2864
                                                                trapmake <= '1';
2865
                                                        END IF;
2866
                                                END IF;
2867
                                        ELSE                                                    --CMP
2868
                                                IF opcode(8 downto 3)/="000001" AND --byte src address reg direct
2869
                                                   (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00") THEN --illegal src ea
2870
                                                        ea_build_now <= '1';
2871 2 tobiflex
                                                        build_logical <= '1';
2872 11 tobiflex
                                                        set_exec(opcCMP) <= '1';
2873
                                                        set(addsub) <= '1';
2874
                                                ELSE
2875
                                                        trap_illegal <= '1';
2876
                                                        trapmake <= '1';
2877 2 tobiflex
                                                END IF;
2878
                                        END IF;
2879 11 tobiflex
                                END IF;
2880 2 tobiflex
--                              
2881
---- 1100 ----------------------------------------------------------------------------          
2882
                        WHEN "1100" =>                                                          --and, exg
2883
                                IF opcode(7 downto 6)="11" THEN --mulu, muls
2884 11 tobiflex
                                        IF MUL_Mode/=3 AND
2885
                                           opcode(5 downto 3)/="001" AND (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00") THEN --ea illegal modes
2886 2 tobiflex
                                                IF opcode(5 downto 4)="00" THEN --Dn, An
2887
                                                        regdirectsource <= '1';
2888 11 tobiflex
                                                END IF;
2889 2 tobiflex
                                                IF (micro_state=idle AND nextpass='1') OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
2890
                                                        IF MUL_Hardware=0 THEN
2891
                                                                setstate <="01";
2892 11 tobiflex
                                                                set(ld_rot_cnt) <= '1';
2893 2 tobiflex
                                                                next_micro_state <= mul1;
2894 11 tobiflex
                                                        ELSE
2895 2 tobiflex
                                                                set_exec(write_lowlong) <= '1';
2896 11 tobiflex
                                                                set_exec(opcMULU) <= '1';
2897
                                                        END IF;
2898 2 tobiflex
                                                END IF;
2899
                                                ea_build_now <= '1';
2900 11 tobiflex
                                                set_exec(Regwrena) <= '1';
2901 2 tobiflex
                                                source_lowbits <='1';
2902
                                                IF (nextpass='1') OR (opcode(5 downto 4)="00" AND decodeOPC='1') THEN
2903
                                                        dest_hbits <= '1';
2904
                                                END IF;
2905 11 tobiflex
                                                datatype <= "01";
2906
                                                IF setexecOPC='1' THEN
2907
                                                        datatype <= "10";
2908
                                                END IF;
2909 2 tobiflex
                                        ELSE
2910
                                                trap_illegal <= '1';
2911
                                                trapmake <= '1';
2912
                                        END IF;
2913
                                ELSIF opcode(8)='1' AND opcode(5 downto 4)="00" THEN    --exg, abcd
2914
                                        IF opcode(7 downto 6)="00" THEN --abcd
2915
                                                build_bcd <= '1';
2916
                                                set_exec(opcADD) <= '1';
2917
                                                set_exec(opcABCD) <= '1';
2918
                                        ELSE                                                                    --exg
2919 11 tobiflex
                                                IF opcode(7 downto 4)="0100" OR opcode(7 downto 3)="10001" THEN
2920
                                                        datatype <= "10";
2921
                                                        set(Regwrena) <= '1';
2922
                                                        set(exg) <= '1';
2923
                                                        set(alu_move) <= '1';
2924
                                                        IF opcode(6)='1' AND opcode(3)='1' THEN
2925
                                                                dest_areg <= '1';
2926
                                                                source_areg <= '1';
2927
                                                        END IF;
2928
                                                        IF decodeOPC='1' THEN
2929
                                                                setstate <= "01";
2930
                                                        ELSE
2931
                                                                dest_hbits <= '1';
2932
                                                        END IF;
2933 2 tobiflex
                                                ELSE
2934 11 tobiflex
                                                        trap_illegal <= '1';
2935
                                                        trapmake <= '1';
2936 2 tobiflex
                                                END IF;
2937
                                        END IF;
2938
                                ELSE                                                                    --and
2939 11 tobiflex
                                        IF opcode(7 downto 6)/="11" AND --illegal opmode
2940
                                           ((opcode(8)='0' AND opcode(5 downto 3)/="001" AND (opcode(5 downto 2)/="1111" OR opcode(1 downto 0)="00")) OR --illegal src ea
2941
                                           (opcode(8)='1' AND opcode(5 downto 4)/="00" AND (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00"))) THEN --illegal dst ea
2942
                                                set_exec(opcAND) <= '1';
2943
                                                build_logical <= '1';
2944
                                        ELSE
2945
                                                trap_illegal <= '1';
2946
                                                trapmake <= '1';
2947
                                        END IF;
2948
                                END IF;
2949 2 tobiflex
--                              
2950
---- 1110 ----------------------------------------------------------------------------          
2951
                        WHEN "1110" =>                                                          --rotation / bitfield
2952
                                IF opcode(7 downto 6)="11" THEN
2953
                                        IF opcode(11)='0' THEN
2954 11 tobiflex
                                           IF (opcode(5 downto 4)/="00" AND (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00")) THEN --ea illegal modes
2955
                                                        IF BarrelShifter=0 THEN
2956
                                                                set_exec(opcROT) <= '1';
2957
                                                        ELSE
2958
                                                                set_exec(exec_BS) <='1';
2959
                                                        END IF;
2960
                                                        ea_build_now <= '1';
2961
                                                        datatype <= "01";
2962
                                                        set_rot_bits <= opcode(10 downto 9);
2963
                                                        set_exec(ea_data_OP1) <= '1';
2964
                                                        write_back <= '1';
2965
                                                ELSE
2966
                                                        trap_illegal <= '1';
2967
                                                        trapmake <= '1';
2968
                                                END IF;
2969 2 tobiflex
                                        ELSE            --bitfield
2970 11 tobiflex
                                                IF BitField=0 OR (cpu(1)='0' AND BitField=2) OR
2971
                                                   ((opcode(10 downto 9)="11" OR opcode(10 downto 8)="010" OR opcode(10 downto 8)="100") AND
2972
                                                   (opcode(5 downto 3)="001" OR opcode(5 downto 3)="011" OR opcode(5 downto 3)="100" OR (opcode(5 downto 3)="111" AND opcode(2 downto 1)/="00"))) OR
2973
                                                   ((opcode(10 downto 9)="00" OR opcode(10 downto 8)="011" OR opcode(10 downto 8)="101") AND
2974
                                                   (opcode(5 downto 3)="001" OR opcode(5 downto 3)="011" OR opcode(5 downto 3)="100" OR opcode(5 downto 2)="1111")) THEN
2975 2 tobiflex
                                                        trap_illegal <= '1';
2976
                                                        trapmake <= '1';
2977
                                                ELSE
2978
                                                        IF decodeOPC='1' THEN
2979
                                                                next_micro_state <= nop;
2980
                                                                set(get_2ndOPC) <= '1';
2981
                                                                set(ea_build) <= '1';
2982 11 tobiflex
                                                        END IF;
2983 2 tobiflex
                                                        set_exec(opcBF) <= '1';
2984
--              000-bftst, 001-bfextu, 010-bfchg, 011-bfexts, 100-bfclr, 101-bfff0, 110-bfset, 111-bfins                                                                
2985 11 tobiflex
                                                        IF opcode(10)='1' OR opcode(8)='0' THEN
2986 2 tobiflex
                                                                set_exec(opcBFwb) <= '1';                       --'1' for tst,chg,clr,ffo,set,ins    --'0' for extu,exts
2987 11 tobiflex
                                                        END IF;
2988 2 tobiflex
                                                        IF opcode(10 downto 8)="111" THEN       --BFINS
2989
                                                                set_exec(ea_data_OP1) <= '1';
2990 11 tobiflex
                                                        END IF;
2991 2 tobiflex
                                                        IF opcode(10 downto 8)="010" OR opcode(10 downto 8)="100" OR opcode(10 downto 8)="110" OR opcode(10 downto 8)="111" THEN
2992
                                                                write_back <= '1';
2993 11 tobiflex
                                                        END IF;
2994 2 tobiflex
                                                        ea_only <= '1';
2995
                                                        IF opcode(10 downto 8)="001" OR opcode(10 downto 8)="011" OR opcode(10 downto 8)="101" THEN
2996
                                                                set_exec(Regwrena) <= '1';
2997 11 tobiflex
                                                        END IF;
2998
                                                        IF opcode(4 downto 3)="00" THEN
2999 2 tobiflex
                                                                IF opcode(10 downto 8)/="000" THEN
3000 11 tobiflex
                                                                        set_exec(Regwrena) <= '1';
3001 2 tobiflex
                                                                END IF;
3002
                                                                IF exec(ea_build)='1' THEN
3003
                                                                        dest_2ndHbits <= '1';
3004
                                                                        source_2ndLbits <= '1';
3005
                                                                        set(get_bfoffset) <='1';
3006
                                                                        setstate <= "01";
3007
                                                                END IF;
3008
                                                        END IF;
3009
                                                        IF set(get_ea_now)='1' THEN
3010
                                                                setstate <= "01";
3011 11 tobiflex
                                                        END IF;
3012 2 tobiflex
                                                        IF exec(get_ea_now)='1' THEN
3013
                                                                dest_2ndHbits <= '1';
3014
                                                                source_2ndLbits <= '1';
3015
                                                                set(get_bfoffset) <='1';
3016
                                                                setstate <= "01";
3017
                                                                set(mem_addsub) <='1';
3018
                                                                next_micro_state <= bf1;
3019
                                                        END IF;
3020 11 tobiflex
                                                        IF setexecOPC='1' THEN
3021 2 tobiflex
                                                                IF opcode(10 downto 8)="111" THEN       --BFINS
3022
                                                                        source_2ndHbits <= '1';
3023 11 tobiflex
                                                                ELSE
3024 2 tobiflex
                                                                        source_lowbits <= '1';
3025 11 tobiflex
                                                                END IF;
3026
                                                                IF opcode(10 downto 8)="001" OR opcode(10 downto 8)="011" OR opcode(10 downto 8)="101" THEN     --BFEXT, BFFFO
3027
                                                                        dest_2ndHbits <= '1';
3028
                                                                END IF;
3029 2 tobiflex
                                                        END IF;
3030
                                                END IF;
3031
                                        END IF;
3032 11 tobiflex
                                ELSE
3033 2 tobiflex
                                        data_is_source <= '1';
3034 11 tobiflex
                                        IF BarrelShifter=0 OR (cpu(1)='0' AND BarrelShifter=2) THEN
3035 2 tobiflex
                                                set_exec(opcROT) <= '1';
3036
                                                set_rot_bits <= opcode(4 downto 3);
3037
                                                set_exec(Regwrena) <= '1';
3038
                                                IF decodeOPC='1' THEN
3039
                                                        IF opcode(5)='1' THEN
3040
                                                                next_micro_state <= rota1;
3041
                                                                set(ld_rot_cnt) <= '1';
3042
                                                                setstate <= "01";
3043
                                                        ELSE
3044
                                                                set_rot_cnt(2 downto 0) <= opcode(11 downto 9);
3045
                                                                IF opcode(11 downto 9)="000" THEN
3046
                                                                        set_rot_cnt(3) <='1';
3047
                                                                ELSE
3048
                                                                        set_rot_cnt(3) <='0';
3049
                                                                END IF;
3050
                                                        END IF;
3051 11 tobiflex
                                                END IF;
3052
                                        ELSE
3053
                                                set_exec(exec_BS) <='1';
3054
                                                set_rot_bits <= opcode(4 downto 3);
3055
                                                set_exec(Regwrena) <= '1';
3056 2 tobiflex
                                        END IF;
3057 11 tobiflex
                                END IF;
3058
--                              
3059
---- 1111 ----------------------------------------------------------------------------          
3060
                        WHEN "1111" =>
3061
                                IF cpu(1)='1' AND opcode(8 downto 6)="100" THEN --cpSAVE
3062
                                        IF opcode(5 downto 4)/="00" AND opcode(5 downto 3)/="011" AND
3063
                                           (opcode(5 downto 3)/="111" OR opcode(2 downto 1)="00") THEN --ea illegal modes
3064
                                                IF opcode(11 downto 9)/="000" THEN
3065
                                                        IF SVmode='1' THEN
3066
                                                                IF opcode(5)='0' AND opcode(5 downto 4)/="01" THEN
3067
                                                                        --never reached according to cputest?!
3068
                                                                        --cpSAVE not implemented
3069
                                                                        trap_illegal <= '1';
3070
                                                                        trapmake <= '1';
3071
                                                                ELSE
3072
                                                                        trap_1111 <= '1';
3073
                                                                        trapmake <= '1';
3074
                                                                END IF;
3075
                                                        ELSE
3076
                                                                trap_priv <= '1';
3077
                                                                trapmake <= '1';
3078
                                                        END IF;
3079
                                                ELSE
3080
                                                        IF SVmode='1' THEN
3081
                                                                trap_1111 <= '1';
3082
                                                                trapmake <= '1';
3083
                                                        ELSE
3084
                                                                trap_priv <= '1';
3085
                                                                trapmake <= '1';
3086
                                                        END IF;
3087
                                                END IF;
3088
                                        ELSE
3089
                                                trap_1111 <= '1';
3090
                                                trapmake <= '1';
3091
                                        END IF;
3092
                                ELSIF cpu(1)='1' AND opcode(8 downto 6)="101" THEN --cpRESTORE
3093
                                        IF opcode(5 downto 4)/="00" AND opcode(5 downto 3)/="100" AND
3094
                                           (opcode(5 downto 3)/="111" OR (opcode(2 downto 1)/="11" AND
3095
                                           opcode(2 downto 0)/="101")) THEN --ea illegal modes
3096
                                                IF opcode(5 downto 1)/="11110" THEN
3097
                                                        IF opcode(11 downto 9)="001" OR opcode(11 downto 9)="010" THEN
3098
                                                                IF SVmode='1' THEN
3099
                                                                        IF opcode(5 downto 3)="101" THEN
3100
                                                                                --cpRESTORE not implemented
3101
                                                                                trap_illegal <= '1';
3102
                                                                                trapmake <= '1';
3103
                                                                        ELSE
3104
                                                                                trap_1111 <= '1';
3105
                                                                                trapmake <= '1';
3106
                                                                        END IF;
3107
                                                                ELSE
3108
                                                                        trap_priv <= '1';
3109
                                                                        trapmake <= '1';
3110
                                                                END IF;
3111
                                                        ELSE
3112
                                                                IF SVmode='1' THEN
3113
                                                                        trap_1111 <= '1';
3114
                                                                        trapmake <= '1';
3115
                                                                ELSE
3116
                                                                        trap_priv <= '1';
3117
                                                                        trapmake <= '1';
3118
                                                                END IF;
3119
                                                        END IF;
3120
                                                ELSE
3121
                                                        trap_1111 <= '1';
3122
                                                        trapmake <= '1';
3123
                                                END IF;
3124
                                        ELSE
3125
                                                trap_1111 <= '1';
3126
                                                trapmake <= '1';
3127
                                        END IF;
3128
                                ELSE
3129
                                        trap_1111 <= '1';
3130
                                        trapmake <= '1';
3131
                                END IF;
3132 2 tobiflex
--                                                      
3133
----      ----------------------------------------------------------------------------          
3134 11 tobiflex
                        WHEN OTHERS =>
3135
                                trap_illegal <= '1';
3136 2 tobiflex
                                trapmake <= '1';
3137
 
3138 11 tobiflex
                END CASE;
3139 2 tobiflex
 
3140
-- use for AND, OR, EOR, CMP
3141
                IF build_logical='1' THEN
3142
                        ea_build_now <= '1';
3143
                        IF set_exec(opcCMP)='0' AND (opcode(8)='0' OR opcode(5 downto 4)="00" ) THEN
3144
                                set_exec(Regwrena) <= '1';
3145
                        END IF;
3146
                        IF opcode(8)='1' THEN
3147
                                write_back <= '1';
3148
                                set_exec(ea_data_OP1) <= '1';
3149
                        ELSE
3150
                                source_lowbits <='1';
3151
                                IF opcode(3)='1' THEN           --use for cmp
3152
                                        source_areg <= '1';
3153
                                END IF;
3154
                                IF setexecOPC='1' THEN
3155
                                        dest_hbits <= '1';
3156
                                END IF;
3157
                        END IF;
3158
                END IF;
3159
 
3160
-- use for ABCD, SBCD
3161
                IF build_bcd='1' THEN
3162
                        set_exec(use_XZFlag) <= '1';
3163
                        set_exec(ea_data_OP1) <= '1';
3164
                        write_back <= '1';
3165
                        source_lowbits <='1';
3166
                        IF opcode(3)='1' THEN
3167
                                IF decodeOPC='1' THEN
3168
                                        IF opcode(2 downto 0)="111" THEN
3169
                                                set(use_SP) <= '1';
3170
                                        END IF;
3171
                                        setstate <= "10";
3172
                                        set(update_ld) <= '1';
3173
                                        set(presub) <= '1';
3174
                                        next_micro_state <= op_AxAy;
3175
                                        dest_areg <= '1';                               --???
3176
                                END IF;
3177
                        ELSE
3178
                                dest_hbits <= '1';
3179
                                set_exec(Regwrena) <= '1';
3180
                        END IF;
3181
                END IF;
3182
 
3183
 
3184
------------------------------------------------------------------------------          
3185
------------------------------------------------------------------------------          
3186
                IF set_Z_error='1'  THEN                -- divu by zero
3187
                        trapmake <= '1';                        --wichtig for USP
3188
                        IF trapd='0' THEN
3189
                                writePC <= '1';
3190
                        END IF;
3191
                END IF;
3192
 
3193
-----------------------------------------------------------------------------
3194
-- execute microcode
3195
-----------------------------------------------------------------------------
3196
                IF rising_edge(clk) THEN
3197
                IF Reset='1' THEN
3198
                                micro_state <= ld_nn;
3199
                        ELSIF clkena_lw='1' THEN
3200
                                trapd <= trapmake;
3201
                                micro_state <= next_micro_state;
3202
                        END IF;
3203
                END IF;
3204
 
3205
                        CASE micro_state IS
3206
                                WHEN ld_nn =>           -- (nnnn).w/l=>
3207
                                        set(get_ea_now) <='1';
3208
                                        setnextpass <= '1';
3209
                                        set(addrlong) <= '1';
3210
 
3211
                                WHEN st_nn =>           -- =>(nnnn).w/l
3212
                                        setstate <= "11";
3213
                                        set(addrlong) <= '1';
3214
                                        next_micro_state <= nop;
3215
 
3216
                                WHEN ld_dAn1 =>         -- d(An)=>, --d(PC)=>
3217
                                        set(get_ea_now) <='1';
3218
                                        setdisp <= '1';         --word
3219
                                        setnextpass <= '1';
3220
 
3221
                                WHEN ld_AnXn1 =>                -- d(An,Xn)=>, --d(PC,Xn)=>
3222
                                        IF brief(8)='0' OR extAddr_Mode=0 OR (cpu(1)='0' AND extAddr_Mode=2) THEN
3223
                                                setdisp <= '1';         --byte  
3224
                                                setdispbyte <= '1';
3225
                                                setstate <= "01";
3226
                                                set(briefext) <= '1';
3227
                                                next_micro_state <= ld_AnXn2;
3228
                                        ELSE
3229
                                                IF brief(7)='1'THEN             --suppress Base
3230
                                                        set_suppress_base <= '1';
3231
                                                ELSIF exec(dispouter)='1' THEN
3232
                                                        set(dispouter) <= '1';
3233
                                                END IF;
3234
                                                IF brief(5)='0' THEN --NULL Base Displacement
3235
                                                        setstate <= "01";
3236
                                                ELSE  --WORD Base Displacement
3237
                                                        IF brief(4)='1' THEN
3238
                                                                set(longaktion) <= '1'; --LONG Base Displacement
3239
                                                        END IF;
3240
                                                END IF;
3241
                                                next_micro_state <= ld_229_1;
3242
                                        END IF;
3243
 
3244
                                WHEN ld_AnXn2 =>
3245
                                        set(get_ea_now) <='1';
3246
                                        setdisp <= '1';         --brief
3247
                                        setnextpass <= '1';
3248
 
3249
-------------------------------------------------------------------------------------                                   
3250
 
3251
                                WHEN ld_229_1 =>                -- (bd,An,Xn)=>, --(bd,PC,Xn)=>
3252
                                        IF brief(5)='1' THEN    --Base Displacement
3253
                                                setdisp <= '1';         --add last_data_read
3254
                                        END IF;
3255
                                        IF brief(6)='0' AND brief(2)='0' THEN --Preindex or Index
3256
                                                set(briefext) <= '1';
3257
                                                setstate <= "01";
3258
                                                IF brief(1 downto 0)="00" THEN
3259
                                                        next_micro_state <= ld_AnXn2;
3260
                                                ELSE
3261
                                                        next_micro_state <= ld_229_2;
3262
                                                END IF;
3263
                                        ELSE
3264
                                                IF brief(1 downto 0)="00" THEN
3265
                                                        set(get_ea_now) <='1';
3266
                                                        setnextpass <= '1';
3267
                                                ELSE
3268
                                                        setstate <= "10";
3269
                                                        set(longaktion) <= '1';
3270
                                                        next_micro_state <= ld_229_3;
3271
                                                END IF;
3272
                                        END IF;
3273
 
3274
                                WHEN ld_229_2 =>                -- (bd,An,Xn)=>, --(bd,PC,Xn)=>
3275
                                        setdisp <= '1';         -- add Index
3276
                                        setstate <= "10";
3277
                                        set(longaktion) <= '1';
3278
                                        next_micro_state <= ld_229_3;
3279
 
3280
                                WHEN ld_229_3 =>                -- (bd,An,Xn)=>, --(bd,PC,Xn)=>
3281
                                        set_suppress_base <= '1';
3282
                                        set(dispouter) <= '1';
3283
                                        IF brief(1)='0' THEN --NULL Outer Displacement
3284
                                                setstate <= "01";
3285
                                        ELSE  --WORD Outer Displacement
3286
                                                IF brief(0)='1' THEN
3287
                                                        set(longaktion) <= '1'; --LONG Outer Displacement
3288
                                                END IF;
3289
                                        END IF;
3290
                                        next_micro_state <= ld_229_4;
3291
 
3292
                                WHEN ld_229_4 =>                -- (bd,An,Xn)=>, --(bd,PC,Xn)=>
3293
                                        IF brief(1)='1' THEN  -- Outer Displacement
3294
                                                setdisp <= '1';   --add last_data_read
3295
                                        END IF;
3296
                                        IF brief(6)='0' AND brief(2)='1' THEN --Postindex
3297
                                                set(briefext) <= '1';
3298
                                                setstate <= "01";
3299
                                                next_micro_state <= ld_AnXn2;
3300
                                        ELSE
3301
                                                set(get_ea_now) <='1';
3302
                                                setnextpass <= '1';
3303
                                        END IF;
3304
 
3305
----------------------------------------------------------------------------------------                                
3306
                                WHEN st_dAn1 =>         -- =>d(An)
3307
                                        setstate <= "11";
3308
                                        setdisp <= '1';         --word
3309
                                        next_micro_state <= nop;
3310
 
3311
                                WHEN st_AnXn1 =>                -- =>d(An,Xn)
3312
                                        IF brief(8)='0' OR extAddr_Mode=0 OR (cpu(1)='0' AND extAddr_Mode=2) THEN
3313
                                                setdisp <= '1';         --byte  
3314
                                                setdispbyte <= '1';
3315
                                                setstate <= "01";
3316
                                                set(briefext) <= '1';
3317
                                                next_micro_state <= st_AnXn2;
3318
                                        ELSE
3319
                                                IF brief(7)='1'THEN             --suppress Base
3320
                                                        set_suppress_base <= '1';
3321
--                                              ELSIF exec(dispouter)='1' THEN
3322
--                                                      set(dispouter) <= '1';
3323
                                                END IF;
3324
                                                IF brief(5)='0' THEN --NULL Base Displacement
3325
                                                        setstate <= "01";
3326
                                                ELSE  --WORD Base Displacement
3327
                                                        IF brief(4)='1' THEN
3328
                                                                set(longaktion) <= '1'; --LONG Base Displacement
3329
                                                        END IF;
3330
                                                END IF;
3331
                                                next_micro_state <= st_229_1;
3332
                                        END IF;
3333
 
3334
                                WHEN st_AnXn2 =>
3335
                                        setstate <= "11";
3336
                                        setdisp <= '1';         --brief 
3337
                                        next_micro_state <= nop;
3338
 
3339
-------------------------------------------------------------------------------------                                   
3340
 
3341
                                WHEN st_229_1 =>                -- (bd,An,Xn)=>, --(bd,PC,Xn)=>
3342
                                        IF brief(5)='1' THEN    --Base Displacement
3343
                                                setdisp <= '1';         --add last_data_read
3344
                                        END IF;
3345
                                        IF brief(6)='0' AND brief(2)='0' THEN --Preindex or Index
3346
                                                set(briefext) <= '1';
3347
                                                setstate <= "01";
3348
                                                IF brief(1 downto 0)="00" THEN
3349
                                                        next_micro_state <= st_AnXn2;
3350
                                                ELSE
3351
                                                        next_micro_state <= st_229_2;
3352
                                                END IF;
3353
                                        ELSE
3354
                                                IF brief(1 downto 0)="00" THEN
3355
                                                        setstate <= "11";
3356
                                                        next_micro_state <= nop;
3357
                                                ELSE
3358
                                                        set(hold_dwr) <= '1';
3359
                                                        setstate <= "10";
3360
                                                        set(longaktion) <= '1';
3361
                                                        next_micro_state <= st_229_3;
3362
                                                END IF;
3363
                                        END IF;
3364
 
3365
                                WHEN st_229_2 =>                -- (bd,An,Xn)=>, --(bd,PC,Xn)=>
3366
                                        setdisp <= '1';         -- add Index
3367
                                        set(hold_dwr) <= '1';
3368
                                        setstate <= "10";
3369
                                        set(longaktion) <= '1';
3370
                                        next_micro_state <= st_229_3;
3371
 
3372
                                WHEN st_229_3 =>                -- (bd,An,Xn)=>, --(bd,PC,Xn)=>
3373
                                        set(hold_dwr) <= '1';
3374
                                        set_suppress_base <= '1';
3375
                                        set(dispouter) <= '1';
3376
                                        IF brief(1)='0' THEN --NULL Outer Displacement
3377
                                                setstate <= "01";
3378
                                        ELSE  --WORD Outer Displacement
3379
                                                IF brief(0)='1' THEN
3380
                                                        set(longaktion) <= '1'; --LONG Outer Displacement
3381
                                                END IF;
3382
                                        END IF;
3383
                                        next_micro_state <= st_229_4;
3384
 
3385
                                WHEN st_229_4 =>                -- (bd,An,Xn)=>, --(bd,PC,Xn)=>
3386
                                        set(hold_dwr) <= '1';
3387
                                        IF brief(1)='1' THEN  -- Outer Displacement
3388
                                                setdisp <= '1';   --add last_data_read
3389
                                        END IF;
3390
                                        IF brief(6)='0' AND brief(2)='1' THEN --Postindex
3391
                                                set(briefext) <= '1';
3392
                                                setstate <= "01";
3393
                                                next_micro_state <= st_AnXn2;
3394
                                        ELSE
3395
                                                setstate <= "11";
3396
                                                next_micro_state <= nop;
3397
                                        END IF;
3398
 
3399
----------------------------------------------------------------------------------------                                
3400
                                WHEN bra1 =>            --bra
3401
                                        IF exe_condition='1' THEN
3402
                                                TG68_PC_brw <= '1';     --pc+0000
3403
                                                next_micro_state <= nop;
3404
                                                skipFetch <= '1';
3405
                                        END IF;
3406
 
3407
                                WHEN bsr1 =>            --bsr short
3408
                                        TG68_PC_brw <= '1';
3409
                                        next_micro_state <= nop;
3410
 
3411
                                WHEN bsr2 =>            --bsr
3412
                                        IF long_start='0' THEN
3413
                                                TG68_PC_brw <= '1';
3414
                                        END IF;
3415
                                        skipFetch <= '1';
3416
                                        set(longaktion) <= '1';
3417
                                        writePC <= '1';
3418
                                        setstate <= "11";
3419
                                        next_micro_state <= nopnop;
3420
                                        setstackaddr <='1';
3421
                                WHEN nopnop =>          --bsr
3422
                                        next_micro_state <= nop;
3423
 
3424
                                WHEN dbcc1 =>           --dbcc
3425
                                        IF exe_condition='0' THEN
3426
                                                Regwrena_now <= '1';
3427
                                                IF c_out(1)='1' THEN
3428
                                                        skipFetch <= '1';
3429
                                                        next_micro_state <= nop;
3430
                                                        TG68_PC_brw <= '1';
3431
                                                END IF;
3432 11 tobiflex
                                        END IF;
3433
 
3434
                                WHEN chk20 =>                   --if C is set -> signed compare
3435
                                        set(ea_data_OP1) <= '1';
3436
                                        set(addsub) <= '1';
3437
                                        set(alu_exec) <= '1';
3438
                                        set(alu_setFlags) <= '1';
3439
                                        setstate <="01";
3440
                                        next_micro_state <= chk21;
3441
                                WHEN chk21 =>                   -- check lower bound
3442
                                        dest_2ndHbits <= '1';
3443
                                        IF sndOPC(15)='1' THEN
3444
                                                set_datatype <="10";    --long
3445
                                                dest_LDRareg <= '1';
3446
                                                IF opcode(10 downto 9)="00" THEN
3447
                                                        set(opcEXTB) <= '1';
3448
                                                END IF;
3449
                                        END IF;
3450
                                        set(addsub) <= '1';
3451
                                        set(alu_exec) <= '1';
3452
                                        set(alu_setFlags) <= '1';
3453
                                        setstate <="01";
3454
                                        next_micro_state <= chk22;
3455
                                WHEN chk22 =>                   --check upper bound
3456
                                        dest_2ndHbits <= '1';
3457
                                        set(ea_data_OP2) <= '1';
3458
                                        IF sndOPC(15)='1' THEN
3459
                                                set_datatype <="10";    --long
3460
                                                dest_LDRareg <= '1';
3461
                                        END IF;
3462
                                        set(addsub) <= '1';
3463
                                        set(alu_exec) <= '1';
3464
                                        set(opcCHK2) <= '1';
3465
                                        set(opcEXTB) <= exec(opcEXTB);
3466
                                        IF sndOPC(11)='1' THEN
3467
                                                setstate <="01";
3468
                                                next_micro_state <= chk23;
3469
                                        END IF;
3470
                                WHEN chk23 =>
3471
                                                setstate <="01";
3472
                                                next_micro_state <= chk24;
3473
                                WHEN chk24 =>
3474
                                        IF Flags(0)='1'THEN
3475
                                                trapmake <= '1';
3476
                                        END IF;
3477
 
3478
 
3479
                                WHEN cas1 =>
3480
                                                setstate <="01";
3481
                                                next_micro_state <= cas2;
3482
                                WHEN cas2 =>
3483
                                        source_2ndMbits <= '1';
3484
                                        IF Flags(2)='1'THEN
3485
                                                setstate<="11";
3486
                                                set(write_reg) <= '1';
3487
                                                set(restore_ADDR) <= '1';
3488
                                                next_micro_state <= nop;
3489
                                        ELSE
3490
                                                set(Regwrena) <= '1';
3491
                                                set(ea_data_OP2) <='1';
3492
                                                dest_2ndLbits <= '1';
3493
                                                set(alu_move) <= '1';
3494
                                        END IF;
3495
 
3496
                                WHEN cas21 =>
3497
                                        dest_2ndHbits <= '1';
3498
                                        dest_LDRareg <= sndOPC(15);
3499
                                        set(get_ea_now) <='1';
3500
                                        next_micro_state <= cas22;
3501
                                WHEN cas22 =>
3502
                                        setstate <= "01";
3503
                                        source_2ndLbits <= '1';
3504
                                        set(ea_data_OP1) <= '1';
3505
                                        set(addsub) <= '1';
3506
                                        set(alu_exec) <= '1';
3507
                                        set(alu_setFlags) <= '1';
3508
                                        next_micro_state <= cas23;
3509
                                WHEN cas23 =>
3510
                                        dest_LDRHbits <= '1';
3511
                                        set(get_ea_now) <='1';
3512
                                        next_micro_state <= cas24;
3513
                                WHEN cas24 =>
3514
                                        IF Flags(2)='1'THEN
3515
                                                set(alu_setFlags) <= '1';
3516
                                        END IF;
3517
                                        setstate <="01";
3518
                                        set(hold_dwr) <= '1';
3519
                                        source_LDRLbits <= '1';
3520
                                        set(ea_data_OP1) <= '1';
3521
                                        set(addsub) <= '1';
3522
                                        set(alu_exec) <= '1';
3523
                                        next_micro_state <= cas25;
3524
                                WHEN cas25 =>
3525
                                        setstate <= "01";
3526
                                        set(hold_dwr) <= '1';
3527
                                        next_micro_state <= cas26;
3528
                                WHEN cas26 =>
3529
                                        IF Flags(2)='1'THEN -- write Update 1 to Destination 1
3530
                                                source_2ndMbits <= '1';
3531
                                                set(write_reg) <= '1';
3532
                                                dest_2ndHbits <= '1';
3533
                                                dest_LDRareg <= sndOPC(15);
3534
                                                setstate <= "11";
3535
                                                set(get_ea_now) <='1';
3536
                                                next_micro_state <= cas27;
3537
                                        ELSE                                    -- write Destination 2 to Compare 2 first
3538
                                                set(hold_dwr) <= '1';
3539
                                                set(hold_OP2) <='1';
3540
                                                dest_LDRLbits <= '1';
3541
                                                set(alu_move) <= '1';
3542
                                                set(Regwrena) <= '1';
3543
                                                set(ea_data_OP2) <='1';
3544
                                                next_micro_state <= cas28;
3545
                                        END IF;
3546
                                WHEN cas27 =>                           -- write Update 2 to Destination 2
3547
                                        source_LDRMbits <= '1';
3548
                                        set(write_reg) <= '1';
3549
                                        dest_LDRHbits <= '1';
3550
                                        setstate <= "11";
3551
                                        set(get_ea_now) <='1';
3552
                                        next_micro_state <= nopnop;
3553
                                WHEN cas28 =>                           -- write Destination 1 to Compare 1 second
3554
                                        dest_2ndLbits <= '1';
3555
                                        set(alu_move) <= '1';
3556
                                        set(Regwrena) <= '1';
3557
 
3558 2 tobiflex
                                WHEN movem1 =>          --movem
3559
                                        IF last_data_read(15 downto 0)/=X"0000" THEN
3560
                                                setstate <="01";
3561
                                                IF opcode(5 downto 3)="100" THEN
3562 10 tobiflex
                                                        set(mem_addsub) <= '1';
3563
                                                        IF cpu(1)='1' THEN
3564
                                                                set(Regwrena) <= '1';   --tg
3565
                                                        END IF;
3566 2 tobiflex
                                                END IF;
3567
                                                next_micro_state <= movem2;
3568
                                        END IF;
3569
                                WHEN movem2 =>          --movem
3570
                                        IF movem_run='0' THEN
3571
                                                setstate <="01";
3572
                                        ELSE
3573
                                                set(movem_action) <= '1';
3574
                                                set(mem_addsub) <= '1';
3575
                                                next_micro_state <= movem2;
3576
                                                IF opcode(10)='0' THEN
3577
                                                        setstate <="11";
3578
                                                        set(write_reg) <= '1';
3579
                                                ELSE
3580
                                                        setstate <="10";
3581
                                                END IF;
3582
                                        END IF;
3583
 
3584
                                WHEN andi =>            --andi
3585
                                        IF opcode(5 downto 4)/="00" THEN
3586
                                                setnextpass <= '1';
3587
                                        END IF;
3588
 
3589
                                WHEN pack1 =>           -- pack -(Ax),-(Ay)
3590 6 tobiflex
                                        IF opcode(2 downto 0)="111" THEN
3591
                                                set(use_SP) <= '1';
3592
                                        END IF;
3593 2 tobiflex
                                        set(hold_ea_data) <= '1';
3594
                                        set(update_ld) <= '1';
3595
                                        setstate <= "10";
3596
                                        set(presub) <= '1';
3597
                                        next_micro_state <= pack2;
3598
                                        dest_areg <= '1';
3599
                                WHEN pack2 =>
3600 6 tobiflex
                                        IF opcode(11 downto 9)="111" THEN
3601
                                                set(use_SP) <= '1';
3602
                                        END IF;
3603 2 tobiflex
                                        set(hold_ea_data) <= '1';
3604
                                        set_direct_data <= '1';
3605
                                        IF opcode(7 downto 6) = "01" THEN       --pack
3606
                                                datatype <= "00";               --Byte
3607
                                        ELSE                                                            --unpk
3608
                                                datatype <= "01";               --Word
3609
                                        END IF;
3610
                                        set(presub) <= '1';
3611
                                        dest_hbits <= '1';
3612
                                        dest_areg <= '1';
3613
                                        setstate <= "10";
3614
                                        next_micro_state <= pack3;
3615
                                WHEN pack3 =>
3616
                                        skipFetch <= '1';
3617
 
3618
                                WHEN op_AxAy =>         -- op -(Ax),-(Ay)
3619
                                        IF opcode(11 downto 9)="111" THEN
3620
                                                set(use_SP) <= '1';
3621
                                        END IF;
3622
                                        set_direct_data <= '1';
3623
                                        set(presub) <= '1';
3624
                                        dest_hbits <= '1';
3625
                                        dest_areg <= '1';
3626
                                        setstate <= "10";
3627
 
3628
                                WHEN cmpm =>            -- cmpm (Ay)+,(Ax)+
3629
                                        IF opcode(11 downto 9)="111" THEN
3630
                                                set(use_SP) <= '1';
3631
                                        END IF;
3632
                                        set_direct_data <= '1';
3633
                                        set(postadd) <= '1';
3634
                                        dest_hbits <= '1';
3635
                                        dest_areg <= '1';
3636
                                        setstate <= "10";
3637
 
3638
                                WHEN link1 =>           -- link
3639
                                        setstate <="11";
3640
                                        source_areg <= '1';
3641
                                        set(opcMOVE) <= '1';
3642
                                        set(Regwrena) <= '1';
3643
                                        next_micro_state <= link2;
3644
                                WHEN link2 =>           -- link
3645
                                        setstackaddr <='1';
3646
                                        set(ea_data_OP2) <= '1';
3647
 
3648
                                WHEN unlink1 =>         -- unlink
3649
                                        setstate <="10";
3650
                                        setstackaddr <='1';
3651
                                        set(postadd) <= '1';
3652
                                        next_micro_state <= unlink2;
3653
                                WHEN unlink2 =>         -- unlink
3654 10 tobiflex
                                        set(ea_data_OP2) <= '1';
3655 2 tobiflex
 
3656 8 tobiflex
-- paste and copy form TH       ---------       
3657 10 tobiflex
                                WHEN trap00 =>          -- TRAP format #2
3658 8 tobiflex
                                        next_micro_state <= trap0;
3659
                                        set(presub) <= '1';
3660
                                        setstackaddr <='1';
3661
                                        setstate <= "11";
3662
                                        datatype <= "10";
3663
------------------------------------
3664 2 tobiflex
                                WHEN trap0 =>           -- TRAP
3665
                                        set(presub) <= '1';
3666
                                        setstackaddr <='1';
3667
                                        setstate <= "11";
3668 10 tobiflex
                                        IF use_VBR_Stackframe='1' THEN  --68010
3669 2 tobiflex
                                                set(writePC_add) <= '1';
3670
                                                datatype <= "01";
3671
--                                              set_datatype <= "10";
3672
                                                next_micro_state <= trap1;
3673
                                        ELSE
3674
                                                IF trap_interrupt='1' OR trap_trace='1' OR trap_berr='1' THEN
3675
                                                        writePC <= '1';
3676
                                                END IF;
3677
                                                datatype <= "10";
3678
                                                next_micro_state <= trap2;
3679 8 tobiflex
                                        END IF;
3680
 
3681 2 tobiflex
                                WHEN trap1 =>           -- TRAP
3682
                                        IF trap_interrupt='1' OR trap_trace='1' THEN
3683
                                                writePC <= '1';
3684
                                        END IF;
3685
                                        set(presub) <= '1';
3686
                                        setstackaddr <='1';
3687
                                        setstate <= "11";
3688
                                        datatype <= "10";
3689
                                        next_micro_state <= trap2;
3690
                                WHEN trap2 =>           -- TRAP
3691
                                        set(presub) <= '1';
3692
                                        setstackaddr <='1';
3693
                                        setstate <= "11";
3694
                                        datatype <= "01";
3695
                                        writeSR <= '1';
3696
                                        IF trap_berr='1' THEN
3697
                                                next_micro_state <= trap4;
3698
                                        ELSE
3699
                                                next_micro_state <= trap3;
3700
                                        END IF;
3701
                                WHEN trap3 =>           -- TRAP
3702
                                        set_vectoraddr <= '1';
3703
                                        datatype <= "10";
3704
                                        set(direct_delta) <= '1';
3705
                                        set(directPC) <= '1';
3706
                                        setstate <= "10";
3707
                                        next_micro_state <= nopnop;
3708
                                WHEN trap4 =>           -- TRAP
3709
                                        set(presub) <= '1';
3710
                                        setstackaddr <='1';
3711
                                        setstate <= "11";
3712
                                        datatype <= "01";
3713
                                        writeSR <= '1';
3714
                                        next_micro_state <= trap5;
3715
                                WHEN trap5 =>           -- TRAP
3716
                                        set(presub) <= '1';
3717
                                        setstackaddr <='1';
3718
                                        setstate <= "11";
3719
                                        datatype <= "10";
3720
                                        writeSR <= '1';
3721
                                        next_micro_state <= trap6;
3722
                                WHEN trap6 =>           -- TRAP
3723
                                        set(presub) <= '1';
3724
                                        setstackaddr <='1';
3725
                                        setstate <= "11";
3726
                                        datatype <= "01";
3727
                                        writeSR <= '1';
3728
                                        next_micro_state <= trap3;
3729
 
3730 9 tobiflex
                                                                                -- return from exception - RTE
3731
                                                                                -- fetch PC and status register from stack
3732
                                                                                -- 010+ fetches another word containing
3733
                                                                                -- the 12 bit vector offset and the
3734
                                                                                -- frame format. If the frame format is
3735
                                                                                -- 2 another two words have to be taken
3736
                                                                                -- from the stack
3737 2 tobiflex
                                WHEN rte1 =>            -- RTE
3738
                                        datatype <= "10";
3739
                                        setstate <= "10";
3740
                                        set(postadd) <= '1';
3741
                                        setstackaddr <= '1';
3742 4 tobiflex
                                        set(directPC) <= '1';
3743 10 tobiflex
                                        IF use_VBR_Stackframe='0' OR opcode(2)='1' THEN  --opcode(2)='1' => opcode is RTR
3744 2 tobiflex
                                                set(update_FC) <= '1';
3745
                                                set(direct_delta) <= '1';
3746
                                        END IF;
3747
                                        next_micro_state <= rte2;
3748
                                WHEN rte2 =>            -- RTE
3749
                                        datatype <= "01";
3750
                                        set(update_FC) <= '1';
3751 10 tobiflex
                                        IF use_VBR_Stackframe='1' AND opcode(2)='0' THEN
3752 9 tobiflex
                                                                                                -- 010+ reads another word
3753 2 tobiflex
                                                setstate <= "10";
3754
                                                set(postadd) <= '1';
3755
                                                setstackaddr <= '1';
3756
                                                next_micro_state <= rte3;
3757
                                        ELSE
3758
                                                next_micro_state <= nop;
3759
                                        END IF;
3760 9 tobiflex
--                              WHEN rte3 =>                    -- RTE
3761
--                                      next_micro_state <= nop;
3762
----                                    set(update_FC) <= '1';
3763
-- paste and copy form TH       ---------       
3764
                                when rte3 => -- RTE
3765
                                        setstate <= "01"; -- idle state to wait
3766
                                                                                        -- for input data to
3767
                                                                                        -- arrive
3768
                                        next_micro_state <= rte4;
3769
                                WHEN rte4 =>         -- RTE
3770
                                                                                        -- check for stack frame format #2
3771
                                        if last_data_in(15 downto 12)="0010" then
3772
                                                                                  -- read another 32 bits in this case
3773
                                                setstate <= "10"; -- read
3774
                                                datatype <= "10"; -- long word
3775
                                                set(postadd) <= '1';
3776
                                                setstackaddr <= '1';
3777
                                                next_micro_state <= rte5;
3778
                                        else
3779
                                                datatype <= "01";
3780
                                                next_micro_state <= nop;
3781
                                        end if;
3782
                                WHEN rte5 =>            -- RTE
3783
                                        next_micro_state <= nop;
3784
-------------------------------------
3785 2 tobiflex
 
3786
                                WHEN rtd1 =>            -- RTD
3787
                                        next_micro_state <= rtd2;
3788
                                WHEN rtd2 =>            -- RTD
3789
                                        setstackaddr <= '1';
3790
                                        set(Regwrena) <= '1';
3791
 
3792
                                WHEN movec1 =>          -- MOVEC
3793
                                        set(briefext) <= '1';
3794
                                        set_writePCbig <='1';
3795
                                        IF (brief(11 downto 0)=X"000" OR brief(11 downto 0)=X"001" OR brief(11 downto 0)=X"800" OR brief(11 downto 0)=X"801") OR
3796
                                           (cpu(1)='1' AND (brief(11 downto 0)=X"002" OR brief(11 downto 0)=X"802" OR brief(11 downto 0)=X"803" OR brief(11 downto 0)=X"804")) THEN
3797
                                                IF opcode(0)='0' THEN
3798
                                                        set(Regwrena) <= '1';
3799
                                                END IF;
3800
--                                      ELSIF brief(11 downto 0)=X"800"OR brief(11 downto 0)=X"001" OR brief(11 downto 0)=X"000" THEN
3801
--                                              trap_addr_error <= '1';
3802
--                                              trapmake <= '1';
3803
                                        ELSE
3804
                                                trap_illegal <= '1';
3805
                                                trapmake <= '1';
3806
                                        END IF;
3807
 
3808
                                WHEN movep1 =>          -- MOVEP d(An)
3809
                                        setdisp <= '1';
3810
                                        set(mem_addsub) <= '1';
3811
                                        set(mem_byte) <= '1';
3812
                                        set(OP1addr) <= '1';
3813
                                        IF opcode(6)='1' THEN
3814
                                                set(movepl) <= '1';
3815
                                        END IF;
3816
                                        IF opcode(7)='0' THEN
3817
                                                setstate <= "10";
3818
                                        ELSE
3819
                                                setstate <= "11";
3820
                                        END IF;
3821
                                        next_micro_state <= movep2;
3822
                                WHEN movep2 =>
3823
                                        IF opcode(6)='1' THEN
3824
                                                set(mem_addsub) <= '1';
3825
                                            set(OP1addr) <= '1';
3826
                                        END IF;
3827
                                        IF opcode(7)='0' THEN
3828
                                                setstate <= "10";
3829
                                        ELSE
3830
                                                setstate <= "11";
3831
                                        END IF;
3832
                                        next_micro_state <= movep3;
3833
                                WHEN movep3 =>
3834
                                        IF opcode(6)='1' THEN
3835
                                                set(mem_addsub) <= '1';
3836
                                            set(OP1addr) <= '1';
3837
                                                set(mem_byte) <= '1';
3838
                                                IF opcode(7)='0' THEN
3839
                                                        setstate <= "10";
3840
                                                ELSE
3841
                                                        setstate <= "11";
3842
                                                END IF;
3843
                                                next_micro_state <= movep4;
3844
                                        ELSE
3845
                                                datatype <= "01";               --Word
3846
                                        END IF;
3847
                                WHEN movep4 =>
3848
                                        IF opcode(7)='0' THEN
3849
                                                setstate <= "10";
3850
                                        ELSE
3851
                                                setstate <= "11";
3852
                                        END IF;
3853
                                        next_micro_state <= movep5;
3854
                                WHEN movep5 =>
3855
                                        datatype <= "10";               --Long
3856
 
3857
                                WHEN mul1       =>              -- mulu
3858
                                        IF opcode(15)='1' OR MUL_Mode=0 THEN
3859
                                                set_rot_cnt <= "001110";
3860
                                        ELSE
3861
                                                set_rot_cnt <= "011110";
3862
                                        END IF;
3863
                                        setstate <="01";
3864
                                        next_micro_state <= mul2;
3865
                                WHEN mul2       =>              -- mulu
3866 8 tobiflex
                                        setstate <="01";
3867 2 tobiflex
                                        IF rot_cnt="00001" THEN
3868 8 tobiflex
                                                next_micro_state <= mul_end1;
3869
 
3870 2 tobiflex
                                        ELSE
3871
                                                next_micro_state <= mul2;
3872
                                        END IF;
3873
                                WHEN mul_end1   =>              -- mulu
3874 8 tobiflex
                                        IF opcode(15)='0' THEN
3875 9 tobiflex
                                                set(hold_OP2) <= '1';
3876 8 tobiflex
                                        END IF;
3877 2 tobiflex
                                        datatype <= "10";
3878
                                        set(opcMULU) <= '1';
3879
                                        IF opcode(15)='0' AND (MUL_Mode=1 OR MUL_Mode=2) THEN
3880
                                                dest_2ndHbits <= '1';
3881
                                                set(write_lowlong) <= '1';
3882
                                                IF sndOPC(10)='1' THEN
3883
                                                        setstate <="01";
3884
                                                        next_micro_state <= mul_end2;
3885
                                                END IF;
3886
                                                set(Regwrena) <= '1';
3887
                                        END IF;
3888
                                        datatype <= "10";
3889 11 tobiflex
                                WHEN mul_end2   =>              -- divu
3890
                                        dest_2ndLbits <= '1';
3891 2 tobiflex
                                        set(write_reminder) <= '1';
3892
                                        set(Regwrena) <= '1';
3893
                                        set(opcMULU) <= '1';
3894
 
3895
                                WHEN div1       =>              -- divu
3896
                                        setstate <="01";
3897
                                        next_micro_state <= div2;
3898
                                WHEN div2       =>              -- divu
3899
                                        IF (OP2out(31 downto 16)=x"0000" OR opcode(15)='1' OR DIV_Mode=0) AND OP2out(15 downto 0)=x"0000" THEN            --div zero
3900
                                                set_Z_error <= '1';
3901
                                        ELSE
3902
                                                next_micro_state <= div3;
3903
                                        END IF;
3904
                                        set(ld_rot_cnt) <= '1';
3905
                                        setstate <="01";
3906
                                WHEN div3       =>              -- divu
3907
                                        IF opcode(15)='1' OR DIV_Mode=0 THEN
3908
                                                set_rot_cnt <= "001101";
3909
                                        ELSE
3910
                                                set_rot_cnt <= "011101";
3911
                                        END IF;
3912
                                        setstate <="01";
3913
                                        next_micro_state <= div4;
3914
                                WHEN div4       =>              -- divu
3915
                                        setstate <="01";
3916
                                        IF rot_cnt="00001" THEN
3917
                                                next_micro_state <= div_end1;
3918
                                        ELSE
3919
                                                next_micro_state <= div4;
3920
                                        END IF;
3921
                                WHEN div_end1   =>              -- divu
3922
                                        IF opcode(15)='0' AND (DIV_Mode=1 OR DIV_Mode=2) THEN
3923 11 tobiflex
                                                dest_2ndLbits <= '1';
3924 2 tobiflex
                                                set(write_reminder) <= '1';
3925
                                                next_micro_state <= div_end2;
3926
                                                setstate <="01";
3927
                                        END IF;
3928
                                        set(opcDIVU) <= '1';
3929
                                        datatype <= "10";
3930
                                WHEN div_end2   =>              -- divu
3931
                                        dest_2ndHbits <= '1';
3932
                                        source_2ndLbits <= '1';--???
3933
                                        set(opcDIVU) <= '1';
3934
 
3935
                                WHEN rota1      =>
3936
                                        IF OP2out(5 downto 0)/="000000" THEN
3937
                                                set_rot_cnt <= OP2out(5 downto 0);
3938
                                        ELSE
3939
                                                set_exec(rot_nop) <= '1';
3940
                                        END IF;
3941
 
3942
                                WHEN bf1 =>
3943
                                        setstate <="10";
3944
 
3945
                                WHEN OTHERS => NULL;
3946
                        END CASE;
3947
        END PROCESS;
3948
 
3949
-----------------------------------------------------------------------------
3950
-- MOVEC
3951
-----------------------------------------------------------------------------
3952
  process (clk, VBR, CACR, brief)
3953
  begin
3954
        -- all other hexa codes should give illegal isntruction exception
3955
        if rising_edge(clk) then
3956
          if Reset = '1' then
3957
                VBR <= (others => '0');
3958
                CACR <= (others => '0');
3959
          elsif clkena_lw = '1' and exec(movec_wr) = '1' then
3960
                case brief(11 downto 0) is
3961
                  when X"000" => NULL; -- SFC -- 68010+
3962
                  when X"001" => NULL; -- DFC -- 68010+
3963
                  when X"002" => CACR <= reg_QA(3 downto 0); -- 68020+
3964
                  when X"800" => NULL; -- USP -- 68010+
3965
                  when X"801" => VBR <= reg_QA; -- 68010+
3966
                  when X"802" => NULL; -- CAAR -- 68020+
3967
                  when X"803" => NULL; -- MSP -- 68020+
3968
                  when X"804" => NULL; -- isP -- 68020+
3969
                  when others => NULL;
3970
                end case;
3971
          end if;
3972
        end if;
3973
 
3974
        movec_data <= (others => '0');
3975
        case brief(11 downto 0) is
3976
          when X"002" => movec_data <= "0000000000000000000000000000" & (CACR AND "0011");
3977
 
3978 10 tobiflex
          when X"801" =>
3979 2 tobiflex
                movec_data <= VBR;
3980
                --end if;
3981
          when others => NULL;
3982
        end case;
3983
  end process;
3984
 
3985
  CACR_out <= CACR;
3986
  VBR_out <= VBR;
3987
-----------------------------------------------------------------------------
3988
-- Conditions
3989
-----------------------------------------------------------------------------
3990
PROCESS (exe_opcode, Flags)
3991
        BEGIN
3992
                CASE exe_opcode(11 downto 8) IS
3993
                        WHEN X"0" => exe_condition <= '1';
3994
                        WHEN X"1" => exe_condition <= '0';
3995
                        WHEN X"2" => exe_condition <=  NOT Flags(0) AND NOT Flags(2);
3996
                        WHEN X"3" => exe_condition <= Flags(0) OR Flags(2);
3997
                        WHEN X"4" => exe_condition <= NOT Flags(0);
3998
                        WHEN X"5" => exe_condition <= Flags(0);
3999
                        WHEN X"6" => exe_condition <= NOT Flags(2);
4000
                        WHEN X"7" => exe_condition <= Flags(2);
4001
                        WHEN X"8" => exe_condition <= NOT Flags(1);
4002
                        WHEN X"9" => exe_condition <= Flags(1);
4003
                        WHEN X"a" => exe_condition <= NOT Flags(3);
4004
                        WHEN X"b" => exe_condition <= Flags(3);
4005
                        WHEN X"c" => exe_condition <= (Flags(3) AND Flags(1)) OR (NOT Flags(3) AND NOT Flags(1));
4006
                        WHEN X"d" => exe_condition <= (Flags(3) AND NOT Flags(1)) OR (NOT Flags(3) AND Flags(1));
4007
                        WHEN X"e" => exe_condition <= (Flags(3) AND Flags(1) AND NOT Flags(2)) OR (NOT Flags(3) AND NOT Flags(1) AND NOT Flags(2));
4008
                        WHEN X"f" => exe_condition <= (Flags(3) AND NOT Flags(1)) OR (NOT Flags(3) AND Flags(1)) OR Flags(2);
4009
                        WHEN OTHERS => NULL;
4010
                END CASE;
4011
        END PROCESS;
4012
 
4013
-----------------------------------------------------------------------------
4014
-- Movem
4015
-----------------------------------------------------------------------------
4016
PROCESS (clk)
4017
        BEGIN
4018
                IF rising_edge(clk) THEN
4019
                        IF clkena_lw='1' THEN
4020
                                movem_actiond <= exec(movem_action);
4021
                                IF decodeOPC='1' THEN
4022
                                        sndOPC <= data_read(15 downto 0);
4023
                                ELSIF exec(movem_action)='1' OR set(movem_action) ='1' THEN
4024
                                        CASE movem_regaddr IS
4025
                                                WHEN "0000" => sndOPC(0)  <= '0';
4026
                                                WHEN "0001" => sndOPC(1)  <= '0';
4027
                                                WHEN "0010" => sndOPC(2)  <= '0';
4028
                                                WHEN "0011" => sndOPC(3)  <= '0';
4029
                                                WHEN "0100" => sndOPC(4)  <= '0';
4030
                                                WHEN "0101" => sndOPC(5)  <= '0';
4031
                                                WHEN "0110" => sndOPC(6)  <= '0';
4032
                                                WHEN "0111" => sndOPC(7)  <= '0';
4033
                                                WHEN "1000" => sndOPC(8)  <= '0';
4034
                                                WHEN "1001" => sndOPC(9)  <= '0';
4035
                                                WHEN "1010" => sndOPC(10) <= '0';
4036
                                                WHEN "1011" => sndOPC(11) <= '0';
4037
                                                WHEN "1100" => sndOPC(12) <= '0';
4038
                                                WHEN "1101" => sndOPC(13) <= '0';
4039
                                                WHEN "1110" => sndOPC(14) <= '0';
4040
                                                WHEN "1111" => sndOPC(15) <= '0';
4041
                                                WHEN OTHERS => NULL;
4042
                                        END CASE;
4043
                                END IF;
4044
                        END IF;
4045
                END IF;
4046
        END PROCESS;
4047
 
4048
PROCESS (sndOPC, movem_mux)
4049
        BEGIN
4050
                movem_regaddr <="0000";
4051
                movem_run <= '1';
4052
                IF sndOPC(3 downto 0)="0000" THEN
4053
                        IF sndOPC(7 downto 4)="0000" THEN
4054
                                movem_regaddr(3) <= '1';
4055
                                IF sndOPC(11 downto 8)="0000" THEN
4056
                                        IF sndOPC(15 downto 12)="0000" THEN
4057
                                                movem_run <= '0';
4058
                                        END IF;
4059
                                        movem_regaddr(2) <= '1';
4060
                                        movem_mux <= sndOPC(15 downto 12);
4061
                                ELSE
4062
                                        movem_mux <= sndOPC(11 downto 8);
4063
                                END IF;
4064
                        ELSE
4065
                                movem_mux <= sndOPC(7 downto 4);
4066
                                movem_regaddr(2) <= '1';
4067
                        END IF;
4068
                ELSE
4069
                        movem_mux <= sndOPC(3 downto 0);
4070
                END IF;
4071
                IF movem_mux(1 downto 0)="00" THEN
4072
                        movem_regaddr(1) <= '1';
4073
                        IF movem_mux(2)='0' THEN
4074
                                movem_regaddr(0) <= '1';
4075
                        END IF;
4076
                ELSE
4077
                        IF movem_mux(0)='0' THEN
4078
                                movem_regaddr(0) <= '1';
4079
                        END IF;
4080
                END  IF;
4081
        END PROCESS;
4082
END;

powered by: WebSVN 2.1.0

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