Example #1
0
File: CPU.cs Project: vggonz/csgbe
        /// <summary>Decodifica una instruccion extendida por el opCode CB</summary>
        /// <param name="parm1">Primer parametro</param>
        /// <param name="parm2">Segundo parametro</param>
        /// <returns>Devuelve la instruccion decodificada lista para ejecutar</returns>
        private Instruccion procesarInstruccionCB(int parm1, int parm2)
        {
            // Instruccion NOP por defecto
            Instruccion instruccion = new InstruccionNOP(_registros, _memoria);
            switch(parm1){
                case 0x00: instruccion = new InstruccionRLC(_registros, _memoria, "B", true); break;
                case 0x01: instruccion = new InstruccionRLC(_registros, _memoria, "C", true); break;
                case 0x02: instruccion = new InstruccionRLC(_registros, _memoria, "D", true); break;
                case 0x03: instruccion = new InstruccionRLC(_registros, _memoria, "E", true); break;
                case 0x04: instruccion = new InstruccionRLC(_registros, _memoria, "H", true); break;
                case 0x05: instruccion = new InstruccionRLC(_registros, _memoria, "L", true); break;
                case 0x06: instruccion = new InstruccionRLC_RADR(_registros, _memoria, "HL"); break;
                case 0x07: instruccion = new InstruccionRLC(_registros, _memoria, "A", true); break;
                case 0x08: instruccion = new InstruccionRRC(_registros, _memoria, "B", true); break;
                case 0x09: instruccion = new InstruccionRRC(_registros, _memoria, "C", true); break;
                case 0x0A: instruccion = new InstruccionRRC(_registros, _memoria, "D", true); break;
                case 0x0B: instruccion = new InstruccionRRC(_registros, _memoria, "E", true); break;
                case 0x0C: instruccion = new InstruccionRRC(_registros, _memoria, "H", true); break;
                case 0x0D: instruccion = new InstruccionRRC(_registros, _memoria, "L", true); break;
                case 0x0E: instruccion = new InstruccionRRC_RADR(_registros, _memoria, "HL"); break;
                case 0x0F: instruccion = new InstruccionRRC(_registros, _memoria, "A", true); break;

                case 0x10: instruccion = new InstruccionRL(_registros, _memoria, "B", true); break;
                case 0x11: instruccion = new InstruccionRL(_registros, _memoria, "C", true); break;
                case 0x12: instruccion = new InstruccionRL(_registros, _memoria, "D", true); break;
                case 0x13: instruccion = new InstruccionRL(_registros, _memoria, "E", true); break;
                case 0x14: instruccion = new InstruccionRL(_registros, _memoria, "H", true); break;
                case 0x15: instruccion = new InstruccionRL(_registros, _memoria, "L", true); break;
                case 0x16: instruccion = new InstruccionRL_RADR(_registros, _memoria, "HL"); break;
                case 0x17: instruccion = new InstruccionRL(_registros, _memoria, "A", true); break;
                case 0x18: instruccion = new InstruccionRR(_registros, _memoria, "B", true); break;
                case 0x19: instruccion = new InstruccionRR(_registros, _memoria, "C", true); break;
                case 0x1A: instruccion = new InstruccionRR(_registros, _memoria, "D", true); break;
                case 0x1B: instruccion = new InstruccionRR(_registros, _memoria, "E", true); break;
                case 0x1C: instruccion = new InstruccionRR(_registros, _memoria, "H", true); break;
                case 0x1D: instruccion = new InstruccionRR(_registros, _memoria, "L", true); break;
                case 0x1E: instruccion = new InstruccionRR_RADR(_registros, _memoria, "HL"); break;
                case 0x1F: instruccion = new InstruccionRR(_registros, _memoria, "A", true); break;

                case 0x20: instruccion = new InstruccionSLA(_registros, _memoria, "B"); break;
                case 0x21: instruccion = new InstruccionSLA(_registros, _memoria, "C"); break;
                case 0x22: instruccion = new InstruccionSLA(_registros, _memoria, "D"); break;
                case 0x23: instruccion = new InstruccionSLA(_registros, _memoria, "E"); break;
                case 0x24: instruccion = new InstruccionSLA(_registros, _memoria, "H"); break;
                case 0x25: instruccion = new InstruccionSLA(_registros, _memoria, "L"); break;
                case 0x26: instruccion = new InstruccionSLA_RADR(_registros, _memoria, "HL"); break;
                case 0x27: instruccion = new InstruccionSLA(_registros, _memoria, "A"); break;
                case 0x28: instruccion = new InstruccionSRA(_registros, _memoria, "B"); break;
                case 0x29: instruccion = new InstruccionSRA(_registros, _memoria, "C"); break;
                case 0x2A: instruccion = new InstruccionSRA(_registros, _memoria, "D"); break;
                case 0x2B: instruccion = new InstruccionSRA(_registros, _memoria, "E"); break;
                case 0x2C: instruccion = new InstruccionSRA(_registros, _memoria, "H"); break;
                case 0x2D: instruccion = new InstruccionSRA(_registros, _memoria, "L"); break;
                case 0x2E: instruccion = new InstruccionSRA_RADR(_registros, _memoria, "HL"); break;
                case 0x2F: instruccion = new InstruccionSRA(_registros, _memoria, "A"); break;

                case 0x30: instruccion = new InstruccionSWAP_R(_registros, _memoria, "B"); break;
                case 0x31: instruccion = new InstruccionSWAP_R(_registros, _memoria, "C"); break;
                case 0x32: instruccion = new InstruccionSWAP_R(_registros, _memoria, "D"); break;
                case 0x33: instruccion = new InstruccionSWAP_R(_registros, _memoria, "E"); break;
                case 0x34: instruccion = new InstruccionSWAP_R(_registros, _memoria, "H"); break;
                case 0x35: instruccion = new InstruccionSWAP_R(_registros, _memoria, "L"); break;
                case 0x36: instruccion = new InstruccionSWAP_RADR(_registros, _memoria, "HL"); break;
                case 0x37: instruccion = new InstruccionSWAP_R(_registros, _memoria, "A"); break;
                case 0x38: instruccion = new InstruccionSRL(_registros, _memoria, "B"); break;
                case 0x39: instruccion = new InstruccionSRL(_registros, _memoria, "C"); break;
                case 0x3A: instruccion = new InstruccionSRL(_registros, _memoria, "D"); break;
                case 0x3B: instruccion = new InstruccionSRL(_registros, _memoria, "E"); break;
                case 0x3C: instruccion = new InstruccionSRL(_registros, _memoria, "H"); break;
                case 0x3D: instruccion = new InstruccionSRL(_registros, _memoria, "L"); break;
                case 0x3E: instruccion = new InstruccionSRL_RADR(_registros, _memoria, "HL"); break;
                case 0x3F: instruccion = new InstruccionSRL(_registros, _memoria, "A"); break;

                case 0x40: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x01, "B"); break;
                case 0x41: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x01, "C"); break;
                case 0x42: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x01, "D"); break;
                case 0x43: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x01, "E"); break;
                case 0x44: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x01, "H"); break;
                case 0x45: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x01, "L"); break;
                case 0x46: instruccion = new InstruccionBIT_RADR(_registros, _memoria, (byte)0x01, "HL"); break;
                case 0x47: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x01, "A"); break;
                case 0x48: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x02, "B"); break;
                case 0x49: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x02, "C"); break;
                case 0x4A: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x02, "D"); break;
                case 0x4B: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x02, "E"); break;
                case 0x4C: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x02, "H"); break;
                case 0x4D: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x02, "L"); break;
                case 0x4E: instruccion = new InstruccionBIT_RADR(_registros, _memoria, (byte)0x02, "HL"); break;
                case 0x4F: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x02, "A"); break;

                case 0x50: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x04, "B"); break;
                case 0x51: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x04, "C"); break;
                case 0x52: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x04, "D"); break;
                case 0x53: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x04, "E"); break;
                case 0x54: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x04, "H"); break;
                case 0x55: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x04, "L"); break;
                case 0x56: instruccion = new InstruccionBIT_RADR(_registros, _memoria, (byte)0x04, "HL"); break;
                case 0x57: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x04, "A"); break;
                case 0x58: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x08, "B"); break;
                case 0x59: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x08, "C"); break;
                case 0x5A: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x08, "D"); break;
                case 0x5B: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x08, "E"); break;
                case 0x5C: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x08, "H"); break;
                case 0x5D: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x08, "L"); break;
                case 0x5E: instruccion = new InstruccionBIT_RADR(_registros, _memoria, (byte)0x08, "HL"); break;
                case 0x5F: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x08, "A"); break;

                case 0x60: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x10, "B"); break;
                case 0x61: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x10, "C"); break;
                case 0x62: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x10, "D"); break;
                case 0x63: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x10, "E"); break;
                case 0x64: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x10, "H"); break;
                case 0x65: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x10, "L"); break;
                case 0x66: instruccion = new InstruccionBIT_RADR(_registros, _memoria, (byte)0x10, "HL"); break;
                case 0x67: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x10, "A"); break;
                case 0x68: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x20, "B"); break;
                case 0x69: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x20, "C"); break;
                case 0x6A: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x20, "D"); break;
                case 0x6B: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x20, "E"); break;
                case 0x6C: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x20, "H"); break;
                case 0x6D: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x20, "L"); break;
                case 0x6E: instruccion = new InstruccionBIT_RADR(_registros, _memoria, (byte)0x20, "HL"); break;
                case 0x6F: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x20, "A"); break;

                case 0x70: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x40, "B"); break;
                case 0x71: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x40, "C"); break;
                case 0x72: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x40, "D"); break;
                case 0x73: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x40, "E"); break;
                case 0x74: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x40, "H"); break;
                case 0x75: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x40, "L"); break;
                case 0x76: instruccion = new InstruccionBIT_RADR(_registros, _memoria, (byte)0x40, "HL"); break;
                case 0x77: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x40, "A"); break;
                case 0x78: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x80, "B"); break;
                case 0x79: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x80, "C"); break;
                case 0x7A: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x80, "D"); break;
                case 0x7B: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x80, "E"); break;
                case 0x7C: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x80, "H"); break;
                case 0x7D: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x80, "L"); break;
                case 0x7E: instruccion = new InstruccionBIT_RADR(_registros, _memoria, (byte)0x80, "HL"); break;
                case 0x7F: instruccion = new InstruccionBIT_R(_registros, _memoria, (byte)0x80, "A"); break;

                case 0x80: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x01, "B"); break;
                case 0x81: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x01, "C"); break;
                case 0x82: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x01, "D"); break;
                case 0x83: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x01, "E"); break;
                case 0x84: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x01, "H"); break;
                case 0x85: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x01, "L"); break;
                case 0x86: instruccion = new InstruccionRES_RADR(_registros, _memoria, (byte)0x01, "HL"); break;
                case 0x87: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x01, "A"); break;
                case 0x88: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x02, "B"); break;
                case 0x89: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x02, "C"); break;
                case 0x8A: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x02, "D"); break;
                case 0x8B: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x02, "E"); break;
                case 0x8C: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x02, "H"); break;
                case 0x8D: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x02, "L"); break;
                case 0x8E: instruccion = new InstruccionRES_RADR(_registros, _memoria, (byte)0x02, "HL"); break;
                case 0x8F: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x02, "A"); break;

                case 0x90: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x04, "B"); break;
                case 0x91: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x04, "C"); break;
                case 0x92: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x04, "D"); break;
                case 0x93: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x04, "E"); break;
                case 0x94: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x04, "H"); break;
                case 0x95: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x04, "L"); break;
                case 0x96: instruccion = new InstruccionRES_RADR(_registros, _memoria, (byte)0x04, "HL"); break;
                case 0x97: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x04, "A"); break;
                case 0x98: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x08, "B"); break;
                case 0x99: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x08, "C"); break;
                case 0x9A: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x08, "D"); break;
                case 0x9B: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x08, "E"); break;
                case 0x9C: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x08, "H"); break;
                case 0x9D: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x08, "L"); break;
                case 0x9E: instruccion = new InstruccionRES_RADR(_registros, _memoria, (byte)0x08, "HL"); break;
                case 0x9F: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x08, "A"); break;

                case 0xA0: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x10, "B"); break;
                case 0xA1: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x10, "C"); break;
                case 0xA2: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x10, "D"); break;
                case 0xA3: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x10, "E"); break;
                case 0xA4: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x10, "H"); break;
                case 0xA5: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x10, "L"); break;
                case 0xA6: instruccion = new InstruccionRES_RADR(_registros, _memoria, (byte)0x10, "HL"); break;
                case 0xA7: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x10, "A"); break;
                case 0xA8: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x20, "B"); break;
                case 0xA9: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x20, "C"); break;
                case 0xAA: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x20, "D"); break;
                case 0xAB: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x20, "E"); break;
                case 0xAC: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x20, "H"); break;
                case 0xAD: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x20, "L"); break;
                case 0xAE: instruccion = new InstruccionRES_RADR(_registros, _memoria, (byte)0x20, "HL"); break;
                case 0xAF: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x20, "A"); break;

                case 0xB0: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x40, "B"); break;
                case 0xB1: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x40, "C"); break;
                case 0xB2: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x40, "D"); break;
                case 0xB3: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x40, "E"); break;
                case 0xB4: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x40, "H"); break;
                case 0xB5: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x40, "L"); break;
                case 0xB6: instruccion = new InstruccionRES_RADR(_registros, _memoria, (byte)0x40, "HL"); break;
                case 0xB7: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x40, "A"); break;
                case 0xB8: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x80, "B"); break;
                case 0xB9: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x80, "C"); break;
                case 0xBA: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x80, "D"); break;
                case 0xBB: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x80, "E"); break;
                case 0xBC: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x80, "H"); break;
                case 0xBD: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x80, "L"); break;
                case 0xBE: instruccion = new InstruccionRES_RADR(_registros, _memoria, (byte)0x80, "HL"); break;
                case 0xBF: instruccion = new InstruccionRES_R(_registros, _memoria, (byte)0x80, "A"); break;

                case 0xC0: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x01, "B"); break;
                case 0xC1: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x01, "C"); break;
                case 0xC2: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x01, "D"); break;
                case 0xC3: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x01, "E"); break;
                case 0xC4: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x01, "H"); break;
                case 0xC5: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x01, "L"); break;
                case 0xC6: instruccion = new InstruccionSET_RADR(_registros, _memoria, (byte)0x01, "HL"); break;
                case 0xC7: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x01, "A"); break;
                case 0xC8: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x02, "B"); break;
                case 0xC9: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x02, "C"); break;
                case 0xCA: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x02, "D"); break;
                case 0xCB: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x02, "E"); break;
                case 0xCC: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x02, "H"); break;
                case 0xCD: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x02, "L"); break;
                case 0xCE: instruccion = new InstruccionSET_RADR(_registros, _memoria, (byte)0x02, "HL"); break;
                case 0xCF: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x02, "A"); break;

                case 0xD0: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x04, "B"); break;
                case 0xD1: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x04, "C"); break;
                case 0xD2: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x04, "D"); break;
                case 0xD3: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x04, "E"); break;
                case 0xD4: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x04, "H"); break;
                case 0xD5: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x04, "L"); break;
                case 0xD6: instruccion = new InstruccionSET_RADR(_registros, _memoria, (byte)0x04, "HL"); break;
                case 0xD7: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x04, "A"); break;
                case 0xD8: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x08, "B"); break;
                case 0xD9: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x08, "C"); break;
                case 0xDA: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x08, "D"); break;
                case 0xDB: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x08, "E"); break;
                case 0xDC: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x08, "H"); break;
                case 0xDD: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x08, "L"); break;
                case 0xDE: instruccion = new InstruccionSET_RADR(_registros, _memoria, (byte)0x08, "HL"); break;
                case 0xDF: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x08, "A"); break;

                case 0xE0: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x10, "B"); break;
                case 0xE1: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x10, "C"); break;
                case 0xE2: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x10, "D"); break;
                case 0xE3: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x10, "E"); break;
                case 0xE4: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x10, "H"); break;
                case 0xE5: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x10, "L"); break;
                case 0xE6: instruccion = new InstruccionSET_RADR(_registros, _memoria, (byte)0x10, "HL"); break;
                case 0xE7: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x10, "A"); break;
                case 0xE8: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x20, "B"); break;
                case 0xE9: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x20, "C"); break;
                case 0xEA: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x20, "D"); break;
                case 0xEB: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x20, "E"); break;
                case 0xEC: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x20, "H"); break;
                case 0xED: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x20, "L"); break;
                case 0xEE: instruccion = new InstruccionSET_RADR(_registros, _memoria, (byte)0x20, "HL"); break;
                case 0xEF: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x20, "A"); break;

                case 0xF0: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x40, "B"); break;
                case 0xF1: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x40, "C"); break;
                case 0xF2: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x40, "D"); break;
                case 0xF3: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x40, "E"); break;
                case 0xF4: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x40, "H"); break;
                case 0xF5: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x40, "L"); break;
                case 0xF6: instruccion = new InstruccionSET_RADR(_registros, _memoria, (byte)0x40, "HL"); break;
                case 0xF7: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x40, "A"); break;
                case 0xF8: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x80, "B"); break;
                case 0xF9: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x80, "C"); break;
                case 0xFA: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x80, "D"); break;
                case 0xFB: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x80, "E"); break;
                case 0xFC: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x80, "H"); break;
                case 0xFD: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x80, "L"); break;
                case 0xFE: instruccion = new InstruccionSET_RADR(_registros, _memoria, (byte)0x80, "HL"); break;
                case 0xFF: instruccion = new InstruccionSET_R(_registros, _memoria, (byte)0x80, "A"); break;

                default: _error = true; Debug.WriteLine("[ERROR] Instruccion CB " + Debug.hexByte(parm1) + " no esperada"); break;
            }
            // Aumenta el contador de programa en 1 siempre por el prefijo CB comun
            _registros.regPC += 1;
            return instruccion;
        }
