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

Subversion Repositories z80soc

[/] [z80soc/] [tags/] [z80soc05c/] [S3E/] [T80_MCode.vhd] - Blame information for rev 31

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 rrred
--
2
-- Z80 compatible microprocessor core
3
--
4
-- Version : 0242
5
-- 
6
-- Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
7
--
8
-- All rights reserved
9
--
10
-- Redistribution and use in source and synthezised forms, with or without
11
-- modification, are permitted provided that the following conditions are met:
12
--
13
-- Redistributions of source code must retain the above copyright notice,
14
-- this list of conditions and the following disclaimer.
15
--
16
-- Redistributions in synthesized form must reproduce the above copyright
17
-- notice, this list of conditions and the following disclaimer in the
18
-- documentation and/or other materials provided with the distribution.
19
--
20
-- Neither the name of the author nor the names of other contributors may
21
-- be used to endorse or promote products derived from this software without
22
-- specific prior written permission.
23
--
24
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
26
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
28
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
-- POSSIBILITY OF SUCH DAMAGE.
35
--
36
-- Please report bugs to the author, but before you do so, please
37
-- make sure that this is not a derivative work and that
38
-- you have the latest version of this file.
39
--
40
-- The latest version of this file can be found at:
41
--      http://www.opencores.org/cvsweb.shtml/t80/
42
-- 
43
-- Limitations :
44
--
45
-- File history :
46
--
47
--      0208 : First complete release
48
--
49
--      0211 : Fixed IM 1
50
--
51
--      0214 : Fixed mostly flags, only the block instructions now fail the zex regression test
52
--
53
--      0235 : Added IM 2 fix by Mike Johnson
54
--
55
--      0238 : Added NoRead signal
56
--
57
--      0238b: Fixed instruction timing for POP and DJNZ
58
--
59
--      0240 : Added (IX/IY+d) states, removed op-codes from mode 2 and added all remaining mode 3 op-codes
60
--
61
--      0242 : Fixed I/O instruction timing, cleanup
62
--
63
 
64
library IEEE;
65
use IEEE.std_logic_1164.all;
66
use IEEE.numeric_std.all;
67
 
68
entity T80_MCode is
69
        generic(
70
                Mode : integer := 0;
71
                Flag_C : integer := 0;
72
                Flag_N : integer := 1;
73
                Flag_P : integer := 2;
74
                Flag_X : integer := 3;
75
                Flag_H : integer := 4;
76
                Flag_Y : integer := 5;
77
                Flag_Z : integer := 6;
78
                Flag_S : integer := 7
79
        );
80
        port(
81
                IR                              : in std_logic_vector(7 downto 0);
82
                ISet                    : in std_logic_vector(1 downto 0);
83
                MCycle                  : in std_logic_vector(2 downto 0);
84
                F                               : in std_logic_vector(7 downto 0);
85
                NMICycle                : in std_logic;
86
                IntCycle                : in std_logic;
87
                MCycles                 : out std_logic_vector(2 downto 0);
88
                TStates                 : out std_logic_vector(2 downto 0);
89
                Prefix                  : out std_logic_vector(1 downto 0); -- None,BC,ED,DD/FD
90
                Inc_PC                  : out std_logic;
91
                Inc_WZ                  : out std_logic;
92
                IncDec_16               : out std_logic_vector(3 downto 0); -- BC,DE,HL,SP   0 is inc
93
                Read_To_Reg             : out std_logic;
94
                Read_To_Acc             : out std_logic;
95
                Set_BusA_To     : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F
96
                Set_BusB_To     : out std_logic_vector(3 downto 0); -- B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0
97
                ALU_Op                  : out std_logic_vector(3 downto 0);
98
                        -- ADD, ADC, SUB, SBC, AND, XOR, OR, CP, ROT, BIT, SET, RES, DAA, RLD, RRD, None
99
                Save_ALU                : out std_logic;
100
                PreserveC               : out std_logic;
101
                Arith16                 : out std_logic;
102
                Set_Addr_To             : out std_logic_vector(2 downto 0); -- aNone,aXY,aIOA,aSP,aBC,aDE,aZI
103
                IORQ                    : out std_logic;
104
                Jump                    : out std_logic;
105
                JumpE                   : out std_logic;
106
                JumpXY                  : out std_logic;
107
                Call                    : out std_logic;
108
                RstP                    : out std_logic;
109
                LDZ                             : out std_logic;
110
                LDW                             : out std_logic;
111
                LDSPHL                  : out std_logic;
112
                Special_LD              : out std_logic_vector(2 downto 0); -- A,I;A,R;I,A;R,A;None
113
                ExchangeDH              : out std_logic;
114
                ExchangeRp              : out std_logic;
115
                ExchangeAF              : out std_logic;
116
                ExchangeRS              : out std_logic;
117
                I_DJNZ                  : out std_logic;
118
                I_CPL                   : out std_logic;
119
                I_CCF                   : out std_logic;
120
                I_SCF                   : out std_logic;
121
                I_RETN                  : out std_logic;
122
                I_BT                    : out std_logic;
123
                I_BC                    : out std_logic;
124
                I_BTR                   : out std_logic;
125
                I_RLD                   : out std_logic;
126
                I_RRD                   : out std_logic;
127
                I_INRC                  : out std_logic;
128
                SetDI                   : out std_logic;
129
                SetEI                   : out std_logic;
130
                IMode                   : out std_logic_vector(1 downto 0);
131
                Halt                    : out std_logic;
132
                NoRead                  : out std_logic;
133
                Write                   : out std_logic
134
        );
135
end T80_MCode;
136
 
137
architecture rtl of T80_MCode is
138
 
139
        constant aNone  : std_logic_vector(2 downto 0) := "111";
140
        constant aBC    : std_logic_vector(2 downto 0) := "000";
141
        constant aDE    : std_logic_vector(2 downto 0) := "001";
142
        constant aXY    : std_logic_vector(2 downto 0) := "010";
143
        constant aIOA   : std_logic_vector(2 downto 0) := "100";
144
        constant aSP    : std_logic_vector(2 downto 0) := "101";
145
        constant aZI    : std_logic_vector(2 downto 0) := "110";
146
--      constant aNone  : std_logic_vector(2 downto 0) := "000";
147
--      constant aXY    : std_logic_vector(2 downto 0) := "001";
148
--      constant aIOA   : std_logic_vector(2 downto 0) := "010";
149
--      constant aSP    : std_logic_vector(2 downto 0) := "011";
150
--      constant aBC    : std_logic_vector(2 downto 0) := "100";
151
--      constant aDE    : std_logic_vector(2 downto 0) := "101";
152
--      constant aZI    : std_logic_vector(2 downto 0) := "110";
153
 
154
        function is_cc_true(
155
                F : std_logic_vector(7 downto 0);
156
                cc : bit_vector(2 downto 0)
157
                ) return boolean is
158
        begin
159
                if Mode = 3 then
160
                        case cc is
161
                        when "000" => return F(7) = '0'; -- NZ
162
                        when "001" => return F(7) = '1'; -- Z
163
                        when "010" => return F(4) = '0'; -- NC
164
                        when "011" => return F(4) = '1'; -- C
165
                        when "100" => return false;
166
                        when "101" => return false;
167
                        when "110" => return false;
168
                        when "111" => return false;
169
                        end case;
170
                else
171
                        case cc is
172
                        when "000" => return F(6) = '0'; -- NZ
173
                        when "001" => return F(6) = '1'; -- Z
174
                        when "010" => return F(0) = '0'; -- NC
175
                        when "011" => return F(0) = '1'; -- C
176
                        when "100" => return F(2) = '0'; -- PO
177
                        when "101" => return F(2) = '1'; -- PE
178
                        when "110" => return F(7) = '0'; -- P
179
                        when "111" => return F(7) = '1'; -- M
180
                        end case;
181
                end if;
182
        end;
183
 
184
begin
185
 
186
        process (IR, ISet, MCycle, F, NMICycle, IntCycle)
187
                variable DDD : std_logic_vector(2 downto 0);
188
                variable SSS : std_logic_vector(2 downto 0);
189
                variable DPair : std_logic_vector(1 downto 0);
190
                variable IRB : bit_vector(7 downto 0);
191
        begin
192
                DDD := IR(5 downto 3);
193
                SSS := IR(2 downto 0);
194
                DPair := IR(5 downto 4);
195
                IRB := to_bitvector(IR);
196
 
197
                MCycles <= "001";
198
                if MCycle = "001" then
199
                        TStates <= "100";
200
                else
201
                        TStates <= "011";
202
                end if;
203
                Prefix <= "00";
204
                Inc_PC <= '0';
205
                Inc_WZ <= '0';
206
                IncDec_16 <= "0000";
207
                Read_To_Acc <= '0';
208
                Read_To_Reg <= '0';
209
                Set_BusB_To <= "0000";
210
                Set_BusA_To <= "0000";
211
                ALU_Op <= "0" & IR(5 downto 3);
212
                Save_ALU <= '0';
213
                PreserveC <= '0';
214
                Arith16 <= '0';
215
                IORQ <= '0';
216
                Set_Addr_To <= aNone;
217
                Jump <= '0';
218
                JumpE <= '0';
219
                JumpXY <= '0';
220
                Call <= '0';
221
                RstP <= '0';
222
                LDZ <= '0';
223
                LDW <= '0';
