private void ExecutionCycle(ExecutionContext context) { byte opcode = (byte)context.Opcode; switch ((OpcodeClass)(opcode & OpcodeClassMask)) { case OpcodeClass.FLOW: Process_FLOW(context); break; case OpcodeClass.MOVE: Process_MOVE(context); break; case OpcodeClass.STACK: Process_STACK(context); break; case OpcodeClass.UNARY: Process_UNARY(context); break; case OpcodeClass.BO_EQUALS: Process_BO_EQUALS(context); break; case OpcodeClass.BO_COMPARE: Process_BO_COMPARE(context); break; case OpcodeClass.BF_OR: Process_BF_OR(context); break; case OpcodeClass.BF_AND: Process_BF_AND(context); break; case OpcodeClass.BF_XOR: Process_BF_XOR(context); break; case OpcodeClass.BF_ADD: Process_BF_ADD(context); break; case OpcodeClass.BF_SUB: Process_BF_SUB(context); break; case OpcodeClass.BF_MUL: Process_BF_MUL(context); break; case OpcodeClass.BF_DIV: Process_BF_DIV(context); break; case OpcodeClass.BF_MOD: Process_BF_MOD(context); break; case OpcodeClass.BF_LSH: Process_BF_LSH(context); break; case OpcodeClass.BF_RSH: Process_BF_RSH(context); break; default: throw new McuException(); } if (context.ResultStatus == InstructionStatus.Normal) { int newAddress = GetInstructionPointer() + context.GetInstructionSize(); if (newAddress > 255) { int newBank = GetBank() + 1; if (newBank > MaxBank) newBank = MinBank; SetBank((byte)newBank); newAddress %= 256; } SetInstructionPointer((byte)newAddress); } else if (context.ResultStatus == InstructionStatus.NotImplemented) { throw new McuException(); } }