Subversion Repositories ngs

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. //
  2. // TV80 8-Bit Microprocessor Core
  3. // Based on the VHDL T80 core by Daniel Wallner (jesus@opencores.org)
  4. //
  5. // Copyright (c) 2004,2007 Guy Hutchison (ghutchis@opencores.org)
  6. //
  7. // Permission is hereby granted, free of charge, to any person obtaining a
  8. // copy of this software and associated documentation files (the "Software"),
  9. // to deal in the Software without restriction, including without limitation
  10. // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11. // and/or sell copies of the Software, and to permit persons to whom the
  12. // Software is furnished to do so, subject to the following conditions:
  13. //
  14. // The above copyright notice and this permission notice shall be included
  15. // in all copies or substantial portions of the Software.
  16. //
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  19. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  20. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  21. // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  22. // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  23. // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24.  
  25. module tv80_mcode
  26.   (/*AUTOARG*/
  27.   // Outputs
  28.   MCycles, TStates, Prefix, Inc_PC, Inc_WZ, IncDec_16, Read_To_Reg,
  29.   Read_To_Acc, Set_BusA_To, Set_BusB_To, ALU_Op, Save_ALU, PreserveC,
  30.   Arith16, Set_Addr_To, IORQ, Jump, JumpE, JumpXY, Call, RstP, LDZ,
  31.   LDW, LDSPHL, Special_LD, ExchangeDH, ExchangeRp, ExchangeAF,
  32.   ExchangeRS, I_DJNZ, I_CPL, I_CCF, I_SCF, I_RETN, I_BT, I_BC, I_BTR,
  33.   I_RLD, I_RRD, I_INRC, SetDI, SetEI, IMode, Halt, NoRead, Write,
  34.   // Inputs
  35.   IR, ISet, MCycle, F, NMICycle, IntCycle
  36.   );
  37.  
  38.   parameter             Mode   = 0;
  39.   parameter             Flag_C = 0;
  40.   parameter             Flag_N = 1;
  41.   parameter             Flag_P = 2;
  42.   parameter             Flag_X = 3;
  43.   parameter             Flag_H = 4;
  44.   parameter             Flag_Y = 5;
  45.   parameter             Flag_Z = 6;
  46.   parameter             Flag_S = 7;
  47.  
  48.   input [7:0]           IR;
  49.   input [1:0]           ISet                    ;
  50.   input [6:0]           MCycle                  ;
  51.   input [7:0]           F                       ;
  52.   input                 NMICycle                ;
  53.   input                 IntCycle                ;
  54.   output [2:0]          MCycles                 ;
  55.   output [2:0]          TStates                 ;
  56.   output [1:0]          Prefix                  ; // None,BC,ED,DD/FD
  57.   output                Inc_PC                  ;
  58.   output                Inc_WZ                  ;
  59.   output [3:0]          IncDec_16               ; // BC,DE,HL,SP   0 is inc
  60.   output                Read_To_Reg             ;
  61.   output                Read_To_Acc             ;
  62.   output [3:0]          Set_BusA_To     ; // B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F
  63.   output [3:0]          Set_BusB_To     ; // B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0
  64.   output [3:0]          ALU_Op                  ;
  65.   output                Save_ALU                ;
  66.   output                PreserveC               ;
  67.   output                Arith16                 ;
  68.   output [2:0]          Set_Addr_To             ; // aNone,aXY,aIOA,aSP,aBC,aDE,aZI
  69.   output                IORQ                    ;
  70.   output                Jump                    ;
  71.   output                JumpE                   ;
  72.   output                JumpXY                  ;
  73.   output                Call                    ;
  74.   output                RstP                    ;
  75.   output                LDZ                     ;
  76.   output                LDW                     ;
  77.   output                LDSPHL                  ;
  78.   output [2:0]          Special_LD              ; // A,I;A,R;I,A;R,A;None
  79.   output                ExchangeDH              ;
  80.   output                ExchangeRp              ;
  81.   output                ExchangeAF              ;
  82.   output                ExchangeRS              ;
  83.   output                I_DJNZ                  ;
  84.   output                I_CPL                   ;
  85.   output                I_CCF                   ;
  86.   output                I_SCF                   ;
  87.   output                I_RETN                  ;
  88.   output                I_BT                    ;
  89.   output                I_BC                    ;
  90.   output                I_BTR                   ;
  91.   output                I_RLD                   ;
  92.   output                I_RRD                   ;
  93.   output                I_INRC                  ;
  94.   output                SetDI                   ;
  95.   output                SetEI                   ;
  96.   output [1:0]          IMode                   ;
  97.   output                Halt                    ;
  98.   output                NoRead                  ;
  99.   output                Write   ;                
  100.  
  101.   // regs
  102.   reg [2:0]             MCycles                 ;
  103.   reg [2:0]             TStates                 ;
  104.   reg [1:0]             Prefix                  ; // None,BC,ED,DD/FD
  105.   reg                   Inc_PC                  ;
  106.   reg                   Inc_WZ                  ;
  107.   reg [3:0]             IncDec_16               ; // BC,DE,HL,SP   0 is inc
  108.   reg                   Read_To_Reg             ;
  109.   reg                   Read_To_Acc             ;
  110.   reg [3:0]             Set_BusA_To     ; // B,C,D,E,H,L,DI/DB,A,SP(L),SP(M),0,F
  111.   reg [3:0]             Set_BusB_To     ; // B,C,D,E,H,L,DI,A,SP(L),SP(M),1,F,PC(L),PC(M),0
  112.   reg [3:0]             ALU_Op                  ;
  113.   reg                   Save_ALU                ;
  114.   reg                   PreserveC               ;
  115.   reg                   Arith16                 ;
  116.   reg [2:0]             Set_Addr_To             ; // aNone,aXY,aIOA,aSP,aBC,aDE,aZI
  117.   reg                   IORQ                    ;
  118.   reg                   Jump                    ;
  119.   reg                   JumpE                   ;
  120.   reg                   JumpXY                  ;
  121.   reg                   Call                    ;
  122.   reg                   RstP                    ;
  123.   reg                   LDZ                     ;
  124.   reg                   LDW                     ;
  125.   reg                   LDSPHL                  ;
  126.   reg [2:0]             Special_LD              ; // A,I;A,R;I,A;R,A;None
  127.   reg                   ExchangeDH              ;
  128.   reg                   ExchangeRp              ;
  129.   reg                   ExchangeAF              ;
  130.   reg                   ExchangeRS              ;
  131.   reg                   I_DJNZ                  ;
  132.   reg                   I_CPL                   ;
  133.   reg                   I_CCF                   ;
  134.   reg                   I_SCF                   ;
  135.   reg                   I_RETN                  ;
  136.   reg                   I_BT                    ;
  137.   reg                   I_BC                    ;
  138.   reg                   I_BTR                   ;
  139.   reg                   I_RLD                   ;
  140.   reg                   I_RRD                   ;
  141.   reg                   I_INRC                  ;
  142.   reg                   SetDI                   ;
  143.   reg                   SetEI                   ;
  144.   reg [1:0]             IMode                   ;
  145.   reg                   Halt                    ;
  146.   reg                   NoRead                  ;
  147.   reg                   Write   ;                
  148.  
  149.   parameter             aNone   = 3'b111;
  150.   parameter             aBC     = 3'b000;
  151.   parameter             aDE     = 3'b001;
  152.   parameter             aXY     = 3'b010;
  153.   parameter             aIOA    = 3'b100;
  154.   parameter             aSP     = 3'b101;
  155.   parameter             aZI     = 3'b110;
  156.   //    constant aNone  : std_logic_vector[2:0] = 3'b000;
  157.   //    constant aXY    : std_logic_vector[2:0] = 3'b001;
  158.   //    constant aIOA   : std_logic_vector[2:0] = 3'b010;
  159.   //    constant aSP    : std_logic_vector[2:0] = 3'b011;
  160.   //    constant aBC    : std_logic_vector[2:0] = 3'b100;
  161.   //    constant aDE    : std_logic_vector[2:0] = 3'b101;
  162.   //    constant aZI    : std_logic_vector[2:0] = 3'b110;
  163.  
  164.   function is_cc_true;
  165.     input [7:0] FF;
  166.     input [2:0] cc;
  167.     begin
  168.       if (Mode == 3 )
  169.         begin
  170.           case (cc)
  171.             3'b000  : is_cc_true = FF[7] == 1'b0; // NZ
  172.             3'b001  : is_cc_true = FF[7] == 1'b1; // Z
  173.             3'b010  : is_cc_true = FF[4] == 1'b0; // NC
  174.             3'b011  : is_cc_true = FF[4] == 1'b1; // C
  175.             3'b100  : is_cc_true = 0;
  176.             3'b101  : is_cc_true = 0;
  177.             3'b110  : is_cc_true = 0;
  178.             3'b111  : is_cc_true = 0;
  179.           endcase
  180.         end
  181.       else
  182.         begin
  183.           case (cc)
  184.             3'b000  : is_cc_true = FF[6] == 1'b0; // NZ
  185.             3'b001  : is_cc_true = FF[6] == 1'b1; // Z
  186.             3'b010  : is_cc_true = FF[0] == 1'b0; // NC
  187.             3'b011  : is_cc_true = FF[0] == 1'b1; // C
  188.             3'b100  : is_cc_true = FF[2] == 1'b0; // PO
  189.             3'b101  : is_cc_true = FF[2] == 1'b1; // PE
  190.             3'b110  : is_cc_true = FF[7] == 1'b0; // P
  191.             3'b111  : is_cc_true = FF[7] == 1'b1; // M
  192.           endcase
  193.         end
  194.     end
  195.   endfunction // is_cc_true
  196.  
  197.  
  198.   reg [2:0] DDD;
  199.   reg [2:0] SSS;
  200.   reg [1:0] DPAIR;
  201.  
  202.   always @ (/*AUTOSENSE*/F or IR or ISet or IntCycle or MCycle
  203.             or NMICycle)
  204.     begin
  205.       DDD = IR[5:3];
  206.       SSS = IR[2:0];
  207.       DPAIR = IR[5:4];
  208.  
  209.       MCycles = 3'b001;
  210.       if (MCycle[0] )
  211.         begin
  212.           TStates = 3'b100;
  213.         end
  214.       else
  215.         begin
  216.           TStates = 3'b011;
  217.         end
  218.       Prefix = 2'b00;
  219.       Inc_PC = 1'b0;
  220.       Inc_WZ = 1'b0;
  221.       IncDec_16 = 4'b0000;
  222.       Read_To_Acc = 1'b0;
  223.       Read_To_Reg = 1'b0;
  224.       Set_BusB_To = 4'b0000;
  225.       Set_BusA_To = 4'b0000;
  226.       ALU_Op = { 1'b0, IR[5:3] };
  227.       Save_ALU = 1'b0;
  228.       PreserveC = 1'b0;
  229.       Arith16 = 1'b0;
  230.       IORQ = 1'b0;
  231.       Set_Addr_To = aNone;
  232.       Jump = 1'b0;
  233.       JumpE = 1'b0;
  234.       JumpXY = 1'b0;
  235.       Call = 1'b0;
  236.       RstP = 1'b0;
  237.       LDZ = 1'b0;
  238.       LDW = 1'b0;
  239.       LDSPHL = 1'b0;
  240.       Special_LD = 3'b000;
  241.       ExchangeDH = 1'b0;
  242.       ExchangeRp = 1'b0;
  243.       ExchangeAF = 1'b0;
  244.       ExchangeRS = 1'b0;
  245.       I_DJNZ = 1'b0;
  246.       I_CPL = 1'b0;
  247.       I_CCF = 1'b0;
  248.       I_SCF = 1'b0;
  249.       I_RETN = 1'b0;
  250.       I_BT = 1'b0;
  251.       I_BC = 1'b0;
  252.       I_BTR = 1'b0;
  253.       I_RLD = 1'b0;
  254.       I_RRD = 1'b0;
  255.       I_INRC = 1'b0;
  256.       SetDI = 1'b0;
  257.       SetEI = 1'b0;
  258.       IMode = 2'b11;
  259.       Halt = 1'b0;
  260.       NoRead = 1'b0;
  261.       Write = 1'b0;
  262.      
  263.       case (ISet)
  264.         2'b00  :
  265.           begin
  266.  
  267.             //----------------------------------------------------------------------------
  268.             //
  269.             //  Unprefixed instructions
  270.             //
  271.             //----------------------------------------------------------------------------
  272.  
  273.             casez (IR)
  274.               // 8 BIT LOAD GROUP
  275.               8'b01zzzzzz :
  276.                 begin
  277.                   if (IR[5:0] == 6'b110110)
  278.                     Halt = 1'b1;
  279.                   else if (IR[2:0] == 3'b110)
  280.                     begin
  281.                       // LD r,(HL)
  282.                       MCycles = 3'b010;
  283.                       if (MCycle[0])
  284.                         Set_Addr_To = aXY;
  285.                       if (MCycle[1])
  286.                         begin
  287.                           Set_BusA_To[2:0] = DDD;
  288.                           Read_To_Reg = 1'b1;
  289.                         end
  290.                     end // if (IR[2:0] == 3'b110)
  291.                   else if (IR[5:3] == 3'b110)
  292.                     begin
  293.                       // LD (HL),r
  294.                       MCycles = 3'b010;
  295.                       if (MCycle[0])
  296.                         begin
  297.                           Set_Addr_To = aXY;
  298.                           Set_BusB_To[2:0] = SSS;
  299.                           Set_BusB_To[3] = 1'b0;
  300.                         end
  301.                       if (MCycle[1])
  302.                         Write = 1'b1;
  303.                     end // if (IR[5:3] == 3'b110)
  304.                   else
  305.                     begin
  306.                       Set_BusB_To[2:0] = SSS;
  307.                       ExchangeRp = 1'b1;
  308.                       Set_BusA_To[2:0] = DDD;
  309.                       Read_To_Reg = 1'b1;
  310.                     end // else: !if(IR[5:3] == 3'b110)
  311.                 end // case: 8'b01zzzzzz                                    
  312.  
  313.               8'b00zzz110 :
  314.                 begin
  315.                   if (IR[5:3] == 3'b110)
  316.                     begin
  317.                       // LD (HL),n
  318.                       MCycles = 3'b011;
  319.                       if (MCycle[1])
  320.                         begin
  321.                           Inc_PC = 1'b1;
  322.                           Set_Addr_To = aXY;
  323.                           Set_BusB_To[2:0] = SSS;
  324.                           Set_BusB_To[3] = 1'b0;
  325.                         end
  326.                       if (MCycle[2])
  327.                         Write = 1'b1;
  328.                     end // if (IR[5:3] == 3'b110)
  329.                   else
  330.                     begin
  331.                       // LD r,n
  332.                       MCycles = 3'b010;
  333.                       if (MCycle[1])
  334.                         begin
  335.                           Inc_PC = 1'b1;
  336.                           Set_BusA_To[2:0] = DDD;
  337.                           Read_To_Reg = 1'b1;
  338.                         end
  339.                     end
  340.                 end
  341.              
  342.               8'b00001010  :
  343.                 begin
  344.                   // LD A,(BC)
  345.                   MCycles = 3'b010;
  346.                   if (MCycle[0])
  347.                     Set_Addr_To = aBC;
  348.                   if (MCycle[1])
  349.                     Read_To_Acc = 1'b1;
  350.                 end // case: 8'b00001010
  351.              
  352.               8'b00011010  :
  353.                 begin
  354.                   // LD A,(DE)
  355.                   MCycles = 3'b010;
  356.                   if (MCycle[0])
  357.                     Set_Addr_To = aDE;
  358.                   if (MCycle[1])
  359.                     Read_To_Acc = 1'b1;
  360.                 end // case: 8'b00011010
  361.              
  362.               8'b00111010  :
  363.                 begin
  364.                   if (Mode == 3 )
  365.                     begin
  366.                       // LDD A,(HL)
  367.                       MCycles = 3'b010;
  368.                       if (MCycle[0])
  369.                         Set_Addr_To = aXY;
  370.                       if (MCycle[1])
  371.                         begin
  372.                           Read_To_Acc = 1'b1;
  373.                           IncDec_16 = 4'b1110;
  374.                         end
  375.                     end
  376.                   else
  377.                     begin
  378.                       // LD A,(nn)
  379.                       MCycles = 3'b100;
  380.                       if (MCycle[1])
  381.                         begin
  382.                           Inc_PC = 1'b1;
  383.                           LDZ = 1'b1;
  384.                         end
  385.                       if (MCycle[2])
  386.                         begin
  387.                           Set_Addr_To = aZI;
  388.                           Inc_PC = 1'b1;
  389.                         end
  390.                       if (MCycle[3])
  391.                         begin
  392.                           Read_To_Acc = 1'b1;
  393.                         end
  394.                     end // else: !if(Mode == 3 )
  395.                 end // case: 8'b00111010
  396.              
  397.               8'b00000010  :
  398.                 begin
  399.                   // LD (BC),A
  400.                   MCycles = 3'b010;
  401.                   if (MCycle[0])
  402.                     begin
  403.                       Set_Addr_To = aBC;
  404.                       Set_BusB_To = 4'b0111;
  405.                     end
  406.                   if (MCycle[1])
  407.                     begin
  408.                       Write = 1'b1;
  409.                     end
  410.                 end // case: 8'b00000010
  411.              
  412.               8'b00010010  :
  413.                 begin
  414.                   // LD (DE),A
  415.                   MCycles = 3'b010;
  416.                   case (1'b1) // MCycle
  417.                     MCycle[0] :
  418.                       begin
  419.                         Set_Addr_To = aDE;
  420.                         Set_BusB_To = 4'b0111;
  421.                       end
  422.                     MCycle[1] :
  423.                       Write = 1'b1;
  424.                     default :;
  425.                   endcase // case(MCycle)
  426.                 end // case: 8'b00010010
  427.              
  428.               8'b00110010  :
  429.                 begin
  430.                   if (Mode == 3 )
  431.                     begin
  432.                       // LDD (HL),A
  433.                       MCycles = 3'b010;
  434.                       case (1'b1) // MCycle
  435.                         MCycle[0] :
  436.                           begin
  437.                             Set_Addr_To = aXY;
  438.                             Set_BusB_To = 4'b0111;
  439.                           end
  440.                         MCycle[1] :
  441.                           begin
  442.                             Write = 1'b1;
  443.                             IncDec_16 = 4'b1110;
  444.                           end
  445.                         default :;
  446.                       endcase // case(MCycle)
  447.                      
  448.                     end
  449.                   else
  450.                     begin
  451.                       // LD (nn),A
  452.                       MCycles = 3'b100;
  453.                       case (1'b1) // MCycle
  454.                         MCycle[1] :
  455.                           begin
  456.                             Inc_PC = 1'b1;
  457.                             LDZ = 1'b1;
  458.                           end
  459.                         MCycle[2] :
  460.                           begin
  461.                             Set_Addr_To = aZI;
  462.                             Inc_PC = 1'b1;
  463.                             Set_BusB_To = 4'b0111;
  464.                           end
  465.                         MCycle[3] :
  466.                           begin
  467.                             Write = 1'b1;
  468.                           end
  469.                         default :;
  470.                       endcase
  471.                     end // else: !if(Mode == 3 )
  472.                 end // case: 8'b00110010
  473.              
  474.  
  475.               // 16 BIT LOAD GROUP
  476.               8'b00000001,8'b00010001,8'b00100001,8'b00110001  :
  477.                 begin
  478.                   // LD dd,nn
  479.                   MCycles = 3'b011;
  480.                   case (1'b1) // MCycle
  481.                     MCycle[1] :
  482.                       begin
  483.                         Inc_PC = 1'b1;
  484.                         Read_To_Reg = 1'b1;
  485.                         if (DPAIR == 2'b11 )
  486.                           begin
  487.                             Set_BusA_To[3:0] = 4'b1000;
  488.                           end
  489.                         else
  490.                           begin
  491.                             Set_BusA_To[2:1] = DPAIR;
  492.                             Set_BusA_To[0] = 1'b1;
  493.                           end
  494.                       end // case: 2
  495.                    
  496.                     MCycle[2] :
  497.                       begin
  498.                         Inc_PC = 1'b1;
  499.                         Read_To_Reg = 1'b1;
  500.                         if (DPAIR == 2'b11 )
  501.                           begin
  502.                             Set_BusA_To[3:0] = 4'b1001;
  503.                           end
  504.                         else
  505.                           begin
  506.                             Set_BusA_To[2:1] = DPAIR;
  507.                             Set_BusA_To[0] = 1'b0;
  508.                           end
  509.                       end // case: 3
  510.                    
  511.                     default :;
  512.                   endcase // case(MCycle)
  513.                 end // case: 8'b00000001,8'b00010001,8'b00100001,8'b00110001
  514.              
  515.               8'b00101010  :
  516.                 begin
  517.                   if (Mode == 3 )
  518.                     begin
  519.                       // LDI A,(HL)
  520.                       MCycles = 3'b010;
  521.                       case (1'b1) // MCycle
  522.                         MCycle[0] :
  523.                           Set_Addr_To = aXY;
  524.                         MCycle[1] :
  525.                           begin
  526.                             Read_To_Acc = 1'b1;
  527.                             IncDec_16 = 4'b0110;
  528.                           end
  529.                        
  530.                         default :;
  531.                       endcase
  532.                     end
  533.                   else
  534.                     begin
  535.                       // LD HL,(nn)
  536.                       MCycles = 3'b101;
  537.                       case (1'b1) // MCycle
  538.                         MCycle[1] :
  539.                           begin
  540.                             Inc_PC = 1'b1;
  541.                             LDZ = 1'b1;
  542.                           end
  543.                         MCycle[2] :
  544.                           begin
  545.                             Set_Addr_To = aZI;
  546.                             Inc_PC = 1'b1;
  547.                             LDW = 1'b1;
  548.                           end
  549.                         MCycle[3] :
  550.                           begin
  551.                             Set_BusA_To[2:0] = 3'b101; // L
  552.                             Read_To_Reg = 1'b1;
  553.                             Inc_WZ = 1'b1;
  554.                             Set_Addr_To = aZI;
  555.                           end
  556.                         MCycle[4] :
  557.                           begin
  558.                             Set_BusA_To[2:0] = 3'b100; // H
  559.                             Read_To_Reg = 1'b1;
  560.                           end
  561.                         default :;
  562.                       endcase
  563.                     end // else: !if(Mode == 3 )
  564.                 end // case: 8'b00101010
  565.              
  566.               8'b00100010  :
  567.                 begin
  568.                   if (Mode == 3 )
  569.                     begin
  570.                       // LDI (HL),A
  571.                       MCycles = 3'b010;
  572.                       case (1'b1) // MCycle
  573.                         MCycle[0] :
  574.                           begin
  575.                             Set_Addr_To = aXY;
  576.                             Set_BusB_To = 4'b0111;
  577.                           end
  578.                         MCycle[1] :
  579.                           begin
  580.                             Write = 1'b1;
  581.                             IncDec_16 = 4'b0110;
  582.                           end
  583.                         default :;
  584.                       endcase
  585.                     end
  586.                   else
  587.                     begin
  588.                       // LD (nn),HL
  589.                       MCycles = 3'b101;
  590.                       case (1'b1) // MCycle                        
  591.                         MCycle[1] :
  592.                           begin
  593.                             Inc_PC = 1'b1;
  594.                             LDZ = 1'b1;
  595.                           end
  596.                        
  597.                         MCycle[2] :
  598.                           begin
  599.                             Set_Addr_To = aZI;
  600.                             Inc_PC = 1'b1;
  601.                             LDW = 1'b1;
  602.                             Set_BusB_To = 4'b0101; // L
  603.                           end
  604.                        
  605.                         MCycle[3] :
  606.                           begin
  607.                             Inc_WZ = 1'b1;
  608.                             Set_Addr_To = aZI;
  609.                             Write = 1'b1;
  610.                             Set_BusB_To = 4'b0100; // H
  611.                           end
  612.                         MCycle[4] :                          
  613.                           Write = 1'b1;
  614.                         default :;
  615.                       endcase
  616.                     end // else: !if(Mode == 3 )
  617.                 end // case: 8'b00100010
  618.              
  619.               8'b11111001  :
  620.                 begin
  621.                   // LD SP,HL
  622.                   TStates = 3'b110;
  623.                   LDSPHL = 1'b1;
  624.                 end
  625.              
  626.               8'b11zz0101 :
  627.                 begin
  628.                   // PUSH qq
  629.                   MCycles = 3'b011;
  630.                   case (1'b1) // MCycle                    
  631.                     MCycle[0] :
  632.                       begin
  633.                         TStates = 3'b101;
  634.                         IncDec_16 = 4'b1111;
  635.                         Set_Addr_To = aSP;
  636.                         if (DPAIR == 2'b11 )
  637.                           begin
  638.                             Set_BusB_To = 4'b0111;
  639.                           end
  640.                         else
  641.                           begin
  642.                             Set_BusB_To[2:1] = DPAIR;
  643.                             Set_BusB_To[0] = 1'b0;
  644.                             Set_BusB_To[3] = 1'b0;
  645.                           end
  646.                       end // case: 1
  647.                    
  648.                     MCycle[1] :
  649.                       begin
  650.                         IncDec_16 = 4'b1111;
  651.                         Set_Addr_To = aSP;
  652.                         if (DPAIR == 2'b11 )
  653.                           begin
  654.                             Set_BusB_To = 4'b1011;
  655.                           end
  656.                         else
  657.                           begin
  658.                             Set_BusB_To[2:1] = DPAIR;
  659.                             Set_BusB_To[0] = 1'b1;
  660.                             Set_BusB_To[3] = 1'b0;
  661.                           end
  662.                         Write = 1'b1;
  663.                       end // case: 2
  664.                    
  665.                     MCycle[2] :
  666.                       Write = 1'b1;
  667.                     default :;
  668.                   endcase // case(MCycle)
  669.                 end // case: 8'b11000101,8'b11010101,8'b11100101,8'b11110101
  670.              
  671.               8'b11zz0001 :
  672.                 begin
  673.                   // POP qq
  674.                   MCycles = 3'b011;
  675.                   case (1'b1) // MCycle
  676.                     MCycle[0] :
  677.                       Set_Addr_To = aSP;
  678.                     MCycle[1] :
  679.                       begin
  680.                         IncDec_16 = 4'b0111;
  681.                         Set_Addr_To = aSP;
  682.                         Read_To_Reg = 1'b1;
  683.                         if (DPAIR == 2'b11 )
  684.                           begin
  685.                             Set_BusA_To[3:0] = 4'b1011;
  686.                           end
  687.                         else
  688.                           begin
  689.                             Set_BusA_To[2:1] = DPAIR;
  690.                             Set_BusA_To[0] = 1'b1;
  691.                           end
  692.                       end // case: 2
  693.                    
  694.                     MCycle[2] :
  695.                       begin
  696.                         IncDec_16 = 4'b0111;
  697.                         Read_To_Reg = 1'b1;
  698.                         if (DPAIR == 2'b11 )
  699.                           begin
  700.                             Set_BusA_To[3:0] = 4'b0111;
  701.                           end
  702.                         else
  703.                           begin
  704.                             Set_BusA_To[2:1] = DPAIR;
  705.                             Set_BusA_To[0] = 1'b0;
  706.                           end
  707.                       end // case: 3
  708.                    
  709.                     default :;
  710.                   endcase // case(MCycle)
  711.                 end // case: 8'b11000001,8'b11010001,8'b11100001,8'b11110001
  712.              
  713.  
  714.               // EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP
  715.               8'b11101011  :
  716.                 begin
  717.                   if (Mode != 3 )
  718.                     begin
  719.                       // EX DE,HL
  720.                       ExchangeDH = 1'b1;
  721.                     end
  722.                 end
  723.              
  724.               8'b00001000  :
  725.                 begin
  726.                   if (Mode == 3 )
  727.                     begin
  728.                       // LD (nn),SP
  729.                       MCycles = 3'b101;
  730.                       case (1'b1) // MCycle
  731.                         MCycle[1] :
  732.                           begin
  733.                             Inc_PC = 1'b1;
  734.                             LDZ = 1'b1;
  735.                           end
  736.                        
  737.                         MCycle[2] :
  738.                           begin
  739.                             Set_Addr_To = aZI;
  740.                             Inc_PC = 1'b1;
  741.                             LDW = 1'b1;
  742.                             Set_BusB_To = 4'b1000;
  743.                           end
  744.                        
  745.                         MCycle[3] :
  746.                           begin
  747.                             Inc_WZ = 1'b1;
  748.                             Set_Addr_To = aZI;
  749.                             Write = 1'b1;
  750.                             Set_BusB_To = 4'b1001;
  751.                           end
  752.                        
  753.                         MCycle[4] :
  754.                           Write = 1'b1;
  755.                         default :;
  756.                       endcase
  757.                     end
  758.                   else if (Mode < 2 )
  759.                     begin
  760.                       // EX AF,AF'
  761.                       ExchangeAF = 1'b1;
  762.                     end
  763.                 end // case: 8'b00001000
  764.              
  765.               8'b11011001  :
  766.                 begin
  767.                   if (Mode == 3 )
  768.                     begin
  769.                       // RETI
  770.                       MCycles = 3'b011;
  771.                       case (1'b1) // MCycle
  772.                         MCycle[0] :
  773.                           Set_Addr_To = aSP;
  774.                         MCycle[1] :
  775.                           begin
  776.                             IncDec_16 = 4'b0111;
  777.                             Set_Addr_To = aSP;
  778.                             LDZ = 1'b1;
  779.                           end
  780.                        
  781.                         MCycle[2] :
  782.                           begin
  783.                             Jump = 1'b1;
  784.                             IncDec_16 = 4'b0111;
  785.                             I_RETN = 1'b1;
  786.                             SetEI = 1'b1;
  787.                           end
  788.                         default :;
  789.                       endcase
  790.                     end
  791.                   else if (Mode < 2 )
  792.                     begin
  793.                       // EXX
  794.                       ExchangeRS = 1'b1;
  795.                     end
  796.                 end // case: 8'b11011001
  797.              
  798.               8'b11100011  :
  799.                 begin
  800.                   if (Mode != 3 )
  801.                     begin
  802.                       // EX (SP),HL
  803.                       MCycles = 3'b101;
  804.                       case (1'b1) // MCycle
  805.                         MCycle[0] :
  806.                           Set_Addr_To = aSP;
  807.                         MCycle[1] :
  808.                           begin
  809.                             Read_To_Reg = 1'b1;
  810.                             Set_BusA_To = 4'b0101;
  811.                             Set_BusB_To = 4'b0101;
  812.                             Set_Addr_To = aSP;
  813.                           end
  814.                         MCycle[2] :
  815.                           begin
  816.                             IncDec_16 = 4'b0111;
  817.                             Set_Addr_To = aSP;
  818.                             TStates = 3'b100;
  819.                             Write = 1'b1;
  820.                           end
  821.                         MCycle[3] :
  822.                           begin
  823.                             Read_To_Reg = 1'b1;
  824.                             Set_BusA_To = 4'b0100;
  825.                             Set_BusB_To = 4'b0100;
  826.                             Set_Addr_To = aSP;
  827.                           end
  828.                         MCycle[4] :
  829.                           begin
  830.                             IncDec_16 = 4'b1111;
  831.                             TStates = 3'b101;
  832.                             Write = 1'b1;
  833.                           end
  834.                        
  835.                         default :;
  836.                       endcase
  837.                     end // if (Mode != 3 )
  838.                 end // case: 8'b11100011
  839.              
  840.  
  841.               // 8 BIT ARITHMETIC AND LOGICAL GROUP
  842.               8'b10zzzzzz :
  843.                 begin
  844.                   if (IR[2:0] == 3'b110)
  845.                     begin
  846.                       // ADD A,(HL)
  847.                       // ADC A,(HL)
  848.                       // SUB A,(HL)
  849.                       // SBC A,(HL)
  850.                       // AND A,(HL)
  851.                       // OR A,(HL)
  852.                       // XOR A,(HL)
  853.                       // CP A,(HL)
  854.                       MCycles = 3'b010;
  855.                       case (1'b1) // MCycle
  856.                         MCycle[0] :
  857.                           Set_Addr_To = aXY;
  858.                         MCycle[1] :
  859.                           begin
  860.                             Read_To_Reg = 1'b1;
  861.                             Save_ALU = 1'b1;
  862.                             Set_BusB_To[2:0] = SSS;
  863.                             Set_BusA_To[2:0] = 3'b111;
  864.                           end
  865.                        
  866.                         default :;
  867.                       endcase // case(MCycle)
  868.                     end // if (IR[2:0] == 3'b110)
  869.                   else
  870.                     begin
  871.                       // ADD A,r
  872.                       // ADC A,r
  873.                       // SUB A,r
  874.                       // SBC A,r
  875.                       // AND A,r
  876.                       // OR A,r
  877.                       // XOR A,r
  878.                       // CP A,r
  879.                       Set_BusB_To[2:0] = SSS;
  880.                       Set_BusA_To[2:0] = 3'b111;
  881.                       Read_To_Reg = 1'b1;
  882.                       Save_ALU = 1'b1;
  883.                     end // else: !if(IR[2:0] == 3'b110)                  
  884.                 end // case: 8'b10000000,8'b10000001,8'b10000010,8'b10000011,8'b10000100,8'b10000101,8'b10000111,...
  885.              
  886.               8'b11zzz110 :
  887.                 begin
  888.                   // ADD A,n
  889.                   // ADC A,n
  890.                   // SUB A,n
  891.                   // SBC A,n
  892.                   // AND A,n
  893.                   // OR A,n
  894.                   // XOR A,n
  895.                   // CP A,n
  896.                   MCycles = 3'b010;
  897.                   if (MCycle[1] )
  898.                     begin
  899.                       Inc_PC = 1'b1;
  900.                       Read_To_Reg = 1'b1;
  901.                       Save_ALU = 1'b1;
  902.                       Set_BusB_To[2:0] = SSS;
  903.                       Set_BusA_To[2:0] = 3'b111;
  904.                     end
  905.                 end
  906.              
  907.               8'b00zzz100 :
  908.                 begin
  909.                   if (IR[5:3] == 3'b110)
  910.                     begin
  911.                       // INC (HL)
  912.                       MCycles = 3'b011;
  913.                       case (1'b1) // MCycle
  914.                         MCycle[0] :
  915.                           Set_Addr_To = aXY;
  916.                         MCycle[1] :
  917.                           begin
  918.                             TStates = 3'b100;
  919.                             Set_Addr_To = aXY;
  920.                             Read_To_Reg = 1'b1;
  921.                             Save_ALU = 1'b1;
  922.                             PreserveC = 1'b1;
  923.                             ALU_Op = 4'b0000;
  924.                             Set_BusB_To = 4'b1010;
  925.                             Set_BusA_To[2:0] = DDD;
  926.                           end // case: 2
  927.                        
  928.                         MCycle[2] :
  929.                           Write = 1'b1;
  930.                         default :;
  931.                       endcase // case(MCycle)
  932.                     end // case: 8'b00110100
  933.                   else
  934.                     begin
  935.                       // INC r
  936.                       Set_BusB_To = 4'b1010;
  937.                       Set_BusA_To[2:0] = DDD;
  938.                       Read_To_Reg = 1'b1;
  939.                       Save_ALU = 1'b1;
  940.                       PreserveC = 1'b1;
  941.                       ALU_Op = 4'b0000;
  942.                     end
  943.                 end
  944.              
  945.               8'b00zzz101 :
  946.                 begin              
  947.                   if (IR[5:3] == 3'b110)
  948.                     begin
  949.                       // DEC (HL)
  950.                       MCycles = 3'b011;
  951.                       case (1'b1) // MCycle
  952.                         MCycle[0] :
  953.                           Set_Addr_To = aXY;
  954.                         MCycle[1] :
  955.                           begin
  956.                             TStates = 3'b100;
  957.                             Set_Addr_To = aXY;
  958.                             ALU_Op = 4'b0010;
  959.                             Read_To_Reg = 1'b1;
  960.                             Save_ALU = 1'b1;
  961.                             PreserveC = 1'b1;
  962.                             Set_BusB_To = 4'b1010;
  963.                             Set_BusA_To[2:0] = DDD;
  964.                           end // case: 2
  965.                        
  966.                         MCycle[2] :
  967.                           Write = 1'b1;
  968.                         default :;
  969.                       endcase // case(MCycle)
  970.                     end
  971.                   else
  972.                     begin
  973.                       // DEC r
  974.                       Set_BusB_To = 4'b1010;
  975.                       Set_BusA_To[2:0] = DDD;
  976.                       Read_To_Reg = 1'b1;
  977.                       Save_ALU = 1'b1;
  978.                       PreserveC = 1'b1;
  979.                       ALU_Op = 4'b0010;
  980.                     end
  981.                 end
  982.              
  983.               // GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS
  984.               8'b00100111  :
  985.                 begin
  986.                   // DAA
  987.                   Set_BusA_To[2:0] = 3'b111;
  988.                   Read_To_Reg = 1'b1;
  989.                   ALU_Op = 4'b1100;
  990.                   Save_ALU = 1'b1;
  991.                 end
  992.              
  993.               8'b00101111  :
  994.                 // CPL
  995.                 I_CPL = 1'b1;
  996.              
  997.               8'b00111111  :
  998.                 // CCF
  999.                 I_CCF = 1'b1;
  1000.              
  1001.               8'b00110111  :
  1002.                 // SCF
  1003.                 I_SCF = 1'b1;
  1004.              
  1005.               8'b00000000  :
  1006.                 begin
  1007.                   if (NMICycle == 1'b1 )
  1008.                     begin
  1009.                       // NMI
  1010.                       MCycles = 3'b011;
  1011.                       case (1'b1) // MCycle
  1012.                         MCycle[0] :
  1013.                           begin
  1014.                             TStates = 3'b101;
  1015.                             IncDec_16 = 4'b1111;
  1016.                             Set_Addr_To = aSP;
  1017.                             Set_BusB_To = 4'b1101;
  1018.                           end
  1019.                        
  1020.                         MCycle[1] :
  1021.                           begin
  1022.                             TStates = 3'b100;
  1023.                             Write = 1'b1;
  1024.                             IncDec_16 = 4'b1111;
  1025.                             Set_Addr_To = aSP;
  1026.                             Set_BusB_To = 4'b1100;
  1027.                           end
  1028.                        
  1029.                         MCycle[2] :
  1030.                           begin
  1031.                             TStates = 3'b100;
  1032.                             Write = 1'b1;
  1033.                           end
  1034.                        
  1035.                         default :;
  1036.                       endcase // case(MCycle)
  1037.                      
  1038.                     end
  1039.                   else if (IntCycle == 1'b1 )
  1040.                     begin
  1041.                       // INT (IM 2)
  1042.                       MCycles = 3'b101;
  1043.                       case (1'b1) // MCycle
  1044.                         MCycle[0] :
  1045.                           begin
  1046.                             LDZ = 1'b1;
  1047.                             TStates = 3'b101;
  1048.                             IncDec_16 = 4'b1111;
  1049.                             Set_Addr_To = aSP;
  1050.                             Set_BusB_To = 4'b1101;
  1051.                           end
  1052.                        
  1053.                         MCycle[1] :
  1054.                           begin
  1055.                             TStates = 3'b100;
  1056.                             Write = 1'b1;
  1057.                             IncDec_16 = 4'b1111;
  1058.                             Set_Addr_To = aSP;
  1059.                             Set_BusB_To = 4'b1100;
  1060.                           end
  1061.                        
  1062.                         MCycle[2] :
  1063.                           begin
  1064.                             TStates = 3'b100;
  1065.                             Write = 1'b1;
  1066.                           end
  1067.                        
  1068.                         MCycle[3] :
  1069.                           begin
  1070.                             Inc_PC = 1'b1;
  1071.                             LDZ = 1'b1;
  1072.                           end
  1073.                        
  1074.                         MCycle[4] :
  1075.                           Jump = 1'b1;
  1076.                         default :;
  1077.                       endcase
  1078.                     end
  1079.                 end // case: 8'b00000000
  1080.              
  1081.               8'b11110011  :
  1082.                 // DI
  1083.                 SetDI = 1'b1;
  1084.              
  1085.               8'b11111011  :
  1086.                 // EI
  1087.                 SetEI = 1'b1;
  1088.  
  1089.               // 16 BIT ARITHMETIC GROUP
  1090.               8'b00zz1001  :
  1091.                 begin
  1092.                   // ADD HL,ss
  1093.                   MCycles = 3'b011;
  1094.                   case (1'b1) // MCycle
  1095.                     MCycle[1] :
  1096.                       begin
  1097.                         NoRead = 1'b1;
  1098.                         ALU_Op = 4'b0000;
  1099.                         Read_To_Reg = 1'b1;
  1100.                         Save_ALU = 1'b1;
  1101.                         Set_BusA_To[2:0] = 3'b101;
  1102.                         case (IR[5:4])
  1103.                           0,1,2  :
  1104.                             begin
  1105.                               Set_BusB_To[2:1] = IR[5:4];
  1106.                               Set_BusB_To[0] = 1'b1;
  1107.                             end
  1108.                          
  1109.                           default :
  1110.                             Set_BusB_To = 4'b1000;
  1111.                         endcase // case(IR[5:4])
  1112.                        
  1113.                         TStates = 3'b100;
  1114.                         Arith16 = 1'b1;
  1115.                       end // case: 2
  1116.                    
  1117.                     MCycle[2] :
  1118.                       begin
  1119.                         NoRead = 1'b1;
  1120.                         Read_To_Reg = 1'b1;
  1121.                         Save_ALU = 1'b1;
  1122.                         ALU_Op = 4'b0001;
  1123.                         Set_BusA_To[2:0] = 3'b100;
  1124.                         case (IR[5:4])
  1125.                           0,1,2  :
  1126.                             Set_BusB_To[2:1] = IR[5:4];
  1127.                           default :
  1128.                             Set_BusB_To = 4'b1001;
  1129.                         endcase
  1130.                         Arith16 = 1'b1;
  1131.                       end // case: 3
  1132.                    
  1133.                     default :;
  1134.                   endcase // case(MCycle)
  1135.                 end // case: 8'b00001001,8'b00011001,8'b00101001,8'b00111001              
  1136.              
  1137.               8'b00zz0011 :
  1138.                 begin
  1139.                   // INC ss
  1140.                   TStates = 3'b110;
  1141.                   IncDec_16[3:2] = 2'b01;
  1142.                   IncDec_16[1:0] = DPAIR;
  1143.                 end
  1144.              
  1145.               8'b00zz1011 :
  1146.                 begin
  1147.                   // DEC ss
  1148.                   TStates = 3'b110;
  1149.                   IncDec_16[3:2] = 2'b11;
  1150.                   IncDec_16[1:0] = DPAIR;
  1151.                 end
  1152.  
  1153.               // ROTATE AND SHIFT GROUP
  1154.               8'b00000111,
  1155.                   // RLCA
  1156.                   8'b00010111,
  1157.                   // RLA
  1158.                   8'b00001111,
  1159.                   // RRCA
  1160.                   8'b00011111 :
  1161.                     // RRA
  1162.                     begin
  1163.                       Set_BusA_To[2:0] = 3'b111;
  1164.                       ALU_Op = 4'b1000;
  1165.                       Read_To_Reg = 1'b1;
  1166.                       Save_ALU = 1'b1;
  1167.                     end // case: 8'b00000111,...
  1168.              
  1169.  
  1170.               // JUMP GROUP
  1171.               8'b11000011  :
  1172.                 begin
  1173.                   // JP nn
  1174.                   MCycles = 3'b011;
  1175.                   if (MCycle[1])
  1176.                     begin
  1177.                       Inc_PC = 1'b1;
  1178.                       LDZ = 1'b1;
  1179.                     end
  1180.                  
  1181.                   if (MCycle[2])
  1182.                     begin
  1183.                       Inc_PC = 1'b1;
  1184.                       Jump = 1'b1;
  1185.                     end
  1186.                  
  1187.                 end // case: 8'b11000011
  1188.              
  1189.               8'b11zzz010  :
  1190.                 begin
  1191.                   if (IR[5] == 1'b1 && Mode == 3 )
  1192.                     begin
  1193.                       case (IR[4:3])
  1194.                         2'b00  :
  1195.                           begin
  1196.                             // LD ($FF00+C),A
  1197.                             MCycles = 3'b010;
  1198.                             case (1'b1) // MCycle
  1199.                               MCycle[0] :
  1200.                                 begin
  1201.                                   Set_Addr_To = aBC;
  1202.                                   Set_BusB_To   = 4'b0111;
  1203.                                 end
  1204.                               MCycle[1] :
  1205.                                 begin
  1206.                                   Write = 1'b1;
  1207.                                   IORQ = 1'b1;
  1208.                                 end
  1209.                              
  1210.                               default :;
  1211.                             endcase // case(MCycle)
  1212.                           end // case: 2'b00
  1213.                        
  1214.                         2'b01  :
  1215.                           begin
  1216.                             // LD (nn),A
  1217.                             MCycles = 3'b100;
  1218.                             case (1'b1) // MCycle
  1219.                               MCycle[1] :
  1220.                                 begin
  1221.                                   Inc_PC = 1'b1;
  1222.                                   LDZ = 1'b1;
  1223.                                 end
  1224.                              
  1225.                               MCycle[2] :
  1226.                                 begin
  1227.                                   Set_Addr_To = aZI;
  1228.                                   Inc_PC = 1'b1;
  1229.                                   Set_BusB_To = 4'b0111;
  1230.                                 end
  1231.                              
  1232.                               MCycle[3] :
  1233.                                 Write = 1'b1;
  1234.                               default :;
  1235.                             endcase // case(MCycle)
  1236.                           end // case: default :...
  1237.                        
  1238.                         2'b10  :
  1239.                           begin
  1240.                             // LD A,($FF00+C)
  1241.                             MCycles = 3'b010;
  1242.                             case (1'b1) // MCycle
  1243.                               MCycle[0] :
  1244.                                 Set_Addr_To = aBC;
  1245.                               MCycle[1] :
  1246.                                 begin
  1247.                                   Read_To_Acc = 1'b1;
  1248.                                   IORQ = 1'b1;
  1249.                                 end
  1250.                               default :;
  1251.                             endcase // case(MCycle)
  1252.                           end // case: 2'b10
  1253.                        
  1254.                         2'b11  :
  1255.                           begin
  1256.                             // LD A,(nn)
  1257.                             MCycles = 3'b100;
  1258.                             case (1'b1) // MCycle
  1259.                               MCycle[1] :
  1260.                                 begin
  1261.                                   Inc_PC = 1'b1;
  1262.                                   LDZ = 1'b1;
  1263.                                 end
  1264.                               MCycle[2] :
  1265.                                 begin
  1266.                                   Set_Addr_To = aZI;
  1267.                                   Inc_PC = 1'b1;
  1268.                                 end
  1269.                               MCycle[3] :
  1270.                                 Read_To_Acc = 1'b1;
  1271.                               default :;
  1272.                             endcase // case(MCycle)
  1273.                           end
  1274.                       endcase
  1275.                     end
  1276.                   else
  1277.                     begin
  1278.                       // JP cc,nn
  1279.                       MCycles = 3'b011;
  1280.                       case (1'b1) // MCycle
  1281.                         MCycle[1] :
  1282.                           begin
  1283.                             Inc_PC = 1'b1;
  1284.                             LDZ = 1'b1;
  1285.                           end
  1286.                         MCycle[2] :
  1287.                           begin
  1288.                             Inc_PC = 1'b1;
  1289.                             if (is_cc_true(F, IR[5:3]) )
  1290.                               begin
  1291.                                 Jump = 1'b1;
  1292.                               end
  1293.                           end
  1294.                        
  1295.                         default :;
  1296.                       endcase
  1297.                     end // else: !if(DPAIR == 2'b11 )
  1298.                 end // case: 8'b11000010,8'b11001010,8'b11010010,8'b11011010,8'b11100010,8'b11101010,8'b11110010,8'b11111010
  1299.              
  1300.               8'b00011000  :
  1301.                 begin
  1302.                   if (Mode != 2 )
  1303.                     begin
  1304.                       // JR e
  1305.                       MCycles = 3'b011;
  1306.                       case (1'b1) // MCycle
  1307.                         MCycle[1] :
  1308.                           Inc_PC = 1'b1;
  1309.                         MCycle[2] :
  1310.                           begin
  1311.                             NoRead = 1'b1;
  1312.                             JumpE = 1'b1;
  1313.                             TStates = 3'b101;
  1314.                           end
  1315.                         default :;
  1316.                       endcase
  1317.                     end // if (Mode != 2 )
  1318.                 end // case: 8'b00011000
  1319.  
  1320.               // Conditional relative jumps (JR [C/NC/Z/NZ], e)
  1321.               8'b001zz000  :
  1322.                 begin
  1323.                   if (Mode != 2 )
  1324.                     begin
  1325.                       MCycles = 3'd3;
  1326.                       case (1'b1) // MCycle
  1327.                         MCycle[1] :
  1328.                           begin
  1329.                             Inc_PC = 1'b1;
  1330.  
  1331.                             case (IR[4:3])
  1332.                               0 : MCycles = (F[Flag_Z]) ? 3'd2 : 3'd3;
  1333.                               1 : MCycles = (!F[Flag_Z]) ? 3'd2 : 3'd3;
  1334.                               2 : MCycles = (F[Flag_C]) ? 3'd2 : 3'd3;
  1335.                               3 : MCycles = (!F[Flag_C]) ? 3'd2 : 3'd3;
  1336.                             endcase
  1337.                           end
  1338.                        
  1339.                         MCycle[2] :
  1340.                           begin
  1341.                             NoRead = 1'b1;
  1342.                             JumpE = 1'b1;
  1343.                             TStates = 3'd5;
  1344.                           end
  1345.                         default :;
  1346.                       endcase
  1347.                     end // if (Mode != 2 )
  1348.                 end // case: 8'b00111000              
  1349.              
  1350.               8'b11101001  :
  1351.                 // JP (HL)
  1352.                 JumpXY = 1'b1;
  1353.              
  1354.               8'b00010000  :
  1355.                 begin
  1356.                   if (Mode == 3 )
  1357.                     begin
  1358.                       I_DJNZ = 1'b1;
  1359.                     end
  1360.                   else if (Mode < 2 )
  1361.                     begin
  1362.                       // DJNZ,e
  1363.                       MCycles = 3'b011;
  1364.                       case (1'b1) // MCycle
  1365.                         MCycle[0] :
  1366.                           begin
  1367.                             TStates = 3'b101;
  1368.                             I_DJNZ = 1'b1;
  1369.                             Set_BusB_To = 4'b1010;
  1370.                             Set_BusA_To[2:0] = 3'b000;
  1371.                             Read_To_Reg = 1'b1;
  1372.                             Save_ALU = 1'b1;
  1373.                             ALU_Op = 4'b0010;
  1374.                           end
  1375.                         MCycle[1] :
  1376.                           begin
  1377.                             I_DJNZ = 1'b1;
  1378.                             Inc_PC = 1'b1;
  1379.                           end
  1380.                         MCycle[2] :
  1381.                           begin
  1382.                             NoRead = 1'b1;
  1383.                             JumpE = 1'b1;
  1384.                             TStates = 3'b101;
  1385.                           end
  1386.                         default :;
  1387.                       endcase
  1388.                     end // if (Mode < 2 )
  1389.                 end // case: 8'b00010000
  1390.              
  1391.  
  1392.               // CALL AND RETURN GROUP
  1393.               8'b11001101  :
  1394.                 begin
  1395.                   // CALL nn
  1396.                   MCycles = 3'b101;
  1397.                   case (1'b1) // MCycle
  1398.                     MCycle[1] :
  1399.                       begin
  1400.                         Inc_PC = 1'b1;
  1401.                         LDZ = 1'b1;
  1402.                       end
  1403.                     MCycle[2] :
  1404.                       begin
  1405.                         IncDec_16 = 4'b1111;
  1406.                         Inc_PC = 1'b1;
  1407.                         TStates = 3'b100;
  1408.                         Set_Addr_To = aSP;
  1409.                         LDW = 1'b1;
  1410.                         Set_BusB_To = 4'b1101;
  1411.                       end
  1412.                     MCycle[3] :
  1413.                       begin
  1414.                         Write = 1'b1;
  1415.                         IncDec_16 = 4'b1111;
  1416.                         Set_Addr_To = aSP;
  1417.                         Set_BusB_To = 4'b1100;
  1418.                       end
  1419.                     MCycle[4] :
  1420.                       begin
  1421.                         Write = 1'b1;
  1422.                         Call = 1'b1;
  1423.                       end
  1424.                     default :;
  1425.                   endcase // case(MCycle)
  1426.                 end // case: 8'b11001101
  1427.              
  1428.               8'b11zzz100  :
  1429.                 begin
  1430.                   if (IR[5] == 1'b0 || Mode != 3 )
  1431.                     begin
  1432.                       // CALL cc,nn
  1433.                       MCycles = 3'b101;
  1434.                       case (1'b1) // MCycle
  1435.                         MCycle[1] :
  1436.                           begin
  1437.                             Inc_PC = 1'b1;
  1438.                             LDZ = 1'b1;
  1439.                           end
  1440.                         MCycle[2] :
  1441.                           begin
  1442.                             Inc_PC = 1'b1;
  1443.                             LDW = 1'b1;
  1444.                             if (is_cc_true(F, IR[5:3]) )
  1445.                               begin
  1446.                                 IncDec_16 = 4'b1111;
  1447.                                 Set_Addr_To = aSP;
  1448.                                 TStates = 3'b100;
  1449.                                 Set_BusB_To = 4'b1101;
  1450.                               end
  1451.                             else
  1452.                               begin
  1453.                                 MCycles = 3'b011;
  1454.                               end // else: !if(is_cc_true(F, IR[5:3]) )
  1455.                           end // case: 3
  1456.                        
  1457.                         MCycle[3] :
  1458.                           begin
  1459.                             Write = 1'b1;
  1460.                             IncDec_16 = 4'b1111;
  1461.                             Set_Addr_To = aSP;
  1462.                             Set_BusB_To = 4'b1100;
  1463.                           end
  1464.                        
  1465.                         MCycle[4] :
  1466.                           begin
  1467.                             Write = 1'b1;
  1468.                             Call = 1'b1;
  1469.                           end
  1470.                        
  1471.                         default :;
  1472.                       endcase
  1473.                     end // if (IR[5] == 1'b0 || Mode != 3 )
  1474.                 end // case: 8'b11000100,8'b11001100,8'b11010100,8'b11011100,8'b11100100,8'b11101100,8'b11110100,8'b11111100
  1475.              
  1476.               8'b11001001  :
  1477.                 begin
  1478.                   // RET
  1479.                   MCycles = 3'b011;
  1480.                   case (1'b1) // MCycle
  1481.                     MCycle[0] :
  1482.                       begin
  1483.                         TStates = 3'b101;
  1484.                         Set_Addr_To = aSP;
  1485.                       end
  1486.                    
  1487.                     MCycle[1] :
  1488.                       begin
  1489.                         IncDec_16 = 4'b0111;
  1490.                         Set_Addr_To = aSP;
  1491.                         LDZ = 1'b1;
  1492.                       end
  1493.                    
  1494.                     MCycle[2] :
  1495.                       begin
  1496.                         Jump = 1'b1;
  1497.                         IncDec_16 = 4'b0111;
  1498.                       end
  1499.                    
  1500.                     default :;
  1501.                   endcase // case(MCycle)
  1502.                 end // case: 8'b11001001
  1503.              
  1504.               8'b11000000,8'b11001000,8'b11010000,8'b11011000,8'b11100000,8'b11101000,8'b11110000,8'b11111000  :
  1505.                 begin                  
  1506.                   if (IR[5] == 1'b1 && Mode == 3 )
  1507.                     begin
  1508.                       case (IR[4:3])
  1509.                         2'b00  :
  1510.                           begin
  1511.                             // LD ($FF00+nn),A
  1512.                             MCycles = 3'b011;
  1513.                             case (1'b1) // MCycle
  1514.                               MCycle[1] :
  1515.                                 begin
  1516.                                   Inc_PC = 1'b1;
  1517.                                   Set_Addr_To = aIOA;
  1518.                                   Set_BusB_To   = 4'b0111;
  1519.                                 end
  1520.                              
  1521.                               MCycle[2] :
  1522.                                 Write = 1'b1;
  1523.                               default :;
  1524.                             endcase // case(MCycle)
  1525.                           end // case: 2'b00
  1526.                        
  1527.                         2'b01  :
  1528.                           begin
  1529.                             // ADD SP,n
  1530.                             MCycles = 3'b011;
  1531.                             case (1'b1) // MCycle
  1532.                               MCycle[1] :
  1533.                                 begin
  1534.                                   ALU_Op = 4'b0000;
  1535.                                   Inc_PC = 1'b1;
  1536.                                   Read_To_Reg = 1'b1;
  1537.                                   Save_ALU = 1'b1;
  1538.                                   Set_BusA_To = 4'b1000;
  1539.                                   Set_BusB_To = 4'b0110;
  1540.                                 end
  1541.                              
  1542.                               MCycle[2] :
  1543.                                 begin
  1544.                                   NoRead = 1'b1;
  1545.                                   Read_To_Reg = 1'b1;
  1546.                                   Save_ALU = 1'b1;
  1547.                                   ALU_Op = 4'b0001;
  1548.                                   Set_BusA_To = 4'b1001;
  1549.                                   Set_BusB_To = 4'b1110;        // Incorrect unsigned !!!!!!!!!!!!!!!!!!!!!
  1550.                                 end
  1551.                              
  1552.                               default :;
  1553.                             endcase // case(MCycle)
  1554.                           end // case: 2'b01
  1555.                        
  1556.                         2'b10  :
  1557.                           begin
  1558.                             // LD A,($FF00+nn)
  1559.                             MCycles = 3'b011;
  1560.                             case (1'b1) // MCycle
  1561.                               MCycle[1] :
  1562.                                 begin
  1563.                                   Inc_PC = 1'b1;
  1564.                                   Set_Addr_To = aIOA;
  1565.                                 end
  1566.                              
  1567.                               MCycle[2] :
  1568.                                 Read_To_Acc = 1'b1;
  1569.                               default :;
  1570.                             endcase // case(MCycle)
  1571.                           end // case: 2'b10
  1572.                        
  1573.                         2'b11  :
  1574.                           begin
  1575.                             // LD HL,SP+n       -- Not correct !!!!!!!!!!!!!!!!!!!
  1576.                             MCycles = 3'b101;
  1577.                             case (1'b1) // MCycle
  1578.                               MCycle[1] :
  1579.                                 begin
  1580.                                   Inc_PC = 1'b1;
  1581.                                   LDZ = 1'b1;
  1582.                                 end
  1583.                              
  1584.                               MCycle[2] :
  1585.                                 begin
  1586.                                   Set_Addr_To = aZI;
  1587.                                   Inc_PC = 1'b1;
  1588.                                   LDW = 1'b1;
  1589.                                 end
  1590.                              
  1591.                               MCycle[3] :
  1592.                                 begin
  1593.                                   Set_BusA_To[2:0] = 3'b101; // L
  1594.                                   Read_To_Reg = 1'b1;
  1595.                                   Inc_WZ = 1'b1;
  1596.                                   Set_Addr_To = aZI;
  1597.                                 end
  1598.                              
  1599.                               MCycle[4] :
  1600.                                 begin
  1601.                                   Set_BusA_To[2:0] = 3'b100; // H
  1602.                                   Read_To_Reg = 1'b1;
  1603.                                 end
  1604.                              
  1605.                               default :;
  1606.                             endcase // case(MCycle)
  1607.                           end // case: 2'b11
  1608.                        
  1609.                       endcase // case(IR[4:3])
  1610.                      
  1611.                     end
  1612.                   else
  1613.                     begin
  1614.                       // RET cc
  1615.                       MCycles = 3'b011;
  1616.                       case (1'b1) // MCycle
  1617.                         MCycle[0] :
  1618.                           begin
  1619.                             if (is_cc_true(F, IR[5:3]) )                              
  1620.                               begin
  1621.                                 Set_Addr_To = aSP;
  1622.                               end
  1623.                             else
  1624.                               begin
  1625.                                 MCycles = 3'b001;
  1626.                               end
  1627.                             TStates = 3'b101;
  1628.                           end // case: 1
  1629.                        
  1630.                         MCycle[1] :
  1631.                           begin
  1632.                             IncDec_16 = 4'b0111;
  1633.                             Set_Addr_To = aSP;
  1634.                             LDZ = 1'b1;
  1635.                           end
  1636.                         MCycle[2] :
  1637.                           begin
  1638.                             Jump = 1'b1;
  1639.                             IncDec_16 = 4'b0111;
  1640.                           end
  1641.                         default :;
  1642.                       endcase
  1643.                     end // else: !if(IR[5] == 1'b1 && Mode == 3 )
  1644.                 end // case: 8'b11000000,8'b11001000,8'b11010000,8'b11011000,8'b11100000,8'b11101000,8'b11110000,8'b11111000
  1645.              
  1646.               8'b11000111,8'b11001111,8'b11010111,8'b11011111,8'b11100111,8'b11101111,8'b11110111,8'b11111111  :
  1647.                 begin
  1648.                   // RST p
  1649.                   MCycles = 3'b011;
  1650.                   case (1'b1) // MCycle
  1651.                     MCycle[0] :
  1652.                       begin
  1653.                         TStates = 3'b101;
  1654.                         IncDec_16 = 4'b1111;
  1655.                         Set_Addr_To = aSP;
  1656.                         Set_BusB_To = 4'b1101;
  1657.                       end
  1658.                    
  1659.                     MCycle[1] :
  1660.                       begin
  1661.                         Write = 1'b1;
  1662.                         IncDec_16 = 4'b1111;
  1663.                         Set_Addr_To = aSP;
  1664.                         Set_BusB_To = 4'b1100;
  1665.                       end
  1666.                    
  1667.                     MCycle[2] :
  1668.                       begin
  1669.                         Write = 1'b1;
  1670.                         RstP = 1'b1;
  1671.                       end
  1672.                    
  1673.                     default :;
  1674.                   endcase // case(MCycle)
  1675.                 end // case: 8'b11000111,8'b11001111,8'b11010111,8'b11011111,8'b11100111,8'b11101111,8'b11110111,8'b11111111
  1676.              
  1677.               // INPUT AND OUTPUT GROUP
  1678.               8'b11011011  :
  1679.                 begin
  1680.                   if (Mode != 3 )
  1681.                     begin
  1682.                       // IN A,(n)
  1683.                       MCycles = 3'b011;
  1684.                       case (1'b1) // MCycle
  1685.                         MCycle[1] :
  1686.                           begin
  1687.                             Inc_PC = 1'b1;
  1688.                             Set_Addr_To = aIOA;
  1689.                           end
  1690.                        
  1691.                         MCycle[2] :
  1692.                           begin
  1693.                             Read_To_Acc = 1'b1;
  1694.                             IORQ = 1'b1;
  1695.                           end
  1696.                        
  1697.                         default :;
  1698.                       endcase
  1699.                     end // if (Mode != 3 )
  1700.                 end // case: 8'b11011011
  1701.              
  1702.               8'b11010011  :
  1703.                 begin
  1704.                   if (Mode != 3 )
  1705.                     begin
  1706.                       // OUT (n),A
  1707.                       MCycles = 3'b011;
  1708.                       case (1'b1) // MCycle
  1709.                         MCycle[1] :
  1710.                           begin
  1711.                             Inc_PC = 1'b1;
  1712.                             Set_Addr_To = aIOA;
  1713.                             Set_BusB_To = 4'b0111;
  1714.                           end
  1715.                        
  1716.                         MCycle[2] :
  1717.                           begin
  1718.                             Write = 1'b1;
  1719.                             IORQ = 1'b1;
  1720.                           end
  1721.                        
  1722.                         default :;
  1723.                       endcase
  1724.                     end // if (Mode != 3 )
  1725.                 end // case: 8'b11010011
  1726.              
  1727.  
  1728.               //----------------------------------------------------------------------------
  1729.               //----------------------------------------------------------------------------
  1730.               // MULTIBYTE INSTRUCTIONS
  1731.               //----------------------------------------------------------------------------
  1732.               //----------------------------------------------------------------------------
  1733.  
  1734.               8'b11001011  :
  1735.                 begin
  1736.                   if (Mode != 2 )
  1737.                     begin
  1738.                       Prefix = 2'b01;
  1739.                     end
  1740.                 end              
  1741.  
  1742.               8'b11101101  :
  1743.                 begin
  1744.                   if (Mode < 2 )
  1745.                     begin
  1746.                       Prefix = 2'b10;
  1747.                     end
  1748.                 end
  1749.  
  1750.               8'b11011101,8'b11111101  :
  1751.                 begin
  1752.                   if (Mode < 2 )
  1753.                     begin
  1754.                       Prefix = 2'b11;
  1755.                     end
  1756.                 end
  1757.              
  1758.             endcase // case(IR)
  1759.           end // case: 2'b00
  1760.        
  1761.  
  1762.         2'b01  :
  1763.           begin
  1764.            
  1765.  
  1766.             //----------------------------------------------------------------------------
  1767.             //
  1768.             //  CB prefixed instructions
  1769.             //
  1770.             //----------------------------------------------------------------------------
  1771.            
  1772.             Set_BusA_To[2:0] = IR[2:0];
  1773.             Set_BusB_To[2:0] = IR[2:0];
  1774.            
  1775.             casez (IR)
  1776.               8'b00000000,8'b00000001,8'b00000010,8'b00000011,8'b00000100,8'b00000101,8'b00000111,
  1777.               8'b00010000,8'b00010001,8'b00010010,8'b00010011,8'b00010100,8'b00010101,8'b00010111,
  1778.               8'b00001000,8'b00001001,8'b00001010,8'b00001011,8'b00001100,8'b00001101,8'b00001111,
  1779.               8'b00011000,8'b00011001,8'b00011010,8'b00011011,8'b00011100,8'b00011101,8'b00011111,
  1780.               8'b00100000,8'b00100001,8'b00100010,8'b00100011,8'b00100100,8'b00100101,8'b00100111,
  1781.               8'b00101000,8'b00101001,8'b00101010,8'b00101011,8'b00101100,8'b00101101,8'b00101111,
  1782.               8'b00110000,8'b00110001,8'b00110010,8'b00110011,8'b00110100,8'b00110101,8'b00110111,
  1783.               8'b00111000,8'b00111001,8'b00111010,8'b00111011,8'b00111100,8'b00111101,8'b00111111 :
  1784.                 begin
  1785.                   // RLC r
  1786.                   // RL r
  1787.                   // RRC r
  1788.                   // RR r
  1789.                   // SLA r
  1790.                   // SRA r
  1791.                   // SRL r
  1792.                   // SLL r (Undocumented) / SWAP r
  1793.                   if (MCycle[0] ) begin
  1794.                     ALU_Op = 4'b1000;
  1795.                     Read_To_Reg = 1'b1;
  1796.                     Save_ALU = 1'b1;
  1797.                   end
  1798.                 end // case: 8'b00000000,8'b00000001,8'b00000010,8'b00000011,8'b00000100,8'b00000101,8'b00000111,...
  1799.              
  1800.               8'b00zzz110  :
  1801.                 begin
  1802.                   // RLC (HL)
  1803.                   // RL (HL)
  1804.                   // RRC (HL)
  1805.                   // RR (HL)
  1806.                   // SRA (HL)
  1807.                   // SRL (HL)
  1808.                   // SLA (HL)
  1809.                   // SLL (HL) (Undocumented) / SWAP (HL)
  1810.                   MCycles = 3'b011;
  1811.                   case (1'b1) // MCycle
  1812.                     MCycle[0], MCycle[6] :
  1813.                       Set_Addr_To = aXY;
  1814.                     MCycle[1] :
  1815.                       begin
  1816.                         ALU_Op = 4'b1000;
  1817.                         Read_To_Reg = 1'b1;
  1818.                         Save_ALU = 1'b1;
  1819.                         Set_Addr_To = aXY;
  1820.                         TStates = 3'b100;
  1821.                       end
  1822.                    
  1823.                     MCycle[2] :
  1824.                       Write = 1'b1;
  1825.                     default :;
  1826.                   endcase // case(MCycle)
  1827.                 end // case: 8'b00000110,8'b00010110,8'b00001110,8'b00011110,8'b00101110,8'b00111110,8'b00100110,8'b00110110
  1828.              
  1829.               8'b01000000,8'b01000001,8'b01000010,8'b01000011,8'b01000100,8'b01000101,8'b01000111,
  1830.                   8'b01001000,8'b01001001,8'b01001010,8'b01001011,8'b01001100,8'b01001101,8'b01001111,
  1831.                   8'b01010000,8'b01010001,8'b01010010,8'b01010011,8'b01010100,8'b01010101,8'b01010111,
  1832.                   8'b01011000,8'b01011001,8'b01011010,8'b01011011,8'b01011100,8'b01011101,8'b01011111,
  1833.                   8'b01100000,8'b01100001,8'b01100010,8'b01100011,8'b01100100,8'b01100101,8'b01100111,
  1834.                   8'b01101000,8'b01101001,8'b01101010,8'b01101011,8'b01101100,8'b01101101,8'b01101111,
  1835.                   8'b01110000,8'b01110001,8'b01110010,8'b01110011,8'b01110100,8'b01110101,8'b01110111,
  1836.                   8'b01111000,8'b01111001,8'b01111010,8'b01111011,8'b01111100,8'b01111101,8'b01111111 :
  1837.                     begin
  1838.                       // BIT b,r
  1839.                       if (MCycle[0] )
  1840.                         begin
  1841.                           Set_BusB_To[2:0] = IR[2:0];
  1842.                           ALU_Op = 4'b1001;
  1843.                         end
  1844.                     end // case: 8'b01000000,8'b01000001,8'b01000010,8'b01000011,8'b01000100,8'b01000101,8'b01000111,...
  1845.              
  1846.               8'b01000110,8'b01001110,8'b01010110,8'b01011110,8'b01100110,8'b01101110,8'b01110110,8'b01111110  :
  1847.                 begin
  1848.                   // BIT b,(HL)
  1849.                   MCycles = 3'b010;
  1850.                   case (1'b1) // MCycle
  1851.                     MCycle[0], MCycle[6] :
  1852.                       Set_Addr_To = aXY;
  1853.                     MCycle[1] :
  1854.                       begin
  1855.                         ALU_Op = 4'b1001;
  1856.                         TStates = 3'b100;
  1857.                       end
  1858.                    
  1859.                     default :;
  1860.                   endcase // case(MCycle)
  1861.                 end // case: 8'b01000110,8'b01001110,8'b01010110,8'b01011110,8'b01100110,8'b01101110,8'b01110110,8'b01111110
  1862.              
  1863.               8'b11000000,8'b11000001,8'b11000010,8'b11000011,8'b11000100,8'b11000101,8'b11000111,
  1864.                   8'b11001000,8'b11001001,8'b11001010,8'b11001011,8'b11001100,8'b11001101,8'b11001111,
  1865.                   8'b11010000,8'b11010001,8'b11010010,8'b11010011,8'b11010100,8'b11010101,8'b11010111,
  1866.                   8'b11011000,8'b11011001,8'b11011010,8'b11011011,8'b11011100,8'b11011101,8'b11011111,
  1867.                   8'b11100000,8'b11100001,8'b11100010,8'b11100011,8'b11100100,8'b11100101,8'b11100111,
  1868.                   8'b11101000,8'b11101001,8'b11101010,8'b11101011,8'b11101100,8'b11101101,8'b11101111,
  1869.                   8'b11110000,8'b11110001,8'b11110010,8'b11110011,8'b11110100,8'b11110101,8'b11110111,
  1870.                   8'b11111000,8'b11111001,8'b11111010,8'b11111011,8'b11111100,8'b11111101,8'b11111111 :
  1871.                     begin
  1872.                       // SET b,r
  1873.                       if (MCycle[0] )
  1874.                         begin
  1875.                           ALU_Op = 4'b1010;
  1876.                           Read_To_Reg = 1'b1;
  1877.                           Save_ALU = 1'b1;
  1878.                         end
  1879.                     end // case: 8'b11000000,8'b11000001,8'b11000010,8'b11000011,8'b11000100,8'b11000101,8'b11000111,...
  1880.              
  1881.               8'b11000110,8'b11001110,8'b11010110,8'b11011110,8'b11100110,8'b11101110,8'b11110110,8'b11111110  :
  1882.                 begin
  1883.                   // SET b,(HL)
  1884.                   MCycles = 3'b011;
  1885.                   case (1'b1) // MCycle
  1886.                     MCycle[0], MCycle[6] :
  1887.                       Set_Addr_To = aXY;
  1888.                     MCycle[1] :
  1889.                       begin
  1890.                         ALU_Op = 4'b1010;
  1891.                         Read_To_Reg = 1'b1;
  1892.                         Save_ALU = 1'b1;
  1893.                         Set_Addr_To = aXY;
  1894.                         TStates = 3'b100;
  1895.                       end
  1896.                     MCycle[2] :
  1897.                       Write = 1'b1;
  1898.                     default :;
  1899.                   endcase // case(MCycle)
  1900.                 end // case: 8'b11000110,8'b11001110,8'b11010110,8'b11011110,8'b11100110,8'b11101110,8'b11110110,8'b11111110
  1901.              
  1902.               8'b10000000,8'b10000001,8'b10000010,8'b10000011,8'b10000100,8'b10000101,8'b10000111,
  1903.                   8'b10001000,8'b10001001,8'b10001010,8'b10001011,8'b10001100,8'b10001101,8'b10001111,
  1904.                   8'b10010000,8'b10010001,8'b10010010,8'b10010011,8'b10010100,8'b10010101,8'b10010111,
  1905.                   8'b10011000,8'b10011001,8'b10011010,8'b10011011,8'b10011100,8'b10011101,8'b10011111,
  1906.                   8'b10100000,8'b10100001,8'b10100010,8'b10100011,8'b10100100,8'b10100101,8'b10100111,
  1907.                   8'b10101000,8'b10101001,8'b10101010,8'b10101011,8'b10101100,8'b10101101,8'b10101111,
  1908.                   8'b10110000,8'b10110001,8'b10110010,8'b10110011,8'b10110100,8'b10110101,8'b10110111,
  1909.                   8'b10111000,8'b10111001,8'b10111010,8'b10111011,8'b10111100,8'b10111101,8'b10111111 :
  1910.                     begin
  1911.                       // RES b,r
  1912.                       if (MCycle[0] )
  1913.                         begin
  1914.                           ALU_Op = 4'b1011;
  1915.                           Read_To_Reg = 1'b1;
  1916.                           Save_ALU = 1'b1;
  1917.                         end
  1918.                     end // case: 8'b10000000,8'b10000001,8'b10000010,8'b10000011,8'b10000100,8'b10000101,8'b10000111,...
  1919.              
  1920.               8'b10000110,8'b10001110,8'b10010110,8'b10011110,8'b10100110,8'b10101110,8'b10110110,8'b10111110  :
  1921.                 begin
  1922.                   // RES b,(HL)
  1923.                   MCycles = 3'b011;
  1924.                   case (1'b1) // MCycle
  1925.                     MCycle[0], MCycle[6] :
  1926.                       Set_Addr_To = aXY;
  1927.                     MCycle[1] :
  1928.                       begin
  1929.                         ALU_Op = 4'b1011;
  1930.                         Read_To_Reg = 1'b1;
  1931.                         Save_ALU = 1'b1;
  1932.                         Set_Addr_To = aXY;
  1933.                         TStates = 3'b100;
  1934.                       end
  1935.                    
  1936.                     MCycle[2] :
  1937.                       Write = 1'b1;
  1938.                     default :;
  1939.                   endcase // case(MCycle)
  1940.                 end // case: 8'b10000110,8'b10001110,8'b10010110,8'b10011110,8'b10100110,8'b10101110,8'b10110110,8'b10111110
  1941.              
  1942.             endcase // case(IR)
  1943.           end // case: 2'b01
  1944.        
  1945.        
  1946.         default :
  1947.           begin : default_ed_block
  1948.            
  1949.             //----------------------------------------------------------------------------
  1950.             //
  1951.             //  ED prefixed instructions
  1952.             //
  1953.             //----------------------------------------------------------------------------
  1954.  
  1955.             casez (IR)
  1956.               /*
  1957.                * Undocumented NOP instructions commented out to reduce size of mcode
  1958.                *
  1959.               8'b00000000,8'b00000001,8'b00000010,8'b00000011,8'b00000100,8'b00000101,8'b00000110,8'b00000111
  1960.                 ,8'b00001000,8'b00001001,8'b00001010,8'b00001011,8'b00001100,8'b00001101,8'b00001110,8'b00001111
  1961.                   ,8'b00010000,8'b00010001,8'b00010010,8'b00010011,8'b00010100,8'b00010101,8'b00010110,8'b00010111
  1962.                     ,8'b00011000,8'b00011001,8'b00011010,8'b00011011,8'b00011100,8'b00011101,8'b00011110,8'b00011111
  1963.                       ,8'b00100000,8'b00100001,8'b00100010,8'b00100011,8'b00100100,8'b00100101,8'b00100110,8'b00100111
  1964.                         ,8'b00101000,8'b00101001,8'b00101010,8'b00101011,8'b00101100,8'b00101101,8'b00101110,8'b00101111
  1965.                           ,8'b00110000,8'b00110001,8'b00110010,8'b00110011,8'b00110100,8'b00110101,8'b00110110,8'b00110111
  1966.                             ,8'b00111000,8'b00111001,8'b00111010,8'b00111011,8'b00111100,8'b00111101,8'b00111110,8'b00111111
  1967.                
  1968.  
  1969.                               ,8'b10000000,8'b10000001,8'b10000010,8'b10000011,8'b10000100,8'b10000101,8'b10000110,8'b10000111
  1970.                                 ,8'b10001000,8'b10001001,8'b10001010,8'b10001011,8'b10001100,8'b10001101,8'b10001110,8'b10001111
  1971.                                   ,8'b10010000,8'b10010001,8'b10010010,8'b10010011,8'b10010100,8'b10010101,8'b10010110,8'b10010111
  1972.                                     ,8'b10011000,8'b10011001,8'b10011010,8'b10011011,8'b10011100,8'b10011101,8'b10011110,8'b10011111
  1973.                                       ,                                            8'b10100100,8'b10100101,8'b10100110,8'b10100111
  1974.                                         ,                                            8'b10101100,8'b10101101,8'b10101110,8'b10101111
  1975.                                           ,                                            8'b10110100,8'b10110101,8'b10110110,8'b10110111
  1976.                                             ,                                            8'b10111100,8'b10111101,8'b10111110,8'b10111111
  1977.                                               ,8'b11000000,8'b11000001,8'b11000010,8'b11000011,8'b11000100,8'b11000101,8'b11000110,8'b11000111
  1978.                                                 ,8'b11001000,8'b11001001,8'b11001010,8'b11001011,8'b11001100,8'b11001101,8'b11001110,8'b11001111
  1979.                                                   ,8'b11010000,8'b11010001,8'b11010010,8'b11010011,8'b11010100,8'b11010101,8'b11010110,8'b11010111
  1980.                                                     ,8'b11011000,8'b11011001,8'b11011010,8'b11011011,8'b11011100,8'b11011101,8'b11011110,8'b11011111
  1981.                                                       ,8'b11100000,8'b11100001,8'b11100010,8'b11100011,8'b11100100,8'b11100101,8'b11100110,8'b11100111
  1982.                                                         ,8'b11101000,8'b11101001,8'b11101010,8'b11101011,8'b11101100,8'b11101101,8'b11101110,8'b11101111
  1983.                                                           ,8'b11110000,8'b11110001,8'b11110010,8'b11110011,8'b11110100,8'b11110101,8'b11110110,8'b11110111
  1984.                                                             ,8'b11111000,8'b11111001,8'b11111010,8'b11111011,8'b11111100,8'b11111101,8'b11111110,8'b11111111 :
  1985.                                                               ; // NOP, undocumented
  1986.              
  1987.               8'b01111110,8'b01111111  :
  1988.                 // NOP, undocumented
  1989.                 ;
  1990.                */
  1991.              
  1992.               // 8 BIT LOAD GROUP
  1993.               8'b01010111  :
  1994.                 begin
  1995.                   // LD A,I
  1996.                   Special_LD = 3'b100;
  1997.                   TStates = 3'b101;
  1998.                 end
  1999.              
  2000.               8'b01011111  :
  2001.                 begin
  2002.                   // LD A,R
  2003.                   Special_LD = 3'b101;
  2004.                   TStates = 3'b101;
  2005.                 end
  2006.              
  2007.               8'b01000111  :
  2008.                 begin
  2009.                   // LD I,A
  2010.                   Special_LD = 3'b110;
  2011.                   TStates = 3'b101;
  2012.                 end
  2013.              
  2014.               8'b01001111  :
  2015.                 begin
  2016.                   // LD R,A
  2017.                   Special_LD = 3'b111;
  2018.                   TStates = 3'b101;
  2019.                 end
  2020.              
  2021.               // 16 BIT LOAD GROUP
  2022.               8'b01001011,8'b01011011,8'b01101011,8'b01111011  :
  2023.                 begin
  2024.                   // LD dd,(nn)
  2025.                   MCycles = 3'b101;
  2026.                   case (1'b1) // MCycle
  2027.                     MCycle[1] :
  2028.                       begin
  2029.                         Inc_PC = 1'b1;
  2030.                         LDZ = 1'b1;
  2031.                       end
  2032.                    
  2033.                     MCycle[2] :
  2034.                       begin
  2035.                         Set_Addr_To = aZI;
  2036.                         Inc_PC = 1'b1;
  2037.                         LDW = 1'b1;
  2038.                       end
  2039.                    
  2040.                     MCycle[3] :
  2041.                       begin
  2042.                         Read_To_Reg = 1'b1;
  2043.                         if (IR[5:4] == 2'b11 )
  2044.                           begin
  2045.                             Set_BusA_To = 4'b1000;
  2046.                           end
  2047.                         else
  2048.                           begin
  2049.                             Set_BusA_To[2:1] = IR[5:4];
  2050.                             Set_BusA_To[0] = 1'b1;
  2051.                           end
  2052.                         Inc_WZ = 1'b1;
  2053.                         Set_Addr_To = aZI;
  2054.                       end // case: 4
  2055.                    
  2056.                     MCycle[4] :
  2057.                       begin
  2058.                         Read_To_Reg = 1'b1;
  2059.                         if (IR[5:4] == 2'b11 )
  2060.                           begin
  2061.                             Set_BusA_To = 4'b1001;
  2062.                           end
  2063.                         else
  2064.                           begin
  2065.                             Set_BusA_To[2:1] = IR[5:4];
  2066.                             Set_BusA_To[0] = 1'b0;
  2067.                           end
  2068.                       end // case: 5
  2069.                    
  2070.                     default :;
  2071.                   endcase // case(MCycle)
  2072.                 end // case: 8'b01001011,8'b01011011,8'b01101011,8'b01111011
  2073.              
  2074.              
  2075.               8'b01000011,8'b01010011,8'b01100011,8'b01110011  :
  2076.                 begin
  2077.                   // LD (nn),dd
  2078.                   MCycles = 3'b101;
  2079.                   case (1'b1) // MCycle
  2080.                     MCycle[1] :
  2081.                       begin
  2082.                         Inc_PC = 1'b1;
  2083.                         LDZ = 1'b1;
  2084.                       end
  2085.                    
  2086.                     MCycle[2] :
  2087.                       begin
  2088.                         Set_Addr_To = aZI;
  2089.                         Inc_PC = 1'b1;
  2090.                         LDW = 1'b1;
  2091.                         if (IR[5:4] == 2'b11 )
  2092.                           begin
  2093.                             Set_BusB_To = 4'b1000;
  2094.                           end
  2095.                         else
  2096.                           begin
  2097.                             Set_BusB_To[2:1] = IR[5:4];
  2098.                             Set_BusB_To[0] = 1'b1;
  2099.                             Set_BusB_To[3] = 1'b0;
  2100.                           end
  2101.                       end // case: 3
  2102.                    
  2103.                     MCycle[3] :
  2104.                       begin
  2105.                         Inc_WZ = 1'b1;
  2106.                         Set_Addr_To = aZI;
  2107.                         Write = 1'b1;
  2108.                         if (IR[5:4] == 2'b11 )
  2109.                           begin
  2110.                             Set_BusB_To = 4'b1001;
  2111.                           end
  2112.                         else
  2113.                           begin
  2114.                             Set_BusB_To[2:1] = IR[5:4];
  2115.                             Set_BusB_To[0] = 1'b0;
  2116.                             Set_BusB_To[3] = 1'b0;
  2117.                           end
  2118.                       end // case: 4
  2119.                    
  2120.                     MCycle[4] :
  2121.                       begin
  2122.                         Write = 1'b1;
  2123.                       end
  2124.                    
  2125.                     default :;
  2126.                   endcase // case(MCycle)
  2127.                 end // case: 8'b01000011,8'b01010011,8'b01100011,8'b01110011
  2128.              
  2129.               8'b10100000 , 8'b10101000 , 8'b10110000 , 8'b10111000  :
  2130.                 begin
  2131.                   // LDI, LDD, LDIR, LDDR
  2132.                   MCycles = 3'b100;
  2133.                   case (1'b1) // MCycle
  2134.                     MCycle[0] :
  2135.                       begin
  2136.                         Set_Addr_To = aXY;
  2137.                         IncDec_16 = 4'b1100; // BC
  2138.                       end
  2139.                    
  2140.                     MCycle[1] :
  2141.                       begin
  2142.                         Set_BusB_To = 4'b0110;
  2143.                         Set_BusA_To[2:0] = 3'b111;
  2144.                         ALU_Op = 4'b0000;
  2145.                         Set_Addr_To = aDE;
  2146.                         if (IR[3] == 1'b0 )
  2147.                           begin
  2148.                             IncDec_16 = 4'b0110; // IX
  2149.                           end
  2150.                         else
  2151.                           begin
  2152.                             IncDec_16 = 4'b1110;
  2153.                           end
  2154.                       end // case: 2
  2155.                    
  2156.                     MCycle[2] :
  2157.                       begin
  2158.                         I_BT = 1'b1;
  2159.                         TStates = 3'b101;
  2160.                         Write = 1'b1;
  2161.                         if (IR[3] == 1'b0 )
  2162.                           begin
  2163.                             IncDec_16 = 4'b0101; // DE
  2164.                           end
  2165.                         else
  2166.                           begin
  2167.                             IncDec_16 = 4'b1101;
  2168.                           end
  2169.                       end // case: 3
  2170.                    
  2171.                     MCycle[3] :
  2172.                       begin
  2173.                         NoRead = 1'b1;
  2174.                         TStates = 3'b101;
  2175.                       end
  2176.                    
  2177.                     default :;
  2178.                   endcase // case(MCycle)
  2179.                 end // case: 8'b10100000 , 8'b10101000 , 8'b10110000 , 8'b10111000
  2180.              
  2181.               8'b10100001 , 8'b10101001 , 8'b10110001 , 8'b10111001  :
  2182.                 begin
  2183.                   // CPI, CPD, CPIR, CPDR
  2184.                   MCycles = 3'b100;
  2185.                   case (1'b1) // MCycle
  2186.                     MCycle[0] :
  2187.                       begin
  2188.                         Set_Addr_To = aXY;
  2189.                         IncDec_16 = 4'b1100; // BC
  2190.                       end
  2191.                    
  2192.                     MCycle[1] :
  2193.                       begin
  2194.                         Set_BusB_To = 4'b0110;
  2195.                         Set_BusA_To[2:0] = 3'b111;
  2196.                         ALU_Op = 4'b0111;
  2197.                         Save_ALU = 1'b1;
  2198.                         PreserveC = 1'b1;
  2199.                         if (IR[3] == 1'b0 )
  2200.                           begin
  2201.                             IncDec_16 = 4'b0110;
  2202.                           end
  2203.                         else
  2204.                           begin
  2205.                             IncDec_16 = 4'b1110;
  2206.                           end
  2207.                       end // case: 2
  2208.                    
  2209.                     MCycle[2] :
  2210.                       begin
  2211.                         NoRead = 1'b1;
  2212.                         I_BC = 1'b1;
  2213.                         TStates = 3'b101;
  2214.                       end
  2215.                    
  2216.                     MCycle[3] :
  2217.                       begin
  2218.                         NoRead = 1'b1;
  2219.                         TStates = 3'b101;
  2220.                       end
  2221.                    
  2222.                     default :;
  2223.                   endcase // case(MCycle)
  2224.                 end // case: 8'b10100001 , 8'b10101001 , 8'b10110001 , 8'b10111001
  2225.              
  2226.               8'b01000100,8'b01001100,8'b01010100,8'b01011100,8'b01100100,8'b01101100,8'b01110100,8'b01111100  :
  2227.                 begin
  2228.                   // NEG
  2229.                   ALU_Op = 4'b0010;
  2230.                   Set_BusB_To = 4'b0111;
  2231.                   Set_BusA_To = 4'b1010;
  2232.                   Read_To_Acc = 1'b1;
  2233.                   Save_ALU = 1'b1;
  2234.                 end
  2235.              
  2236.               8'b01000110,8'b01001110,8'b01100110,8'b01101110  :
  2237.                 begin
  2238.                   // IM 0
  2239.                   IMode = 2'b00;
  2240.                 end
  2241.              
  2242.               8'b01010110,8'b01110110  :
  2243.                 // IM 1
  2244.                 IMode = 2'b01;
  2245.              
  2246.               8'b01011110,8'b01110111  :
  2247.                 // IM 2
  2248.                 IMode = 2'b10;
  2249.              
  2250.               // 16 bit arithmetic
  2251.               8'b01001010,8'b01011010,8'b01101010,8'b01111010  :
  2252.                 begin
  2253.                   // ADC HL,ss
  2254.                   MCycles = 3'b011;
  2255.                   case (1'b1) // MCycle
  2256.                     MCycle[1] :
  2257.                       begin
  2258.                         NoRead = 1'b1;
  2259.                         ALU_Op = 4'b0001;
  2260.                         Read_To_Reg = 1'b1;
  2261.                         Save_ALU = 1'b1;
  2262.                         Set_BusA_To[2:0] = 3'b101;
  2263.                         case (IR[5:4])
  2264.                           0,1,2  :
  2265.                             begin
  2266.                               Set_BusB_To[2:1] = IR[5:4];
  2267.                               Set_BusB_To[0] = 1'b1;
  2268.                             end
  2269.                           default :
  2270.                             Set_BusB_To = 4'b1000;
  2271.                         endcase
  2272.                         TStates = 3'b100;
  2273.                       end // case: 2
  2274.                    
  2275.                     MCycle[2] :
  2276.                       begin
  2277.                         NoRead = 1'b1;
  2278.                         Read_To_Reg = 1'b1;
  2279.                         Save_ALU = 1'b1;
  2280.                         ALU_Op = 4'b0001;
  2281.                         Set_BusA_To[2:0] = 3'b100;
  2282.                         case (IR[5:4])
  2283.                           0,1,2  :
  2284.                             begin
  2285.                               Set_BusB_To[2:1] = IR[5:4];
  2286.                               Set_BusB_To[0] = 1'b0;
  2287.                             end
  2288.                           default :
  2289.                             Set_BusB_To = 4'b1001;
  2290.                         endcase // case(IR[5:4])
  2291.                       end // case: 3
  2292.                    
  2293.                     default :;
  2294.                   endcase // case(MCycle)
  2295.                 end // case: 8'b01001010,8'b01011010,8'b01101010,8'b01111010
  2296.              
  2297.               8'b01000010,8'b01010010,8'b01100010,8'b01110010  :
  2298.                 begin
  2299.                   // SBC HL,ss
  2300.                   MCycles = 3'b011;
  2301.                   case (1'b1) // MCycle
  2302.                     MCycle[1] :
  2303.                       begin
  2304.                         NoRead = 1'b1;
  2305.                         ALU_Op = 4'b0011;
  2306.                         Read_To_Reg = 1'b1;
  2307.                         Save_ALU = 1'b1;
  2308.                         Set_BusA_To[2:0] = 3'b101;
  2309.                         case (IR[5:4])
  2310.                           0,1,2  :
  2311.                             begin
  2312.                               Set_BusB_To[2:1] = IR[5:4];
  2313.                               Set_BusB_To[0] = 1'b1;
  2314.                             end
  2315.                           default :
  2316.                             Set_BusB_To = 4'b1000;
  2317.                         endcase
  2318.                         TStates = 3'b100;
  2319.                       end // case: 2
  2320.                    
  2321.                     MCycle[2] :
  2322.                       begin
  2323.                         NoRead = 1'b1;
  2324.                         ALU_Op = 4'b0011;
  2325.                         Read_To_Reg = 1'b1;
  2326.                         Save_ALU = 1'b1;
  2327.                         Set_BusA_To[2:0] = 3'b100;
  2328.                         case (IR[5:4])
  2329.                           0,1,2  :
  2330.                             Set_BusB_To[2:1] = IR[5:4];
  2331.                           default :
  2332.                             Set_BusB_To = 4'b1001;
  2333.                         endcase
  2334.                       end // case: 3
  2335.                    
  2336.                     default :;
  2337.                    
  2338.                   endcase // case(MCycle)
  2339.                 end // case: 8'b01000010,8'b01010010,8'b01100010,8'b01110010
  2340.              
  2341.               8'b01101111  :
  2342.                 begin
  2343.                   // RLD
  2344.                   MCycles = 3'b100;
  2345.                   case (1'b1) // MCycle
  2346.                     MCycle[1] :
  2347.                       begin
  2348.                         NoRead = 1'b1;
  2349.                         Set_Addr_To = aXY;
  2350.                       end
  2351.                    
  2352.                     MCycle[2] :
  2353.                       begin
  2354.                         Read_To_Reg = 1'b1;
  2355.                         Set_BusB_To[2:0] = 3'b110;
  2356.                         Set_BusA_To[2:0] = 3'b111;
  2357.                         ALU_Op = 4'b1101;
  2358.                         TStates = 3'b100;
  2359.                         Set_Addr_To = aXY;
  2360.                         Save_ALU = 1'b1;
  2361.                       end
  2362.                    
  2363.                     MCycle[3] :
  2364.                       begin
  2365.                         I_RLD = 1'b1;
  2366.                         Write = 1'b1;
  2367.                       end
  2368.                    
  2369.                     default :;
  2370.                   endcase // case(MCycle)
  2371.                 end // case: 8'b01101111
  2372.              
  2373.               8'b01100111  :
  2374.                 begin
  2375.                   // RRD
  2376.                   MCycles = 3'b100;
  2377.                   case (1'b1) // MCycle
  2378.                     MCycle[1] :
  2379.                       Set_Addr_To = aXY;
  2380.                     MCycle[2] :
  2381.                       begin
  2382.                         Read_To_Reg = 1'b1;
  2383.                         Set_BusB_To[2:0] = 3'b110;
  2384.                         Set_BusA_To[2:0] = 3'b111;
  2385.                         ALU_Op = 4'b1110;
  2386.                         TStates = 3'b100;
  2387.                         Set_Addr_To = aXY;
  2388.                         Save_ALU = 1'b1;
  2389.                       end
  2390.                    
  2391.                     MCycle[3] :
  2392.                       begin
  2393.                         I_RRD = 1'b1;
  2394.                         Write = 1'b1;
  2395.                       end
  2396.                    
  2397.                     default :;
  2398.                   endcase // case(MCycle)
  2399.                 end // case: 8'b01100111
  2400.              
  2401.               8'b01000101,8'b01001101,8'b01010101,8'b01011101,8'b01100101,8'b01101101,8'b01110101,8'b01111101  :
  2402.                 begin
  2403.                   // RETI, RETN
  2404.                   MCycles = 3'b011;
  2405.                   case (1'b1) // MCycle
  2406.                     MCycle[0] :
  2407.                       Set_Addr_To = aSP;
  2408.                    
  2409.                     MCycle[1] :
  2410.                       begin
  2411.                         IncDec_16 = 4'b0111;
  2412.                         Set_Addr_To = aSP;
  2413.                         LDZ = 1'b1;
  2414.                       end
  2415.                    
  2416.                     MCycle[2] :
  2417.                       begin
  2418.                         Jump = 1'b1;
  2419.                         IncDec_16 = 4'b0111;
  2420.                         I_RETN = 1'b1;
  2421.                       end
  2422.                    
  2423.                     default :;
  2424.                   endcase // case(MCycle)
  2425.                 end // case: 8'b01000101,8'b01001101,8'b01010101,8'b01011101,8'b01100101,8'b01101101,8'b01110101,8'b01111101
  2426.              
  2427.               8'b01000000,8'b01001000,8'b01010000,8'b01011000,8'b01100000,8'b01101000,8'b01110000,8'b01111000  :
  2428.                 begin
  2429.                   // IN r,(C)
  2430.                   MCycles = 3'b010;
  2431.                   case (1'b1) // MCycle
  2432.                     MCycle[0] :
  2433.                       Set_Addr_To = aBC;
  2434.                    
  2435.                     MCycle[1] :
  2436.                       begin
  2437.                         IORQ = 1'b1;
  2438.                         if (IR[5:3] != 3'b110 )
  2439.                           begin
  2440.                             Read_To_Reg = 1'b1;
  2441.                             Set_BusA_To[2:0] = IR[5:3];
  2442.                           end
  2443.                         I_INRC = 1'b1;
  2444.                       end
  2445.                    
  2446.                     default :;
  2447.                   endcase // case(MCycle)
  2448.                 end // case: 8'b01000000,8'b01001000,8'b01010000,8'b01011000,8'b01100000,8'b01101000,8'b01110000,8'b01111000
  2449.              
  2450.               8'b01000001,8'b01001001,8'b01010001,8'b01011001,8'b01100001,8'b01101001,8'b01110001,8'b01111001  :
  2451.                 begin
  2452.                   // OUT (C),r
  2453.                   // OUT (C),0
  2454.                   MCycles = 3'b010;
  2455.                   case (1'b1) // MCycle
  2456.                     MCycle[0] :
  2457.                       begin
  2458.                         Set_Addr_To = aBC;
  2459.                         Set_BusB_To[2:0]        = IR[5:3];
  2460.                         if (IR[5:3] == 3'b110 )
  2461.                           begin
  2462.                             Set_BusB_To[3] = 1'b1;
  2463.                           end
  2464.                       end
  2465.                    
  2466.                     MCycle[1] :
  2467.                       begin
  2468.                         Write = 1'b1;
  2469.                         IORQ = 1'b1;
  2470.                       end
  2471.                    
  2472.                     default :;
  2473.                   endcase // case(MCycle)
  2474.                 end // case: 8'b01000001,8'b01001001,8'b01010001,8'b01011001,8'b01100001,8'b01101001,8'b01110001,8'b01111001
  2475.              
  2476.               8'b10100010 , 8'b10101010 , 8'b10110010 , 8'b10111010  :
  2477.                 begin
  2478.                   // INI, IND, INIR, INDR
  2479.                   MCycles = 3'b100;
  2480.                   case (1'b1) // MCycle
  2481.                     MCycle[0] :
  2482.                       begin
  2483.                         Set_Addr_To = aBC;
  2484.                         Set_BusB_To = 4'b1010;
  2485.                         Set_BusA_To = 4'b0000;
  2486.                         Read_To_Reg = 1'b1;
  2487.                         Save_ALU = 1'b1;
  2488.                         ALU_Op = 4'b0010;
  2489.                       end
  2490.                    
  2491.                     MCycle[1] :
  2492.                       begin
  2493.                         IORQ = 1'b1;
  2494.                         Set_BusB_To = 4'b0110;
  2495.                         Set_Addr_To = aXY;
  2496.                       end
  2497.                    
  2498.                     MCycle[2] :
  2499.                       begin
  2500.                         if (IR[3] == 1'b0 )
  2501.                           begin
  2502.                             IncDec_16 = 4'b0110;
  2503.                           end
  2504.                         else
  2505.                           begin
  2506.                             IncDec_16 = 4'b1110;
  2507.                           end
  2508.                         TStates = 3'b100;
  2509.                         Write = 1'b1;
  2510.                         I_BTR = 1'b1;
  2511.                       end // case: 3
  2512.                    
  2513.                     MCycle[3] :
  2514.                       begin
  2515.                         NoRead = 1'b1;
  2516.                         TStates = 3'b101;
  2517.                       end
  2518.                    
  2519.                     default :;
  2520.                   endcase // case(MCycle)
  2521.                 end // case: 8'b10100010 , 8'b10101010 , 8'b10110010 , 8'b10111010
  2522.              
  2523.               8'b10100011 , 8'b10101011 , 8'b10110011 , 8'b10111011  :
  2524.                 begin
  2525.                   // OUTI, OUTD, OTIR, OTDR
  2526.                   MCycles = 3'b100;
  2527.                   case (1'b1) // MCycle
  2528.                     MCycle[0] :
  2529.                       begin
  2530.                         TStates = 3'b101;
  2531.                         Set_Addr_To = aXY;
  2532.                         Set_BusB_To = 4'b1010;
  2533.                         Set_BusA_To = 4'b0000;
  2534.                         Read_To_Reg = 1'b1;
  2535.                         Save_ALU = 1'b1;
  2536.                         ALU_Op = 4'b0010;
  2537.                       end
  2538.                    
  2539.                     MCycle[1] :
  2540.                       begin
  2541.                         Set_BusB_To = 4'b0110;
  2542.                         Set_Addr_To = aBC;
  2543.                         if (IR[3] == 1'b0 )
  2544.                           begin
  2545.                             IncDec_16 = 4'b0110;
  2546.                           end
  2547.                         else
  2548.                           begin
  2549.                             IncDec_16 = 4'b1110;
  2550.                           end
  2551.                       end
  2552.                    
  2553.                     MCycle[2] :
  2554.                       begin
  2555.                         if (IR[3] == 1'b0 )
  2556.                           begin
  2557.                             IncDec_16 = 4'b0010;
  2558.                           end
  2559.                         else
  2560.                           begin
  2561.                             IncDec_16 = 4'b1010;
  2562.                           end
  2563.                         IORQ = 1'b1;
  2564.                         Write = 1'b1;
  2565.                         I_BTR = 1'b1;
  2566.                       end // case: 3
  2567.                    
  2568.                     MCycle[3] :
  2569.                       begin
  2570.                         NoRead = 1'b1;
  2571.                         TStates = 3'b101;
  2572.                       end
  2573.                    
  2574.                     default :;
  2575.                   endcase // case(MCycle)
  2576.                 end // case: 8'b10100011 , 8'b10101011 , 8'b10110011 , 8'b10111011
  2577.  
  2578.               default : ;
  2579.              
  2580.             endcase // case(IR)                  
  2581.           end // block: default_ed_block        
  2582.       endcase // case(ISet)
  2583.      
  2584.       if (Mode == 1 )
  2585.         begin
  2586.           if (MCycle[0] )
  2587.             begin
  2588.               //TStates = 3'b100;
  2589.             end
  2590.           else
  2591.             begin
  2592.               TStates = 3'b011;
  2593.             end
  2594.         end
  2595.  
  2596.       if (Mode == 3 )
  2597.         begin
  2598.           if (MCycle[0] )
  2599.             begin
  2600.               //TStates = 3'b100;
  2601.             end
  2602.           else
  2603.             begin
  2604.               TStates = 3'b100;
  2605.             end
  2606.         end
  2607.  
  2608.       if (Mode < 2 )
  2609.         begin
  2610.           if (MCycle[5] )
  2611.             begin
  2612.               Inc_PC = 1'b1;
  2613.               if (Mode == 1 )
  2614.                 begin
  2615.                   Set_Addr_To = aXY;
  2616.                   TStates = 3'b100;
  2617.                   Set_BusB_To[2:0] = SSS;
  2618.                   Set_BusB_To[3] = 1'b0;
  2619.                 end
  2620.               if (IR == 8'b00110110 || IR == 8'b11001011 )
  2621.                 begin
  2622.                   Set_Addr_To = aNone;
  2623.                 end
  2624.             end
  2625.           if (MCycle[6] )
  2626.             begin
  2627.               if (Mode == 0 )
  2628.                 begin
  2629.                   TStates = 3'b101;
  2630.                 end
  2631.               if (ISet != 2'b01 )
  2632.                 begin
  2633.                   Set_Addr_To = aXY;
  2634.                 end
  2635.               Set_BusB_To[2:0] = SSS;
  2636.               Set_BusB_To[3] = 1'b0;
  2637.               if (IR == 8'b00110110 || ISet == 2'b01 )
  2638.                 begin
  2639.                   // LD (HL),n
  2640.                   Inc_PC = 1'b1;
  2641.                 end
  2642.               else
  2643.                 begin
  2644.                   NoRead = 1'b1;
  2645.                 end
  2646.             end
  2647.         end // if (Mode < 2 )      
  2648.      
  2649.     end // always @ (IR, ISet, MCycle, F, NMICycle, IntCycle)
  2650. endmodule // T80_MCode
  2651.