224
                LDSPHL <= '0';
225
                Special_LD <= "000";
226
                ExchangeDH <= '0';
227
                ExchangeRp <= '0';
228
                ExchangeAF <= '0';
229
                ExchangeRS <= '0';
230
                I_DJNZ <= '0';
231
                I_CPL <= '0';
232
                I_CCF <= '0';
233
                I_SCF <= '0';
234
                I_RETN <= '0';
235
                I_BT <= '0';
236
                I_BC <= '0';
237
                I_BTR <= '0';
238
                I_RLD <= '0';
239
                I_RRD <= '0';
240
                I_INRC <= '0';
241
                SetDI <= '0';
242
                SetEI <= '0';
243
                IMode <= "11";
244
                Halt <= '0';
245
                NoRead <= '0';
246
                Write <= '0';
247
 
248
                case ISet is
249
                when "00" =>
250
 
251
------------------------------------------------------------------------------
252
--
253
--      Unprefixed instructions
254
--
255
------------------------------------------------------------------------------
256
 
257
                case IRB is
258
-- 8 BIT LOAD GROUP
259
                when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111"
260
                        |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111"
261
                        |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111"
262
                        |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111"
263
                        |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111"
264
                        |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111"
265
                        |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" =>
266
                        -- LD r,r'
267
                        Set_BusB_To(2 downto 0) <= SSS;
268
                        ExchangeRp <= '1';
269
                        Set_BusA_To(2 downto 0) <= DDD;
270
                        Read_To_Reg <= '1';
271
                when "00000110"|"00001110"|"00010110"|"00011110"|"00100110"|"00101110"|"00111110" =>
272
                        -- LD r,n
273
                        MCycles <= "010";
274
                        case to_integer(unsigned(MCycle)) is
275
                        when 2 =>
276
                                Inc_PC <= '1';
277
                                Set_BusA_To(2 downto 0) <= DDD;
278
                                Read_To_Reg <= '1';
279
                        when others => null;
280
                        end case;
281
                when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01111110" =>
282
                        -- LD r,(HL)
283
                        MCycles <= "010";
284
                        case to_integer(unsigned(MCycle)) is
285
                        when 1 =>
286
                                Set_Addr_To <= aXY;
287
                        when 2 =>
288
                                Set_BusA_To(2 downto 0) <= DDD;
289
                                Read_To_Reg <= '1';
290
                        when others => null;
291
                        end case;
292
                when "01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" =>
293
                        -- LD (HL),r
294
                        MCycles <= "010";
295
                        case to_integer(unsigned(MCycle)) is
296
                        when 1 =>
297
                                Set_Addr_To <= aXY;
298
                                Set_BusB_To(2 downto 0) <= SSS;
299
                                Set_BusB_To(3) <= '0';
300
                        when 2 =>
301
                                Write <= '1';
302
                        when others => null;
303
                        end case;
304
                when "00110110" =>
305
                        -- LD (HL),n
306
                        MCycles <= "011";
307
                        case to_integer(unsigned(MCycle)) is
308
                        when 2 =>
309
                                Inc_PC <= '1';
310
                                Set_Addr_To <= aXY;
311
                                Set_BusB_To(2 downto 0) <= SSS;
312
                                Set_BusB_To(3) <= '0';
313
                        when 3 =>
314
                                Write <= '1';
315
                        when others => null;
316
                        end case;
317
                when "00001010" =>
318
                        -- LD A,(BC)
319
                        MCycles <= "010";
320
                        case to_integer(unsigned(MCycle)) is
321
                        when 1 =>
322
                                Set_Addr_To <= aBC;
323
                        when 2 =>
324
                                Read_To_Acc <= '1';
325
                        when others => null;
326
                        end case;
327
                when "00011010" =>
328
                        -- LD A,(DE)
329
                        MCycles <= "010";
330
                        case to_integer(unsigned(MCycle)) is
331
                        when 1 =>
332
                                Set_Addr_To <= aDE;
333
                        when 2 =>
334
                                Read_To_Acc <= '1';
335
                        when others => null;
336
                        end case;
337
                when "00111010" =>
338
                        if Mode = 3 then
339
                                -- LDD A,(HL)
340
                                MCycles <= "010";
341
                                case to_integer(unsigned(MCycle)) is
342
                                when 1 =>
343
                                        Set_Addr_To <= aXY;
344
                                when 2 =>
345
                                        Read_To_Acc <= '1';
346
                                        IncDec_16 <= "1110";
347
                                when others => null;
348
                                end case;
349
                        else
350
                                -- LD A,(nn)
351
                                MCycles <= "100";
352
                                case to_integer(unsigned(MCycle)) is
353
                                when 2 =>
354
                                        Inc_PC <= '1';
355
                                        LDZ <= '1';
356
                                when 3 =>
357
                                        Set_Addr_To <= aZI;
358
                                        Inc_PC <= '1';
359
                                when 4 =>
360
                                        Read_To_Acc <= '1';
361
                                when others => null;
362
                                end case;
363
                        end if;
364
                when "00000010" =>
365
                        -- LD (BC),A
366
                        MCycles <= "010";
367
                        case to_integer(unsigned(MCycle)) is
368
                        when 1 =>
369
                                Set_Addr_To <= aBC;
370
                                Set_BusB_To <= "0111";
371
                        when 2 =>
372
                                Write <= '1';
373
                        when others => null;
374
                        end case;
375
                when "00010010" =>
376
                        -- LD (DE),A
377
                        MCycles <= "010";
378
                        case to_integer(unsigned(MCycle)) is
379
                        when 1 =>
380
                                Set_Addr_To <= aDE;
381
                                Set_BusB_To <= "0111";
382
                        when 2 =>
383
                                Write <= '1';
384
                        when others => null;
385
                        end case;
386
                when "00110010" =>
387
                        if Mode = 3 then
388
                                -- LDD (HL),A
389
                                MCycles <= "010";
390
                                case to_integer(unsigned(MCycle)) is
391
                                when 1 =>
392
                                        Set_Addr_To <= aXY;
393
                                        Set_BusB_To <= "0111";
394
                                when 2 =>
395
                                        Write <= '1';
396
                                        IncDec_16 <= "1110";
397
                                when others => null;
398
                                end case;
399
                        else
400
                                -- LD (nn),A
401
                                MCycles <= "100";
402
                                case to_integer(unsigned(MCycle)) is
403
                                when 2 =>
404
                                        Inc_PC <= '1';
405
                                        LDZ <= '1';
406
                                when 3 =>
407
                                        Set_Addr_To <= aZI;
408
                                        Inc_PC <= '1';
409
                                        Set_BusB_To <= "0111";
410
                                when 4 =>
411
                                        Write <= '1';
412
                                when others => null;
413
                                end case;
414
                        end if;
415
 
416
-- 16 BIT LOAD GROUP
417
                when "00000001"|"00010001"|"00100001"|"00110001" =>
418
                        -- LD dd,nn
419
                        MCycles <= "011";
420
                        case to_integer(unsigned(MCycle)) is
421
                        when 2 =>
422
                                Inc_PC <= '1';
423
                                Read_To_Reg <= '1';
424
                                if DPAIR = "11" then
425
                                        Set_BusA_To(3 downto 0) <= "1000";
426
                                else
427
                                        Set_BusA_To(2 downto 1) <= DPAIR;
428
                                        Set_BusA_To(0) <= '1';
429
                                end if;
430
                        when 3 =>
431
                                Inc_PC <= '1';
432
                                Read_To_Reg <= '1';
433
                                if DPAIR = "11" then
434
                                        Set_BusA_To(3 downto 0) <= "1001";
435
                                else
436
                                        Set_BusA_To(2 downto 1) <= DPAIR;
437
                                        Set_BusA_To(0) <= '0';
438
                                end if;
439
                        when others => null;
440
                        end case;
441
                when "00101010" =>
442
                        if Mode = 3 then
443
                                -- LDI A,(HL)
444
                                MCycles <= "010";
445
                                case to_integer(unsigned(MCycle)) is
446
                                when 1 =>
447
                                        Set_Addr_To <= aXY;
448
                                when 2 =>
449
                                        Read_To_Acc <= '1';
450
                                        IncDec_16 <= "0110";
451
                                when others => null;
452
                                end case;
453
                        else
454
                                -- LD HL,(nn)
455
                                MCycles <= "101";
456
                                case to_integer(unsigned(MCycle)) is
457
                                when 2 =>
458
                                        Inc_PC <= '1';
459
                                        LDZ <= '1';
460
                                when 3 =>
461
                                        Set_Addr_To <= aZI;
462
                                        Inc_PC <= '1';
463
                                        LDW <= '1';
464
                                when 4 =>
465
                                        Set_BusA_To(2 downto 0) <= "101"; -- L
466
                                        Read_To_Reg <= '1';
467
                                        Inc_WZ <= '1';
468
                                        Set_Addr_To <= aZI;
469
                                when 5 =>
470
                                        Set_BusA_To(2 downto 0) <= "100"; -- H
471
                                        Read_To_Reg <= '1';
472
                                when others => null;
473
                                end case;
474
                        end if;
475
                when "00100010" =>
476
                        if Mode = 3 then
477
                                -- LDI (HL),A
478
                                MCycles <= "010";
479
                                case to_integer(unsigned(MCycle)) is
480
                                when 1 =>