Example #2
0
File: CPU.cs Project: vggonz/csgbe
        /// <summary>Ejecuta una instruccion del contador de programa</summary>
        private void procesarInstruccion()
        {
            int opCod = _memoria.leer(_registros.regPC);
            // El numero maximo argumentos que puede tomar una instruccion son 2. Se leen por si acaso.
            int parm1 = _memoria.leer(_registros.regPC + 1);
            int parm2 = _memoria.leer(_registros.regPC + 2);

            if (debug){
                Debug.Write("#" + _instruccionesProcesadas);
                Debug.Write("\t" + Debug.hexWord(_registros.regPC) + ": " + Debug.hexByte(opCod));
            }

            // Instruccion NOP por defecto
            Instruccion instruccion = new InstruccionNOP(_registros, _memoria);
            switch(opCod){
                case 0x00: instruccion = new InstruccionNOP(_registros, _memoria); break;
                case 0x01: instruccion = new InstruccionLD_DD_NN(_registros, _memoria, parm1, parm2, "BC"); break;
                case 0x02: instruccion = new InstruccionLD_RADR_R(_registros, _memoria, "BC", "A"); break;
                case 0x03: instruccion = new InstruccionINC_RR(_registros, _memoria, "BC"); break;
                case 0x04: instruccion = new InstruccionINC_R(_registros, _memoria, "B"); break;
                case 0x05: instruccion = new InstruccionDEC_R(_registros, _memoria, "B"); break;
                case 0x06: instruccion = new InstruccionLD_R_N(_registros, _memoria, parm1, "B"); break;
                case 0x07: instruccion = new InstruccionRLC(_registros, _memoria, "A", false); break;
                case 0x08: instruccion = new InstruccionLD_ADR_RR(_registros, _memoria, parm1, parm2, "SP"); break;
                case 0x09: instruccion = new InstruccionADD_RR_RR(_registros, _memoria, "HL", "BC"); break;
                case 0x0A: instruccion = new InstruccionLD_R_RADR(_registros, _memoria, "A", "BC"); break;
                case 0x0B: instruccion = new InstruccionDEC_RR(_registros, _memoria, "BC"); break;
                case 0x0C: instruccion = new InstruccionINC_R(_registros, _memoria, "C"); break;
                case 0x0D: instruccion = new InstruccionDEC_R(_registros, _memoria, "C"); break;
                case 0x0E: instruccion = new InstruccionLD_R_N(_registros, _memoria, parm1, "C"); break;
                case 0x0F: instruccion = new InstruccionRRC(_registros, _memoria, "A", false); break;

                case 0x10: instruccion = new InstruccionSTOP(_registros, _memoria); break;
                case 0x11: instruccion = new InstruccionLD_DD_NN(_registros, _memoria, parm1, parm2, "DE"); break;
                case 0x12: instruccion = new InstruccionLD_RADR_R(_registros, _memoria, "DE", "A"); break;
                case 0x13: instruccion = new InstruccionINC_RR(_registros, _memoria, "DE"); break;
                case 0x14: instruccion = new InstruccionINC_R(_registros, _memoria, "D"); break;
                case 0x15: instruccion = new InstruccionDEC_R(_registros, _memoria, "D"); break;
                case 0x16: instruccion = new InstruccionLD_R_N(_registros, _memoria, parm1, "D"); break;
                case 0x17: instruccion = new InstruccionRL(_registros, _memoria, "A", false); break;
                case 0x18: instruccion = new InstruccionJR_N(_registros, _memoria, parm1); break;
                case 0x19: instruccion = new InstruccionADD_RR_RR(_registros, _memoria, "HL", "DE"); break;
                case 0x1A: instruccion = new InstruccionLD_R_RADR(_registros, _memoria, "A", "DE"); break;
                case 0x1B: instruccion = new InstruccionDEC_RR(_registros, _memoria, "DE"); break;
                case 0x1C: instruccion = new InstruccionINC_R(_registros, _memoria, "E"); break;
                case 0x1D: instruccion = new InstruccionDEC_R(_registros, _memoria, "E"); break;
                case 0x1E: instruccion = new InstruccionLD_R_N(_registros, _memoria, parm1, "E"); break;
                case 0x1F: instruccion = new InstruccionRR(_registros, _memoria, "A", false); break;

                case 0x20: instruccion = new InstruccionJR_CC0_N(_registros, _memoria, "Z", parm1); break;
                case 0x21: instruccion = new InstruccionLD_DD_NN(_registros, _memoria, parm1, parm2, "HL"); break;
                case 0x22: instruccion = new InstruccionLDI_RADR_R(_registros, _memoria, "HL", "A"); break;
                case 0x23: instruccion = new InstruccionINC_RR(_registros, _memoria, "HL"); break;
                case 0x24: instruccion = new InstruccionINC_R(_registros, _memoria, "H"); break;
                case 0x25: instruccion = new InstruccionDEC_R(_registros, _memoria, "H"); break;
                case 0x26: instruccion = new InstruccionLD_R_N(_registros, _memoria, parm1, "H"); break;
                case 0x27: instruccion = new InstruccionDAA(_registros, _memoria); break;
                case 0x28: instruccion = new InstruccionJR_CC1_N(_registros, _memoria, "Z", parm1); break;
                case 0x29: instruccion = new InstruccionADD_RR_RR(_registros, _memoria, "HL", "HL"); break;
                case 0x2A: instruccion = new InstruccionLDI_R_RADR(_registros, _memoria, "A", "HL"); break;
                case 0x2B: instruccion = new InstruccionDEC_RR(_registros, _memoria, "HL"); break;
                case 0x2C: instruccion = new InstruccionINC_R(_registros, _memoria, "L"); break;
                case 0x2D: instruccion = new InstruccionDEC_R(_registros, _memoria, "L"); break;
                case 0x2E: instruccion = new InstruccionLD_R_N(_registros, _memoria, parm1, "L"); break;
                case 0x2F: instruccion = new InstruccionCPL(_registros, _memoria); break;

                case 0x30: instruccion = new InstruccionJR_CC0_N(_registros, _memoria, "C", parm1); break;
                case 0x31: instruccion = new InstruccionLD_DD_NN(_registros, _memoria, parm1, parm2, "SP"); break;
                case 0x32: instruccion = new InstruccionLDD_RADR_R(_registros, _memoria, "HL", "A"); break;
                case 0x33: instruccion = new InstruccionINC_RR(_registros, _memoria, "SP"); break;
                case 0x34: instruccion = new InstruccionINC_RADR(_registros, _memoria, "HL"); break;
                case 0x35: instruccion = new InstruccionDEC_RADR(_registros, _memoria, "HL"); break;
                case 0x36: instruccion = new InstruccionLD_RADR_N(_registros, _memoria, "HL", parm1); break;
                case 0x37: instruccion = new InstruccionSCF(_registros, _memoria); break;
                case 0x38: instruccion = new InstruccionJR_CC1_N(_registros, _memoria, "C", parm1); break;
                case 0x39: instruccion = new InstruccionADD_RR_RR(_registros, _memoria, "HL", "SP"); break;
                case 0x3A: instruccion = new InstruccionLDD_R_RADR(_registros, _memoria, "A", "HL"); break;
                case 0x3B: instruccion = new InstruccionDEC_RR(_registros, _memoria, "SP"); break;
                case 0x3C: instruccion = new InstruccionINC_R(_registros, _memoria, "A"); break;
                case 0x3D: instruccion = new InstruccionDEC_R(_registros, _memoria, "A"); break;
                case 0x3E: instruccion = new InstruccionLD_R_N(_registros, _memoria, parm1, "A"); break;
                case 0x3F: instruccion = new InstruccionCCF(_registros, _memoria); break;

                case 0x40: instruccion = new InstruccionLD_R_R(_registros, _memoria, "B", "B"); break;
                case 0x41: instruccion = new InstruccionLD_R_R(_registros, _memoria, "B", "C"); break;
                case 0x42: instruccion = new InstruccionLD_R_R(_registros, _memoria, "B", "D"); break;
                case 0x43: instruccion = new InstruccionLD_R_R(_registros, _memoria, "B", "E"); break;
                case 0x44: instruccion = new InstruccionLD_R_R(_registros, _memoria, "B", "H"); break;
                case 0x45: instruccion = new InstruccionLD_R_R(_registros, _memoria, "B", "L"); break;
                case 0x46: instruccion = new InstruccionLD_R_RADR(_registros, _memoria, "B", "HL"); break;
                case 0x47: instruccion = new InstruccionLD_R_R(_registros, _memoria, "B", "A"); break;
                case 0x48: instruccion = new InstruccionLD_R_R(_registros, _memoria, "C", "B"); break;
                case 0x49: instruccion = new InstruccionLD_R_R(_registros, _memoria, "C", "C"); break;
                case 0x4A: instruccion = new InstruccionLD_R_R(_registros, _memoria, "C", "D"); break;
                case 0x4B: instruccion = new InstruccionLD_R_R(_registros, _memoria, "C", "E"); break;
                case 0x4C: instruccion = new InstruccionLD_R_R(_registros, _memoria, "C", "H"); break;
                case 0x4D: instruccion = new InstruccionLD_R_R(_registros, _memoria, "C", "L"); break;
                case 0x4E: instruccion = new InstruccionLD_R_RADR(_registros, _memoria, "C", "HL"); break;
                case 0x4F: instruccion = new InstruccionLD_R_R(_registros, _memoria, "C", "A"); break;

             		case 0x50: instruccion = new InstruccionLD_R_R(_registros, _memoria, "D", "B"); break;
                case 0x51: instruccion = new InstruccionLD_R_R(_registros, _memoria, "D", "C"); break;
                case 0x52: instruccion = new InstruccionLD_R_R(_registros, _memoria, "D", "D"); break;
                case 0x53: instruccion = new InstruccionLD_R_R(_registros, _memoria, "D", "E"); break;
                case 0x54: instruccion = new InstruccionLD_R_R(_registros, _memoria, "D", "H"); break;
                case 0x55: instruccion = new InstruccionLD_R_R(_registros, _memoria, "D", "L"); break;
                case 0x56: instruccion = new InstruccionLD_R_RADR(_registros, _memoria, "D", "HL"); break;
                case 0x57: instruccion = new InstruccionLD_R_R(_registros, _memoria, "D", "A"); break;
                case 0x58: instruccion = new InstruccionLD_R_R(_registros, _memoria, "E", "B"); break;
                case 0x59: instruccion = new InstruccionLD_R_R(_registros, _memoria, "E", "C"); break;
                case 0x5A: instruccion = new InstruccionLD_R_R(_registros, _memoria, "E", "D"); break;
                case 0x5B: instruccion = new InstruccionLD_R_R(_registros, _memoria, "E", "E"); break;
                case 0x5C: instruccion = new InstruccionLD_R_R(_registros, _memoria, "E", "H"); break;
                case 0x5D: instruccion = new InstruccionLD_R_R(_registros, _memoria, "E", "L"); break;
                case 0x5E: instruccion = new InstruccionLD_R_RADR(_registros, _memoria, "E", "HL"); break;
                case 0x5F: instruccion = new InstruccionLD_R_R(_registros, _memoria, "E", "A"); break;

                    case 0x60: instruccion = new InstruccionLD_R_R(_registros, _memoria, "H", "B"); break;
                case 0x61: instruccion = new InstruccionLD_R_R(_registros, _memoria, "H", "C"); break;
                case 0x62: instruccion = new InstruccionLD_R_R(_registros, _memoria, "H", "D"); break;
                case 0x63: instruccion = new InstruccionLD_R_R(_registros, _memoria, "H", "E"); break;
                case 0x64: instruccion = new InstruccionLD_R_R(_registros, _memoria, "H", "H"); break;
                case 0x65: instruccion = new InstruccionLD_R_R(_registros, _memoria, "H", "L"); break;
                case 0x66: instruccion = new InstruccionLD_R_RADR(_registros, _memoria, "H", "HL"); break;
                case 0x67: instruccion = new InstruccionLD_R_R(_registros, _memoria, "H", "A"); break;
                case 0x68: instruccion = new InstruccionLD_R_R(_registros, _memoria, "L", "B"); break;
                case 0x69: instruccion = new InstruccionLD_R_R(_registros, _memoria, "L", "C"); break;
                case 0x6A: instruccion = new InstruccionLD_R_R(_registros, _memoria, "L", "D"); break;
                case 0x6B: instruccion = new InstruccionLD_R_R(_registros, _memoria, "L", "E"); break;
                case 0x6C: instruccion = new InstruccionLD_R_R(_registros, _memoria, "L", "H"); break;
                case 0x6D: instruccion = new InstruccionLD_R_R(_registros, _memoria, "L", "L"); break;
                case 0x6E: instruccion = new InstruccionLD_R_RADR(_registros, _memoria, "L", "HL"); break;
                case 0x6F: instruccion = new InstruccionLD_R_R(_registros, _memoria, "L", "A"); break;

                case 0x70: instruccion = new InstruccionLD_RADR_R(_registros, _memoria, "HL", "B"); break;
                case 0x71: instruccion = new InstruccionLD_RADR_R(_registros, _memoria, "HL", "C"); break;
                case 0x72: instruccion = new InstruccionLD_RADR_R(_registros, _memoria, "HL", "D"); break;
                case 0x73: instruccion = new InstruccionLD_RADR_R(_registros, _memoria, "HL", "E"); break;
                case 0x74: instruccion = new InstruccionLD_RADR_R(_registros, _memoria, "HL", "H"); break;
                case 0x75: instruccion = new InstruccionLD_RADR_R(_registros, _memoria, "HL", "L"); break;
                case 0x76: instruccion = new InstruccionHALT(_registros, _memoria); break;
                case 0x77: instruccion = new InstruccionLD_RADR_R(_registros, _memoria, "HL", "A"); break;
                case 0x78: instruccion = new InstruccionLD_R_R(_registros, _memoria, "A", "B"); break;
                case 0x79: instruccion = new InstruccionLD_R_R(_registros, _memoria, "A", "C"); break;
                case 0x7A: instruccion = new InstruccionLD_R_R(_registros, _memoria, "A", "D"); break;
                case 0x7B: instruccion = new InstruccionLD_R_R(_registros, _memoria, "A", "E"); break;
                case 0x7C: instruccion = new InstruccionLD_R_R(_registros, _memoria, "A", "H"); break;
                case 0x7D: instruccion = new InstruccionLD_R_R(_registros, _memoria, "A", "L"); break;
                case 0x7E: instruccion = new InstruccionLD_R_RADR(_registros, _memoria, "A", "HL"); break;
                case 0x7F: instruccion = new InstruccionLD_R_R(_registros, _memoria, "A", "A"); break;

                case 0x80: instruccion = new InstruccionADD_R_R(_registros, _memoria, "A", "B"); break;
                case 0x81: instruccion = new InstruccionADD_R_R(_registros, _memoria, "A", "C"); break;
                case 0x82: instruccion = new InstruccionADD_R_R(_registros, _memoria, "A", "D"); break;
                case 0x83: instruccion = new InstruccionADD_R_R(_registros, _memoria, "A", "E"); break;
                case 0x84: instruccion = new InstruccionADD_R_R(_registros, _memoria, "A", "H"); break;
                case 0x85: instruccion = new InstruccionADD_R_R(_registros, _memoria, "A", "L"); break;
                case 0x86: instruccion = new InstruccionADD_R_RADR(_registros, _memoria, "A", "HL"); break;
                case 0x87: instruccion = new InstruccionADD_R_R(_registros, _memoria, "A", "A"); break;
                case 0x88: instruccion = new InstruccionADC_R_R(_registros, _memoria, "A", "B"); break;
                case 0x89: instruccion = new InstruccionADC_R_R(_registros, _memoria, "A", "C"); break;
                case 0x8A: instruccion = new InstruccionADC_R_R(_registros, _memoria, "A", "D"); break;
                case 0x8B: instruccion = new InstruccionADC_R_R(_registros, _memoria, "A", "E"); break;
                case 0x8C: instruccion = new InstruccionADC_R_R(_registros, _memoria, "A", "H"); break;
                case 0x8D: instruccion = new InstruccionADC_R_R(_registros, _memoria, "A", "L"); break;
                case 0x8E: instruccion = new InstruccionADC_R_RADR(_registros, _memoria, "A", "HL"); break;
                case 0x8F: instruccion = new InstruccionADC_R_R(_registros, _memoria, "A", "A"); break;

                case 0x90: instruccion = new InstruccionSUB_R_R(_registros, _memoria, "A", "B"); break;
                case 0x91: instruccion = new InstruccionSUB_R_R(_registros, _memoria, "A", "C"); break;
                case 0x92: instruccion = new InstruccionSUB_R_R(_registros, _memoria, "A", "D"); break;
                case 0x93: instruccion = new InstruccionSUB_R_R(_registros, _memoria, "A", "E"); break;
                case 0x94: instruccion = new InstruccionSUB_R_R(_registros, _memoria, "A", "H"); break;
                case 0x95: instruccion = new InstruccionSUB_R_R(_registros, _memoria, "A", "L"); break;
                case 0x96: instruccion = new InstruccionSUB_R_RADR(_registros, _memoria, "A", "HL"); break;
                case 0x97: instruccion = new InstruccionSUB_R_R(_registros, _memoria, "A", "A"); break;
                case 0x98: instruccion = new InstruccionSBC_R_R(_registros, _memoria, "A", "B"); break;
                case 0x99: instruccion = new InstruccionSBC_R_R(_registros, _memoria, "A", "C"); break;
                case 0x9A: instruccion = new InstruccionSBC_R_R(_registros, _memoria, "A", "D"); break;
                case 0x9B: instruccion = new InstruccionSBC_R_R(_registros, _memoria, "A", "E"); break;
                case 0x9C: instruccion = new InstruccionSBC_R_R(_registros, _memoria, "A", "H"); break;
                case 0x9D: instruccion = new InstruccionSBC_R_R(_registros, _memoria, "A", "L"); break;
                case 0x9E: instruccion = new InstruccionSBC_R_RADR(_registros, _memoria, "A", "HL"); break;
                case 0x9F: instruccion = new InstruccionSBC_R_R(_registros, _memoria, "A", "A"); break;

                case 0xA0: instruccion = new InstruccionAND_R_R(_registros, _memoria, "B"); break;
                case 0xA1: instruccion = new InstruccionAND_R_R(_registros, _memoria, "C"); break;
                case 0xA2: instruccion = new InstruccionAND_R_R(_registros, _memoria, "D"); break;
                case 0xA3: instruccion = new InstruccionAND_R_R(_registros, _memoria, "E"); break;
                case 0xA4: instruccion = new InstruccionAND_R_R(_registros, _memoria, "H"); break;
                case 0xA5: instruccion = new InstruccionAND_R_R(_registros, _memoria, "L"); break;
                case 0xA6: instruccion = new InstruccionAND_RADR(_registros, _memoria, "HL"); break;
                case 0xA7: instruccion = new InstruccionAND_R_R(_registros, _memoria, "A"); break;
                case 0xA8: instruccion = new InstruccionXOR_R(_registros, _memoria, "B"); break;
                case 0xA9: instruccion = new InstruccionXOR_R(_registros, _memoria, "C"); break;
                case 0xAA: instruccion = new InstruccionXOR_R(_registros, _memoria, "D"); break;
                case 0xAB: instruccion = new InstruccionXOR_R(_registros, _memoria, "E"); break;
                case 0xAC: instruccion = new InstruccionXOR_R(_registros, _memoria, "H"); break;
                case 0xAD: instruccion = new InstruccionXOR_R(_registros, _memoria, "L"); break;
                case 0xAE: instruccion = new InstruccionXOR_RADR(_registros, _memoria, "HL"); break;
                case 0xAF: instruccion = new InstruccionXOR_R(_registros, _memoria, "A"); break;

                case 0xB0: instruccion = new InstruccionOR_R_R(_registros, _memoria, "B"); break;
                case 0xB1: instruccion = new InstruccionOR_R_R(_registros, _memoria, "C"); break;
                case 0xB2: instruccion = new InstruccionOR_R_R(_registros, _memoria, "D"); break;
                case 0xB3: instruccion = new InstruccionOR_R_R(_registros, _memoria, "E"); break;
                case 0xB4: instruccion = new InstruccionOR_R_R(_registros, _memoria, "H"); break;
                case 0xB5: instruccion = new InstruccionOR_R_R(_registros, _memoria, "L"); break;
                case 0xB6: instruccion = new InstruccionOR_R_ADR(_registros, _memoria, "HL"); break;
                case 0xB7: instruccion = new InstruccionOR_R_R(_registros, _memoria, "A"); break;
                case 0xB8: instruccion = new InstruccionCP_R(_registros, _memoria, "B"); break;
                case 0xB9: instruccion = new InstruccionCP_R(_registros, _memoria, "C"); break;
                case 0xBA: instruccion = new InstruccionCP_R(_registros, _memoria, "D"); break;
                case 0xBB: instruccion = new InstruccionCP_R(_registros, _memoria, "E"); break;
                case 0xBC: instruccion = new InstruccionCP_R(_registros, _memoria, "H"); break;
                case 0xBD: instruccion = new InstruccionCP_R(_registros, _memoria, "L"); break;
                case 0xBE: instruccion = new InstruccionCP_RADR(_registros, _memoria, "HL"); break;
                case 0xBF: instruccion = new InstruccionCP_R(_registros, _memoria, "A"); break;

                case 0xC0: instruccion = new InstruccionRET_CC0_ADR(_registros, _memoria, "Z"); break;
                case 0xC1: instruccion = new InstruccionPOP_RR(_registros, _memoria, "BC"); break;
                case 0xC2: instruccion = new InstruccionJP_CC0_ADR(_registros, _memoria, "Z", parm1, parm2); break;
             		case 0xC3: instruccion = new InstruccionJP_ADR(_registros, _memoria, parm1, parm2); break;
             		case 0xC4: instruccion = new InstruccionCALL_CC0_ADR(_registros, _memoria, "Z", parm1, parm2); break;
                case 0xC5: instruccion = new InstruccionPUSH_RR(_registros, _memoria, "BC"); break;
                case 0xC6: instruccion = new InstruccionADD_R_N(_registros, _memoria, "A", parm1); break;
                case 0xC7: instruccion = new InstruccionRST(_registros, _memoria, 0x00); break;
                case 0xC8: instruccion = new InstruccionRET_CC1_ADR(_registros, _memoria, "Z"); break;
                case 0xC9: instruccion = new InstruccionRET_ADR(_registros, _memoria); break;
                case 0xCA: instruccion = new InstruccionJP_CC1_ADR(_registros, _memoria, "Z", parm1, parm2); break;
                case 0xCB: instruccion = procesarInstruccionCB(parm1, parm2); break;
             		case 0xCC: instruccion = new InstruccionCALL_CC1_ADR(_registros, _memoria, "Z", parm1, parm2); break;
                case 0xCD: instruccion = new InstruccionCALL_ADR(_registros, _memoria, parm1, parm2); break;
                case 0xCE: instruccion = new InstruccionADC_R_N(_registros, _memoria, "A", parm1); break;
                case 0xCF: instruccion = new InstruccionRST(_registros, _memoria, 0x08); break;

                case 0xD0: instruccion = new InstruccionRET_CC0_ADR(_registros, _memoria, "C"); break;
                case 0xD1: instruccion = new InstruccionPOP_RR(_registros, _memoria, "DE"); break;
                case 0xD2: instruccion = new InstruccionJP_CC0_ADR(_registros, _memoria, "C", parm1, parm2); break;
                case 0xD3: _error = true; break;
             		case 0xD4: instruccion = new InstruccionCALL_CC0_ADR(_registros, _memoria, "C", parm1, parm2); break;
                case 0xD5: instruccion = new InstruccionPUSH_RR(_registros, _memoria, "DE"); break;
                case 0xD6: instruccion = new InstruccionSUB_R_N(_registros, _memoria, "A", parm1); break;
                case 0xD7: instruccion = new InstruccionRST(_registros, _memoria, 0x10); break;
                case 0xD8: instruccion = new InstruccionRET_CC1_ADR(_registros, _memoria, "C"); break;
                case 0xD9: instruccion = new InstruccionRETI(_registros, _memoria); break;
                case 0xDA: instruccion = new InstruccionJP_CC1_ADR(_registros, _memoria, "C", parm1, parm2); break;
                case 0xDB: _error = true; break;
             		case 0xDC: instruccion = new InstruccionCALL_CC1_ADR(_registros, _memoria, "C", parm1, parm2); break;
                case 0xDD: _error = true; break;
                case 0xDE: instruccion = new InstruccionSBC_R_N(_registros, _memoria, "A", parm1); break;
                case 0xDF: instruccion = new InstruccionRST(_registros, _memoria, 0x18); break;

                case 0xE0: instruccion = new InstruccionLD_DADR_R(_registros, _memoria, "A", parm1); break;
                case 0xE1: instruccion = new InstruccionPOP_RR(_registros, _memoria, "HL"); break;
                case 0xE2: instruccion = new InstruccionLD_DR_R(_registros, _memoria, "C", "A"); break;
                case 0xE3: _error = true; break;
                case 0xE4: _error = true; break;
                case 0xE5: instruccion = new InstruccionPUSH_RR(_registros, _memoria, "HL"); break;
                case 0xE6: instruccion = new InstruccionAND_R_N(_registros, _memoria, parm1); break;
                case 0xE7: instruccion = new InstruccionRST(_registros, _memoria, 0x20); break;
                case 0xE8: instruccion = new InstruccionADD_R_NN(_registros, _memoria, "SP", parm1); break;
                case 0xE9: instruccion = new InstruccionJP_RADR(_registros, _memoria, "HL"); break;
                case 0xEA: instruccion = new InstruccionLD_ADR_R(_registros, _memoria, parm1, parm2, "A"); break;
                case 0xEB: _error = true; break;
                case 0xEC: _error = true; break;
                case 0xED: _error = true; break;
                case 0xEE: instruccion = new InstruccionXOR_N(_registros, _memoria, parm1); break;
                case 0xEF: instruccion = new InstruccionRST(_registros, _memoria, 0x28); break;

                case 0xF0: instruccion = new InstruccionLD_R_DADR(_registros, _memoria, "A", parm1); break;
                case 0xF1: instruccion = new InstruccionPOP_RR(_registros, _memoria, "AF"); break;
                case 0xF2: instruccion = new InstruccionLD_R_DR(_registros, _memoria, "A", "C"); break;
                case 0xF3: instruccion = new InstruccionDI(_registros, _memoria); break;
                case 0xF4: _error = true; break;
                case 0xF5: instruccion = new InstruccionPUSH_RR(_registros, _memoria, "AF"); break;
                case 0xF6: instruccion = new InstruccionOR_N(_registros, _memoria, parm1); break;
                case 0xF7: instruccion = new InstruccionRST(_registros, _memoria, 0x30); break;
                case 0xF8: instruccion = new InstruccionLD_R_SPD(_registros, _memoria, "HL", parm1); break;
                case 0xF9: instruccion = new InstruccionLD_R_R(_registros, _memoria, "SP", "HL"); break;
                case 0xFA: instruccion = new InstruccionLD_R_ADR(_registros, _memoria, "A", parm1, parm2); break;
                case 0xFB: instruccion = new InstruccionEI(_registros, _memoria); break;
                case 0xFC: _error = true; break;
                case 0xFD: _error = true; break;
                case 0xFE: instruccion = new InstruccionCP_N(_registros, _memoria, parm1); break;
                case 0xFF: instruccion = new InstruccionRST(_registros, _memoria, 0x38); break;

                default: _error = true; break;
            }

            if (_error) Debug.WriteLine("[ERROR] Instruccion " + Debug.hexByte(opCod) + " no esperada");

            if (debug){
                Debug.Write("\t" + instruccion.nombre);
                if (instruccion.nombre.Length < 8){ Debug.Write("\t\t"); }
                else if (instruccion.nombre.Length < 16){ Debug.Write("\t"); }
            }

            // Ejecuta la instruccion y recoge su duracion teorica
            int ticks = instruccion.ejecutar();

            _tiempo += (ticks / _MHZ); // Microsegundos
            // Como el metodo Sleep recibe como minimo 1 ms, espera hasta acumular 1 ms al menos
            int tiempo_ms = (int)(_tiempo % 1000);
            if (tiempo_ms >= 1){
            //				System.Threading.Thread.Sleep(tiempo_ms);
                _tiempo -= (tiempo_ms * 1000);
            }

            // Aumenta los contadores de ciclos para las interrupciones
            for (int i = 0; i < _ciclos.Length; i++) _ciclos[i] += ticks;

            if (debug){
                Debug.Write("\tZ:" + _registros.flagZ + "\tN:" + _registros.flagN + "\tH:" + _registros.flagH + "\tC:" + _registros.flagC);
                Debug.Write("\tA:" + Debug.hexByte(_registros.regA) + "\tB:" + Debug.hexByte(_registros.regB) + "\tC:" + Debug.hexByte(_registros.regC) + "\tD:" + Debug.hexByte(_registros.regD) + "\tE:" + Debug.hexByte(_registros.regE) + "\tH:" + Debug.hexByte(_registros.regH) + "\tL:" + Debug.hexByte(_registros.regL));
                Debug.WriteLine();
            }
        }