GameBoy\Opcode::opcode118 PHP Méthode

opcode118() public static méthode

HALT
public static opcode118 ( Core $core )
$core Core
    public static function opcode118(Core $core)
    {
        if ($core->untilEnable == 1) {
            /*VBA-M says this fixes Torpedo Range (Seems to work):
              Involves an edge case where an EI is placed right before a HALT.
              EI in this case actually is immediate, so we adjust (Hacky?).*/
            $core->programCounter = $core->nswtuw($core->programCounter - 1);
        } else {
            if (!$core->halt && !$core->IME && !$core->cGBC && ($core->memory[0xff0f] & $core->memory[0xffff] & 0x1f) > 0) {
                $core->skipPCIncrement = true;
            }
            $core->halt = true;
            while ($core->halt && ($core->stopEmulator & 1) === 0) {
                /*We're hijacking the main interpreter loop to do this dirty business
                  in order to not slow down the main interpreter loop code with halt state handling.*/
                $bitShift = 0;
                $testbit = 1;
                $interrupts = $core->memory[0xffff] & $core->memory[0xff0f];
                while ($bitShift < 5) {
                    //Check to see if an interrupt is enabled AND requested.
                    if (($testbit & $interrupts) === $testbit) {
                        $core->halt = false;
                        //Get out of halt state if in halt state.
                        return;
                        //Let the main interrupt handler compute the interrupt.
                    }
                    $testbit = 1 << ++$bitShift;
                }
                $core->CPUTicks = 1;
                //1 machine cycle under HALT...
                //Timing:
                $core->updateCore();
            }
            //Throw an error on purpose to exit out of the loop.
            throw new Exception('HALT_OVERRUN');
        }
    }
Opcode