481
                                        Set_Addr_To <= aXY;
482
                                        Set_BusB_To <= "0111";
483
                                when 2 =>
484
                                        Write <= '1';
485
                                        IncDec_16 <= "0110";
486
                                when others => null;
487
                                end case;
488
                        else
489
                                -- LD (nn),HL
490
                                MCycles <= "101";
491
                                case to_integer(unsigned(MCycle)) is
492
                                when 2 =>
493
                                        Inc_PC <= '1';
494
                                        LDZ <= '1';
495
                                when 3 =>
496
                                        Set_Addr_To <= aZI;
497
                                        Inc_PC <= '1';
498
                                        LDW <= '1';
499
                                        Set_BusB_To <= "0101"; -- L
500
                                when 4 =>
501
                                        Inc_WZ <= '1';
502
                                        Set_Addr_To <= aZI;
503
                                        Write <= '1';
504
                                        Set_BusB_To <= "0100"; -- H
505
                                when 5 =>
506
                                        Write <= '1';
507
                                when others => null;
508
                                end case;
509
                        end if;
510
                when "11111001" =>
511
                        -- LD SP,HL
512
                        TStates <= "110";
513
                        LDSPHL <= '1';
514
                when "11000101"|"11010101"|"11100101"|"11110101" =>
515
                        -- PUSH qq
516
                        MCycles <= "011";
517
                        case to_integer(unsigned(MCycle)) is
518
                        when 1 =>
519
                                TStates <= "101";
520
                                IncDec_16 <= "1111";
521
                                Set_Addr_TO <= aSP;
522
                                if DPAIR = "11" then
523
                                        Set_BusB_To <= "0111";
524
                                else
525
                                        Set_BusB_To(2 downto 1) <= DPAIR;
526
                                        Set_BusB_To(0) <= '0';
527
                                        Set_BusB_To(3) <= '0';
528
                                end if;
529
                        when 2 =>
530
                                IncDec_16 <= "1111";
531
                                Set_Addr_To <= aSP;
532
                                if DPAIR = "11" then
533
                                        Set_BusB_To <= "1011";
534
                                else
535
                                        Set_BusB_To(2 downto 1) <= DPAIR;
536
                                        Set_BusB_To(0) <= '1';
537
                                        Set_BusB_To(3) <= '0';
538
                                end if;
539
                                Write <= '1';
540
                        when 3 =>
541
                                Write <= '1';
542
                        when others => null;
543
                        end case;
544
                when "11000001"|"11010001"|"11100001"|"11110001" =>
545
                        -- POP qq
546
                        MCycles <= "011";
547
                        case to_integer(unsigned(MCycle)) is
548
                        when 1 =>
549
                                Set_Addr_To <= aSP;
550
                        when 2 =>
551
                                IncDec_16 <= "0111";
552
                                Set_Addr_To <= aSP;
553
                                Read_To_Reg <= '1';
554
                                if DPAIR = "11" then
555
                                        Set_BusA_To(3 downto 0) <= "1011";
556
                                else
557
                                        Set_BusA_To(2 downto 1) <= DPAIR;
558
                                        Set_BusA_To(0) <= '1';
559
                                end if;
560
                        when 3 =>
561
                                IncDec_16 <= "0111";
562
                                Read_To_Reg <= '1';
563
                                if DPAIR = "11" then
564
                                        Set_BusA_To(3 downto 0) <= "0111";
565
                                else
566
                                        Set_BusA_To(2 downto 1) <= DPAIR;
567
                                        Set_BusA_To(0) <= '0';
568
                                end if;
569
                        when others => null;
570
                        end case;
571
 
572
-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP
573
                when "11101011" =>
574
                        if Mode /= 3 then
575
                                -- EX DE,HL
576
                                ExchangeDH <= '1';
577
                        end if;
578
                when "00001000" =>
579
                        if Mode = 3 then
580
                                -- LD (nn),SP
581
                                MCycles <= "101";
582
                                case to_integer(unsigned(MCycle)) is
583
                                when 2 =>
584
                                        Inc_PC <= '1';
585
                                        LDZ <= '1';
586
                                when 3 =>
587
                                        Set_Addr_To <= aZI;
588
                                        Inc_PC <= '1';
589
                                        LDW <= '1';
590
                                        Set_BusB_To <= "1000";
591
                                when 4 =>
592
                                        Inc_WZ <= '1';
593
                                        Set_Addr_To <= aZI;
594
                                        Write <= '1';
595
                                        Set_BusB_To <= "1001";
596
                                when 5 =>
597
                                        Write <= '1';
598
                                when others => null;
599
                                end case;
600
                        elsif Mode < 2 then
601
                                -- EX AF,AF'
602
                                ExchangeAF <= '1';
603
                        end if;
604
                when "11011001" =>
605
                        if Mode = 3 then
606
                                -- RETI
607
                                MCycles <= "011";
608
                                case to_integer(unsigned(MCycle)) is
609
                                when 1 =>
610
                                        Set_Addr_TO <= aSP;
611
                                when 2 =>
612
                                        IncDec_16 <= "0111";
613
                                        Set_Addr_To <= aSP;
614
                                        LDZ <= '1';
615
                                when 3 =>
616
                                        Jump <= '1';
617
                                        IncDec_16 <= "0111";
618
                                        I_RETN <= '1';
619
                                        SetEI <= '1';
620
                                when others => null;
621
                                end case;
622
                        elsif Mode < 2 then
623
                                -- EXX
624
                                ExchangeRS <= '1';
625
                        end if;
626
                when "11100011" =>
627
                        if Mode /= 3 then
628
                                -- EX (SP),HL
629
                                MCycles <= "101";
630
                                case to_integer(unsigned(MCycle)) is
631
                                when 1 =>
632
                                        Set_Addr_To <= aSP;
633
                                when 2 =>
634
                                        Read_To_Reg <= '1';
635
                                        Set_BusA_To <= "0101";
636
                                        Set_BusB_To <= "0101";
637
                                        Set_Addr_To <= aSP;
638
                                when 3 =>
639
                                        IncDec_16 <= "0111";
640
                                        Set_Addr_To <= aSP;
641
                                        TStates <= "100";
642
                                        Write <= '1';
643
                                when 4 =>
644
                                        Read_To_Reg <= '1';
645
                                        Set_BusA_To <= "0100";
646
                                        Set_BusB_To <= "0100";
647
                                        Set_Addr_To <= aSP;
648
                                when 5 =>
649
                                        IncDec_16 <= "1111";
650
                                        TStates <= "101";
651
                                        Write <= '1';
652
                                when others => null;
653
                                end case;
654
                        end if;
655
 
656
-- 8 BIT ARITHMETIC AND LOGICAL GROUP
657
                when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111"
658
                        |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111"
659
                        |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111"
660
                        |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111"
661
                        |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111"
662
                        |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111"
663
                        |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111"
664
                        |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" =>
665
                        -- ADD A,r
666
                        -- ADC A,r
667
                        -- SUB A,r
668
                        -- SBC A,r
669
                        -- AND A,r
670
                        -- OR A,r
671
                        -- XOR A,r
672
                        -- CP A,r
673
                        Set_BusB_To(2 downto 0) <= SSS;
674
                        Set_BusA_To(2 downto 0) <= "111";
675
                        Read_To_Reg <= '1';
676
                        Save_ALU <= '1';
677
                when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" =>
678
                        -- ADD A,(HL)
679
                        -- ADC A,(HL)
680
                        -- SUB A,(HL)
681
                        -- SBC A,(HL)
682
                        -- AND A,(HL)
683
                        -- OR A,(HL)
684
                        -- XOR A,(HL)
685
                        -- CP A,(HL)
686
                        MCycles <= "010";
687
                        case to_integer(unsigned(MCycle)) is
688
                        when 1 =>
689
                                Set_Addr_To <= aXY;
690
                        when 2 =>
691
                                Read_To_Reg <= '1';
692
                                Save_ALU <= '1';
693
                                Set_BusB_To(2 downto 0) <= SSS;
694
                                Set_BusA_To(2 downto 0) <= "111";
695
                        when others => null;
696
                        end case;
697
                when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" =>
698
                        -- ADD A,n
699
                        -- ADC A,n
700
                        -- SUB A,n
701
                        -- SBC A,n
702
                        -- AND A,n
703
                        -- OR A,n
704
                        -- XOR A,n
705
                        -- CP A,n
706
                        MCycles <= "010";
707
                        if MCycle = "010" then
708
                                Inc_PC <= '1';
709
                                Read_To_Reg <= '1';
710
                                Save_ALU <= '1';
711
                                Set_BusB_To(2 downto 0) <= SSS;
712
                                Set_BusA_To(2 downto 0) <= "111";
713
                        end if;
714
                when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" =>
715
                        -- INC r
716
                        Set_BusB_To <= "1010";
717
                        Set_BusA_To(2 downto 0) <= DDD;
718
                        Read_To_Reg <= '1';
719
                        Save_ALU <= '1';
720
                        PreserveC <= '1';
721
                        ALU_Op <= "0000";
722
                when "00110100" =>
723
                        -- INC (HL)
724
                        MCycles <= "011";
725
                        case to_integer(unsigned(MCycle)) is
726
                        when 1 =>
727
                                Set_Addr_To <= aXY;
728
                        when 2 =>
729
                                TStates <= "100";
730
                                Set_Addr_To <= aXY;
731
                                Read_To_Reg <= '1';
732
                                Save_ALU <= '1';
733
                                PreserveC <= '1';
734
                                ALU_Op <= "0000";
735
                                Set_BusB_To <= "1010";
736
                                Set_BusA_To(2 downto 0) <= DDD;
737
                        when 3 =>
738
                                Write <= '1';
739
                        when others => null;
740
                        end case;
741
                when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" =>
742
                        -- DEC r
743
                        Set_BusB_To <= "1010";
744
                        Set_BusA_To(2 downto 0) <= DDD;
745
                        Read_To_Reg <= '1';
746
                        Save_ALU <= '1';
747
                        PreserveC <= '1';
748
                        ALU_Op <= "0010";
749
                when "00110101" =>
750
                        -- DEC (HL)
751
                        MCycles <= "011";
752
                        case to_integer(unsigned(MCycle)) is
753
                        when 1 =>
754
                                Set_Addr_To <= aXY;
755
                        when 2 =>
756
                                TStates <= "100";
757
                                Set_Addr_To <= aXY;
758
                                ALU_Op <= "0010";
759
                                Read_To_Reg <= '1';
760
                                Save_ALU <= '1';
761
                                PreserveC <= '1';
762
                                Set_BusB_To <= "1010";
763
                                Set_BusA_To(2 downto 0) <= DDD;
764
                        when 3 =>
765
                                Write <= '1';
766
                        when others => null;
767
                        end case;
768
 
769
-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS
770
                when "00100111" =>
771
                        -- DAA
772
                        Set_BusA_To(2 downto 0) <= "111";
773
                        Read_To_Reg <= '1';
774
                        ALU_Op <= "1100";
775
                        Save_ALU <= '1';
776
                when "00101111" =>
777
                        -- CPL
778
                        I_CPL <= '1';
779
                when "00111111" =>
780
                        -- CCF
781
                        I_CCF <= '1';
782
                when "00110111" =>
783
                        -- SCF
784
                        I_SCF <= '1';
785
                when "00000000" =>
786
                        if NMICycle = '1' then
787
                                -- NMI
788
                                MCycles <= "011";
789
                                case to_integer(unsigned(MCycle)) is
790
                                when 1 =>
791
                                        TStates <= "101";
792
                                        IncDec_16 <= "1111";
793
                                        Set_Addr_To <= aSP;
794
                                        Set_BusB_To <= "1101";
795
                                when 2 =>
796
                                        TStates <= "100";
797
                                        Write <= '1';
798
                                        IncDec_16 <= "1111";
799
                                        Set_Addr_To <= aSP;
800
                                        Set_BusB_To <= "1100";
801
                                when 3 =>
802
                                        TStates <= "100";
803
                                        Write <= '1';
804
                                when others => null;
805
                                end case;
806
                        elsif IntCycle = '1' then
807
                                -- INT (IM 2)
808
                                MCycles <= "101";
809
                                case to_integer(unsigned(MCycle)) is
810
                                when 1 =>
811
                                        LDZ <= '1';
812
                                        TStates <= "101";
813
                                        IncDec_16 <= "1111";
814
                                        Set_Addr_To <= aSP;
815
                                        Set_BusB_To <= "1101";
816
                                when 2 =>
817
                                        TStates <= "100";
818
                                        Write <= '1';
819
                                        IncDec_16 <= "1111";
820
                                        Set_Addr_To <= aSP;
821
                                        Set_BusB_To <= "1100";
822
                                when 3 =>
823
                                        TStates <= "100";
824
                                        Write <= '1';
825
                                when 4 =>
826
                                        Inc_PC <= '1';
827
                                        LDZ <= '1';
828
                                when 5 =>
829
                                        Jump <= '1';
830
                                when others => null;
831
                                end case;
832
                        else
833
                                -- NOP
834
                        end if;
835
                when "01110110" =>
836
                        -- HALT
837
                        Halt <= '1';
838
                when "11110011" =>
839
                        -- DI
840
                        SetDI <= '1';
841
                when "11111011" =>
842
                        -- EI
843
                        SetEI <= '1';
844
 
845
-- 16 BIT ARITHMETIC GROUP
846
                when "00001001"|"00011001"|"00101001"|"00111001" =>
847
                        -- ADD HL,ss
848
                        MCycles <= "011";
849
                        case to_integer(unsigned(MCycle)) is
850
                        when 2 =>
851
                                NoRead <= '1';
852
                                ALU_Op <= "0000";
853
                                Read_To_Reg <= '1';
854
                                Save_ALU <= '1';
855
                                Set_BusA_To(2 downto 0) <= "101";
856
                                case to_integer(unsigned(IR(5 downto 4))) is
857
                                when 0|1|2 =>
858
                                        Set_BusB_To(2 downto 1) <= IR(5 downto 4);
859
                                        Set_BusB_To(0) <= '1';
860
                                when others =>
861
                                        Set_BusB_To <= "1000";
862
                                end case;
863
                                TStates <= "100";
864
                                Arith16 <= '1';
865
                        when 3 =>
866
                                NoRead <= '1';
867
                                Read_To_Reg <= '1';
868
                                Save_ALU <= '1';
869
                                ALU_Op <= "0001";
870
                                Set_BusA_To(2 downto 0) <= "100";
871
                                case to_integer(unsigned(IR(5 downto 4))) is
872
                                when 0|1|2 =>
873
                                        Set_BusB_To(2 downto 1) <= IR(5 downto 4);
874
                                when others =>
875
                                        Set_BusB_To <= "1001";
876
                                end case;
877
                                Arith16 <= '1';
878
                        when others =>
879
                        end case;
880
                when "00000011"|"00010011"|"00100011"|"00110011" =>
881
                        -- INC ss
882
                        TStates <= "110";
883
                        IncDec_16(3 downto 2) <= "01";
884
                        IncDec_16(1 downto 0) <= DPair;
885
                when "00001011"|"00011011"|"00101011"|"00111011" =>
886
                        -- DEC ss
887
                        TStates <= "110";
888
                        IncDec_16(3 downto 2) <= "11";
889
                        IncDec_16(1 downto 0) <= DPair;
890
 
891
-- ROTATE AND SHIFT GROUP
892
                when "00000111"
893
                        -- RLCA
894
                        |"00010111"
895
                        -- RLA
896
                        |"00001111"
897
                        -- RRCA
898
                        |"00011111" =>
899
                        -- RRA
900
                        Set_BusA_To(2 downto 0) <= "111";
901
                        ALU_Op <= "1000";
902
                        Read_To_Reg <= '1';
903
                        Save_ALU <= '1';
904
 
905
-- JUMP GROUP
906
                when "11000011" =>
907
                        -- JP nn
908
                        MCycles <= "011";
909
                        case to_integer(unsigned(MCycle)) is
910
                        when 2 =>
911
                                Inc_PC <= '1';
912
                                LDZ <= '1';
913
                        when 3 =>
914
                                Inc_PC <= '1';
915
                                Jump <= '1';
916
                        when others => null;
917
                        end case;
918
                when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" =>
919
                        if IR(5) = '1' and Mode = 3 then
920
                                case IRB(4 downto 3) is
921
                                when "00" =>
922
                                        -- LD ($FF00+C),A
923
                                        MCycles <= "010";
924
                                        case to_integer(unsigned(MCycle)) is
925
                                        when 1 =>
926
                                                Set_Addr_To <= aBC;
927
                                                Set_BusB_To     <= "0111";
928
                                        when 2 =>
929
                                                Write <= '1';
930
                                                IORQ <= '1';
931
                                        when others =>
932
                                        end case;
933
                                when "01" =>
934
                                        -- LD (nn),A
935
                                        MCycles <= "100";
936
                                        case to_integer(unsigned(MCycle)) is
937
                                        when 2 =>
938
                                                Inc_PC <= '1';
939
                                                LDZ <= '1';
940
                                        when 3 =>
941
                                                Set_Addr_To <= aZI;
942
                                                Inc_PC <= '1';
943
                                                Set_BusB_To <= "0111";
944
                                        when 4 =>
945
                                                Write <= '1';
946
                                        when others => null;
947
                                        end case;
948
                                when "10" =>
949
                                        -- LD A,($FF00+C)
950
                                        MCycles <= "010";
951
                                        case to_integer(unsigned(MCycle)) is
952
                                        when 1 =>
953
                                                Set_Addr_To <= aBC;
954
                                        when 2 =>
955
                                                Read_To_Acc <= '1';
956
                                                IORQ <= '1';
957
                                        when others =>
958
                                        end case;
959
                                when "11" =>
960
                                        -- LD A,(nn)
961
                                        MCycles <= "100";
962
                                        case to_integer(unsigned(MCycle)) is
963
                                        when 2 =>
964
                                                Inc_PC <= '1';
965
                                                LDZ <= '1';
966
                                        when 3 =>
967
                                                Set_Addr_To <= aZI;
968
                                                Inc_PC <= '1';
969
                                        when 4 =>
970
                                                Read_To_Acc <= '1';
971
                                        when others => null;
972
                                        end case;
973
                                end case;
974
                        else
975
                                -- JP cc,nn
976
                                MCycles <= "011";
977
                                case to_integer(unsigned(MCycle)) is
978
                                when 2 =>
979
                                        Inc_PC <= '1';
980
                                        LDZ <= '1';
981
                                when 3 =>
982
                                        Inc_PC <= '1';
983
                                        if is_cc_true(F, to_bitvector(IR(5 downto 3))) then
984
                                                Jump <= '1';
985
                                        end if;
986
                                when others => null;
987
                                end case;
988
                        end if;
989
                when "00011000" =>
990
                        if Mode /= 2 then
991
                                -- JR e
992
                                MCycles <= "011";
993
                                case to_integer(unsigned(MCycle)) is
994
                                when 2 =>
995
                                        Inc_PC <= '1';
996
                                when 3 =>
997
                                        NoRead <= '1';
998
                                        JumpE <= '1';
999
                                        TStates <= "101";
1000
                                when others => null;
1001
                                end case;
1002
                        end if;
1003
                when "00111000" =>
1004
                        if Mode /= 2 then
1005
                                -- JR C,e
1006
                                MCycles <= "011";
1007
                                case to_integer(unsigned(MCycle)) is
1008
                                when 2 =>
1009
                                        Inc_PC <= '1';
1010
                                        if F(Flag_C) = '0' then
1011
                                                MCycles <= "010";
1012
                                        end if;
1013
                                when 3 =>
1014
                                        NoRead <= '1';
1015
                                        JumpE <= '1';
1016
                                        TStates <= "101";
1017
                                when others => null;
1018
                                end case;
1019
                        end if;
1020
                when "00110000" =>
1021
                        if Mode /= 2 then
1022
                                -- JR NC,e
1023
                                MCycles <= "011";
1024
                                case to_integer(unsigned(MCycle)) is
1025
                                when 2 =>
1026
                                        Inc_PC <= '1';
1027
                                        if F(Flag_C) = '1' then
1028
                                                MCycles <= "010";
1029
                                        end if;
1030
                                when 3 =>
1031
                                        NoRead <= '1';
1032
                                        JumpE <= '1';
1033
                                        TStates <= "101";
1034
                                when others => null;
1035
                                end case;
1036
                        end if;
1037
                when "00101000" =>
1038
                        if Mode /= 2 then
1039
                                -- JR Z,e
1040
                                MCycles <= "011";
1041
                                case to_integer(unsigned(MCycle)) is
1042
                                when 2 =>
1043
                                        Inc_PC <= '1';
1044
                                        if F(Flag_Z) = '0' then
1045
                                                MCycles <= "010";
1046
                                        end if;
1047
                                when 3 =>
1048
                                        NoRead <= '1';
1049
                                        JumpE <= '1';
1050
                                        TStates <= "101";
1051
                                when others => null;
1052
                                end case;
1053
                        end if;
1054
                when "00100000" =>
1055
                        if Mode /= 2 then
1056
                                -- JR NZ,e
1057
                                MCycles <= "011";
1058
                                case to_integer(unsigned(MCycle)) is
1059
                                when 2 =>
1060
                                        Inc_PC <= '1';
1061
                                        if F(Flag_Z) = '1' then
1062
                                                MCycles <= "010";
1063
                                        end if;
1064
                                when 3 =>
1065
                                        NoRead <= '1';
1066
                                        JumpE <= '1';
1067
                                        TStates <= "101";
1068
                                when others => null;
1069
                                end case;
1070
                        end if;
1071
                when "11101001" =>
1072
                        -- JP (HL)
1073
                        JumpXY <= '1';
1074
                when "00010000" =>
1075
                        if Mode = 3 then
1076
                                I_DJNZ <= '1';
1077
                        elsif Mode < 2 then
1078
                                -- DJNZ,e
1079
                                MCycles <= "011";
1080
                                case to_integer(unsigned(MCycle)) is
1081
                                when 1 =>
1082
                                        TStates <= "101";
1083
                                        I_DJNZ <= '1';
1084
                                        Set_BusB_To <= "1010";
1085
                                        Set_BusA_To(2 downto 0) <= "000";
1086
                                        Read_To_Reg <= '1';
1087
                                        Save_ALU <= '1';
1088
                                        ALU_Op <= "0010";
1089
                                when 2 =>
1090
                                        I_DJNZ <= '1';
1091
                                        Inc_PC <= '1';
1092
                                when 3 =>
1093
                                        NoRead <= '1';
1094
                                        JumpE <= '1';
1095
                                        TStates <= "101";
1096
                                when others => null;
1097
                                end case;
1098
                        end if;
1099
 
1100
-- CALL AND RETURN GROUP
1101
                when "11001101" =>
1102
                        -- CALL nn
1103
                        MCycles <= "101";
1104
                        case to_integer(unsigned(MCycle)) is
1105
                        when 2 =>
1106
                                Inc_PC <= '1';
1107
                                LDZ <= '1';
1108
                        when 3 =>
1109
                                IncDec_16 <= "1111";
1110
                                Inc_PC <= '1';
1111
                                TStates <= "100";
1112
                                Set_Addr_To <= aSP;
1113
                                LDW <= '1';
1114
                                Set_BusB_To <= "1101";
1115
                        when 4 =>
1116
                                Write <= '1';
1117
                                IncDec_16 <= "1111";
1118
                                Set_Addr_To <= aSP;
1119
                                Set_BusB_To <= "1100";
1120
                        when 5 =>
1121
                                Write <= '1';
1122
                                Call <= '1';
1123
                        when others => null;
1124
                        end case;
1125
                when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" =>
1126
                        if IR(5) = '0' or Mode /= 3 then
1127
                                -- CALL cc,nn
1128
                                MCycles <= "101";
1129
                                case to_integer(unsigned(MCycle)) is
1130
                                when 2 =>
1131
                                        Inc_PC <= '1';
1132
                                        LDZ <= '1';
1133
                                when 3 =>
1134
                                        Inc_PC <= '1';
1135
                                        LDW <= '1';
1136
                                        if is_cc_true(F, to_bitvector(IR(5 downto 3))) then
1137
                                                IncDec_16 <= "1111";
1138
                                                Set_Addr_TO <= aSP;
1139
                                                TStates <= "100";
1140
                                                Set_BusB_To <= "1101";
1141
                                        else
1142
                                                MCycles <= "011";
1143
                                        end if;
1144
                                when 4 =>
1145
                                        Write <= '1';
1146
                                        IncDec_16 <= "1111";
1147
                                        Set_Addr_To <= aSP;
1148
                                        Set_BusB_To <= "1100";
1149
                                when 5 =>
1150
                                        Write <= '1';
1151
                                        Call <= '1';
1152
                                when others => null;
1153
                                end case;
1154
                        end if;
1155
                when "11001001" =>
1156
                        -- RET
1157
                        MCycles <= "011";
1158
                        case to_integer(unsigned(MCycle)) is
1159
                        when 1 =>
1160
                                TStates <= "101";
1161
                                Set_Addr_TO <= aSP;
1162
                        when 2 =>
1163
                                IncDec_16 <= "0111";
1164
                                Set_Addr_To <= aSP;
1165
                                LDZ <= '1';
1166
                        when 3 =>
1167
                                Jump <= '1';
1168
                                IncDec_16 <= "0111";
1169
                        when others => null;
1170
                        end case;
1171
                when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" =>
1172
                        if IR(5) = '1' and Mode = 3 then
1173
                                case IRB(4 downto 3) is
1174
                                when "00" =>
1175
                                        -- LD ($FF00+nn),A
1176
                                        MCycles <= "011";
1177
                                        case to_integer(unsigned(MCycle)) is
1178
                                        when 2 =>
1179
                                                Inc_PC <= '1';
1180
                                                Set_Addr_To <= aIOA;
1181
                                                Set_BusB_To     <= "0111";
1182
                                        when 3 =>
1183
                                                Write <= '1';
1184
                                        when others => null;
1185
                                        end case;
1186
                                when "01" =>
1187
                                        -- ADD SP,n
1188
                                        MCycles <= "011";
1189
                                        case to_integer(unsigned(MCycle)) is
1190
                                        when 2 =>
1191
                                                ALU_Op <= "0000";
1192
                                                Inc_PC <= '1';
1193
                                                Read_To_Reg <= '1';
1194
                                                Save_ALU <= '1';
1195
                                                Set_BusA_To <= "1000";
1196
                                                Set_BusB_To <= "0110";
1197
                                        when 3 =>
1198
                                                NoRead <= '1';
1199
                                                Read_To_Reg <= '1';
1200
                                                Save_ALU <= '1';
1201
                                                ALU_Op <= "0001";
1202
                                                Set_BusA_To <= "1001";
1203
                                                Set_BusB_To <= "1110";  -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!!
1204
                                        when others =>
1205
                                        end case;
1206
                                when "10" =>
1207
                                        -- LD A,($FF00+nn)
1208
                                        MCycles <= "011";
1209
                                        case to_integer(unsigned(MCycle)) is
1210
                                        when 2 =>
1211
                                                Inc_PC <= '1';
1212
                                                Set_Addr_To <= aIOA;
1213
                                        when 3 =>
1214
                                                Read_To_Acc <= '1';
1215
                                        when others => null;
1216
                                        end case;
1217
                                when "11" =>
1218
                                        -- LD HL,SP+n   -- Not correct !!!!!!!!!!!!!!!!!!!
1219
                                        MCycles <= "101";
1220
                                        case to_integer(unsigned(MCycle)) is
1221
                                        when 2 =>
1222
                                                Inc_PC <= '1';
1223
                                                LDZ <= '1';
1224
                                        when 3 =>
1225
                                                Set_Addr_To <= aZI;
1226
                                                Inc_PC <= '1';
1227
                                                LDW <= '1';
1228
                                        when 4 =>
1229
                                                Set_BusA_To(2 downto 0) <= "101"; -- L
1230
                                                Read_To_Reg <= '1';
1231
                                                Inc_WZ <= '1';
1232
                                                Set_Addr_To <= aZI;
1233
                                        when 5 =>
1234
                                                Set_BusA_To(2 downto 0) <= "100"; -- H
1235
                                                Read_To_Reg <= '1';
1236
                                        when others => null;
1237
                                        end case;
1238
                                end case;
1239
                        else
1240
                                -- RET cc
1241
                                MCycles <= "011";
1242
                                case to_integer(unsigned(MCycle)) is
1243
                                when 1 =>
1244
                                        if is_cc_true(F, to_bitvector(IR(5 downto 3))) then
1245
                                                Set_Addr_TO <= aSP;
1246
                                        else
1247
                                                MCycles <= "001";
1248
                                        end if;
1249
                                        TStates <= "101";
1250
                                when 2 =>
1251
                                        IncDec_16 <= "0111";
1252
                                        Set_Addr_To <= aSP;
1253
                                        LDZ <= '1';
1254
                                when 3 =>
1255
                                        Jump <= '1';
1256
                                        IncDec_16 <= "0111";
1257
                                when others => null;
1258
                                end case;
1259
                        end if;
1260
                when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" =>
1261
                        -- RST p
1262
                        MCycles <= "011";
1263
                        case to_integer(unsigned(MCycle)) is
1264
                        when 1 =>
1265
                                TStates <= "101";
1266
                                IncDec_16 <= "1111";
1267
                                Set_Addr_To <= aSP;
1268
                                Set_BusB_To <= "1101";
1269
                        when 2 =>
1270
                                Write <= '1';
1271
                                IncDec_16 <= "1111";
1272
                                Set_Addr_To <= aSP;
1273
                                Set_BusB_To <= "1100";
1274
                        when 3 =>
1275
                                Write <= '1';
1276
                                RstP <= '1';
1277
                        when others => null;
1278
                        end case;
1279
 
1280
-- INPUT AND OUTPUT GROUP
1281
                when "11011011" =>
1282
                        if Mode /= 3 then
1283
                                -- IN A,(n)
1284
                                MCycles <= "011";
1285
                                case to_integer(unsigned(MCycle)) is
1286
                                when 2 =>
1287
                                        Inc_PC <= '1';
1288
                                        Set_Addr_To <= aIOA;
1289
                                when 3 =>
1290
                                        Read_To_Acc <= '1';
1291
                                        IORQ <= '1';
1292
                                when others => null;
1293
                                end case;
1294
                        end if;
1295
                when "11010011" =>
1296
                        if Mode /= 3 then
1297
                                -- OUT (n),A
1298
                                MCycles <= "011";
1299
                                case to_integer(unsigned(MCycle)) is
1300
                                when 2 =>
1301
                                        Inc_PC <= '1';
1302
                                        Set_Addr_To <= aIOA;
1303
                                        Set_BusB_To     <= "0111";
1304
                                when 3 =>
1305
                                        Write <= '1';
1306
                                        IORQ <= '1';
1307
                                when others => null;
1308
                                end case;
1309
                        end if;
1310
 
1311
------------------------------------------------------------------------------
1312
------------------------------------------------------------------------------
1313
-- MULTIBYTE INSTRUCTIONS
1314
------------------------------------------------------------------------------
1315
------------------------------------------------------------------------------
1316
 
1317
                when "11001011" =>
1318
                        if Mode /= 2 then
1319
                                Prefix <= "01";
1320
                        end if;
1321
 
1322
                when "11101101" =>
1323
                        if Mode < 2 then
1324
                                Prefix <= "10";
1325
                        end if;
1326
 
1327
                when "11011101"|"11111101" =>
1328
                        if Mode < 2 then
1329
                                Prefix <= "11";
1330
                        end if;
1331
 
1332
                end case;
1333
 
1334
                when "01" =>
1335
 
1336
------------------------------------------------------------------------------
1337
--
1338
--      CB prefixed instructions
1339
--
1340
------------------------------------------------------------------------------
1341
 
1342
                        Set_BusA_To(2 downto 0) <= IR(2 downto 0);
1343
                        Set_BusB_To(2 downto 0) <= IR(2 downto 0);
1344
 
1345
                        case IRB is
1346
                        when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111"
1347
                                |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111"
1348
                                |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111"
1349
                                |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111"
1350
                                |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111"
1351
                                |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111"
1352
                                |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111"
1353
                                |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" =>
1354
                                -- RLC r
1355
                                -- RL r
1356
                                -- RRC r
1357
                                -- RR r
1358
                                -- SLA r
1359
                                -- SRA r
1360
                                -- SRL r
1361
                                -- SLL r (Undocumented) / SWAP r
1362
                                if MCycle = "001" then
1363
                                        ALU_Op <= "1000";
1364
                                        Read_To_Reg <= '1';
1365
                                        Save_ALU <= '1';
1366
                                end if;
1367
                        when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" =>
1368
                                -- RLC (HL)
1369
                                -- RL (HL)
1370
                                -- RRC (HL)
1371
                                -- RR (HL)
1372
                                -- SRA (HL)
1373
                                -- SRL (HL)
1374
                                -- SLA (HL)
1375
                                -- SLL (HL) (Undocumented) / SWAP (HL)
1376
                                MCycles <= "011";
1377
                                case to_integer(unsigned(MCycle)) is
1378
                                when 1 | 7 =>
1379
                                        Set_Addr_To <= aXY;
1380
                                when 2 =>
1381
                                        ALU_Op <= "1000";
1382
                                        Read_To_Reg <= '1';
1383
                                        Save_ALU <= '1';
1384
                                        Set_Addr_To <= aXY;
1385
                                        TStates <= "100";
1386
                                when 3 =>
1387
                                        Write <= '1';
1388
                                when others =>
1389
                                end case;
1390
                        when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111"
1391
                                |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111"
1392
                                |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111"
1393
                                |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111"
1394
                                |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111"
1395
                                |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111"
1396
                                |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111"
1397
                                |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" =>
1398
                                -- BIT b,r
1399
                                if MCycle = "001" then
1400
                                        Set_BusB_To(2 downto 0) <= IR(2 downto 0);
1401
                                        ALU_Op <= "1001";
1402
                                end if;
1403
                        when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" =>
1404
                                -- BIT b,(HL)
1405
                                MCycles <= "010";
1406
                                case to_integer(unsigned(MCycle)) is
1407
                                when 1 | 7 =>
1408
                                        Set_Addr_To <= aXY;
1409
                                when 2 =>
1410
                                        ALU_Op <= "1001";
1411
                                        TStates <= "100";
1412
                                when others =>
1413
                                end case;
1414
                        when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111"
1415
                                |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111"
1416
                                |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111"
1417
                                |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111"
1418
                                |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111"
1419
                                |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111"
1420
                                |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111"
1421
                                |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" =>
1422
                                -- SET b,r
1423
                                if MCycle = "001" then
1424
                                        ALU_Op <= "1010";
1425
                                        Read_To_Reg <= '1';
1426
                                        Save_ALU <= '1';
1427
                                end if;
1428
                        when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" =>
1429
                                -- SET b,(HL)
1430
                                MCycles <= "011";
1431
                                case to_integer(unsigned(MCycle)) is
1432
                                when 1 | 7 =>
1433
                                        Set_Addr_To <= aXY;
1434
                                when 2 =>
1435
                                        ALU_Op <= "1010";
1436
                                        Read_To_Reg <= '1';
1437
                                        Save_ALU <= '1';
1438
                                        Set_Addr_To <= aXY;
1439
                                        TStates <= "100";
1440
                                when 3 =>
1441
                                        Write <= '1';
1442
                                when others =>
1443
                                end case;
1444
                        when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111"
1445
                                |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111"
1446
                                |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111"
1447
                                |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111"
1448
                                |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111"
1449
                                |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111"
1450
                                |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111"
1451
                                |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" =>
1452
                                -- RES b,r
1453
                                if MCycle = "001" then
1454
                                        ALU_Op <= "1011";
1455
                                        Read_To_Reg <= '1';
1456
                                        Save_ALU <= '1';
1457
                                end if;
1458
                        when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" =>
1459
                                -- RES b,(HL)
1460
                                MCycles <= "011";
1461
                                case to_integer(unsigned(MCycle)) is
1462
                                when 1 | 7 =>
1463
                                        Set_Addr_To <= aXY;
1464
                                when 2 =>
1465
                                        ALU_Op <= "1011";
1466
                                        Read_To_Reg <= '1';
1467
                                        Save_ALU <= '1';
1468
                                        Set_Addr_To <= aXY;
1469
                                        TStates <= "100";
1470
                                when 3 =>
1471
                                        Write <= '1';
1472
                                when others =>
1473
                                end case;
1474
                        end case;
1475
 
1476
                when others =>
1477
 
1478
------------------------------------------------------------------------------
1479
--
1480
--      ED prefixed instructions
1481
--
1482
------------------------------------------------------------------------------
1483
 
1484
                        case IRB is
1485
                        when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111"
1486
                                |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111"
1487
                                |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111"
1488
                                |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111"
1489
                                |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111"
1490
                                |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111"
1491
                                |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111"
1492
                                |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111"
1493
 
1494
 
1495
                                |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111"
1496
                                |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111"
1497
                                |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111"
1498
                                |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111"
1499
                                |                                            "10100100"|"10100101"|"10100110"|"10100111"
1500
                                |                                            "10101100"|"10101101"|"10101110"|"10101111"
1501
                                |                                            "10110100"|"10110101"|"10110110"|"10110111"
1502
                                |                                            "10111100"|"10111101"|"10111110"|"10111111"
1503
                                |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111"
1504
                                |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111"
1505
                                |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111"
1506
                                |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111"
1507
                                |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111"
1508
                                |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111"
1509
                                |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111"
1510
                                |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" =>
1511
                                null; -- NOP, undocumented
1512
                        when "01111110"|"01111111" =>
1513
                                -- NOP, undocumented
1514
                                null;
1515
-- 8 BIT LOAD GROUP
1516
                        when "01010111" =>
1517
                                -- LD A,I
1518
                                Special_LD <= "100";
1519
                                TStates <= "101";
1520
                        when "01011111" =>
1521
                                -- LD A,R
1522
                                Special_LD <= "101";
1523
                                TStates <= "101";
1524
                        when "01000111" =>
1525
                                -- LD I,A
1526
                                Special_LD <= "110";
1527
                                TStates <= "101";
1528
                        when "01001111" =>
1529
                                -- LD R,A
1530
                                Special_LD <= "111";
1531
                                TStates <= "101";
1532
-- 16 BIT LOAD GROUP
1533
                        when "01001011"|"01011011"|"01101011"|"01111011" =>
1534
                                -- LD dd,(nn)
1535
                                MCycles <= "101";
1536
                                case to_integer(unsigned(MCycle)) is
1537
                                when 2 =>
1538
                                        Inc_PC <= '1';
1539
                                        LDZ <= '1';
1540
                                when 3 =>
1541
                                        Set_Addr_To <= aZI;
1542
                                        Inc_PC <= '1';
1543
                                        LDW <= '1';
1544
                                when 4 =>
1545
                                        Read_To_Reg <= '1';
1546
                                        if IR(5 downto 4) = "11" then
1547
                                                Set_BusA_To <= "1000";
1548
                                        else
1549
                                                Set_BusA_To(2 downto 1) <= IR(5 downto 4);
1550
                                                Set_BusA_To(0) <= '1';
1551
                                        end if;
1552
                                        Inc_WZ <= '1';
1553
                                        Set_Addr_To <= aZI;
1554
                                when 5 =>
1555
                                        Read_To_Reg <= '1';
1556
                                        if IR(5 downto 4) = "11" then
1557
                                                Set_BusA_To <= "1001";
1558
                                        else
1559
                                                Set_BusA_To(2 downto 1) <= IR(5 downto 4);
1560
                                                Set_BusA_To(0) <= '0';
1561
                                        end if;
1562
                                when others => null;
1563
                                end case;
1564
                        when "01000011"|"01010011"|"01100011"|"01110011" =>
1565
                                -- LD (nn),dd
1566
                                MCycles <= "101";
1567
                                case to_integer(unsigned(MCycle)) is
1568
                                when 2 =>
1569
                                        Inc_PC <= '1';
1570
                                        LDZ <= '1';
1571
                                when 3 =>
1572
                                        Set_Addr_To <= aZI;
1573
                                        Inc_PC <= '1';
1574
                                        LDW <= '1';
1575
                                        if IR(5 downto 4) = "11" then
1576
                                                Set_BusB_To <= "1000";
1577
                                        else
1578
                                                Set_BusB_To(2 downto 1) <= IR(5 downto 4);
1579
                                                Set_BusB_To(0) <= '1';
1580
                                                Set_BusB_To(3) <= '0';
1581
                                        end if;
1582
                                when 4 =>
1583
                                        Inc_WZ <= '1';
1584
                                        Set_Addr_To <= aZI;
1585
                                        Write <= '1';
1586
                                        if IR(5 downto 4) = "11" then
1587
                                                Set_BusB_To <= "1001";
1588
                                        else
1589
                                                Set_BusB_To(2 downto 1) <= IR(5 downto 4);
1590
                                                Set_BusB_To(0) <= '0';
1591
                                                Set_BusB_To(3) <= '0';
1592
                                        end if;
1593
                                when 5 =>
1594
                                        Write <= '1';
1595
                                when others => null;
1596
                                end case;
1597
                        when "10100000" | "10101000" | "10110000" | "10111000" =>
1598
                                -- LDI, LDD, LDIR, LDDR
1599
                                MCycles <= "100";
1600
                                case to_integer(unsigned(MCycle)) is
1601
                                when 1 =>
1602
                                        Set_Addr_To <= aXY;
1603
                                        IncDec_16 <= "1100"; -- BC
1604
                                when 2 =>
1605
                                        Set_BusB_To <= "0110";
1606
                                        Set_BusA_To(2 downto 0) <= "111";
1607
                                        ALU_Op <= "0000";
1608
                                        Set_Addr_To <= aDE;
1609
                                        if IR(3) = '0' then
1610
                                                IncDec_16 <= "0110"; -- IX
1611
                                        else
1612
                                                IncDec_16 <= "1110";
1613
                                        end if;
1614
                                when 3 =>
1615
                                        I_BT <= '1';
1616
                                        TStates <= "101";
1617
                                        Write <= '1';
1618
                                        if IR(3) = '0' then
1619
                                                IncDec_16 <= "0101"; -- DE
1620
                                        else
1621
                                                IncDec_16 <= "1101";
1622
                                        end if;
1623
                                when 4 =>
1624
                                        NoRead <= '1';
1625
                                        TStates <= "101";
1626
                                when others => null;
1627
                                end case;
1628
                        when "10100001" | "10101001" | "10110001" | "10111001" =>
1629
                                -- CPI, CPD, CPIR, CPDR
1630
                                MCycles <= "100";
1631
                                case to_integer(unsigned(MCycle)) is
1632
                                when 1 =>
1633
                                        Set_Addr_To <= aXY;
1634
                                        IncDec_16 <= "1100"; -- BC
1635
                                when 2 =>
1636
                                        Set_BusB_To <= "0110";
1637
                                        Set_BusA_To(2 downto 0) <= "111";
1638
                                        ALU_Op <= "0111";
1639
                                        Save_ALU <= '1';
1640
                                        PreserveC <= '1';
1641
                                        if IR(3) = '0' then
1642
                                                IncDec_16 <= "0110";
1643
                                        else
1644
                                                IncDec_16 <= "1110";
1645
                                        end if;
1646
                                when 3 =>
1647
                                        NoRead <= '1';
1648
                                        I_BC <= '1';
1649
                                        TStates <= "101";
1650
                                when 4 =>
1651
                                        NoRead <= '1';
1652
                                        TStates <= "101";
1653
                                when others => null;
1654
                                end case;
1655
                        when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" =>
1656
                                -- NEG
1657
                                Alu_OP <= "0010";
1658
                                Set_BusB_To <= "0111";
1659
                                Set_BusA_To <= "1010";
1660
                                Read_To_Acc <= '1';
1661
                                Save_ALU <= '1';
1662
                        when "01000110"|"01001110"|"01100110"|"01101110" =>
1663
                                -- IM 0
1664
                                IMode <= "00";
1665
                        when "01010110"|"01110110" =>
1666
                                -- IM 1
1667
                                IMode <= "01";
1668
                        when "01011110"|"01110111" =>
1669
                                -- IM 2
1670
                                IMode <= "10";
1671
-- 16 bit arithmetic
1672
                        when "01001010"|"01011010"|"01101010"|"01111010" =>
1673
                                -- ADC HL,ss
1674
                                MCycles <= "011";
1675
                                case to_integer(unsigned(MCycle)) is
1676
                                when 2 =>
1677
                                        NoRead <= '1';
1678
                                        ALU_Op <= "0001";
1679
                                        Read_To_Reg <= '1';
1680
                                        Save_ALU <= '1';
1681
                                        Set_BusA_To(2 downto 0) <= "101";
1682
                                        case to_integer(unsigned(IR(5 downto 4))) is
1683
                                        when 0|1|2 =>
1684
                                                Set_BusB_To(2 downto 1) <= IR(5 downto 4);
1685
                                        Set_BusB_To(0) <= '1';
1686
                                                when others =>
1687
                                                Set_BusB_To <= "1000";
1688
                                        end case;
1689
                                        TStates <= "100";
1690
                                when 3 =>
1691
                                        NoRead <= '1';
1692
                                        Read_To_Reg <= '1';
1693
                                        Save_ALU <= '1';
1694
                                        ALU_Op <= "0001";
1695
                                        Set_BusA_To(2 downto 0) <= "100";
1696
                                        case to_integer(unsigned(IR(5 downto 4))) is
1697
                                        when 0|1|2 =>
1698
                                                Set_BusB_To(2 downto 1) <= IR(5 downto 4);
1699
                                                Set_BusB_To(0) <= '0';
1700
                                        when others =>
1701
                                                Set_BusB_To <= "1001";
1702
                                        end case;
1703
                                when others =>
1704
                                end case;
1705
                        when "01000010"|"01010010"|"01100010"|"01110010" =>
1706
                                -- SBC HL,ss
1707
                                MCycles <= "011";
1708
                                case to_integer(unsigned(MCycle)) is
1709
                                when 2 =>
1710
                                        NoRead <= '1';
1711
                                        ALU_Op <= "0011";
1712
                                        Read_To_Reg <= '1';
1713
                                        Save_ALU <= '1';
1714
                                        Set_BusA_To(2 downto 0) <= "101";
1715
                                        case to_integer(unsigned(IR(5 downto 4))) is
1716
                                        when 0|1|2 =>
1717
                                                Set_BusB_To(2 downto 1) <= IR(5 downto 4);
1718
                                                Set_BusB_To(0) <= '1';
1719
                                        when others =>
1720
                                                Set_BusB_To <= "1000";
1721
                                        end case;
1722
                                        TStates <= "100";
1723
                                when 3 =>
1724
                                        NoRead <= '1';
1725
                                        ALU_Op <= "0011";
1726
                                        Read_To_Reg <= '1';
1727
                                        Save_ALU <= '1';
1728
                                        Set_BusA_To(2 downto 0) <= "100";
1729
                                        case to_integer(unsigned(IR(5 downto 4))) is
1730
                                        when 0|1|2 =>
1731
                                                Set_BusB_To(2 downto 1) <= IR(5 downto 4);
1732
                                        when others =>
1733
                                                        Set_BusB_To <= "1001";
1734
                                        end case;
1735
                                when others =>
1736
                                end case;
1737
                        when "01101111" =>
1738
                                -- RLD
1739
                                MCycles <= "100";
1740
                                case to_integer(unsigned(MCycle)) is
1741
                                when 2 =>
1742
                                        NoRead <= '1';
1743
                                        Set_Addr_To <= aXY;
1744
                                when 3 =>
1745
                                        Read_To_Reg <= '1';
1746
                                        Set_BusB_To(2 downto 0) <= "110";
1747
                                        Set_BusA_To(2 downto 0) <= "111";
1748
                                        ALU_Op <= "1101";
1749
                                        TStates <= "100";
1750
                                        Set_Addr_To <= aXY;
1751
                                        Save_ALU <= '1';
1752
                                when 4 =>
1753
                                        I_RLD <= '1';
1754
                                        Write <= '1';
1755
                                when others =>
1756
                                end case;
1757
                        when "01100111" =>
1758
                                -- RRD
1759
                                MCycles <= "100";
1760
                                case to_integer(unsigned(MCycle)) is
1761
                                when 2 =>
1762
                                        Set_Addr_To <= aXY;
1763
                                when 3 =>
1764
                                        Read_To_Reg <= '1';
1765
                                        Set_BusB_To(2 downto 0) <= "110";
1766
                                        Set_BusA_To(2 downto 0) <= "111";
1767
                                        ALU_Op <= "1110";
1768
                                        TStates <= "100";
1769
                                        Set_Addr_To <= aXY;
1770
                                        Save_ALU <= '1';
1771
                                when 4 =>
1772
                                        I_RRD <= '1';
1773
                                        Write <= '1';
1774
                                when others =>
1775
                                end case;
1776
                        when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" =>
1777
                                -- RETI, RETN
1778
                                MCycles <= "011";
1779
                                case to_integer(unsigned(MCycle)) is
1780
                                when 1 =>
1781
                                        Set_Addr_TO <= aSP;
1782
                                when 2 =>
1783
                                        IncDec_16 <= "0111";
1784
                                        Set_Addr_To <= aSP;
1785
                                        LDZ <= '1';
1786
                                when 3 =>
1787
                                        Jump <= '1';
1788
                                        IncDec_16 <= "0111";
1789
                                        I_RETN <= '1';
1790
                                when others => null;
1791
                                end case;
1792
                        when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" =>
1793
                                -- IN r,(C)
1794
                                MCycles <= "010";
1795
                                case to_integer(unsigned(MCycle)) is
1796
                                when 1 =>
1797
                                        Set_Addr_To <= aBC;
1798
                                when 2 =>
1799
                                        IORQ <= '1';
1800
                                        if IR(5 downto 3) /= "110" then
1801
                                                Read_To_Reg <= '1';
1802
                                                Set_BusA_To(2 downto 0) <= IR(5 downto 3);
1803
                                        end if;
1804
                                        I_INRC <= '1';
1805
                                when others =>
1806
                                end case;
1807
                        when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" =>
1808
                                -- OUT (C),r
1809
                                -- OUT (C),0
1810
                                MCycles <= "010";
1811
                                case to_integer(unsigned(MCycle)) is
1812
                                when 1 =>
1813
                                        Set_Addr_To <= aBC;
1814
                                        Set_BusB_To(2 downto 0)  <= IR(5 downto 3);
1815
                                        if IR(5 downto 3) = "110" then
1816
                                                Set_BusB_To(3) <= '1';
1817
                                        end if;
1818
                                when 2 =>
1819
                                        Write <= '1';
1820
                                        IORQ <= '1';
1821
                                when others =>
1822
                                end case;
1823
                        when "10100010" | "10101010" | "10110010" | "10111010" =>
1824
                                -- INI, IND, INIR, INDR
1825
                                MCycles <= "100";
1826
                                case to_integer(unsigned(MCycle)) is
1827
                                when 1 =>
1828
                                        Set_Addr_To <= aBC;
1829
                                        Set_BusB_To <= "1010";
1830
                                        Set_BusA_To <= "0000";
1831
                                        Read_To_Reg <= '1';
1832
                                        Save_ALU <= '1';
1833
                                        ALU_Op <= "0010";
1834
                                when 2 =>
1835
                                        IORQ <= '1';
1836
                                        Set_BusB_To <= "0110";
1837
                                        Set_Addr_To <= aXY;
1838
                                when 3 =>
1839
                                        if IR(3) = '0' then
1840
                                                IncDec_16 <= "0010";
1841
                                        else
1842
                                                IncDec_16 <= "1010";
1843
                                        end if;
1844
                                        TStates <= "100";
1845
                                        Write <= '1';
1846
                                        I_BTR <= '1';
1847
                                when 4 =>
1848
                                        NoRead <= '1';
1849
                                        TStates <= "101";
1850
                                when others => null;
1851
                                end case;
1852
                        when "10100011" | "10101011" | "10110011" | "10111011" =>
1853
                                -- OUTI, OUTD, OTIR, OTDR
1854
                                MCycles <= "100";
1855
                                case to_integer(unsigned(MCycle)) is
1856
                                when 1 =>
1857
                                        TStates <= "101";
1858
                                        Set_Addr_To <= aXY;
1859
                                        Set_BusB_To <= "1010";
1860
                                        Set_BusA_To <= "0000";
1861
                                        Read_To_Reg <= '1';
1862
                                        Save_ALU <= '1';
1863
                                        ALU_Op <= "0010";
1864
                                when 2 =>
1865
                                        Set_BusB_To <= "0110";
1866
                                        Set_Addr_To <= aBC;
1867
                                when 3 =>
1868
                                        if IR(3) = '0' then
1869
                                                IncDec_16 <= "0010";
1870
                                        else
1871
                                                IncDec_16 <= "1010";
1872
                                        end if;
1873
                                        IORQ <= '1';
1874
                                        Write <= '1';
1875
                                        I_BTR <= '1';
1876
                                when 4 =>
1877
                                        NoRead <= '1';
1878
                                        TStates <= "101";
1879
                                when others => null;
1880
                                end case;
1881
                        end case;
1882
 
1883
                end case;
1884
 
1885
                if Mode = 1 then
1886
                        if MCycle = "001" then
1887
--                              TStates <= "100";
1888
                        else
1889
                                TStates <= "011";
1890
                        end if;
1891
                end if;
1892
 
1893
                if Mode = 3 then
1894
                        if MCycle = "001" then
1895
--                              TStates <= "100";
1896
                        else
1897
                                TStates <= "100";
1898
                        end if;
1899
                end if;
1900
 
1901
                if Mode < 2 then
1902
                        if MCycle = "110" then
1903
                                Inc_PC <= '1';
1904
                                if Mode = 1 then
1905
                                        Set_Addr_To <= aXY;
1906
                                        TStates <= "100";
1907
                                        Set_BusB_To(2 downto 0) <= SSS;
1908
                                        Set_BusB_To(3) <= '0';
1909
                                end if;
1910
                                if IRB = "00110110" or IRB = "11001011" then
1911
                                        Set_Addr_To <= aNone;
1912
                                end if;
1913
                        end if;
1914
                        if MCycle = "111" then
1915
                                if Mode = 0 then
1916
                                        TStates <= "101";
1917
                                end if;
1918
                                if ISet /= "01" then
1919
                                        Set_Addr_To <= aXY;
1920
                                end if;
1921
                                Set_BusB_To(2 downto 0) <= SSS;
1922
                                Set_BusB_To(3) <= '0';
1923
                                if IRB = "00110110" or ISet = "01" then
1924
                                        -- LD (HL),n
1925
                                        Inc_PC <= '1';
1926
                                else
1927
                                        NoRead <= '1';
1928
                                end if;
1929
                        end if;
1930
                end if;
1931
 
1932
        end process;
1933
 
1934
end;

powered by: WebSVN 2.1.0

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