diff options
author | Gabriel Rodrigues Couto <gabriel@rodriguescouto.com.br> | 2016-02-29 12:12:02 -0300 |
---|---|---|
committer | Gabriel Rodrigues Couto <gabriel@rodriguescouto.com.br> | 2016-02-29 12:12:02 -0300 |
commit | cc403325cfd30fb2559dde2f474cbcb795e513f2 (patch) | |
tree | 12da38da7f9c8f4c175b49551d557c2c160a9674 | |
parent | c2c6a6ca84830053f19cb827046dcfe18969c055 (diff) | |
parent | 4620492b8916e2525bc37f3ba8efffb86b73e94a (diff) | |
download | php-terminal-gameboy-emulator-cc403325cfd30fb2559dde2f474cbcb795e513f2.zip php-terminal-gameboy-emulator-cc403325cfd30fb2559dde2f474cbcb795e513f2.tar.gz php-terminal-gameboy-emulator-cc403325cfd30fb2559dde2f474cbcb795e513f2.tar.bz2 |
Merge pull request #41 from ikari7789/refactor-opcode
Refactor Opcode and Cbopcode to use static methods
-rw-r--r-- | boot.php | 15 | ||||
-rw-r--r-- | src/Cbopcode.php | 4053 | ||||
-rw-r--r-- | src/Core.php | 14 | ||||
-rw-r--r-- | src/Opcode.php | 5718 |
4 files changed, 6686 insertions, 3114 deletions
@@ -14,10 +14,17 @@ use GameBoy\Canvas\TerminalCanvas; use GameBoy\Core; use GameBoy\Keyboard; -set_exception_handler(function (Exception $exception) { - fwrite(STDERR, $exception->getMessage().PHP_EOL); - exit(254); -}); +if (PHP_VERSION_ID >= 70000) { + set_exception_handler(function (Error $exception) { + fwrite(STDERR, $exception->getMessage() . PHP_EOL); + exit(254); + }); +} else { + set_exception_handler(function (Exception $exception) { + fwrite(STDERR, $exception->getMessage() . PHP_EOL); + exit(254); + }); +} if (count($argv) < 2) { throw new RuntimeException('You need to pass the ROM file name (Ex: drmario.rom)'); diff --git a/src/Cbopcode.php b/src/Cbopcode.php index 0b80c4d..37a6942 100644 --- a/src/Cbopcode.php +++ b/src/Cbopcode.php @@ -4,1143 +4,2920 @@ namespace GameBoy; class Cbopcode { - public $functionsArray = []; - - public function __construct() - { - //#0x00: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerB & 0x80) == 0x80); - $parentObj->registerB = (($parentObj->registerB << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerB == 0); - }; - - //#0x01: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerC & 0x80) == 0x80); - $parentObj->registerC = (($parentObj->registerC << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerC == 0); - }; - //#0x02: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerD & 0x80) == 0x80); - $parentObj->registerD = (($parentObj->registerD << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerD == 0); - }; - //#0x03: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerE & 0x80) == 0x80); - $parentObj->registerE = (($parentObj->registerE << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerE == 0); - }; - //#0x04: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registersHL & 0x8000) == 0x8000); - $parentObj->registersHL = (($parentObj->registersHL << 1) & 0xFE00) + (($parentObj->FCarry) ? 0x100 : 0) + ($parentObj->registersHL & 0xFF); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registersHL <= 0xFF); - }; - //#0x05: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registersHL & 0x80) == 0x80); - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + (($parentObj->registersHL << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0xFF) == 0x00); - }; - //#0x06: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->FCarry = (($temp_var & 0x80) == 0x80); - $temp_var = (($temp_var << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->memoryWrite($parentObj->registersHL, $temp_var); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($temp_var == 0x00); - }; - //#0x07: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerA & 0x80) == 0x80); - $parentObj->registerA = (($parentObj->registerA << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerA == 0x00); - }; - //#0x08: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerB & 0x01) == 0x01); - $parentObj->registerB = (($parentObj->FCarry) ? 0x80 : 0) + ($parentObj->registerB >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerB == 0); - }; - //#0x09: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerC & 0x01) == 0x01); - $parentObj->registerC = (($parentObj->FCarry) ? 0x80 : 0) + ($parentObj->registerC >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerC == 0); - }; - //#0x0A: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerD & 0x01) == 0x01); - $parentObj->registerD = (($parentObj->FCarry) ? 0x80 : 0) + ($parentObj->registerD >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerD == 0); - }; - //#0x0B: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerE & 0x01) == 0x01); - $parentObj->registerE = (($parentObj->FCarry) ? 0x80 : 0) + ($parentObj->registerE >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerE == 0); - }; - //#0x0C: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registersHL & 0x0100) == 0x0100); - $parentObj->registersHL = (($parentObj->FCarry) ? 0x8000 : 0) + (($parentObj->registersHL >> 1) & 0xFF00) + ($parentObj->registersHL & 0xFF); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registersHL <= 0xFF); - }; - //#0x0D: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registersHL & 0x01) == 0x01); - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + (($parentObj->FCarry) ? 0x80 : 0) + (($parentObj->registersHL & 0xFF) >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0xFF) == 0x00); - }; - //#0x0E: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->FCarry = (($temp_var & 0x01) == 0x01); - $temp_var = (($parentObj->FCarry) ? 0x80 : 0) + ($temp_var >> 1); - $parentObj->memoryWrite($parentObj->registersHL, $temp_var); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($temp_var == 0x00); - }; - //#0x0F: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerA & 0x01) == 0x01); - $parentObj->registerA = (($parentObj->FCarry) ? 0x80 : 0) + ($parentObj->registerA >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerA == 0x00); - }; - //#0x10: - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registerB & 0x80) == 0x80); - $parentObj->registerB = (($parentObj->registerB << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerB == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registerC & 0x80) == 0x80); - $parentObj->registerC = (($parentObj->registerC << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerC == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registerD & 0x80) == 0x80); - $parentObj->registerD = (($parentObj->registerD << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerD == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registerE & 0x80) == 0x80); - $parentObj->registerE = (($parentObj->registerE << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerE == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registersHL & 0x8000) == 0x8000); - $parentObj->registersHL = (($parentObj->registersHL << 1) & 0xFE00) + (($parentObj->FCarry) ? 0x100 : 0) + ($parentObj->registersHL & 0xFF); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registersHL <= 0xFF); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registersHL & 0x80) == 0x80); - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + (($parentObj->registersHL << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0xFF) == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $newFCarry = (($temp_var & 0x80) == 0x80); - $temp_var = (($temp_var << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FCarry = $newFCarry; - $parentObj->memoryWrite($parentObj->registersHL, $temp_var); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($temp_var == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registerA & 0x80) == 0x80); - $parentObj->registerA = (($parentObj->registerA << 1) & 0xFF) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerA == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registerB & 0x01) == 0x01); - $parentObj->registerB = (($parentObj->FCarry) ? 0x80 : 0) + ($parentObj->registerB >> 1); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerB == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registerC & 0x01) == 0x01); - $parentObj->registerC = (($parentObj->FCarry) ? 0x80 : 0) + ($parentObj->registerC >> 1); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerC == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registerD & 0x01) == 0x01); - $parentObj->registerD = (($parentObj->FCarry) ? 0x80 : 0) + ($parentObj->registerD >> 1); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerD == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registerE & 0x01) == 0x01); - $parentObj->registerE = (($parentObj->FCarry) ? 0x80 : 0) + ($parentObj->registerE >> 1); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerE == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registersHL & 0x0100) == 0x0100); - $parentObj->registersHL = (($parentObj->FCarry) ? 0x8000 : 0) + (($parentObj->registersHL >> 1) & 0xFF00) + ($parentObj->registersHL & 0xFF); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registersHL <= 0xFF); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registersHL & 0x01) == 0x01); - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + (($parentObj->FCarry) ? 0x80 : 0) + (($parentObj->registersHL & 0xFF) >> 1); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0xFF) == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $newFCarry = (($temp_var & 0x01) == 0x01); - $temp_var = (($parentObj->FCarry) ? 0x80 : 0) + ($temp_var >> 1); - $parentObj->FCarry = $newFCarry; - $parentObj->memoryWrite($parentObj->registersHL, $temp_var); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($temp_var == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $newFCarry = (($parentObj->registerA & 0x01) == 0x01); - $parentObj->registerA = (($parentObj->FCarry) ? 0x80 : 0) + ($parentObj->registerA >> 1); - $parentObj->FCarry = $newFCarry; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerA == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerB & 0x80) == 0x80); - $parentObj->registerB = ($parentObj->registerB << 1) & 0xFF; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerB == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerC & 0x80) == 0x80); - $parentObj->registerC = ($parentObj->registerC << 1) & 0xFF; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerC == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerD & 0x80) == 0x80); - $parentObj->registerD = ($parentObj->registerD << 1) & 0xFF; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerD == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerE & 0x80) == 0x80); - $parentObj->registerE = ($parentObj->registerE << 1) & 0xFF; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerE == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registersHL & 0x8000) == 0x8000); - $parentObj->registersHL = (($parentObj->registersHL << 1) & 0xFE00) + ($parentObj->registersHL & 0xFF); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registersHL <= 0xFF); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registersHL & 0x0080) == 0x0080); - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + (($parentObj->registersHL << 1) & 0xFF); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0xFF) == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->FCarry = (($temp_var & 0x80) == 0x80); - $temp_var = ($temp_var << 1) & 0xFF; - $parentObj->memoryWrite($parentObj->registersHL, $temp_var); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($temp_var == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerA & 0x80) == 0x80); - $parentObj->registerA = ($parentObj->registerA << 1) & 0xFF; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerA == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerB & 0x01) == 0x01); - $parentObj->registerB = ($parentObj->registerB & 0x80) + ($parentObj->registerB >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerB == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerC & 0x01) == 0x01); - $parentObj->registerC = ($parentObj->registerC & 0x80) + ($parentObj->registerC >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerC == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerD & 0x01) == 0x01); - $parentObj->registerD = ($parentObj->registerD & 0x80) + ($parentObj->registerD >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerD == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerE & 0x01) == 0x01); - $parentObj->registerE = ($parentObj->registerE & 0x80) + ($parentObj->registerE >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerE == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registersHL & 0x0100) == 0x0100); - $parentObj->registersHL = (($parentObj->registersHL >> 1) & 0xFF00) + ($parentObj->registersHL & 0x80FF); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registersHL <= 0xFF); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registersHL & 0x0001) == 0x0001); - $parentObj->registersHL = ($parentObj->registersHL & 0xFF80) + (($parentObj->registersHL & 0xFF) >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0xFF) == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->FCarry = (($temp_var & 0x01) == 0x01); - $temp_var = ($temp_var & 0x80) + ($temp_var >> 1); - $parentObj->memoryWrite($parentObj->registersHL, $temp_var); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($temp_var == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerA & 0x01) == 0x01); - $parentObj->registerA = ($parentObj->registerA & 0x80) + ($parentObj->registerA >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerA == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = (($parentObj->registerB & 0xF) << 4) + ($parentObj->registerB >> 4); - $parentObj->FZero = ($parentObj->registerB == 0); - $parentObj->FCarry = $parentObj->FHalfCarry = $parentObj->FSubtract = false; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = (($parentObj->registerC & 0xF) << 4) + ($parentObj->registerC >> 4); - $parentObj->FZero = ($parentObj->registerC == 0); - $parentObj->FCarry = $parentObj->FHalfCarry = $parentObj->FSubtract = false; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = (($parentObj->registerD & 0xF) << 4) + ($parentObj->registerD >> 4); - $parentObj->FZero = ($parentObj->registerD == 0); - $parentObj->FCarry = $parentObj->FHalfCarry = $parentObj->FSubtract = false; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = (($parentObj->registerE & 0xF) << 4) + ($parentObj->registerE >> 4); - $parentObj->FZero = ($parentObj->registerE == 0); - $parentObj->FCarry = $parentObj->FHalfCarry = $parentObj->FSubtract = false; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = (($parentObj->registersHL & 0xF00) << 4) + (($parentObj->registersHL & 0xF000) >> 4) + ($parentObj->registersHL & 0xFF); - $parentObj->FZero = ($parentObj->registersHL <= 0xFF); - $parentObj->FCarry = $parentObj->FHalfCarry = $parentObj->FSubtract = false; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + (($parentObj->registersHL & 0xF) << 4) + (($parentObj->registersHL & 0xF0) >> 4); - $parentObj->FZero = (($parentObj->registersHL & 0xFF) == 0); - $parentObj->FCarry = $parentObj->FHalfCarry = $parentObj->FSubtract = false; - }; - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $temp_var = (($temp_var & 0xF) << 4) + ($temp_var >> 4); - $parentObj->memoryWrite($parentObj->registersHL, $temp_var); - $parentObj->FZero = ($temp_var == 0); - $parentObj->FCarry = $parentObj->FHalfCarry = $parentObj->FSubtract = false; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = (($parentObj->registerA & 0xF) << 4) + ($parentObj->registerA >> 4); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FCarry = $parentObj->FHalfCarry = $parentObj->FSubtract = false; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerB & 0x01) == 0x01); - $parentObj->registerB >>= 1; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerB == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerC & 0x01) == 0x01); - $parentObj->registerC >>= 1; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerC == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerD & 0x01) == 0x01); - $parentObj->registerD >>= 1; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerD == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerE & 0x01) == 0x01); - $parentObj->registerE >>= 1; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerE == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registersHL & 0x0100) == 0x0100); - $parentObj->registersHL = (($parentObj->registersHL >> 1) & 0xFF00) + ($parentObj->registersHL & 0xFF); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registersHL <= 0xFF); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registersHL & 0x0001) == 0x0001); - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + (($parentObj->registersHL & 0xFF) >> 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0xFF) == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->FCarry = (($temp_var & 0x01) == 0x01); - $parentObj->memoryWrite($parentObj->registersHL, $temp_var >>= 1); - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($temp_var == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerA & 0x01) == 0x01); - $parentObj->registerA >>= 1; - $parentObj->FHalfCarry = $parentObj->FSubtract = false; - $parentObj->FZero = ($parentObj->registerA == 0x00); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerB & 0x01) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerC & 0x01) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerD & 0x01) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerE & 0x01) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0100) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0001) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0x01) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerA & 0x01) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerB & 0x02) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerC & 0x02) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerD & 0x02) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerE & 0x02) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0200) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0002) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0x02) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerA & 0x02) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerB & 0x04) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerC & 0x04) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerD & 0x04) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerE & 0x04) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0400) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0004) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0x04) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerA & 0x04) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerB & 0x08) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerC & 0x08) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerD & 0x08) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerE & 0x08) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0800) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0008) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0x08) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerA & 0x08) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerB & 0x10) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerC & 0x10) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerD & 0x10) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerE & 0x10) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x1000) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0010) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0x10) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerA & 0x10) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerB & 0x20) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerC & 0x20) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerD & 0x20) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerE & 0x20) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x2000) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0020) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0x20) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerA & 0x20) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerB & 0x40) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerC & 0x40) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerD & 0x40) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerE & 0x40) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x4000) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0040) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0x40) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerA & 0x40) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerB & 0x80) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerC & 0x80) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerD & 0x80) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerE & 0x80) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x8000) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registersHL & 0x0080) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0x80) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = false; - $parentObj->FZero = (($parentObj->registerA & 0x80) == 0); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB &= 0xFE; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC &= 0xFE; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD &= 0xFE; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE &= 0xFE; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFEFF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFFFE; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0xFE); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= 0xFE; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB &= 0xFD; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC &= 0xFD; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD &= 0xFD; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE &= 0xFD; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFDFF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFFFD; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0xFD); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= 0xFD; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB &= 0xFB; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC &= 0xFB; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD &= 0xFB; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE &= 0xFB; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFBFF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFFFB; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0xFB); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= 0xFB; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB &= 0xF7; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC &= 0xF7; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD &= 0xF7; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE &= 0xF7; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xF7FF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFFF7; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0xF7); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= 0xF7; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB &= 0xEF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC &= 0xEF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD &= 0xEF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE &= 0xEF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xEFFF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFFEF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0xEF); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= 0xEF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB &= 0xDF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC &= 0xDF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD &= 0xDF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE &= 0xDF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xDFFF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFFDF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0xDF); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= 0xDF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB &= 0xBF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC &= 0xBF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD &= 0xBF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE &= 0xBF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xBFFF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFFBF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0xBF); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= 0xBF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB &= 0x7F; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC &= 0x7F; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD &= 0x7F; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE &= 0x7F; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0x7FFF; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL &= 0xFF7F; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) & 0x7F); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= 0x7F; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB |= 0x01; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC |= 0x01; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD |= 0x01; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE |= 0x01; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x0100; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x01; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) | 0x01); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= 0x01; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB |= 0x02; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC |= 0x02; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD |= 0x02; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE |= 0x02; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x0200; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x02; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) | 0x02); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= 0x02; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB |= 0x04; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC |= 0x04; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD |= 0x04; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE |= 0x04; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x0400; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x04; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) | 0x04); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= 0x04; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB |= 0x08; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC |= 0x08; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD |= 0x08; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE |= 0x08; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x0800; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x08; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) | 0x08); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= 0x08; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB |= 0x10; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC |= 0x10; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD |= 0x10; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE |= 0x10; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x1000; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x10; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) | 0x10); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= 0x10; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB |= 0x20; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC |= 0x20; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD |= 0x20; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE |= 0x20; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x2000; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x20; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) | 0x20); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= 0x20; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB |= 0x40; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC |= 0x40; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD |= 0x40; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE |= 0x40; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x4000; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x40; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) | 0x40); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= 0x40; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB |= 0x80; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC |= 0x80; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD |= 0x80; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE |= 0x80; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x8000; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL |= 0x80; - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) | 0x80); - }; - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= 0x80; - }; - } - - public function get() - { - return $this->functionsArray; + /** + * Run the given cbopcode. + * + * @param Core $core + * @param int $address + * @return mixed + */ + public static function run(Core $core, $address) + { + $function = 'cbopcode'.$address; + return Cbopcode::$function($core); + } + + /** + * Cbopcode #0x00. + * + * @param Core $core + */ + private static function cbopcode0(Core $core) + { + $core->FCarry = (($core->registerB & 0x80) == 0x80); + $core->registerB = (($core->registerB << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerB == 0); + } + + /** + * Cbopcode #0x01. + * + * @param Core $core + */ + private static function cbopcode1(Core $core) + { + $core->FCarry = (($core->registerC & 0x80) == 0x80); + $core->registerC = (($core->registerC << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerC == 0); + } + + /** + * Cbopcode #0x02. + * + * @param Core $core + */ + private static function cbopcode2(Core $core) + { + $core->FCarry = (($core->registerD & 0x80) == 0x80); + $core->registerD = (($core->registerD << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerD == 0); + } + + /** + * Cbopcode #0x03. + * + * @param Core $core + */ + private static function cbopcode3(Core $core) + { + $core->FCarry = (($core->registerE & 0x80) == 0x80); + $core->registerE = (($core->registerE << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerE == 0); + } + + /** + * Cbopcode #0x04. + * + * @param Core $core + */ + private static function cbopcode4(Core $core) + { + $core->FCarry = (($core->registersHL & 0x8000) == 0x8000); + $core->registersHL = (($core->registersHL << 1) & 0xFE00) + (($core->FCarry) ? 0x100 : 0) + ($core->registersHL & 0xFF); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registersHL <= 0xFF); + } + + /** + * Cbopcode #0x05. + * + * @param Core $core + */ + private static function cbopcode5(Core $core) + { + $core->FCarry = (($core->registersHL & 0x80) == 0x80); + $core->registersHL = ($core->registersHL & 0xFF00) + (($core->registersHL << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0xFF) == 0x00); + } + + /** + * Cbopcode #0x06. + * + * @param Core $core + */ + private static function cbopcode6(Core $core) + { + $temp_var = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->FCarry = (($temp_var & 0x80) == 0x80); + $temp_var = (($temp_var << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->memoryWrite($core->registersHL, $temp_var); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($temp_var == 0x00); + } + + /** + * Cbopcode #0x07. + * + * @param Core $core + */ + private static function cbopcode7(Core $core) + { + $core->FCarry = (($core->registerA & 0x80) == 0x80); + $core->registerA = (($core->registerA << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerA == 0x00); + } + + /** + * Cbopcode #0x08. + * + * @param Core $core + */ + private static function cbopcode8(Core $core) + { + $core->FCarry = (($core->registerB & 0x01) == 0x01); + $core->registerB = (($core->FCarry) ? 0x80 : 0) + ($core->registerB >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerB == 0); + } + + /** + * Cbopcode #0x09. + * + * @param Core $core + */ + private static function cbopcode9(Core $core) + { + $core->FCarry = (($core->registerC & 0x01) == 0x01); + $core->registerC = (($core->FCarry) ? 0x80 : 0) + ($core->registerC >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerC == 0); + } + + /** + * Cbopcode #0x0A. + * + * @param Core $core + */ + private static function cbopcode10(Core $core) + { + $core->FCarry = (($core->registerD & 0x01) == 0x01); + $core->registerD = (($core->FCarry) ? 0x80 : 0) + ($core->registerD >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerD == 0); + } + + /** + * Cbopcode #0x0B. + * + * @param Core $core + */ + private static function cbopcode11(Core $core) + { + $core->FCarry = (($core->registerE & 0x01) == 0x01); + $core->registerE = (($core->FCarry) ? 0x80 : 0) + ($core->registerE >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerE == 0); + } + + /** + * Cbopcode #0x0C. + * + * @param Core $core + */ + private static function cbopcode12(Core $core) + { + $core->FCarry = (($core->registersHL & 0x0100) == 0x0100); + $core->registersHL = (($core->FCarry) ? 0x8000 : 0) + (($core->registersHL >> 1) & 0xFF00) + ($core->registersHL & 0xFF); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registersHL <= 0xFF); + } + + /** + * Cbopcode #0x0D. + * + * @param Core $core + */ + private static function cbopcode13(Core $core) + { + $core->FCarry = (($core->registersHL & 0x01) == 0x01); + $core->registersHL = ($core->registersHL & 0xFF00) + (($core->FCarry) ? 0x80 : 0) + (($core->registersHL & 0xFF) >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0xFF) == 0x00); + } + + /** + * Cbopcode #0x0E. + * + * @param Core $core + */ + private static function cbopcode14(Core $core) + { + $temp_var = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->FCarry = (($temp_var & 0x01) == 0x01); + $temp_var = (($core->FCarry) ? 0x80 : 0) + ($temp_var >> 1); + $core->memoryWrite($core->registersHL, $temp_var); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($temp_var == 0x00); + } + + /** + * Cbopcode #0x0F. + * + * @param Core $core + */ + private static function cbopcode15(Core $core) + { + $core->FCarry = (($core->registerA & 0x01) == 0x01); + $core->registerA = (($core->FCarry) ? 0x80 : 0) + ($core->registerA >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerA == 0x00); + } + + /** + * Cbopcode #0x10. + * + * @param Core $core + */ + private static function cbopcode16(Core $core) + { + $newFCarry = (($core->registerB & 0x80) == 0x80); + $core->registerB = (($core->registerB << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerB == 0); + } + + /** + * Cbopcode #0x11. + * + * @param Core $core + */ + private static function cbopcode17(Core $core) + { + $newFCarry = (($core->registerC & 0x80) == 0x80); + $core->registerC = (($core->registerC << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerC == 0); + } + + /** + * Cbopcode #0x12. + * + * @param Core $core + */ + private static function cbopcode18(Core $core) + { + $newFCarry = (($core->registerD & 0x80) == 0x80); + $core->registerD = (($core->registerD << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerD == 0); + } + + /** + * Cbopcode #0x13. + * + * @param Core $core + */ + private static function cbopcode19(Core $core) + { + $newFCarry = (($core->registerE & 0x80) == 0x80); + $core->registerE = (($core->registerE << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerE == 0); + } + + /** + * Cbopcode #0x14. + * + * @param Core $core + */ + private static function cbopcode20(Core $core) + { + $newFCarry = (($core->registersHL & 0x8000) == 0x8000); + $core->registersHL = (($core->registersHL << 1) & 0xFE00) + (($core->FCarry) ? 0x100 : 0) + ($core->registersHL & 0xFF); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registersHL <= 0xFF); + } + + /** + * Cbopcode #0x15. + * + * @param Core $core + */ + private static function cbopcode21(Core $core) + { + $newFCarry = (($core->registersHL & 0x80) == 0x80); + $core->registersHL = ($core->registersHL & 0xFF00) + (($core->registersHL << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0xFF) == 0x00); + } + + /** + * Cbopcode #0x16. + * + * @param Core $core + */ + private static function cbopcode22(Core $core) + { + $temp_var = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $newFCarry = (($temp_var & 0x80) == 0x80); + $temp_var = (($temp_var << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FCarry = $newFCarry; + $core->memoryWrite($core->registersHL, $temp_var); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($temp_var == 0x00); + } + + /** + * Cbopcode #0x17. + * + * @param Core $core + */ + private static function cbopcode23(Core $core) + { + $newFCarry = (($core->registerA & 0x80) == 0x80); + $core->registerA = (($core->registerA << 1) & 0xFF) + (($core->FCarry) ? 1 : 0); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerA == 0x00); + } + + /** + * Cbopcode #0x18. + * + * @param Core $core + */ + private static function cbopcode24(Core $core) + { + $newFCarry = (($core->registerB & 0x01) == 0x01); + $core->registerB = (($core->FCarry) ? 0x80 : 0) + ($core->registerB >> 1); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerB == 0); + } + + /** + * Cbopcode #0x19. + * + * @param Core $core + */ + private static function cbopcode25(Core $core) + { + $newFCarry = (($core->registerC & 0x01) == 0x01); + $core->registerC = (($core->FCarry) ? 0x80 : 0) + ($core->registerC >> 1); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerC == 0); + } + + /** + * Cbopcode #0x1A. + * + * @param Core $core + */ + private static function cbopcode26(Core $core) + { + $newFCarry = (($core->registerD & 0x01) == 0x01); + $core->registerD = (($core->FCarry) ? 0x80 : 0) + ($core->registerD >> 1); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerD == 0); + } + + /** + * Cbopcode #0x1B. + * + * @param Core $core + */ + private static function cbopcode27(Core $core) + { + $newFCarry = (($core->registerE & 0x01) == 0x01); + $core->registerE = (($core->FCarry) ? 0x80 : 0) + ($core->registerE >> 1); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerE == 0); + } + + /** + * Cbopcode #0x1C. + * + * @param Core $core + */ + private static function cbopcode28(Core $core) + { + $newFCarry = (($core->registersHL & 0x0100) == 0x0100); + $core->registersHL = (($core->FCarry) ? 0x8000 : 0) + (($core->registersHL >> 1) & 0xFF00) + ($core->registersHL & 0xFF); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registersHL <= 0xFF); + } + + /** + * Cbopcode #0x1D. + * + * @param Core $core + */ + private static function cbopcode29(Core $core) + { + $newFCarry = (($core->registersHL & 0x01) == 0x01); + $core->registersHL = ($core->registersHL & 0xFF00) + (($core->FCarry) ? 0x80 : 0) + (($core->registersHL & 0xFF) >> 1); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0xFF) == 0x00); + } + + /** + * Cbopcode #0x1E. + * + * @param Core $core + */ + private static function cbopcode30(Core $core) + { + $temp_var = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $newFCarry = (($temp_var & 0x01) == 0x01); + $temp_var = (($core->FCarry) ? 0x80 : 0) + ($temp_var >> 1); + $core->FCarry = $newFCarry; + $core->memoryWrite($core->registersHL, $temp_var); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($temp_var == 0x00); + } + + /** + * Cbopcode #0x1F. + * + * @param Core $core + */ + private static function cbopcode31(Core $core) + { + $newFCarry = (($core->registerA & 0x01) == 0x01); + $core->registerA = (($core->FCarry) ? 0x80 : 0) + ($core->registerA >> 1); + $core->FCarry = $newFCarry; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerA == 0x00); + } + + /** + * Cbopcode #0x20. + * + * @param Core $core + */ + private static function cbopcode32(Core $core) + { + $core->FCarry = (($core->registerB & 0x80) == 0x80); + $core->registerB = ($core->registerB << 1) & 0xFF; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerB == 0); + } + + /** + * Cbopcode #0x21. + * + * @param Core $core + */ + private static function cbopcode33(Core $core) + { + $core->FCarry = (($core->registerC & 0x80) == 0x80); + $core->registerC = ($core->registerC << 1) & 0xFF; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerC == 0); + } + + /** + * Cbopcode #0x22. + * + * @param Core $core + */ + private static function cbopcode34(Core $core) + { + $core->FCarry = (($core->registerD & 0x80) == 0x80); + $core->registerD = ($core->registerD << 1) & 0xFF; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerD == 0); + } + + /** + * Cbopcode #0x23. + * + * @param Core $core + */ + private static function cbopcode35(Core $core) + { + $core->FCarry = (($core->registerE & 0x80) == 0x80); + $core->registerE = ($core->registerE << 1) & 0xFF; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerE == 0); + } + + /** + * Cbopcode #0x24. + * + * @param Core $core + */ + private static function cbopcode36(Core $core) + { + $core->FCarry = (($core->registersHL & 0x8000) == 0x8000); + $core->registersHL = (($core->registersHL << 1) & 0xFE00) + ($core->registersHL & 0xFF); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registersHL <= 0xFF); + } + + /** + * Cbopcode #0x25. + * + * @param Core $core + */ + private static function cbopcode37(Core $core) + { + $core->FCarry = (($core->registersHL & 0x0080) == 0x0080); + $core->registersHL = ($core->registersHL & 0xFF00) + (($core->registersHL << 1) & 0xFF); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0xFF) == 0x00); + } + + /** + * Cbopcode #0x26. + * + * @param Core $core + */ + private static function cbopcode38(Core $core) + { + $temp_var = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->FCarry = (($temp_var & 0x80) == 0x80); + $temp_var = ($temp_var << 1) & 0xFF; + $core->memoryWrite($core->registersHL, $temp_var); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($temp_var == 0x00); + } + + /** + * Cbopcode #0x27. + * + * @param Core $core + */ + private static function cbopcode39(Core $core) + { + $core->FCarry = (($core->registerA & 0x80) == 0x80); + $core->registerA = ($core->registerA << 1) & 0xFF; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerA == 0x00); + } + + /** + * Cbopcode #0x28. + * + * @param Core $core + */ + private static function cbopcode40(Core $core) + { + $core->FCarry = (($core->registerB & 0x01) == 0x01); + $core->registerB = ($core->registerB & 0x80) + ($core->registerB >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerB == 0); + } + + /** + * Cbopcode #0x29. + * + * @param Core $core + */ + private static function cbopcode41(Core $core) + { + $core->FCarry = (($core->registerC & 0x01) == 0x01); + $core->registerC = ($core->registerC & 0x80) + ($core->registerC >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerC == 0); + } + + /** + * Cbopcode #0x2A. + * + * @param Core $core + */ + private static function cbopcode42(Core $core) + { + $core->FCarry = (($core->registerD & 0x01) == 0x01); + $core->registerD = ($core->registerD & 0x80) + ($core->registerD >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerD == 0); + } + + /** + * Cbopcode #0x2B. + * + * @param Core $core + */ + private static function cbopcode43(Core $core) + { + $core->FCarry = (($core->registerE & 0x01) == 0x01); + $core->registerE = ($core->registerE & 0x80) + ($core->registerE >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerE == 0); + } + + /** + * + * Cbopcode #0x2C. + * + * @param Core $core + */ + private static function cbopcode44(Core $core) + { + $core->FCarry = (($core->registersHL & 0x0100) == 0x0100); + $core->registersHL = (($core->registersHL >> 1) & 0xFF00) + ($core->registersHL & 0x80FF); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registersHL <= 0xFF); + } + + /** + * Cbopcode #0x2D. + * + * @param Core $core + */ + private static function cbopcode45(Core $core) + { + $core->FCarry = (($core->registersHL & 0x0001) == 0x0001); + $core->registersHL = ($core->registersHL & 0xFF80) + (($core->registersHL & 0xFF) >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0xFF) == 0x00); + } + + /** + * Cbopcode #0x2E. + * + * @param Core $core + */ + private static function cbopcode46(Core $core) + { + $temp_var = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->FCarry = (($temp_var & 0x01) == 0x01); + $temp_var = ($temp_var & 0x80) + ($temp_var >> 1); + $core->memoryWrite($core->registersHL, $temp_var); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($temp_var == 0x00); + } + + /** + * Cbopcode #0x2F. + * + * @param Core $core + */ + private static function cbopcode47(Core $core) + { + $core->FCarry = (($core->registerA & 0x01) == 0x01); + $core->registerA = ($core->registerA & 0x80) + ($core->registerA >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerA == 0x00); + } + + /** + * Cbopcode #0x30. + * + * @param Core $core + */ + private static function cbopcode48(Core $core) + { + $core->registerB = (($core->registerB & 0xF) << 4) + ($core->registerB >> 4); + $core->FZero = ($core->registerB == 0); + $core->FCarry = $core->FHalfCarry = $core->FSubtract = false; + } + + /** + * Cbopcode #0x31. + * + * @param Core $core + */ + private static function cbopcode49(Core $core) + { + $core->registerC = (($core->registerC & 0xF) << 4) + ($core->registerC >> 4); + $core->FZero = ($core->registerC == 0); + $core->FCarry = $core->FHalfCarry = $core->FSubtract = false; + } + + /** + * Cbopcode #0x32. + * + * @param Core $core + */ + private static function cbopcode50(Core $core) + { + $core->registerD = (($core->registerD & 0xF) << 4) + ($core->registerD >> 4); + $core->FZero = ($core->registerD == 0); + $core->FCarry = $core->FHalfCarry = $core->FSubtract = false; + } + + /** + * Cbopcode #0x33. + * + * @param Core $core + */ + private static function cbopcode51(Core $core) + { + $core->registerE = (($core->registerE & 0xF) << 4) + ($core->registerE >> 4); + $core->FZero = ($core->registerE == 0); + $core->FCarry = $core->FHalfCarry = $core->FSubtract = false; + } + + /** + * Cbopcode #0x34. + * + * @param Core $core + */ + private static function cbopcode52(Core $core) + { + $core->registersHL = (($core->registersHL & 0xF00) << 4) + (($core->registersHL & 0xF000) >> 4) + ($core->registersHL & 0xFF); + $core->FZero = ($core->registersHL <= 0xFF); + $core->FCarry = $core->FHalfCarry = $core->FSubtract = false; + } + + /** + * Cbopcode #0x35. + * + * @param Core $core + */ + private static function cbopcode53(Core $core) + { + $core->registersHL = ($core->registersHL & 0xFF00) + (($core->registersHL & 0xF) << 4) + (($core->registersHL & 0xF0) >> 4); + $core->FZero = (($core->registersHL & 0xFF) == 0); + $core->FCarry = $core->FHalfCarry = $core->FSubtract = false; + } + + /** + * Cbopcode #0x36. + * + * @param Core $core + */ + private static function cbopcode54(Core $core) + { + $temp_var = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $temp_var = (($temp_var & 0xF) << 4) + ($temp_var >> 4); + $core->memoryWrite($core->registersHL, $temp_var); + $core->FZero = ($temp_var == 0); + $core->FCarry = $core->FHalfCarry = $core->FSubtract = false; + } + + /** + * Cbopcode #0x37. + * + * @param Core $core + */ + private static function cbopcode55(Core $core) + { + $core->registerA = (($core->registerA & 0xF) << 4) + ($core->registerA >> 4); + $core->FZero = ($core->registerA == 0); + $core->FCarry = $core->FHalfCarry = $core->FSubtract = false; + } + + /** + * Cbopcode #0x38. + * + * @param Core $core + */ + private static function cbopcode56(Core $core) + { + $core->FCarry = (($core->registerB & 0x01) == 0x01); + $core->registerB >>= 1; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerB == 0); + } + + /** + * Cbopcode #0x39. + * + * @param Core $core + */ + private static function cbopcode57(Core $core) + { + $core->FCarry = (($core->registerC & 0x01) == 0x01); + $core->registerC >>= 1; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerC == 0); + } + + /** + * Cbopcode #0x3A. + * + * @param Core $core + */ + private static function cbopcode58(Core $core) + { + $core->FCarry = (($core->registerD & 0x01) == 0x01); + $core->registerD >>= 1; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerD == 0); + } + + /** + * Cbopcode #0x3B. + * + * @param Core $core + */ + private static function cbopcode59(Core $core) + { + $core->FCarry = (($core->registerE & 0x01) == 0x01); + $core->registerE >>= 1; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerE == 0); + } + + /** + * Cbopcode #0x3C. + * + * @param Core $core + */ + private static function cbopcode60(Core $core) + { + $core->FCarry = (($core->registersHL & 0x0100) == 0x0100); + $core->registersHL = (($core->registersHL >> 1) & 0xFF00) + ($core->registersHL & 0xFF); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registersHL <= 0xFF); + } + + /** + * Cbopcode #0x3D. + * + * @param Core $core + */ + private static function cbopcode61(Core $core) + { + $core->FCarry = (($core->registersHL & 0x0001) == 0x0001); + $core->registersHL = ($core->registersHL & 0xFF00) + (($core->registersHL & 0xFF) >> 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0xFF) == 0x00); + } + + /** + * Cbopcode #0x3E. + * + * @param Core $core + */ + private static function cbopcode62(Core $core) + { + $temp_var = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->FCarry = (($temp_var & 0x01) == 0x01); + $core->memoryWrite($core->registersHL, $temp_var >>= 1); + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($temp_var == 0x00); + } + + /** + * Cbopcode #0x3F. + * + * @param Core $core + */ + private static function cbopcode63(Core $core) + { + $core->FCarry = (($core->registerA & 0x01) == 0x01); + $core->registerA >>= 1; + $core->FHalfCarry = $core->FSubtract = false; + $core->FZero = ($core->registerA == 0x00); + } + + /** + * Cbopcode #0x40. + * + * @param Core $core + */ + private static function cbopcode64(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerB & 0x01) == 0); + } + + /** + * Cbopcode #0x41. + * + * @param Core $core + */ + private static function cbopcode65(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerC & 0x01) == 0); + } + + /** + * Cbopcode #0x42. + * + * @param Core $core + */ + private static function cbopcode66(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerD & 0x01) == 0); + } + + /** + * Cbopcode #0x43. + * + * @param Core $core + */ + private static function cbopcode67(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerE & 0x01) == 0); + } + + /** + * Cbopcode #0x44. + * + * @param Core $core + */ + private static function cbopcode68(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0100) == 0); + } + + /** + * Cbopcode #0x45. + * + * @param Core $core + */ + private static function cbopcode69(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0001) == 0); + } + + /** + * Cbopcode #0x46. + * + * @param Core $core + */ + private static function cbopcode70(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0x01) == 0); + } + + /** + * Cbopcode #0x47. + * + * @param Core $core + */ + private static function cbopcode71(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerA & 0x01) == 0); + } + + /** + * Cbopcode #0x48. + * + * @param Core $core + */ + private static function cbopcode72(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerB & 0x02) == 0); + } + + /** + * Cbopcode #0x49. + * + * @param Core $core + */ + private static function cbopcode73(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerC & 0x02) == 0); + } + + /** + * Cbopcode #0x4A. + * + * @param Core $core + */ + private static function cbopcode74(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerD & 0x02) == 0); + } + + /** + * Cbopcode #0x4B. + * + * @param Core $core + */ + private static function cbopcode75(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerE & 0x02) == 0); + } + + /** + * Cbopcode #0x4C. + * + * @param Core $core + */ + private static function cbopcode76(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0200) == 0); + } + + /** + * Cbopcode #0x4D. + * + * @param Core $core + */ + private static function cbopcode77(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0002) == 0); + } + + /** + * Cbopcode #0x4E. + * + * @param Core $core + */ + private static function cbopcode78(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0x02) == 0); + } + + /** + * Cbopcode #0x4F. + * + * @param Core $core + */ + private static function cbopcode79(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerA & 0x02) == 0); + } + + /** + * Cbopcode #0x50. + * + * @param Core $core + */ + private static function cbopcode80(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerB & 0x04) == 0); + } + + /** + * Cbopcode #0x51. + * + * @param Core $core + */ + private static function cbopcode81(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerC & 0x04) == 0); + } + + /** + * Cbopcode #0x52. + * + * @param Core $core + */ + private static function cbopcode82(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerD & 0x04) == 0); + } + + /** + * Cbopcode #0x53. + * + * @param Core $core + */ + private static function cbopcode83(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerE & 0x04) == 0); + } + + /** + * Cbopcode #0x54. + * + * @param Core $core + */ + private static function cbopcode84(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0400) == 0); + } + + /** + * Cbopcode #0x55. + * + * @param Core $core + */ + private static function cbopcode85(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0004) == 0); + } + + /** + * Cbopcode #0x56. + * + * @param Core $core + */ + private static function cbopcode86(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0x04) == 0); + } + + /** + * Cbopcode #0x57. + * + * @param Core $core + */ + private static function cbopcode87(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerA & 0x04) == 0); + } + + /** + * Cbopcode #0x58. + * + * @param Core $core + */ + private static function cbopcode88(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerB & 0x08) == 0); + } + + /** + * Cbopcode #0x59. + * + * @param Core $core + */ + private static function cbopcode89(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerC & 0x08) == 0); + } + + /** + * Cbopcode #0x5A. + * + * @param Core $core + */ + private static function cbopcode90(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerD & 0x08) == 0); + } + + /** + * Cbopcode #0x5B. + * + * @param Core $core + */ + private static function cbopcode91(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerE & 0x08) == 0); + } + + /** + * Cbopcode #0x5C. + * + * @param Core $core + */ + private static function cbopcode92(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0800) == 0); + } + + /** + * Cbopcode #0x5D. + * + * @param Core $core + */ + private static function cbopcode93(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0008) == 0); + } + + /** + * Cbopcode #0x5E. + * + * @param Core $core + */ + private static function cbopcode94(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0x08) == 0); + } + + /** + * Cbopcode #0x5F. + * + * @param Core $core + */ + private static function cbopcode95(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerA & 0x08) == 0); + } + + /** + * Cbopcode #0x60. + * + * @param Core $core + */ + private static function cbopcode96(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerB & 0x10) == 0); + } + + /** + * Cbopcode #0x61. + * + * @param Core $core + */ + private static function cbopcode97(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerC & 0x10) == 0); + } + + /** + * Cbopcode #0x62. + * + * @param Core $core + */ + private static function cbopcode98(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerD & 0x10) == 0); + } + + /** + * Cbopcode #0x63. + * + * @param Core $core + */ + private static function cbopcode99(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerE & 0x10) == 0); + } + + /** + * Cbopcode #0x64. + * + * @param Core $core + */ + private static function cbopcode100(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x1000) == 0); + } + + /** + * Cbopcode #0x65. + * + * @param Core $core + */ + private static function cbopcode101(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0010) == 0); + } + + /** + * Cbopcode #0x66. + * + * @param Core $core + */ + private static function cbopcode102(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0x10) == 0); + } + + /** + * Cbopcode #0x67. + * + * @param Core $core + */ + private static function cbopcode103(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerA & 0x10) == 0); + } + + /** + * Cbopcode #0x68. + * + * @param Core $core + */ + private static function cbopcode104(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerB & 0x20) == 0); + } + + /** + * Cbopcode #0x69. + * + * @param Core $core + */ + private static function cbopcode105(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerC & 0x20) == 0); + } + + /** + * Cbopcode #0x6A. + * + * @param Core $core + */ + private static function cbopcode106(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerD & 0x20) == 0); + } + + /** + * Cbopcode #0x6B. + * + * @param Core $core + */ + private static function cbopcode107(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerE & 0x20) == 0); + } + + /** + * Cbopcode #0x6C. + * + * @param Core $core + */ + private static function cbopcode108(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x2000) == 0); + } + + /** + * Cbopcode #0x6D. + * + * @param Core $core + */ + private static function cbopcode109(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0020) == 0); + } + + /** + * Cbopcode #0x6E. + * + * @param Core $core + */ + private static function cbopcode110(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0x20) == 0); + } + + /** + * Cbopcode #0x6F. + * + * @param Core $core + */ + private static function cbopcode111(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerA & 0x20) == 0); + } + + /** + * Cbopcode #0x70. + * + * @param Core $core + */ + private static function cbopcode112(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerB & 0x40) == 0); + } + + /** + * Cbopcode #0x71. + * + * @param Core $core + */ + private static function cbopcode113(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerC & 0x40) == 0); + } + + /** + * Cbopcode #0x72. + * + * @param Core $core + */ + private static function cbopcode114(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerD & 0x40) == 0); + } + + /** + * Cbopcode #0x73. + * + * @param Core $core + */ + private static function cbopcode115(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerE & 0x40) == 0); + } + + /** + * Cbopcode #0x74. + * + * @param Core $core + */ + private static function cbopcode116(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x4000) == 0); + } + + /** + * Cbopcode #0x75. + * + * @param Core $core + */ + private static function cbopcode117(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0040) == 0); + } + + /** + * Cbopcode #0x76. + * + * @param Core $core + */ + private static function cbopcode118(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0x40) == 0); + } + + /** + * Cbopcode #0x77. + * + * @param Core $core + */ + private static function cbopcode119(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerA & 0x40) == 0); + } + + /** + * Cbopcode #0x78. + * + * @param Core $core + */ + private static function cbopcode120(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerB & 0x80) == 0); + } + + /** + * Cbopcode #0x79. + * + * @param Core $core + */ + private static function cbopcode121(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerC & 0x80) == 0); + } + + /** + * Cbopcode #0x7A. + * + * @param Core $core + */ + private static function cbopcode122(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerD & 0x80) == 0); + } + + /** + * Cbopcode #0x7B. + * + * @param Core $core + */ + private static function cbopcode123(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerE & 0x80) == 0); + } + + /** + * Cbopcode #0x7C. + * + * @param Core $core + */ + private static function cbopcode124(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x8000) == 0); + } + + /** + * Cbopcode #0x7D. + * + * @param Core $core + */ + private static function cbopcode125(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registersHL & 0x0080) == 0); + } + + /** + * Cbopcode #0x7E. + * + * @param Core $core + */ + private static function cbopcode126(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0x80) == 0); + } + + /** + * Cbopcode #0x7F. + * + * @param Core $core + */ + private static function cbopcode127(Core $core) + { + $core->FHalfCarry = true; + $core->FSubtract = false; + $core->FZero = (($core->registerA & 0x80) == 0); + } + + /** + * Cbopcode #0x80. + * + * @param Core $core + */ + private static function cbopcode128(Core $core) + { + $core->registerB &= 0xFE; + } + + /** + * Cbopcode #0x81. + * + * @param Core $core + */ + private static function cbopcode129(Core $core) + { + $core->registerC &= 0xFE; + } + + /** + * Cbopcode #0x82. + * + * @param Core $core + */ + private static function cbopcode130(Core $core) + { + $core->registerD &= 0xFE; + } + + /** + * Cbopcode #0x83. + * + * @param Core $core + */ + private static function cbopcode131(Core $core) + { + $core->registerE &= 0xFE; + } + + /** + * Cbopcode #0x84. + * + * @param Core $core + */ + private static function cbopcode132(Core $core) + { + $core->registersHL &= 0xFEFF; + } + + /** + * Cbopcode #0x85. + * + * @param Core $core + */ + private static function cbopcode133(Core $core) + { + $core->registersHL &= 0xFFFE; + } + + /** + * Cbopcode #0x86. + * + * @param Core $core + */ + private static function cbopcode134(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0xFE); + } + + /** + * Cbopcode #0x87. + * + * @param Core $core + */ + private static function cbopcode135(Core $core) + { + $core->registerA &= 0xFE; + } + + /** + * Cbopcode #0x88. + * + * @param Core $core + */ + private static function cbopcode136(Core $core) + { + $core->registerB &= 0xFD; + } + + /** + * Cbopcode #0x89. + * + * @param Core $core + */ + private static function cbopcode137(Core $core) + { + $core->registerC &= 0xFD; + } + + /** + * Cbopcode #0x8A. + * + * @param Core $core + */ + private static function cbopcode138(Core $core) + { + $core->registerD &= 0xFD; + } + + /** + * Cbopcode #0x8B. + * + * @param Core $core + */ + private static function cbopcode139(Core $core) + { + $core->registerE &= 0xFD; + } + + /** + * Cbopcode #0x8C. + * + * @param Core $core + */ + private static function cbopcode140(Core $core) + { + $core->registersHL &= 0xFDFF; + } + + /** + * Cbopcode #0x8D. + * + * @param Core $core + */ + private static function cbopcode141(Core $core) + { + $core->registersHL &= 0xFFFD; + } + + /** + * Cbopcode #0x8E. + * + * @param Core $core + */ + private static function cbopcode142(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0xFD); + } + + /** + * Cbopcode #0x8F. + * + * @param Core $core + */ + private static function cbopcode143(Core $core) + { + $core->registerA &= 0xFD; + } + + /** + * Cbopcode #0x90. + * + * @param Core $core + */ + private static function cbopcode144(Core $core) + { + $core->registerB &= 0xFB; + } + + /** + * Cbopcode #0x91. + * + * @param Core $core + */ + private static function cbopcode145(Core $core) + { + $core->registerC &= 0xFB; + } + + /** + * Cbopcode #0x92. + * + * @param Core $core + */ + private static function cbopcode146(Core $core) + { + $core->registerD &= 0xFB; + } + + /** + * Cbopcode #0x93. + * + * @param Core $core + */ + private static function cbopcode147(Core $core) + { + $core->registerE &= 0xFB; + } + + /** + * Cbopcode #0x94. + * + * @param Core $core + */ + private static function cbopcode148(Core $core) + { + $core->registersHL &= 0xFBFF; + } + + /** + * Cbopcode #0x95. + * + * @param Core $core + */ + private static function cbopcode149(Core $core) + { + $core->registersHL &= 0xFFFB; + } + + /** + * Cbopcode #0x96. + * + * @param Core $core + */ + private static function cbopcode150(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0xFB); + } + + /** + * Cbopcode #0x97. + * + * @param Core $core + */ + private static function cbopcode151(Core $core) + { + $core->registerA &= 0xFB; + } + + /** + * Cbopcode #0x98. + * + * @param Core $core + */ + private static function cbopcode152(Core $core) + { + $core->registerB &= 0xF7; + } + + /** + * Cbopcode #0x99. + * + * @param Core $core + */ + private static function cbopcode153(Core $core) + { + $core->registerC &= 0xF7; + } + + /** + * Cbopcode #0x9A. + * + * @param Core $core + */ + private static function cbopcode154(Core $core) + { + $core->registerD &= 0xF7; + } + + /** + * Cbopcode #0x9B. + * + * @param Core $core + */ + private static function cbopcode155(Core $core) + { + $core->registerE &= 0xF7; + } + + /** + * Cbopcode #0x9C. + * + * @param Core $core + */ + private static function cbopcode156(Core $core) + { + $core->registersHL &= 0xF7FF; + } + + /** + * Cbopcode #0x9D. + * + * @param Core $core + */ + private static function cbopcode157(Core $core) + { + $core->registersHL &= 0xFFF7; + } + + /** + * Cbopcode #0x9E. + * + * @param Core $core + */ + private static function cbopcode158(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0xF7); + } + + /** + * Cbopcode #0x9F. + * + * @param Core $core + */ + private static function cbopcode159(Core $core) + { + $core->registerA &= 0xF7; + } + + /** + * Cbopcode #0xA0. + * + * @param Core $core + */ + private static function cbopcode160(Core $core) + { + $core->registerB &= 0xEF; + } + + /** + * Cbopcode #0xA1. + * + * @param Core $core + */ + private static function cbopcode161(Core $core) + { + $core->registerC &= 0xEF; + } + + /** + * Cbopcode #0xA2. + * + * @param Core $core + */ + private static function cbopcode162(Core $core) + { + $core->registerD &= 0xEF; + } + + /** + * Cbopcode #0xA3. + * + * @param Core $core + */ + private static function cbopcode163(Core $core) + { + $core->registerE &= 0xEF; + } + + /** + * Cbopcode #0xA4. + * + * @param Core $core + */ + private static function cbopcode164(Core $core) + { + $core->registersHL &= 0xEFFF; + } + + /** + * Cbopcode #0xA5. + * + * @param Core $core + */ + private static function cbopcode165(Core $core) + { + $core->registersHL &= 0xFFEF; + } + + /** + * Cbopcode #0xA6. + * + * @param Core $core + */ + private static function cbopcode166(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0xEF); + } + + /** + * Cbopcode #0xA7. + * + * @param Core $core + */ + private static function cbopcode167(Core $core) + { + $core->registerA &= 0xEF; + } + + /** + * Cbopcode #0xA8. + * + * @param Core $core + */ + private static function cbopcode168(Core $core) + { + $core->registerB &= 0xDF; + } + + /** + * Cbopcode #0xA9. + * + * @param Core $core + */ + private static function cbopcode169(Core $core) + { + $core->registerC &= 0xDF; + } + + /** + * Cbopcode #0xAA. + * + * @param Core $core + */ + private static function cbopcode170(Core $core) + { + $core->registerD &= 0xDF; + } + + /** + * Cbopcode #0xAB. + * + * @param Core $core + */ + private static function cbopcode171(Core $core) + { + $core->registerE &= 0xDF; + } + + /** + * Cbopcode #0xAC. + * + * @param Core $core + */ + private static function cbopcode172(Core $core) + { + $core->registersHL &= 0xDFFF; + } + + /** + * Cbopcode #0xAD. + * + * @param Core $core + */ + private static function cbopcode173(Core $core) + { + $core->registersHL &= 0xFFDF; + } + + /** + * Cbopcode #0xAE. + * + * @param Core $core + */ + private static function cbopcode174(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0xDF); + } + + /** + * Cbopcode #0xAF. + * + * @param Core $core + */ + private static function cbopcode175(Core $core) + { + $core->registerA &= 0xDF; + } + + /** + * Cbopcode #0xB0. + * + * @param Core $core + */ + private static function cbopcode176(Core $core) + { + $core->registerB &= 0xBF; + } + + /** + * Cbopcode #0xB1. + * + * @param Core $core + */ + private static function cbopcode177(Core $core) + { + $core->registerC &= 0xBF; + } + + /** + * Cbopcode #0xB2. + * + * @param Core $core + */ + private static function cbopcode178(Core $core) + { + $core->registerD &= 0xBF; + } + + /** + * Cbopcode #0xB3. + * + * @param Core $core + */ + private static function cbopcode179(Core $core) + { + $core->registerE &= 0xBF; + } + + /** + * Cbopcode #0xB4. + * + * @param Core $core + */ + private static function cbopcode180(Core $core) + { + $core->registersHL &= 0xBFFF; + } + + /** + * Cbopcode #0xB5. + * + * @param Core $core + */ + private static function cbopcode181(Core $core) + { + $core->registersHL &= 0xFFBF; + } + + /** + * Cbopcode #0xB6. + * + * @param Core $core + */ + private static function cbopcode182(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0xBF); + } + + /** + * Cbopcode #0xB7. + * + * @param Core $core + */ + private static function cbopcode183(Core $core) + { + $core->registerA &= 0xBF; + } + + /** + * Cbopcode #0xB8. + * + * @param Core $core + */ + private static function cbopcode184(Core $core) + { + $core->registerB &= 0x7F; + } + + /** + * Cbopcode #0xB9. + * + * @param Core $core + */ + private static function cbopcode185(Core $core) + { + $core->registerC &= 0x7F; + } + + /** + * Cbopcode #0xBA. + * + * @param Core $core + */ + private static function cbopcode186(Core $core) + { + $core->registerD &= 0x7F; + } + + /** + * Cbopcode #0xBB. + * + * @param Core $core + */ + private static function cbopcode187(Core $core) + { + $core->registerE &= 0x7F; + } + + /** + * Cbopcode #0xBC. + * + * @param Core $core + */ + private static function cbopcode188(Core $core) + { + $core->registersHL &= 0x7FFF; + } + + /** + * Cbopcode #0xBD. + * + * @param Core $core + */ + private static function cbopcode189(Core $core) + { + $core->registersHL &= 0xFF7F; + } + + /** + * Cbopcode #0xBE. + * + * @param Core $core + */ + private static function cbopcode190(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) & 0x7F); + } + + /** + * Cbopcode #0xBF. + * + * @param Core $core + */ + private static function cbopcode191(Core $core) + { + $core->registerA &= 0x7F; + } + + /** + * Cbopcode #0xC0. + * + * @param Core $core + */ + private static function cbopcode192(Core $core) + { + $core->registerB |= 0x01; + } + + /** + * Cbopcode #0xC1. + * + * @param Core $core + */ + private static function cbopcode193(Core $core) + { + $core->registerC |= 0x01; + } + + /** + * Cbopcode #0xC2. + * + * @param Core $core + */ + private static function cbopcode194(Core $core) + { + $core->registerD |= 0x01; + } + + /** + * Cbopcode #0xC3. + * + * @param Core $core + */ + private static function cbopcode195(Core $core) + { + $core->registerE |= 0x01; + } + + /** + * Cbopcode #0xC4. + * + * @param Core $core + */ + private static function cbopcode196(Core $core) + { + $core->registersHL |= 0x0100; + } + + /** + * Cbopcode #0xC5. + * + * @param Core $core + */ + private static function cbopcode197(Core $core) + { + $core->registersHL |= 0x01; + } + + /** + * Cbopcode #0xC6. + * + * @param Core $core + */ + private static function cbopcode198(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) | 0x01); + } + + /** + * Cbopcode #0xC7. + * + * @param Core $core + */ + private static function cbopcode199(Core $core) + { + $core->registerA |= 0x01; + } + + /** + * Cbopcode #0xC8. + * + * @param Core $core + */ + private static function cbopcode200(Core $core) + { + $core->registerB |= 0x02; + } + + /** + * Cbopcode #0xC9. + * + * @param Core $core + */ + private static function cbopcode201(Core $core) + { + $core->registerC |= 0x02; + } + + /** + * Cbopcode #0xCA. + * + * @param Core $core + */ + private static function cbopcode202(Core $core) + { + $core->registerD |= 0x02; + } + + /** + * Cbopcode #0xCB. + * + * @param Core $core + */ + private static function cbopcode203(Core $core) + { + $core->registerE |= 0x02; + } + + /** + * Cbopcode #0xCC. + * + * @param Core $core + */ + private static function cbopcode204(Core $core) + { + $core->registersHL |= 0x0200; + } + + /** + * Cbopcode #0xCD. + * + * @param Core $core + */ + private static function cbopcode205(Core $core) + { + $core->registersHL |= 0x02; + } + + /** + * Cbopcode #0xCE. + * + * @param Core $core + */ + private static function cbopcode206(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) | 0x02); + } + + /** + * Cbopcode #0xCF. + * + * @param Core $core + */ + private static function cbopcode207(Core $core) + { + $core->registerA |= 0x02; + } + + /** + * Cbopcode #0xD0. + * + * @param Core $core + */ + private static function cbopcode208(Core $core) + { + $core->registerB |= 0x04; + } + + /** + * Cbopcode #0xD1. + * + * @param Core $core + */ + private static function cbopcode209(Core $core) + { + $core->registerC |= 0x04; + } + + /** + * Cbopcode #0xD2. + * + * @param Core $core + */ + private static function cbopcode210(Core $core) + { + $core->registerD |= 0x04; + } + + /** + * Cbopcode #0xD3. + * + * @param Core $core + */ + private static function cbopcode211(Core $core) + { + $core->registerE |= 0x04; + } + + /** + * Cbopcode #0xD4. + * + * @param Core $core + */ + private static function cbopcode212(Core $core) + { + $core->registersHL |= 0x0400; + } + + /** + * Cbopcode #0xD5. + * + * @param Core $core + */ + private static function cbopcode213(Core $core) + { + $core->registersHL |= 0x04; + } + + /** + * Cbopcode #0xD6. + * + * @param Core $core + */ + private static function cbopcode214(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) | 0x04); + } + + /** + * Cbopcode #0xD7. + * + * @param Core $core + */ + private static function cbopcode215(Core $core) + { + $core->registerA |= 0x04; + } + + /** + * Cbopcode #0xD8. + * + * @param Core $core + */ + private static function cbopcode216(Core $core) + { + $core->registerB |= 0x08; + } + + /** + * Cbopcode #0xD9. + * + * @param Core $core + */ + private static function cbopcode217(Core $core) + { + $core->registerC |= 0x08; + } + + /** + * Cbopcode #0xDA. + * + * @param Core $core + */ + private static function cbopcode218(Core $core) + { + $core->registerD |= 0x08; + } + + /** + * Cbopcode #0xDB. + * + * @param Core $core + */ + private static function cbopcode219(Core $core) + { + $core->registerE |= 0x08; + } + + /** + * Cbopcode #0xDC. + * + * @param Core $core + */ + private static function cbopcode220(Core $core) + { + $core->registersHL |= 0x0800; + } + + /** + * Cbopcode #0xDD. + * + * @param Core $core + */ + private static function cbopcode221(Core $core) + { + $core->registersHL |= 0x08; + } + + /** + * Cbopcode #0xDE. + * + * @param Core $core + */ + private static function cbopcode222(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) | 0x08); + } + + /** + * Cbopcode #0xDF. + * + * @param Core $core + */ + private static function cbopcode223(Core $core) + { + $core->registerA |= 0x08; + } + + /** + * Cbopcode #0xE0. + * + * @param Core $core + */ + private static function cbopcode224(Core $core) + { + $core->registerB |= 0x10; + } + + /** + * Cbopcode #0xE1. + * + * @param Core $core + */ + private static function cbopcode225(Core $core) + { + $core->registerC |= 0x10; + } + + /** + * Cbopcode #0xE2. + * + * @param Core $core + */ + private static function cbopcode226(Core $core) + { + $core->registerD |= 0x10; + } + + /** + * Cbopcode #0xE3. + * + * @param Core $core + */ + private static function cbopcode227(Core $core) + { + $core->registerE |= 0x10; + } + + /** + * Cbopcode #0xE4. + * + * @param Core $core + */ + private static function cbopcode228(Core $core) + { + $core->registersHL |= 0x1000; + } + + /** + * Cbopcode #0xE5. + * + * @param Core $core + */ + private static function cbopcode229(Core $core) + { + $core->registersHL |= 0x10; + } + + /** + * Cbopcode #0xE6. + * + * @param Core $core + */ + private static function cbopcode230(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) | 0x10); + } + + /** + * Cbopcode #0xE7. + * + * @param Core $core + */ + private static function cbopcode231(Core $core) + { + $core->registerA |= 0x10; + } + + /** + * Cbopcode #0xE8. + * + * @param Core $core + */ + private static function cbopcode232(Core $core) + { + $core->registerB |= 0x20; + } + + /** + * Cbopcode #0xE9. + * + * @param Core $core + */ + private static function cbopcode233(Core $core) + { + $core->registerC |= 0x20; + } + + /** + * Cbopcode #0xEA. + * + * @param Core $core + */ + private static function cbopcode234(Core $core) + { + $core->registerD |= 0x20; + } + + /** + * Cbopcode #0xEB. + * + * @param Core $core + */ + private static function cbopcode235(Core $core) + { + $core->registerE |= 0x20; + } + + /** + * Cbopcode #0xEC. + * + * @param Core $core + */ + private static function cbopcode236(Core $core) + { + $core->registersHL |= 0x2000; + } + + /** + * Cbopcode #0xED. + * + * @param Core $core + */ + private static function cbopcode237(Core $core) + { + $core->registersHL |= 0x20; + } + + /** + * Cbopcode #0xEE. + * + * @param Core $core + */ + private static function cbopcode238(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) | 0x20); + } + + /** + * Cbopcode #0xEF. + * + * @param Core $core + */ + private static function cbopcode239(Core $core) + { + $core->registerA |= 0x20; + } + + /** + * Cbopcode #0xF0. + * + * @param Core $core + */ + private static function cbopcode240(Core $core) + { + $core->registerB |= 0x40; + } + + /** + * Cbopcode #0xF1. + * + * @param Core $core + */ + private static function cbopcode241(Core $core) + { + $core->registerC |= 0x40; + } + + /** + * Cbopcode #0xF2. + * + * @param Core $core + */ + private static function cbopcode242(Core $core) + { + $core->registerD |= 0x40; + } + + /** + * Cbopcode #0xF3. + * + * @param Core $core + */ + private static function cbopcode243(Core $core) + { + $core->registerE |= 0x40; + } + + /** + * Cbopcode #0xF4. + * + * @param Core $core + */ + private static function cbopcode244(Core $core) + { + $core->registersHL |= 0x4000; + } + + /** + * Cbopcode #0xF5. + * + * @param Core $core + */ + private static function cbopcode245(Core $core) + { + $core->registersHL |= 0x40; + } + + /** + * Cbopcode #0xF6. + * + * @param Core $core + */ + private static function cbopcode246(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) | 0x40); + } + + /** + * Cbopcode #0xF7. + * + * @param Core $core + */ + private static function cbopcode247(Core $core) + { + $core->registerA |= 0x40; + } + + /** + * Cbopcode #0xF8. + * + * @param Core $core + */ + private static function cbopcode248(Core $core) + { + $core->registerB |= 0x80; + } + + /** + * Cbopcode #0xF9. + * + * @param Core $core + */ + private static function cbopcode249(Core $core) + { + $core->registerC |= 0x80; + } + + /** + * Cbopcode #0xFA. + * + * @param Core $core + */ + private static function cbopcode250(Core $core) + { + $core->registerD |= 0x80; + } + + /** + * Cbopcode #0xFB. + * + * @param Core $core + */ + private static function cbopcode251(Core $core) + { + $core->registerE |= 0x80; + } + + /** + * Cbopcode #0xFC. + * + * @param Core $core + */ + private static function cbopcode252(Core $core) + { + $core->registersHL |= 0x8000; + } + + /** + * Cbopcode #0xFD. + * + * @param Core $core + */ + private static function cbopcode253(Core $core) + { + $core->registersHL |= 0x80; + } + + /** + * Cbopcode #0xFE. + * + * @param Core $core + */ + private static function cbopcode254(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->registersHL]($core, $core->registersHL) | 0x80); + } + + /** + * Cbopcode #0xFF. + * + * @param Core $core + */ + private static function cbopcode255(Core $core) + { + $core->registerA |= 0x80; } } diff --git a/src/Core.php b/src/Core.php index 4ef0d5a..b7256c4 100644 --- a/src/Core.php +++ b/src/Core.php @@ -360,10 +360,6 @@ class Core public $ffxxDump; - public $OPCODE; - - public $CBOPCODE; - public $TICKTable; public $SecondaryTICKTable; @@ -393,12 +389,6 @@ class Core $this->DAATable = Data::$DAATable; $this->ffxxDump = Data::$ffxxDump; - $opcode = new Opcode(); - $this->OPCODE = $opcode->get(); - - $cbopcode = new Cbopcode(); - $this->CBOPCODE = $cbopcode->get(); - $this->TICKTable = TICKTables::$primary; $this->SecondaryTICKTable = TICKTables::$secondary; @@ -1095,7 +1085,7 @@ class Core //If we bailed out of a halt because the iteration ran down its timing. } else { $this->CPUTicks = 1; - $this->OPCODE[0x76]($this); + Opcode::run($this, 0x76); //Execute Interrupt: $this->runInterrupt(); //Timing: @@ -1131,7 +1121,7 @@ class Core //Get how many CPU cycles the current op code counts for: $this->CPUTicks = $this->TICKTable[$op]; //Execute the OP code instruction: - $this->OPCODE[$op]($this); + Opcode::run($this, $op); //Interrupt Arming: switch ($this->untilEnable) { case 1: diff --git a/src/Opcode.php b/src/Opcode.php index 64037d3..cf767ef 100644 --- a/src/Opcode.php +++ b/src/Opcode.php @@ -2,1974 +2,3772 @@ namespace GameBoy; +use Exception; + class Opcode { - public $functionsArray = []; - - public function __construct() - { - //NOP - //#0x00: - $this->functionsArray[] = function ($parentObj) { - //Do Nothing... - }; - //LD BC, nn - //#0x01: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->registerB = $parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - }; - //LD (BC), A - //#0x02: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite(($parentObj->registerB << 8) + $parentObj->registerC, $parentObj->registerA); - }; - //INC BC - //#0x03: - $this->functionsArray[] = function ($parentObj) { - $temp_var = ((($parentObj->registerB << 8) + $parentObj->registerC) + 1); - $parentObj->registerB = (($temp_var >> 8) & 0xFF); - $parentObj->registerC = ($temp_var & 0xFF); - }; - //INC B - //#0x04: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = (($parentObj->registerB + 1) & 0xFF); - $parentObj->FZero = ($parentObj->registerB == 0); - $parentObj->FHalfCarry = (($parentObj->registerB & 0xF) == 0); - $parentObj->FSubtract = false; - }; - //DEC B - //#0x05: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = $parentObj->unsbtub($parentObj->registerB - 1); - $parentObj->FZero = ($parentObj->registerB == 0); - $parentObj->FHalfCarry = (($parentObj->registerB & 0xF) == 0xF); - $parentObj->FSubtract = true; - }; - //LD B, n - //#0x06: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //RLCA - //#0x07: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerA & 0x80) == 0x80); - $parentObj->registerA = (($parentObj->registerA << 1) & 0xFF) | ($parentObj->registerA >> 7); - $parentObj->FZero = $parentObj->FSubtract = $parentObj->FHalfCarry = false; - }; - //LD (nn), SP - //#0x08: - $this->functionsArray[] = function ($parentObj) { - $temp_var = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->memoryWrite($temp_var, $parentObj->stackPointer & 0xFF); - $parentObj->memoryWrite(($temp_var + 1) & 0xFFFF, $parentObj->stackPointer >> 8); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - }; - //ADD HL, BC - //#0x09: - $this->functionsArray[] = function ($parentObj) { - $n2 = ($parentObj->registerB << 8) + $parentObj->registerC; - $dirtySum = $parentObj->registersHL + $n2; - $parentObj->FHalfCarry = (($parentObj->registersHL & 0xFFF) + ($n2 & 0xFFF) > 0xFFF); - $parentObj->FCarry = ($dirtySum > 0xFFFF); - $parentObj->registersHL = ($dirtySum & 0xFFFF); - $parentObj->FSubtract = false; - }; - //LD A, (BC) - //#0x0A: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->memoryRead(($parentObj->registerB << 8) + $parentObj->registerC); - }; - //DEC BC - //#0x0B: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->unswtuw((($parentObj->registerB << 8) + $parentObj->registerC) - 1); - $parentObj->registerB = ($temp_var >> 8); - $parentObj->registerC = ($temp_var & 0xFF); - }; - //INC C - //#0x0C: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = (($parentObj->registerC + 1) & 0xFF); - $parentObj->FZero = ($parentObj->registerC == 0); - $parentObj->FHalfCarry = (($parentObj->registerC & 0xF) == 0); - $parentObj->FSubtract = false; - }; - //DEC C - //#0x0D: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = $parentObj->unsbtub($parentObj->registerC - 1); - $parentObj->FZero = ($parentObj->registerC == 0); - $parentObj->FHalfCarry = (($parentObj->registerC & 0xF) == 0xF); - $parentObj->FSubtract = true; - }; - //LD C, n - //#0x0E: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //RRCA - //#0x0F: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = (($parentObj->registerA & 1) == 1); - $parentObj->registerA = ($parentObj->registerA >> 1) + (($parentObj->registerA & 1) << 7); - $parentObj->FZero = $parentObj->FSubtract = $parentObj->FHalfCarry = false; - }; - //STOP - //#0x10: - $this->functionsArray[] = function ($parentObj) { - if ($parentObj->cGBC) { - /*TODO: Emulate the speed switch delay: - Delay Amount: - 16 ms when going to double-speed. - 32 ms when going to single-speed. - Also, bits 4 and 5 of 0xFF00 should read as set (1), while the switch is in process. - */ - - // Speed change requested. - if (($parentObj->memory[0xFF4D] & 0x01) == 0x01) { - //Go back to single speed mode. - if (($parentObj->memory[0xFF4D] & 0x80) == 0x80) { - // cout("Going into single clock speed mode.", 0); - $parentObj->multiplier = 1; //TODO: Move this into the delay done code. - $parentObj->memory[0xFF4D] &= 0x7F; //Clear the double speed mode flag. + /** + * Run the given opcode. + * + * @param Core $core + * @param int $address + * @return mixed + */ + public static function run(Core $core, $address) + { + $function = 'opcode'.$address; + return Opcode::$function($core); + } + + /** + * Opcode #0x00. + * + * NOP + * + * @param Core $core + */ + private static function opcode0(Core $core) + { + // Do Nothing... + } + + /** + * Opcode #0x01. + * + * LD BC, nn + * + * @param Core $core + */ + private static function opcode1(Core $core) + { + $core->registerC = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->registerB = $core->memoryRead(($core->programCounter + 1) & 0xFFFF); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + + /** + * Opcode #0x02. + * + * LD (BC), A + * + * @param Core $core + */ + private static function opcode2(Core $core) + { + $core->memoryWrite(($core->registerB << 8) + $core->registerC, $core->registerA); + } + + /** + * Opcode #0x03. + * + * INC BC + * + * @param Core $core + */ + private static function opcode3(Core $core) + { + $temp_var = ((($core->registerB << 8) + $core->registerC) + 1); + $core->registerB = (($temp_var >> 8) & 0xFF); + $core->registerC = ($temp_var & 0xFF); + } + + /** + * Opcode #0x04. + * + * INC B + * + * @param Core $core + */ + private static function opcode4(Core $core) + { + $core->registerB = (($core->registerB + 1) & 0xFF); + $core->FZero = ($core->registerB == 0); + $core->FHalfCarry = (($core->registerB & 0xF) == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x05. + * + * DEC B + * + * @param Core $core + */ + private static function opcode5(Core $core) + { + $core->registerB = $core->unsbtub($core->registerB - 1); + $core->FZero = ($core->registerB == 0); + $core->FHalfCarry = (($core->registerB & 0xF) == 0xF); + $core->FSubtract = true; + } + + /** + * Opcode #0x06. + * + * LD B, n + * + * @param Core $core + */ + private static function opcode6(Core $core) + { + $core->registerB = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0x07. + * + * RCLA + * + * @param Core $core + */ + private static function opcode7(Core $core) + { + $core->FCarry = (($core->registerA & 0x80) == 0x80); + $core->registerA = (($core->registerA << 1) & 0xFF) | ($core->registerA >> 7); + $core->FZero = $core->FSubtract = $core->FHalfCarry = false; + } + + /** + * Opcode #0x08 + * + * LD (nn), SP + * + * @param Core $core + */ + private static function opcode8(Core $core) + { + $temp_var = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->memoryWrite($temp_var, $core->stackPointer & 0xFF); + $core->memoryWrite(($temp_var + 1) & 0xFFFF, $core->stackPointer >> 8); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + + /** + * Opcode #0x09. + * + * ADD HL, BC + * + * @param Core $core + */ + private static function opcode9(Core $core) + { + $n2 = ($core->registerB << 8) + $core->registerC; + $dirtySum = $core->registersHL + $n2; + $core->FHalfCarry = (($core->registersHL & 0xFFF) + ($n2 & 0xFFF) > 0xFFF); + $core->FCarry = ($dirtySum > 0xFFFF); + $core->registersHL = ($dirtySum & 0xFFFF); + $core->FSubtract = false; + } + + /** + * Opcode #0x0A. + * + * LD A, (BC) + * + * @param Core $core + */ + private static function opcode10(Core $core) + { + $core->registerA = $core->memoryRead(($core->registerB << 8) + $core->registerC); + } + + /** + * Opcode #0x0B. + * + * DEC BC + * + * @param Core $core + */ + private static function opcode11(Core $core) + { + $temp_var = $core->unswtuw((($core->registerB << 8) + $core->registerC) - 1); + $core->registerB = ($temp_var >> 8); + $core->registerC = ($temp_var & 0xFF); + } + + /** + * Opcode #0x0C + * + * INC C + * + * @param Core $core + */ + private static function opcode12(Core $core) + { + $core->registerC = (($core->registerC + 1) & 0xFF); + $core->FZero = ($core->registerC == 0); + $core->FHalfCarry = (($core->registerC & 0xF) == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x0D. + * + * DEC C + * + * @param Core $core + */ + private static function opcode13(Core $core) + { + $core->registerC = $core->unsbtub($core->registerC - 1); + $core->FZero = ($core->registerC == 0); + $core->FHalfCarry = (($core->registerC & 0xF) == 0xF); + $core->FSubtract = true; + } + + /** + * Opcode #0x0E. + * + * LD C, n + * + * @param Core $core + */ + private static function opcode14(Core $core) + { + $core->registerC = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0x0F. + * + * RRCA + * + * @param Core $core + */ + private static function opcode15(Core $core) + { + $core->FCarry = (($core->registerA & 1) == 1); + $core->registerA = ($core->registerA >> 1) + (($core->registerA & 1) << 7); + $core->FZero = $core->FSubtract = $core->FHalfCarry = false; + } + + /** + * Opcode #0x10. + * + * STOP + * + * @param Core $core + */ + private static function opcode16(Core $core) + { + if ($core->cGBC) { + /*TODO: Emulate the speed switch delay: + Delay Amount: + 16 ms when going to double-speed. + 32 ms when going to single-speed. + Also, bits 4 and 5 of 0xFF00 should read as set (1), while the switch is in process. + */ + + // Speed change requested. + if (($core->memory[0xFF4D] & 0x01) == 0x01) { + //Go back to single speed mode. + if (($core->memory[0xFF4D] & 0x80) == 0x80) { + // cout("Going into single clock speed mode.", 0); + $core->multiplier = 1; //TODO: Move this into the delay done code. + $core->memory[0xFF4D] &= 0x7F; //Clear the double speed mode flag. //Go to double speed mode. - } else { - // cout("Going into double clock speed mode.", 0); - $parentObj->multiplier = 2; //TODO: Move this into the delay done code. - $parentObj->memory[0xFF4D] |= 0x80; //Set the double speed mode flag. - } - $parentObj->memory[0xFF4D] &= 0xFE; //Reset the request bit. + } else { + // cout("Going into double clock speed mode.", 0); + $core->multiplier = 2; //TODO: Move this into the delay done code. + $core->memory[0xFF4D] |= 0x80; //Set the double speed mode flag. } + $core->memory[0xFF4D] &= 0xFE; //Reset the request bit. } - }; - //LD DE, nn - //#0x11: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->registerD = $parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - }; - //LD (DE), A - //#0x12: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite(($parentObj->registerD << 8) + $parentObj->registerE, $parentObj->registerA); - }; - //INC DE - //#0x13: - $this->functionsArray[] = function ($parentObj) { - $temp_var = ((($parentObj->registerD << 8) + $parentObj->registerE) + 1); - $parentObj->registerD = (($temp_var >> 8) & 0xFF); - $parentObj->registerE = ($temp_var & 0xFF); - }; - //INC D - //#0x14: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = (($parentObj->registerD + 1) & 0xFF); - $parentObj->FZero = ($parentObj->registerD == 0); - $parentObj->FHalfCarry = (($parentObj->registerD & 0xF) == 0); - $parentObj->FSubtract = false; - }; - //DEC D - //#0x15: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = $parentObj->unsbtub($parentObj->registerD - 1); - $parentObj->FZero = ($parentObj->registerD == 0); - $parentObj->FHalfCarry = (($parentObj->registerD & 0xF) == 0xF); - $parentObj->FSubtract = true; - }; - //LD D, n - //#0x16: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //RLA - //#0x17: - $this->functionsArray[] = function ($parentObj) { - $carry_flag = ($parentObj->FCarry) ? 1 : 0; - $parentObj->FCarry = (($parentObj->registerA & 0x80) == 0x80); - $parentObj->registerA = (($parentObj->registerA << 1) & 0xFF) | $carry_flag; - $parentObj->FZero = $parentObj->FSubtract = $parentObj->FHalfCarry = false; - }; - //JR n - //#0x18: - $this->functionsArray[] = function ($parentObj) { - $parentObj->programCounter = $parentObj->nswtuw($parentObj->programCounter + $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)) + 1); - }; - //ADD HL, DE - //#0x19: - $this->functionsArray[] = function ($parentObj) { - $n2 = ($parentObj->registerD << 8) + $parentObj->registerE; - $dirtySum = $parentObj->registersHL + $n2; - $parentObj->FHalfCarry = (($parentObj->registersHL & 0xFFF) + ($n2 & 0xFFF) > 0xFFF); - $parentObj->FCarry = ($dirtySum > 0xFFFF); - $parentObj->registersHL = ($dirtySum & 0xFFFF); - $parentObj->FSubtract = false; - }; - //LD A, (DE) - //#0x1A: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->memoryRead(($parentObj->registerD << 8) + $parentObj->registerE); - }; - //DEC DE - //#0x1B: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->unswtuw((($parentObj->registerD << 8) + $parentObj->registerE) - 1); - $parentObj->registerD = ($temp_var >> 8); - $parentObj->registerE = ($temp_var & 0xFF); - }; - //INC E - //#0x1C: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = (($parentObj->registerE + 1) & 0xFF); - $parentObj->FZero = ($parentObj->registerE == 0); - $parentObj->FHalfCarry = (($parentObj->registerE & 0xF) == 0); - $parentObj->FSubtract = false; - }; - //DEC E - //#0x1D: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = $parentObj->unsbtub($parentObj->registerE - 1); - $parentObj->FZero = ($parentObj->registerE == 0); - $parentObj->FHalfCarry = (($parentObj->registerE & 0xF) == 0xF); - $parentObj->FSubtract = true; - }; - //LD E, n - //#0x1E: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //RRA - //#0x1F: - $this->functionsArray[] = function ($parentObj) { - $carry_flag = ($parentObj->FCarry) ? 0x80 : 0; - $parentObj->FCarry = (($parentObj->registerA & 1) == 1); - $parentObj->registerA = ($parentObj->registerA >> 1) + $carry_flag; - $parentObj->FZero = $parentObj->FSubtract = $parentObj->FHalfCarry = false; - }; - //JR cc, n - //#0x20: - $this->functionsArray[] = function ($parentObj) { - if (!$parentObj->FZero) { - $parentObj->programCounter = $parentObj->nswtuw($parentObj->programCounter + $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)) + 1); - ++$parentObj->CPUTicks; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - } - }; - //LD HL, nn - //#0x21: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - }; - //LDI (HL), A - //#0x22: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->registerA); - $parentObj->registersHL = (($parentObj->registersHL + 1) & 0xFFFF); - }; - //INC HL - //#0x23: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = (($parentObj->registersHL + 1) & 0xFFFF); - }; - //INC H - //#0x24: - $this->functionsArray[] = function ($parentObj) { - $H = ((($parentObj->registersHL >> 8) + 1) & 0xFF); - $parentObj->FZero = ($H == 0); - $parentObj->FHalfCarry = (($H & 0xF) == 0); - $parentObj->FSubtract = false; - $parentObj->registersHL = ($H << 8) + ($parentObj->registersHL & 0xFF); - }; - //DEC H - //#0x25: - $this->functionsArray[] = function ($parentObj) { - $H = $parentObj->unsbtub(($parentObj->registersHL >> 8) - 1); - $parentObj->FZero = ($H == 0); - $parentObj->FHalfCarry = (($H & 0xF) == 0xF); - $parentObj->FSubtract = true; - $parentObj->registersHL = ($H << 8) + ($parentObj->registersHL & 0xFF); - }; - //LD H, n - //#0x26: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter) << 8) + ($parentObj->registersHL & 0xFF); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //DAA - //#0x27: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->registerA; - if ($parentObj->FCarry) { - $temp_var |= 0x100; - } - if ($parentObj->FHalfCarry) { - $temp_var |= 0x200; - } - if ($parentObj->FSubtract) { - $temp_var |= 0x400; - } - $parentObj->registerA = ($temp_var = $parentObj->DAATable[$temp_var]) >> 8; - $parentObj->FZero = (($temp_var & 0x80) == 0x80); - $parentObj->FSubtract = (($temp_var & 0x40) == 0x40); - $parentObj->FHalfCarry = (($temp_var & 0x20) == 0x20); - $parentObj->FCarry = (($temp_var & 0x10) == 0x10); - }; - //JR cc, n - //#0x28: - $this->functionsArray[] = function ($parentObj) { - if ($parentObj->FZero) { - $parentObj->programCounter = $parentObj->nswtuw($parentObj->programCounter + $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)) + 1); - ++$parentObj->CPUTicks; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - } - }; - //ADD HL, HL - //#0x29: - $this->functionsArray[] = function ($parentObj) {; - $parentObj->FHalfCarry = (($parentObj->registersHL & 0xFFF) > 0x7FF); - $parentObj->FCarry = ($parentObj->registersHL > 0x7FFF); - $parentObj->registersHL = ((2 * $parentObj->registersHL) & 0xFFFF); - $parentObj->FSubtract = false; - }; - //LDI A, (HL) - //#0x2A: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->registersHL = (($parentObj->registersHL + 1) & 0xFFFF); - }; - //DEC HL - //#0x2B: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = $parentObj->unswtuw($parentObj->registersHL - 1); - }; - //INC L - //#0x2C: - $this->functionsArray[] = function ($parentObj) { - $L = (($parentObj->registersHL + 1) & 0xFF); - $parentObj->FZero = ($L == 0); - $parentObj->FHalfCarry = (($L & 0xF) == 0); - $parentObj->FSubtract = false; - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + $L; - }; - //DEC L - //#0x2D: - $this->functionsArray[] = function ($parentObj) { - $L = $parentObj->unsbtub(($parentObj->registersHL & 0xFF) - 1); - $parentObj->FZero = ($L == 0); - $parentObj->FHalfCarry = (($L & 0xF) == 0xF); - $parentObj->FSubtract = true; - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + $L; - }; - //LD L, n - //#0x2E: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //CPL - //#0x2F: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA ^= 0xFF; - $parentObj->FSubtract = $parentObj->FHalfCarry = true; - }; - //JR cc, n - //#0x30: - $this->functionsArray[] = function ($parentObj) { - if (!$parentObj->FCarry) { - $parentObj->programCounter = $parentObj->nswtuw($parentObj->programCounter + $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)) + 1); - ++$parentObj->CPUTicks; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - } - }; - //LD SP, nn - //#0x31: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - }; - //LDD (HL), A - //#0x32: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->registerA); - $parentObj->registersHL = $parentObj->unswtuw($parentObj->registersHL - 1); - }; - //INC SP - //#0x33: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = ($parentObj->stackPointer + 1) & 0xFFFF; - }; - //INC (HL) - //#0x34: - $this->functionsArray[] = function ($parentObj) { - $temp_var = (($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) + 1) & 0xFF); - $parentObj->FZero = ($temp_var == 0); - $parentObj->FHalfCarry = (($temp_var & 0xF) == 0); - $parentObj->FSubtract = false; - $parentObj->memoryWrite($parentObj->registersHL, $temp_var); - }; - //DEC (HL) - //#0x35: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->unsbtub($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) - 1); - $parentObj->FZero = ($temp_var == 0); - $parentObj->FHalfCarry = (($temp_var & 0xF) == 0xF); - $parentObj->FSubtract = true; - $parentObj->memoryWrite($parentObj->registersHL, $temp_var); - }; - //LD (HL), n - //#0x36: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //SCF - //#0x37: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = true; - $parentObj->FSubtract = $parentObj->FHalfCarry = false; - }; - //JR cc, n - //#0x38: - $this->functionsArray[] = function ($parentObj) { - if ($parentObj->FCarry) { - $parentObj->programCounter = $parentObj->nswtuw($parentObj->programCounter + $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)) + 1); - ++$parentObj->CPUTicks; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; + } + } + + /** + * Opcode #0x11. + * + * LD DE, nn + * + * @param Core $core + */ + private static function opcode17(Core $core) + { + $core->registerE = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->registerD = $core->memoryRead(($core->programCounter + 1) & 0xFFFF); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + + /** + * Opcode #0x12. + * + * LD (DE), A + * + * @param Core $core + */ + private static function opcode18(Core $core) + { + $core->memoryWrite(($core->registerD << 8) + $core->registerE, $core->registerA); + } + + /** + * Opcode #0x13. + * + * INC DE + * + * @param Core $core + */ + private static function opcode19(Core $core) + { + $temp_var = ((($core->registerD << 8) + $core->registerE) + 1); + $core->registerD = (($temp_var >> 8) & 0xFF); + $core->registerE = ($temp_var & 0xFF); + } + + /** + * Opcode #0x14. + * + * INC D + * + * @param Core $core + */ + private static function opcode20(Core $core) + { + $core->registerD = (($core->registerD + 1) & 0xFF); + $core->FZero = ($core->registerD == 0); + $core->FHalfCarry = (($core->registerD & 0xF) == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x15. + * + * DEC D + * + * @param Core $core + */ + private static function opcode21(Core $core) + { + $core->registerD = $core->unsbtub($core->registerD - 1); + $core->FZero = ($core->registerD == 0); + $core->FHalfCarry = (($core->registerD & 0xF) == 0xF); + $core->FSubtract = true; + } + + /** + * Opcode #0x16. + * + * LD D, n + * + * @param Core $core + */ + private static function opcode22(Core $core) + { + $core->registerD = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0x17. + * + * RLA + * + * @param Core $core + */ + private static function opcode23(Core $core) + { + $carry_flag = ($core->FCarry) ? 1 : 0; + $core->FCarry = (($core->registerA & 0x80) == 0x80); + $core->registerA = (($core->registerA << 1) & 0xFF) | $carry_flag; + $core->FZero = $core->FSubtract = $core->FHalfCarry = false; + } + + /** + * Opcode #0x18. + * + * JR n + * + * @param Core $core + */ + private static function opcode24(Core $core) + { + $core->programCounter = $core->nswtuw($core->programCounter + $core->usbtsb($core->memoryReader[$core->programCounter]($core, $core->programCounter)) + 1); + } + + /** + * Opcode #0x19. + * + * ADD HL, DE + * + * @param Core $core + */ + private static function opcode25(Core $core) + { + $n2 = ($core->registerD << 8) + $core->registerE; + $dirtySum = $core->registersHL + $n2; + $core->FHalfCarry = (($core->registersHL & 0xFFF) + ($n2 & 0xFFF) > 0xFFF); + $core->FCarry = ($dirtySum > 0xFFFF); + $core->registersHL = ($dirtySum & 0xFFFF); + $core->FSubtract = false; + } + + /** + * Opcode #0x1A. + * + * LD A, (DE) + * + * @param Core $core + */ + private static function opcode26(Core $core) + { + $core->registerA = $core->memoryRead(($core->registerD << 8) + $core->registerE); + } + + /** + * Opcode #0x1B. + * + * DEC DE + * + * @param Core $core + */ + private static function opcode27(Core $core) + { + $temp_var = $core->unswtuw((($core->registerD << 8) + $core->registerE) - 1); + $core->registerD = ($temp_var >> 8); + $core->registerE = ($temp_var & 0xFF); + } + + /** + * Opcode #0x1C. + * + * INC E + * + * @param Core $core + */ + private static function opcode28(Core $core) + { + $core->registerE = (($core->registerE + 1) & 0xFF); + $core->FZero = ($core->registerE == 0); + $core->FHalfCarry = (($core->registerE & 0xF) == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x1D. + * + * DEC E + * + * @param Core $core + */ + private static function opcode29(Core $core) + { + $core->registerE = $core->unsbtub($core->registerE - 1); + $core->FZero = ($core->registerE == 0); + $core->FHalfCarry = (($core->registerE & 0xF) == 0xF); + $core->FSubtract = true; + } + + /** + * Opcode #0x1E. + * + * LD E, n + * + * @param Core $core + */ + private static function opcode30(Core $core) + { + $core->registerE = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0x1F. + * + * RRA + * + * @param Core $core + */ + private static function opcode31(Core $core) + { + $carry_flag = ($core->FCarry) ? 0x80 : 0; + $core->FCarry = (($core->registerA & 1) == 1); + $core->registerA = ($core->registerA >> 1) + $carry_flag; + $core->FZero = $core->FSubtract = $core->FHalfCarry = false; + } + + /** + * Opcode #0x20. + * + * JR cc, n + * + * @param Core $core + */ + private static function opcode32(Core $core) + { + if (!$core->FZero) { + $core->programCounter = $core->nswtuw($core->programCounter + $core->usbtsb($core->memoryReader[$core->programCounter]($core, $core->programCounter)) + 1); + ++$core->CPUTicks; + } else { + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + } + + /** + * Opcode #0x21. + * + * LD HL, nn + * + * @param Core $core + */ + private static function opcode33(Core $core) + { + $core->registersHL = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + + /** + * Opcode #0x22. + * + * LDI (HL), A + * + * @param Core $core + */ + private static function opcode34(Core $core) + { + $core->memoryWrite($core->registersHL, $core->registerA); + $core->registersHL = (($core->registersHL + 1) & 0xFFFF); + } + + /** + * Opcode #0x23. + * + * INC HL + * + * @param Core $core + */ + private static function opcode35(Core $core) + { + $core->registersHL = (($core->registersHL + 1) & 0xFFFF); + } + + /** + * Opcode #0x24. + * + * INC H + * + * @param Core $core + */ + private static function opcode36(Core $core) + { + $H = ((($core->registersHL >> 8) + 1) & 0xFF); + $core->FZero = ($H == 0); + $core->FHalfCarry = (($H & 0xF) == 0); + $core->FSubtract = false; + $core->registersHL = ($H << 8) + ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x25. + * + * DEC H + * + * @param Core $core + */ + private static function opcode37(Core $core) + { + $H = $core->unsbtub(($core->registersHL >> 8) - 1); + $core->FZero = ($H == 0); + $core->FHalfCarry = (($H & 0xF) == 0xF); + $core->FSubtract = true; + $core->registersHL = ($H << 8) + ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x26. + * + * LD H, n + * + * @param Core $core + */ + private static function opcode38(Core $core) + { + $core->registersHL = ($core->memoryReader[$core->programCounter]($core, $core->programCounter) << 8) + ($core->registersHL & 0xFF); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0x27. + * + * DAA + * + * @param Core $core + */ + private static function opcode39(Core $core) + { + $temp_var = $core->registerA; + if ($core->FCarry) { + $temp_var |= 0x100; + } + if ($core->FHalfCarry) { + $temp_var |= 0x200; + } + if ($core->FSubtract) { + $temp_var |= 0x400; + } + $core->registerA = ($temp_var = $core->DAATable[$temp_var]) >> 8; + $core->FZero = (($temp_var & 0x80) == 0x80); + $core->FSubtract = (($temp_var & 0x40) == 0x40); + $core->FHalfCarry = (($temp_var & 0x20) == 0x20); + $core->FCarry = (($temp_var & 0x10) == 0x10); + } + + /** + * Opcode #0x28. + * + * JR cc, n + * + * @param Core $core + */ + private static function opcode40(Core $core) + { + if ($core->FZero) { + $core->programCounter = $core->nswtuw($core->programCounter + $core->usbtsb($core->memoryReader[$core->programCounter]($core, $core->programCounter)) + 1); + ++$core->CPUTicks; + } else { + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + } + + /** + * Opcode #0x29. + * + * ADD HL, HL + * + * @param Core $core + */ + private static function opcode41(Core $core) + { + ; + $core->FHalfCarry = (($core->registersHL & 0xFFF) > 0x7FF); + $core->FCarry = ($core->registersHL > 0x7FFF); + $core->registersHL = ((2 * $core->registersHL) & 0xFFFF); + $core->FSubtract = false; + } + + /** + * Opcode #0x2A. + * + * LDI A, (HL) + * + * @param Core $core + */ + private static function opcode42(Core $core) + { + $core->registerA = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->registersHL = (($core->registersHL + 1) & 0xFFFF); + } + + /** + * Opcode #0x2B. + * + * DEC HL + * + * @param Core $core + */ + private static function opcode43(Core $core) + { + $core->registersHL = $core->unswtuw($core->registersHL - 1); + } + + /** + * Opcode #0x2C. + * + * INC L + * + * @param Core $core + */ + private static function opcode44(Core $core) + { + $L = (($core->registersHL + 1) & 0xFF); + $core->FZero = ($L == 0); + $core->FHalfCarry = (($L & 0xF) == 0); + $core->FSubtract = false; + $core->registersHL = ($core->registersHL & 0xFF00) + $L; + } + + /** + * Opcode #0x2D. + * + * DEC L + * + * @param Core $core + */ + private static function opcode45(Core $core) + { + $L = $core->unsbtub(($core->registersHL & 0xFF) - 1); + $core->FZero = ($L == 0); + $core->FHalfCarry = (($L & 0xF) == 0xF); + $core->FSubtract = true; + $core->registersHL = ($core->registersHL & 0xFF00) + $L; + } + + /** + * Opcode #0x2E. + * + * LD L, n + * + * @param Core $core + */ + private static function opcode46(Core $core) + { + $core->registersHL = ($core->registersHL & 0xFF00) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0x2F. + * + * CPL + * + * @param Core $core + */ + private static function opcode47(Core $core) + { + $core->registerA ^= 0xFF; + $core->FSubtract = $core->FHalfCarry = true; + } + + /** + * Opcode #0x30. + * + * JR cc, n + * + * @param Core $core + */ + private static function opcode48(Core $core) + { + if (!$core->FCarry) { + $core->programCounter = $core->nswtuw($core->programCounter + $core->usbtsb($core->memoryReader[$core->programCounter]($core, $core->programCounter)) + 1); + ++$core->CPUTicks; + } else { + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + } + + /** + * Opcode #0x31. + * + * LD SP, nn + * + * @param Core $core + */ + private static function opcode49(Core $core) + { + $core->stackPointer = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + + /** + * Opcode #0x32. + * + * LDD (HL), A + * + * @param Core $core + */ + private static function opcode50(Core $core) + { + $core->memoryWrite($core->registersHL, $core->registerA); + $core->registersHL = $core->unswtuw($core->registersHL - 1); + } + + /** + * Opcode #0x33. + * + * INC SP + * + * @param Core $core + */ + private static function opcode51(Core $core) + { + $core->stackPointer = ($core->stackPointer + 1) & 0xFFFF; + } + + /** + * Opcode #0x34. + * + * INC (HL) + * + * @param Core $core + */ + private static function opcode52(Core $core) + { + $temp_var = (($core->memoryReader[$core->registersHL]($core, $core->registersHL) + 1) & 0xFF); + $core->FZero = ($temp_var == 0); + $core->FHalfCarry = (($temp_var & 0xF) == 0); + $core->FSubtract = false; + $core->memoryWrite($core->registersHL, $temp_var); + } + + /** + * Opcode #0x35. + * + * DEC (HL) + * + * @param Core $core + */ + private static function opcode53(Core $core) + { + $temp_var = $core->unsbtub($core->memoryReader[$core->registersHL]($core, $core->registersHL) - 1); + $core->FZero = ($temp_var == 0); + $core->FHalfCarry = (($temp_var & 0xF) == 0xF); + $core->FSubtract = true; + $core->memoryWrite($core->registersHL, $temp_var); + } + + /** + * Opcode #0x36. + * + * LD (HL), n + * + * @param Core $core + */ + private static function opcode54(Core $core) + { + $core->memoryWrite($core->registersHL, $core->memoryReader[$core->programCounter]($core, $core->programCounter)); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0x37. + * + * SCF + * + * @param Core $core + */ + private static function opcode55(Core $core) + { + $core->FCarry = true; + $core->FSubtract = $core->FHalfCarry = false; + } + + /** + * Opcode #0x38. + * + * JR cc, n + * + * @param Core $core + */ + private static function opcode56(Core $core) + { + if ($core->FCarry) { + $core->programCounter = $core->nswtuw($core->programCounter + $core->usbtsb($core->memoryReader[$core->programCounter]($core, $core->programCounter)) + 1); + ++$core->CPUTicks; + } else { + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + } + + /** + * Opcode #0x39. + * + * ADD HL, SP + * + * @param Core $core + */ + private static function opcode57(Core $core) + { + $dirtySum = $core->registersHL + $core->stackPointer; + $core->FHalfCarry = (($core->registersHL & 0xFFF) + ($core->stackPointer & 0xFFF) > 0xFFF); + $core->FCarry = ($dirtySum > 0xFFFF); + $core->registersHL = ($dirtySum & 0xFFFF); + $core->FSubtract = false; + } + + /** + * Opcode #0x3A. + * + * LDD A, (HL) + * + * @param Core $core + */ + private static function opcode58(Core $core) + { + $core->registerA = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->registersHL = $core->unswtuw($core->registersHL - 1); + } + + /** + * Opcode #0x3B. + * + * DEC SP + * + * @param Core $core + */ + private static function opcode59(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + } + + /** + * Opcode #0x3C. + * + * INC A + * + * @param Core $core + */ + private static function opcode60(Core $core) + { + $core->registerA = (($core->registerA + 1) & 0xFF); + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = (($core->registerA & 0xF) == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x3D. + * + * DEC A + * + * @param Core $core + */ + private static function opcode61(Core $core) + { + $core->registerA = $core->unsbtub($core->registerA - 1); + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = (($core->registerA & 0xF) == 0xF); + $core->FSubtract = true; + } + + /** + * Opcode #0x3E. + * + * LD A, n + * + * @param Core $core + */ + private static function opcode62(Core $core) + { + $core->registerA = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0x3F. + * + * CCF + * + * @param Core $core + */ + private static function opcode63(Core $core) + { + $core->FCarry = !$core->FCarry; + $core->FSubtract = $core->FHalfCarry = false; + } + + /** + * Opcode #0x40. + * + * LD B, B + * + * @param Core $core + */ + private static function opcode64(Core $core) + { + //Do nothing... + } + + /** + * Opcode #0x41. + * + * LD B, C + * + * @param Core $core + */ + private static function opcode65(Core $core) + { + $core->registerB = $core->registerC; + } + + /** + * Opcode #0x42. + * + * LD B, D + * + * @param Core $core + */ + private static function opcode66(Core $core) + { + $core->registerB = $core->registerD; + } + + /** + * Opcode #0x43. + * + * LD B, E + * + * @param Core $core + */ + private static function opcode67(Core $core) + { + $core->registerB = $core->registerE; + } + + /** + * Opcode #0x44. + * + * LD B, H + * + * @param Core $core + */ + private static function opcode68(Core $core) + { + $core->registerB = ($core->registersHL >> 8); + } + + /** + * Opcode #0x45. + * + * LD B, L + * + * @param Core $core + */ + private static function opcode69(Core $core) + { + $core->registerB = ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x46. + * + * LD B, (HL) + * + * @param Core $core + */ + private static function opcode70(Core $core) + { + $core->registerB = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + } + + /** + * Opcode #0x47. + * + * LD B, A + * + * @param Core $core + */ + private static function opcode71(Core $core) + { + $core->registerB = $core->registerA; + } + + /** + * Opcode #0x48. + * + * LD C, B + * + * @param Core $core + */ + private static function opcode72(Core $core) + { + $core->registerC = $core->registerB; + } + + /** + * Opcode #0x49. + * + * LD C, C + * + * @param Core $core + */ + private static function opcode73(Core $core) + { + //Do nothing... + } + + /** + * Opcode #0x4A. + * + * LD C, D + * + * @param Core $core + */ + private static function opcode74(Core $core) + { + $core->registerC = $core->registerD; + } + + /** + * Opcode #0x4B. + * + * LD C, E + * + * @param Core $core + */ + private static function opcode75(Core $core) + { + $core->registerC = $core->registerE; + } + + /** + * Opcode #0x4C. + * + * LD C, H + * + * @param Core $core + */ + private static function opcode76(Core $core) + { + $core->registerC = ($core->registersHL >> 8); + } + + /** + * Opcode #0x4D. + * + * LD C, L + * + * @param Core $core + */ + private static function opcode77(Core $core) + { + $core->registerC = ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x4E. + * + * LD C, (HL) + * + * @param Core $core + */ + private static function opcode78(Core $core) + { + $core->registerC = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + } + + /** + * Opcode #0x4F. + * + * LD C, A + * + * @param Core $core + */ + private static function opcode79(Core $core) + { + $core->registerC = $core->registerA; + } + + /** + * Opcode #0x50. + * + * LD D, B + * + * @param Core $core + */ + private static function opcode80(Core $core) + { + $core->registerD = $core->registerB; + } + + /** + * Opcode #0x51. + * + * LD D, C + * + * @param Core $core + */ + private static function opcode81(Core $core) + { + $core->registerD = $core->registerC; + } + + /** + * Opcode #0x52. + * + * LD D, D + * + * @param Core $core + */ + private static function opcode82(Core $core) + { + //Do nothing... + } + + /** + * Opcode #0x53. + * + * LD D, E + * + * @param Core $core + */ + private static function opcode83(Core $core) + { + $core->registerD = $core->registerE; + } + + /** + * Opcode #0x54. + * + * LD D, H + * + * @param Core $core + */ + private static function opcode84(Core $core) + { + $core->registerD = ($core->registersHL >> 8); + } + + /** + * Opcode #0x55. + * + * LD D, L + * + * @param Core $core + */ + private static function opcode85(Core $core) + { + $core->registerD = ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x56. + * + * LD D, (HL) + * + * @param Core $core + */ + private static function opcode86(Core $core) + { + $core->registerD = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + } + + /** + * Opcode #0x57. + * + * LD D, A + * + * @param Core $core + */ + private static function opcode87(Core $core) + { + $core->registerD = $core->registerA; + } + + /** + * Opcode #0x58. + * + * LD E, B + * + * @param Core $core + */ + private static function opcode88(Core $core) + { + $core->registerE = $core->registerB; + } + + /** + * Opcode #0x59. + * + * LD E, C + * + * @param Core $core + */ + private static function opcode89(Core $core) + { + $core->registerE = $core->registerC; + } + + /** + * Opcode #0x5A. + * + * LD E, D + * + * @param Core $core + */ + private static function opcode90(Core $core) + { + $core->registerE = $core->registerD; + } + + /** + * Opcode #0x5B. + * + * LD E, E + * + * @param Core $core + */ + private static function opcode91(Core $core) + { + //Do nothing... + } + + /** + * Opcode #0x5C. + * + * LD E, H + * + * @param Core $core + */ + private static function opcode92(Core $core) + { + $core->registerE = ($core->registersHL >> 8); + } + + /** + * Opcode #0x5D. + * + * LD E, L + * + * @param Core $core + */ + private static function opcode93(Core $core) + { + $core->registerE = ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x5E. + * + * LD E, (HL) + * + * @param Core $core + */ + private static function opcode94(Core $core) + { + $core->registerE = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + } + + /** + * Opcode #0x5F. + * + * LD E, A + * + * @param Core $core + */ + private static function opcode95(Core $core) + { + $core->registerE = $core->registerA; + } + + /** + * Opcode #0x60. + * + * LD H, B + * + * @param Core $core + */ + private static function opcode96(Core $core) + { + $core->registersHL = ($core->registerB << 8) + ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x61. + * + * LD H, C + * + * @param Core $core + */ + private static function opcode97(Core $core) + { + $core->registersHL = ($core->registerC << 8) + ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x62. + * + * LD H, D + * + * @param Core $core + */ + private static function opcode98(Core $core) + { + $core->registersHL = ($core->registerD << 8) + ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x63. + * + * LD H, E + * + * @param Core $core + */ + private static function opcode99(Core $core) + { + $core->registersHL = ($core->registerE << 8) + ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x64. + * + * LD H, H + * + * @param Core $core + */ + private static function opcode100(Core $core) + { + //Do nothing... + } + + /** + * Opcode #0x65. + * + * LD H, L + * + * @param Core $core + */ + private static function opcode101(Core $core) + { + $core->registersHL = (($core->registersHL & 0xFF) << 8) + ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x66. + * + * LD H, (HL) + * + * @param Core $core + */ + private static function opcode102(Core $core) + { + $core->registersHL = ($core->memoryReader[$core->registersHL]($core, $core->registersHL) << 8) + ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x67. + * + * LD H, A + * + * @param Core $core + */ + private static function opcode103(Core $core) + { + $core->registersHL = ($core->registerA << 8) + ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x68. + * + * LD L, B + * + * @param Core $core + */ + private static function opcode104(Core $core) + { + $core->registersHL = ($core->registersHL & 0xFF00) + $core->registerB; + } + + /** + * Opcode #0x69. + * + * LD L, C + * + * @param Core $core + */ + private static function opcode105(Core $core) + { + $core->registersHL = ($core->registersHL & 0xFF00) + $core->registerC; + } + + /** + * Opcode #0x6A. + * + * LD L, D + * + * @param Core $core + */ + private static function opcode106(Core $core) + { + $core->registersHL = ($core->registersHL & 0xFF00) + $core->registerD; + } + + /** + * Opcode #0x6B. + * + * LD L, E + * + * @param Core $core + */ + private static function opcode107(Core $core) + { + $core->registersHL = ($core->registersHL & 0xFF00) + $core->registerE; + } + + /** + * Opcode #0x6C. + * + * LD L, H + * + * @param Core $core + */ + private static function opcode108(Core $core) + { + $core->registersHL = ($core->registersHL & 0xFF00) + ($core->registersHL >> 8); + } + + /** + * Opcode #0x6D. + * + * LD L, L + * + * @param Core $core + */ + private static function opcode109(Core $core) + { + //Do nothing... + } + + /** + * Opcode #0x6E. + * + * LD L, (HL) + * + * @param Core $core + */ + private static function opcode110(Core $core) + { + $core->registersHL = ($core->registersHL & 0xFF00) + $core->memoryReader[$core->registersHL]($core, $core->registersHL); + } + + /** + * Opcode #0x6F. + * + * LD L, A + * + * @param Core $core + */ + private static function opcode111(Core $core) + { + $core->registersHL = ($core->registersHL & 0xFF00) + $core->registerA; + } + + /** + * Opcode #0x70. + * + * LD (HL), B + * + * @param Core $core + */ + private static function opcode112(Core $core) + { + $core->memoryWrite($core->registersHL, $core->registerB); + } + + /** + * Opcode #0x71. + * + * LD (HL), C + * + * @param Core $core + */ + private static function opcode113(Core $core) + { + $core->memoryWrite($core->registersHL, $core->registerC); + } + + /** + * Opcode #0x72. + * + * LD (HL), D + * + * @param Core $core + */ + private static function opcode114(Core $core) + { + $core->memoryWrite($core->registersHL, $core->registerD); + } + + /** + * Opcode #0x73. + * + * LD (HL), E + * + * @param Core $core + */ + private static function opcode115(Core $core) + { + $core->memoryWrite($core->registersHL, $core->registerE); + } + + /** + * Opcode #0x74. + * + * LD (HL), H + * + * @param Core $core + */ + private static function opcode116(Core $core) + { + $core->memoryWrite($core->registersHL, ($core->registersHL >> 8)); + } + + /** + * Opcode #0x75. + * + * LD (HL), L + * + * @param Core $core + */ + private static function opcode117(Core $core) + { + $core->memoryWrite($core->registersHL, ($core->registersHL & 0xFF)); + } + + /** + * Opcode #0x76. + * + * HALT + * + * @param \GameBoy\Core $core + * @throws Exception + */ + private 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->usedBootROM && ($core->memory[0xFF0F] & $core->memory[0xFFFF] & 0x1F) > 0) { + $core->skipPCIncrement = true; } - }; - //ADD HL, SP - //#0x39: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registersHL + $parentObj->stackPointer; - $parentObj->FHalfCarry = (($parentObj->registersHL & 0xFFF) + ($parentObj->stackPointer & 0xFFF) > 0xFFF); - $parentObj->FCarry = ($dirtySum > 0xFFFF); - $parentObj->registersHL = ($dirtySum & 0xFFFF); - $parentObj->FSubtract = false; - }; - // LDD A, (HL) - //#0x3A: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->registersHL = $parentObj->unswtuw($parentObj->registersHL - 1); - }; - //DEC SP - //#0x3B: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - }; - //INC A - //#0x3C: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = (($parentObj->registerA + 1) & 0xFF); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) == 0); - $parentObj->FSubtract = false; - }; - //DEC A - //#0x3D: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->unsbtub($parentObj->registerA - 1); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) == 0xF); - $parentObj->FSubtract = true; - }; - //LD A, n - //#0x3E: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //CCF - //#0x3F: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FCarry = !$parentObj->FCarry; - $parentObj->FSubtract = $parentObj->FHalfCarry = false; - }; - //LD B, B - //#0x40: - $this->functionsArray[] = function ($parentObj) { - //Do nothing... - }; - //LD B, C - //#0x41: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = $parentObj->registerC; - }; - //LD B, D - //#0x42: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = $parentObj->registerD; - }; - //LD B, E - //#0x43: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = $parentObj->registerE; - }; - //LD B, H - //#0x44: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = ($parentObj->registersHL >> 8); - }; - //LD B, L - //#0x45: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = ($parentObj->registersHL & 0xFF); - }; - //LD B, (HL) - //#0x46: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - }; - //LD B, A - //#0x47: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerB = $parentObj->registerA; - }; - //LD C, B - //#0x48: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = $parentObj->registerB; - }; - //LD C, C - //#0x49: - $this->functionsArray[] = function ($parentObj) { - //Do nothing... - }; - //LD C, D - //#0x4A: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = $parentObj->registerD; - }; - //LD C, E - //#0x4B: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = $parentObj->registerE; - }; - //LD C, H - //#0x4C: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = ($parentObj->registersHL >> 8); - }; - //LD C, L - //#0x4D: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = ($parentObj->registersHL & 0xFF); - }; - //LD C, (HL) - //#0x4E: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - }; - //LD C, A - //#0x4F: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = $parentObj->registerA; - }; - //LD D, B - //#0x50: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = $parentObj->registerB; - }; - //LD D, C - //#0x51: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = $parentObj->registerC; - }; - //LD D, D - //#0x52: - $this->functionsArray[] = function ($parentObj) { - //Do nothing... - }; - //LD D, E - //#0x53: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = $parentObj->registerE; - }; - //LD D, H - //#0x54: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = ($parentObj->registersHL >> 8); - }; - //LD D, L - //#0x55: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = ($parentObj->registersHL & 0xFF); - }; - //LD D, (HL) - //#0x56: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - }; - //LD D, A - //#0x57: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerD = $parentObj->registerA; - }; - //LD E, B - //#0x58: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = $parentObj->registerB; - }; - //LD E, C - //#0x59: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = $parentObj->registerC; - }; - //LD E, D - //#0x5A: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = $parentObj->registerD; - }; - //LD E, E - //#0x5B: - $this->functionsArray[] = function ($parentObj) { - //Do nothing... - }; - //LD E, H - //#0x5C: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = ($parentObj->registersHL >> 8); - }; - //LD E, L - //#0x5D: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = ($parentObj->registersHL & 0xFF); - }; - //LD E, (HL) - //#0x5E: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - }; - //LD E, A - //#0x5F: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = $parentObj->registerA; - }; - //LD H, B - //#0x60: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registerB << 8) + ($parentObj->registersHL & 0xFF); - }; - //LD H, C - //#0x61: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registerC << 8) + ($parentObj->registersHL & 0xFF); - }; - //LD H, D - //#0x62: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registerD << 8) + ($parentObj->registersHL & 0xFF); - }; - //LD H, E - //#0x63: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registerE << 8) + ($parentObj->registersHL & 0xFF); - }; - //LD H, H - //#0x64: - $this->functionsArray[] = function ($parentObj) { - //Do nothing... - }; - //LD H, L - //#0x65: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = (($parentObj->registersHL & 0xFF) << 8) + ($parentObj->registersHL & 0xFF); - }; - //LD H, (HL) - //#0x66: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL) << 8) + ($parentObj->registersHL & 0xFF); - }; - //LD H, A - //#0x67: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registerA << 8) + ($parentObj->registersHL & 0xFF); - }; - //LD L, B - //#0x68: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + $parentObj->registerB; - }; - //LD L, C - //#0x69: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + $parentObj->registerC; - }; - //LD L, D - //#0x6A: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + $parentObj->registerD; - }; - //LD L, E - //#0x6B: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + $parentObj->registerE; - }; - //LD L, H - //#0x6C: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + ($parentObj->registersHL >> 8); - }; - //LD L, L - //#0x6D: - $this->functionsArray[] = function ($parentObj) { - //Do nothing... - }; - //LD L, (HL) - //#0x6E: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - }; - //LD L, A - //#0x6F: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->registersHL & 0xFF00) + $parentObj->registerA; - }; - //LD (HL), B - //#0x70: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->registerB); - }; - //LD (HL), C - //#0x71: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->registerC); - }; - //LD (HL), D - //#0x72: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->registerD); - }; - //LD (HL), E - //#0x73: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->registerE); - }; - //LD (HL), H - //#0x74: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, ($parentObj->registersHL >> 8)); - }; - //LD (HL), L - //#0x75: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, ($parentObj->registersHL & 0xFF)); - }; - //HALT - //#0x76: - $this->functionsArray[] = function ($parentObj) { - if ($parentObj->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?).*/ - $parentObj->programCounter = $parentObj->nswtuw($parentObj->programCounter - 1); - } else { - if (!$parentObj->halt && !$parentObj->IME && !$parentObj->cGBC && !$parentObj->usedBootROM && ($parentObj->memory[0xFF0F] & $parentObj->memory[0xFFFF] & 0x1F) > 0) { - $parentObj->skipPCIncrement = true; - } - $parentObj->halt = true; - while ($parentObj->halt && ($parentObj->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 = $parentObj->memory[0xFFFF] & $parentObj->memory[0xFF0F]; - while ($bitShift < 5) { - //Check to see if an interrupt is enabled AND requested. - if (($testbit & $interrupts) == $testbit) { - $parentObj->halt = false; //Get out of halt state if in halt state. - return; //Let the main interrupt handler compute the interrupt. - } - $testbit = 1 << ++$bitShift; + $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. } - $parentObj->CPUTicks = 1; //1 machine cycle under HALT... - //Timing: - $parentObj->updateCore(); + $testbit = 1 << ++$bitShift; } - - //Throw an error on purpose to exit out of the loop. - throw new \Exception('HALT_OVERRUN'); - } - }; - //LD (HL), A - //#0x77: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite($parentObj->registersHL, $parentObj->registerA); - }; - //LD A, B - //#0x78: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->registerB; - }; - //LD A, C - //#0x79: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->registerC; - }; - //LD A, D - //#0x7A: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->registerD; - }; - //LD A, E - //#0x7B: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->registerE; - }; - //LD A, H - //#0x7C: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = ($parentObj->registersHL >> 8); - }; - //LD A, L - //#0x7D: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = ($parentObj->registersHL & 0xFF); - }; - //LD, A, (HL) - //#0x7E: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - }; - //LD A, A - //#0x7F: - $this->functionsArray[] = function ($parentObj) { - //Do Nothing... - }; - //ADD A, B - //#0x80: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + $parentObj->registerB; - $parentObj->FHalfCarry = ($dirtySum & 0xF) < ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADD A, C - //#0x81: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + $parentObj->registerC; - $parentObj->FHalfCarry = ($dirtySum & 0xF) < ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADD A, D - //#0x82: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + $parentObj->registerD; - $parentObj->FHalfCarry = ($dirtySum & 0xF) < ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADD A, E - //#0x83: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + $parentObj->registerE; - $parentObj->FHalfCarry = ($dirtySum & 0xF) < ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADD A, H - //#0x84: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + ($parentObj->registersHL >> 8); - $parentObj->FHalfCarry = ($dirtySum & 0xF) < ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADD A, L - //#0x85: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + ($parentObj->registersHL & 0xFF); - $parentObj->FHalfCarry = ($dirtySum & 0xF) < ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADD A, (HL) - //#0x86: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->FHalfCarry = ($dirtySum & 0xF) < ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADD A, A - //#0x87: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA * 2; - $parentObj->FHalfCarry = ($dirtySum & 0xF) < ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADC A, B - //#0x88: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + $parentObj->registerB + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) + ($parentObj->registerB & 0xF) + (($parentObj->FCarry) ? 1 : 0) > 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADC A, C - //#0x89: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + $parentObj->registerC + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) + ($parentObj->registerC & 0xF) + (($parentObj->FCarry) ? 1 : 0) > 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADC A, D - //#0x8A: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + $parentObj->registerD + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) + ($parentObj->registerD & 0xF) + (($parentObj->FCarry) ? 1 : 0) > 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADC A, E - //#0x8B: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + $parentObj->registerE + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) + ($parentObj->registerE & 0xF) + (($parentObj->FCarry) ? 1 : 0) > 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADC A, H - //#0x8C: - $this->functionsArray[] = function ($parentObj) { - $tempValue = ($parentObj->registersHL >> 8); - $dirtySum = $parentObj->registerA + $tempValue + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) + ($tempValue & 0xF) + (($parentObj->FCarry) ? 1 : 0) > 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADC A, L - //#0x8D: - $this->functionsArray[] = function ($parentObj) { - $tempValue = ($parentObj->registersHL & 0xFF); - $dirtySum = $parentObj->registerA + $tempValue + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) + ($tempValue & 0xF) + (($parentObj->FCarry) ? 1 : 0) > 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADC A, (HL) - //#0x8E: - $this->functionsArray[] = function ($parentObj) { - $tempValue = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $dirtySum = $parentObj->registerA + $tempValue + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) + ($tempValue & 0xF) + (($parentObj->FCarry) ? 1 : 0) > 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //ADC A, A - //#0x8F: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = ($parentObj->registerA * 2) + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) + ($parentObj->registerA & 0xF) + (($parentObj->FCarry) ? 1 : 0) > 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - }; - //SUB A, B - //#0x90: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerB; - $parentObj->FHalfCarry = ($parentObj->registerA & 0xF) < ($parentObj->registerB & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SUB A, C - //#0x91: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerC; - $parentObj->FHalfCarry = ($parentObj->registerA & 0xF) < ($parentObj->registerC & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SUB A, D - //#0x92: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerD; - $parentObj->FHalfCarry = ($parentObj->registerA & 0xF) < ($parentObj->registerD & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SUB A, E - //#0x93: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerE; - $parentObj->FHalfCarry = ($parentObj->registerA & 0xF) < ($parentObj->registerE & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SUB A, H - //#0x94: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->registersHL >> 8; - $dirtySum = $parentObj->registerA - $temp_var; - $parentObj->FHalfCarry = ($parentObj->registerA & 0xF) < ($temp_var & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SUB A, L - //#0x95: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - ($parentObj->registersHL & 0xFF); - $parentObj->FHalfCarry = ($parentObj->registerA & 0xF) < ($parentObj->registersHL & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SUB A, (HL) - //#0x96: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $dirtySum = $parentObj->registerA - $temp_var; - $parentObj->FHalfCarry = ($parentObj->registerA & 0xF) < ($temp_var & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SUB A, A - //#0x97: - $this->functionsArray[] = function ($parentObj) { - //number - same number == 0 - $parentObj->registerA = 0; - $parentObj->FHalfCarry = $parentObj->FCarry = false; - $parentObj->FZero = $parentObj->FSubtract = true; - }; - //SBC A, B - //#0x98: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerB - (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) - ($parentObj->registerB & 0xF) - (($parentObj->FCarry) ? 1 : 0) < 0); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SBC A, C - //#0x99: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerC - (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) - ($parentObj->registerC & 0xF) - (($parentObj->FCarry) ? 1 : 0) < 0); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SBC A, D - //#0x9A: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerD - (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) - ($parentObj->registerD & 0xF) - (($parentObj->FCarry) ? 1 : 0) < 0); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SBC A, E - //#0x9B: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerE - (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) - ($parentObj->registerE & 0xF) - (($parentObj->FCarry) ? 1 : 0) < 0); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SBC A, H - //#0x9C: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->registersHL >> 8; - $dirtySum = $parentObj->registerA - $temp_var - (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) - ($temp_var & 0xF) - (($parentObj->FCarry) ? 1 : 0) < 0); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SBC A, L - //#0x9D: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - ($parentObj->registersHL & 0xFF) - (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) - ($parentObj->registersHL & 0xF) - (($parentObj->FCarry) ? 1 : 0) < 0); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SBC A, (HL) - //#0x9E: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $dirtySum = $parentObj->registerA - $temp_var - (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) - ($temp_var & 0xF) - (($parentObj->FCarry) ? 1 : 0) < 0); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //SBC A, A - //#0x9F: - $this->functionsArray[] = function ($parentObj) { - //Optimized SBC A: - if ($parentObj->FCarry) { - $parentObj->FZero = false; - $parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = true; - $parentObj->registerA = 0xFF; - } else { - $parentObj->FHalfCarry = $parentObj->FCarry = false; - $parentObj->FSubtract = $parentObj->FZero = true; - $parentObj->registerA = 0; - } - }; - //AND B - //#0xA0: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= $parentObj->registerB; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = $parentObj->FCarry = false; - }; - //AND C - //#0xA1: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= $parentObj->registerC; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = $parentObj->FCarry = false; - }; - //AND D - //#0xA2: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= $parentObj->registerD; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = $parentObj->FCarry = false; - }; - //AND E - //#0xA3: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= $parentObj->registerE; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = $parentObj->FCarry = false; - }; - //AND H - //#0xA4: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= ($parentObj->registersHL >> 8); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = $parentObj->FCarry = false; - }; - //AND L - //#0xA5: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= ($parentObj->registersHL & 0xFF); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = $parentObj->FCarry = false; - }; - //AND (HL) - //#0xA6: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = $parentObj->FCarry = false; - }; - //AND A - //#0xA7: - $this->functionsArray[] = function ($parentObj) { - //number & same number = same number - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = $parentObj->FCarry = false; - }; - //XOR B - //#0xA8: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA ^= $parentObj->registerB; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = false; - }; - //XOR C - //#0xA9: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA ^= $parentObj->registerC; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = false; - }; - //XOR D - //#0xAA: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA ^= $parentObj->registerD; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = false; - }; - //XOR E - //#0xAB: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA ^= $parentObj->registerE; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = false; - }; - //XOR H - //#0xAC: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA ^= ($parentObj->registersHL >> 8); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = false; - }; - //XOR L - //#0xAD: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA ^= ($parentObj->registersHL & 0xFF); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = false; - }; - //XOR (HL) - //#0xAE: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA ^= $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = false; - }; - //XOR A - //#0xAF: - $this->functionsArray[] = function ($parentObj) { - //number ^ same number == 0 - $parentObj->registerA = 0; - $parentObj->FZero = true; - $parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = false; - }; - //OR B - //#0xB0: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= $parentObj->registerB; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FCarry = $parentObj->FHalfCarry = false; - }; - //OR C - //#0xB1: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= $parentObj->registerC; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FCarry = $parentObj->FHalfCarry = false; - }; - //OR D - //#0xB2: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= $parentObj->registerD; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FCarry = $parentObj->FHalfCarry = false; - }; - //OR E - //#0xB3: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= $parentObj->registerE; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FCarry = $parentObj->FHalfCarry = false; - }; - //OR H - //#0xB4: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= ($parentObj->registersHL >> 8); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FCarry = $parentObj->FHalfCarry = false; - }; - //OR L - //#0xB5: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= ($parentObj->registersHL & 0xFF); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FCarry = $parentObj->FHalfCarry = false; - }; - //OR (HL) - //#0xB6: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FCarry = $parentObj->FHalfCarry = false; - }; - //OR A - //#0xB7: - $this->functionsArray[] = function ($parentObj) { - //number | same number == same number - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = $parentObj->FCarry = $parentObj->FHalfCarry = false; - }; - //CP B - //#0xB8: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerB; - $parentObj->FHalfCarry = ($parentObj->unsbtub($dirtySum) & 0xF) > ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->FZero = ($dirtySum == 0); - $parentObj->FSubtract = true; - }; - //CP C - //#0xB9: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerC; - $parentObj->FHalfCarry = ($parentObj->unsbtub($dirtySum) & 0xF) > ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->FZero = ($dirtySum == 0); - $parentObj->FSubtract = true; - }; - //CP D - //#0xBA: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerD; - $parentObj->FHalfCarry = ($parentObj->unsbtub($dirtySum) & 0xF) > ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->FZero = ($dirtySum == 0); - $parentObj->FSubtract = true; - }; - //CP E - //#0xBB: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->registerE; - $parentObj->FHalfCarry = ($parentObj->unsbtub($dirtySum) & 0xF) > ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->FZero = ($dirtySum == 0); - $parentObj->FSubtract = true; - }; - //CP H - //#0xBC: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - ($parentObj->registersHL >> 8); - $parentObj->FHalfCarry = ($parentObj->unsbtub($dirtySum) & 0xF) > ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->FZero = ($dirtySum == 0); - $parentObj->FSubtract = true; - }; - //CP L - //#0xBD: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - ($parentObj->registersHL & 0xFF); - $parentObj->FHalfCarry = ($parentObj->unsbtub($dirtySum) & 0xF) > ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->FZero = ($dirtySum == 0); - $parentObj->FSubtract = true; - }; - //CP (HL) - //#0xBE: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->memoryReader[$parentObj->registersHL]($parentObj, $parentObj->registersHL); - $parentObj->FHalfCarry = ($parentObj->unsbtub($dirtySum) & 0xF) > ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->FZero = ($dirtySum == 0); - $parentObj->FSubtract = true; - }; - //CP A - //#0xBF: - $this->functionsArray[] = function ($parentObj) { - $parentObj->FHalfCarry = $parentObj->FCarry = false; - $parentObj->FZero = $parentObj->FSubtract = true; - }; - //RET !FZ - //#0xC0: - $this->functionsArray[] = function ($parentObj) { - if (!$parentObj->FZero) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer); - $parentObj->stackPointer = ($parentObj->stackPointer + 2) & 0xFFFF; - $parentObj->CPUTicks += 3; - } - }; - //POP BC - //#0xC1: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerC = $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer); - $parentObj->registerB = $parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF); - $parentObj->stackPointer = ($parentObj->stackPointer + 2) & 0xFFFF; - }; - //JP !FZ, nn - //#0xC2: - $this->functionsArray[] = function ($parentObj) { - if (!$parentObj->FZero) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - ++$parentObj->CPUTicks; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - } - }; - //JP nn - //#0xC3: - $this->functionsArray[] = function ($parentObj) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - }; - //CALL !FZ, nn - //#0xC4: - $this->functionsArray[] = function ($parentObj) { - if (!$parentObj->FZero) { - $temp_pc = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = $temp_pc; - $parentObj->CPUTicks += 3; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; + $core->CPUTicks = 1; //1 machine cycle under HALT... + //Timing: + $core->updateCore(); } - }; - //PUSH BC - //#0xC5: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->registerB); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->registerC); - }; - //ADD, n - //#0xC6: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->FHalfCarry = ($dirtySum & 0xF) < ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //RST 0 - //#0xC7: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = 0; - }; - //RET FZ - //#0xC8: - $this->functionsArray[] = function ($parentObj) { - if ($parentObj->FZero) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer); - $parentObj->stackPointer = ($parentObj->stackPointer + 2) & 0xFFFF; - $parentObj->CPUTicks += 3; - } - }; - //RET - //#0xC9: - $this->functionsArray[] = function ($parentObj) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer); - $parentObj->stackPointer = ($parentObj->stackPointer + 2) & 0xFFFF; - }; - //JP FZ, nn - //#0xCA: - $this->functionsArray[] = function ($parentObj) { - if ($parentObj->FZero) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - ++$parentObj->CPUTicks; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - } - }; - //Secondary OP Code Set: - //#0xCB: - $this->functionsArray[] = function ($parentObj) { - $opcode = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - //Increment the program counter to the next instruction: - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - //Get how many CPU cycles the current 0xCBXX op code counts for: - $parentObj->CPUTicks = $parentObj->SecondaryTICKTable[$opcode]; - //Execute secondary OP codes for the 0xCB OP code call. - $parentObj->CBOPCODE[$opcode]($parentObj); - }; - //CALL FZ, nn - //#0xCC: - $this->functionsArray[] = function ($parentObj) { - if ($parentObj->FZero) { - $temp_pc = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = $temp_pc; - $parentObj->CPUTicks += 3; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - } - }; - //CALL nn - //#0xCD: - $this->functionsArray[] = function ($parentObj) { - $temp_pc = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = $temp_pc; - }; - //ADC A, n - //#0xCE: - $this->functionsArray[] = function ($parentObj) { - $tempValue = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $dirtySum = $parentObj->registerA + $tempValue + (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) + ($tempValue & 0xF) + (($parentObj->FCarry) ? 1 : 0) > 0xF); - $parentObj->FCarry = ($dirtySum > 0xFF); - $parentObj->registerA = $dirtySum & 0xFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = false; - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //RST 0x8 - //#0xCF: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = 0x8; - }; - //RET !FC - //#0xD0: - $this->functionsArray[] = function ($parentObj) { - if (!$parentObj->FCarry) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer); - $parentObj->stackPointer = ($parentObj->stackPointer + 2) & 0xFFFF; - $parentObj->CPUTicks += 3; - } - }; - //POP DE - //#0xD1: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerE = $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer); - $parentObj->registerD = $parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF); - $parentObj->stackPointer = ($parentObj->stackPointer + 2) & 0xFFFF; - }; - //JP !FC, nn - //#0xD2: - $this->functionsArray[] = function ($parentObj) { - if (!$parentObj->FCarry) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - ++$parentObj->CPUTicks; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - } - }; - //0xD3 - Illegal - //#0xD3: - $this->functionsArray[] = function ($parentObj) { - // @TODO - // cout("Illegal op code 0xD3 called, pausing emulation.", 2); - // pause(); - }; - //CALL !FC, nn - //#0xD4: - $this->functionsArray[] = function ($parentObj) { - if (!$parentObj->FCarry) { - $temp_pc = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = $temp_pc; - $parentObj->CPUTicks += 3; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - } - }; - //PUSH DE - //#0xD5: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->registerD); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->registerE); - }; - //SUB A, n - //#0xD6: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $dirtySum = $parentObj->registerA - $temp_var; - $parentObj->FHalfCarry = ($parentObj->registerA & 0xF) < ($temp_var & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //RST 0x10 - //#0xD7: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = 0x10; - }; - //RET FC - //#0xD8: - $this->functionsArray[] = function ($parentObj) { - if ($parentObj->FCarry) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer); - $parentObj->stackPointer = ($parentObj->stackPointer + 2) & 0xFFFF; - $parentObj->CPUTicks += 3; - } - }; - //RETI - //#0xD9: - $this->functionsArray[] = function ($parentObj) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer); - $parentObj->stackPointer = ($parentObj->stackPointer + 2) & 0xFFFF; - //$parentObj->IME = true; - $parentObj->untilEnable = 2; - }; - //JP FC, nn - //#0xDA: - $this->functionsArray[] = function ($parentObj) { - if ($parentObj->FCarry) { - $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - ++$parentObj->CPUTicks; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - } - }; - //0xDB - Illegal - //#0xDB: - $this->functionsArray[] = function ($parentObj) { - echo 'Illegal op code 0xDB called, pausing emulation.'; - exit(); - }; - //CALL FC, nn - //#0xDC: - $this->functionsArray[] = function ($parentObj) { - if ($parentObj->FCarry) { - $temp_pc = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = $temp_pc; - $parentObj->CPUTicks += 3; - } else { - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - } - }; - //0xDD - Illegal - //#0xDD: - $this->functionsArray[] = function ($parentObj) { - echo 'Illegal op code 0xDD called, pausing emulation.'; - exit(); - }; - //SBC A, n - //#0xDE: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $dirtySum = $parentObj->registerA - $temp_var - (($parentObj->FCarry) ? 1 : 0); - $parentObj->FHalfCarry = (($parentObj->registerA & 0xF) - ($temp_var & 0xF) - (($parentObj->FCarry) ? 1 : 0) < 0); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->registerA = $parentObj->unsbtub($dirtySum); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FSubtract = true; - }; - //RST 0x18 - //#0xDF: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = 0x18; - }; - //LDH (n), A - //#0xE0: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite(0xFF00 + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter), $parentObj->registerA); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //POP HL - //#0xE1: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registersHL = ($parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer); - $parentObj->stackPointer = ($parentObj->stackPointer + 2) & 0xFFFF; - }; - //LD (C), A - //#0xE2: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite(0xFF00 + $parentObj->registerC, $parentObj->registerA); - }; - //0xE3 - Illegal - //#0xE3: - $this->functionsArray[] = function ($parentObj) { - echo 'Illegal op code 0xE3 called, pausing emulation.'; - exit(); - }; - //0xE4 - Illegal - //#0xE4: - $this->functionsArray[] = function ($parentObj) { - echo 'Illegal op code 0xE4 called, pausing emulation.'; - exit(); - }; - //PUSH HL - //#0xE5: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->registersHL >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->registersHL & 0xFF); - }; - //AND n - //#0xE6: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA &= $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->FHalfCarry = true; - $parentObj->FSubtract = $parentObj->FCarry = false; - }; - //RST 0x20 - //#0xE7: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = 0x20; - }; - //ADD SP, n - //#0xE8: - $this->functionsArray[] = function ($parentObj) { - $signedByte = $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)); - $temp_value = $parentObj->nswtuw($parentObj->stackPointer + $signedByte); - $parentObj->FCarry = ((($parentObj->stackPointer ^ $signedByte ^ $temp_value) & 0x100) == 0x100); - $parentObj->FHalfCarry = ((($parentObj->stackPointer ^ $signedByte ^ $temp_value) & 0x10) == 0x10); - $parentObj->stackPointer = $temp_value; - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - $parentObj->FZero = $parentObj->FSubtract = false; - }; - //JP, (HL) - //#0xE9: - $this->functionsArray[] = function ($parentObj) { - $parentObj->programCounter = $parentObj->registersHL; - }; - //LD n, A - //#0xEA: - $this->functionsArray[] = function ($parentObj) { - $parentObj->memoryWrite(($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter), $parentObj->registerA); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - }; - //0xEB - Illegal - //#0xEB: - $this->functionsArray[] = function ($parentObj) { - echo 'Illegal op code 0xEB called, pausing emulation.'; - exit(); - }; - //0xEC - Illegal - //#0xEC: - $this->functionsArray[] = function ($parentObj) { - echo 'Illegal op code 0xEC called, pausing emulation.'; - exit(); - }; - //0xED - Illegal - //#0xED: - $this->functionsArray[] = function ($parentObj) { - echo 'Illegal op code 0xED called, pausing emulation.'; - exit(); - }; - //XOR n - //#0xEE: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA ^= $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - $parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = false; - }; - //RST 0x28 - //#0xEF: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = 0x28; - }; - //LDH A, (n) - //#0xF0: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->memoryRead(0xFF00 + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - }; - //POP AF - //#0xF1: - $this->functionsArray[] = function ($parentObj) { - $temp_var = $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer); - $parentObj->FZero = (($temp_var & 0x80) == 0x80); - $parentObj->FSubtract = (($temp_var & 0x40) == 0x40); - $parentObj->FHalfCarry = (($temp_var & 0x20) == 0x20); - $parentObj->FCarry = (($temp_var & 0x10) == 0x10); - $parentObj->registerA = $parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF); - $parentObj->stackPointer = ($parentObj->stackPointer + 2) & 0xFFFF; - }; - //LD A, (C) - //#0xF2: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->memoryRead(0xFF00 + $parentObj->registerC); - }; - //DI - //#0xF3: - $this->functionsArray[] = function ($parentObj) { - $parentObj->IME = false; - $parentObj->untilEnable = 0; - }; - //0xF4 - Illegal - //#0xF4: - $this->functionsArray[] = function ($parentObj) { - // @TODO - // cout("Illegal op code 0xF4 called, pausing emulation.", 2); - // pause(); - }; - //PUSH AF - //#0xF5: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->registerA); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, (($parentObj->FZero) ? 0x80 : 0) + (($parentObj->FSubtract) ? 0x40 : 0) + (($parentObj->FHalfCarry) ? 0x20 : 0) + (($parentObj->FCarry) ? 0x10 : 0)); - }; - //OR n - //#0xF6: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA |= $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->FZero = ($parentObj->registerA == 0); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - $parentObj->FSubtract = $parentObj->FCarry = $parentObj->FHalfCarry = false; - }; - //RST 0x30 - //#0xF7: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = 0x30; - }; - //LDHL SP, n - //#0xF8: - $this->functionsArray[] = function ($parentObj) { - $signedByte = $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)); - $parentObj->registersHL = $parentObj->nswtuw($parentObj->stackPointer + $signedByte); - $parentObj->FCarry = ((($parentObj->stackPointer ^ $signedByte ^ $parentObj->registersHL) & 0x100) == 0x100); - $parentObj->FHalfCarry = ((($parentObj->stackPointer ^ $signedByte ^ $parentObj->registersHL) & 0x10) == 0x10); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - $parentObj->FZero = $parentObj->FSubtract = false; - }; - //LD SP, HL - //#0xF9: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->registersHL; - }; - //LD A, (nn) - //#0xFA: - $this->functionsArray[] = function ($parentObj) { - $parentObj->registerA = $parentObj->memoryRead(($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)); - $parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF; - }; - //EI - //#0xFB: - $this->functionsArray[] = function ($parentObj) { - $parentObj->untilEnable = 2; - }; - //0xFC - Illegal - //#0xFC: - $this->functionsArray[] = function ($parentObj) { - echo 'Illegal op code 0xFC called, pausing emulation.'; - exit(); - }; - //0xFD - Illegal - //#0xFD: - $this->functionsArray[] = function ($parentObj) { - echo 'Illegal op code 0xFD called, pausing emulation.'; - exit(); - }; - //CP n - //#0xFE: - $this->functionsArray[] = function ($parentObj) { - $dirtySum = $parentObj->registerA - $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter); - $parentObj->FHalfCarry = ($parentObj->unsbtub($dirtySum) & 0xF) > ($parentObj->registerA & 0xF); - $parentObj->FCarry = ($dirtySum < 0); - $parentObj->FZero = ($dirtySum == 0); - $parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF; - $parentObj->FSubtract = true; - }; - //RST 0x38 - //#0xFF: - $this->functionsArray[] = function ($parentObj) { - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter >> 8); - $parentObj->stackPointer = $parentObj->unswtuw($parentObj->stackPointer - 1); - $parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF); - $parentObj->programCounter = 0x38; - }; - } - - public function get() - { - return $this->functionsArray; + + //Throw an error on purpose to exit out of the loop. + throw new Exception('HALT_OVERRUN'); + } + } + + /** + * Opcode #0x77. + * + * LD (HL), A + * + * @param Core $core + */ + private static function opcode119(Core $core) + { + $core->memoryWrite($core->registersHL, $core->registerA); + } + + /** + * Opcode #0x78. + * + * LD A, B + * + * @param Core $core + */ + private static function opcode120(Core $core) + { + $core->registerA = $core->registerB; + } + + /** + * Opcode #0x79. + * + * LD A, C + * + * @param Core $core + */ + private static function opcode121(Core $core) + { + $core->registerA = $core->registerC; + } + + /** + * Opcode #0x7A. + * + * LD A, D + * + * @param Core $core + */ + private static function opcode122(Core $core) + { + $core->registerA = $core->registerD; + } + + /** + * Opcode #0x7B. + * + * LD A, E + * + * @param Core $core + */ + private static function opcode123(Core $core) + { + $core->registerA = $core->registerE; + } + + /** + * Opcode #0x7C. + * + * LD A, H + * + * @param Core $core + */ + private static function opcode124(Core $core) + { + $core->registerA = ($core->registersHL >> 8); + } + + /** + * Opcode #0x7D. + * + * LD A, L + * + * @param Core $core + */ + private static function opcode125(Core $core) + { + $core->registerA = ($core->registersHL & 0xFF); + } + + /** + * Opcode #0x7E. + * + * LD, A, (HL) + * + * @param Core $core + */ + private static function opcode126(Core $core) + { + $core->registerA = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + } + + /** + * Opcode #0x7F. + * + * LD A, A + * + * @param Core $core + */ + private static function opcode127(Core $core) + { + //Do Nothing... + } + + /** + * Opcode #0x80. + * + * ADD A, B + * + * @param Core $core + */ + private static function opcode128(Core $core) + { + $dirtySum = $core->registerA + $core->registerB; + $core->FHalfCarry = ($dirtySum & 0xF) < ($core->registerA & 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x81. + * + * ADD A, C + * + * @param Core $core + */ + private static function opcode129(Core $core) + { + $dirtySum = $core->registerA + $core->registerC; + $core->FHalfCarry = ($dirtySum & 0xF) < ($core->registerA & 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x82. + * + * ADD A, D + * + * @param Core $core + */ + private static function opcode130(Core $core) + { + $dirtySum = $core->registerA + $core->registerD; + $core->FHalfCarry = ($dirtySum & 0xF) < ($core->registerA & 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x83. + * + * ADD A, E + * + * @param Core $core + */ + private static function opcode131(Core $core) + { + $dirtySum = $core->registerA + $core->registerE; + $core->FHalfCarry = ($dirtySum & 0xF) < ($core->registerA & 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x84. + * + * ADD A, H + * + * @param Core $core + */ + private static function opcode132(Core $core) + { + $dirtySum = $core->registerA + ($core->registersHL >> 8); + $core->FHalfCarry = ($dirtySum & 0xF) < ($core->registerA & 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x85. + * + * ADD A, L + * + * @param Core $core + */ + private static function opcode133(Core $core) + { + $dirtySum = $core->registerA + ($core->registersHL & 0xFF); + $core->FHalfCarry = ($dirtySum & 0xF) < ($core->registerA & 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x86. + * + * ADD A, (HL) + * + * @param Core $core + */ + private static function opcode134(Core $core) + { + $dirtySum = $core->registerA + $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->FHalfCarry = ($dirtySum & 0xF) < ($core->registerA & 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x87. + * + * ADD A, A + * + * @param Core $core + */ + private static function opcode135(Core $core) + { + $dirtySum = $core->registerA * 2; + $core->FHalfCarry = ($dirtySum & 0xF) < ($core->registerA & 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x88. + * + * ADC A, B + * + * @param Core $core + */ + private static function opcode136(Core $core) + { + $dirtySum = $core->registerA + $core->registerB + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) + ($core->registerB & 0xF) + (($core->FCarry) ? 1 : 0) > 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x89. + * + * ADC A, C + * + * @param Core $core + */ + private static function opcode137(Core $core) + { + $dirtySum = $core->registerA + $core->registerC + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) + ($core->registerC & 0xF) + (($core->FCarry) ? 1 : 0) > 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x8A. + * + * ADC A, D + * + * @param Core $core + */ + private static function opcode138(Core $core) + { + $dirtySum = $core->registerA + $core->registerD + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) + ($core->registerD & 0xF) + (($core->FCarry) ? 1 : 0) > 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x8B. + * + * ADC A, E + * + * @param Core $core + */ + private static function opcode139(Core $core) + { + $dirtySum = $core->registerA + $core->registerE + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) + ($core->registerE & 0xF) + (($core->FCarry) ? 1 : 0) > 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x8C. + * + * ADC A, H + * + * @param Core $core + */ + private static function opcode140(Core $core) + { + $tempValue = ($core->registersHL >> 8); + $dirtySum = $core->registerA + $tempValue + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) + ($tempValue & 0xF) + (($core->FCarry) ? 1 : 0) > 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x8D. + * + * ADC A, L + * + * @param Core $core + */ + private static function opcode141(Core $core) + { + $tempValue = ($core->registersHL & 0xFF); + $dirtySum = $core->registerA + $tempValue + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) + ($tempValue & 0xF) + (($core->FCarry) ? 1 : 0) > 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x8E. + * + * ADC A, (HL) + * + * @param Core $core + */ + private static function opcode142(Core $core) + { + $tempValue = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $dirtySum = $core->registerA + $tempValue + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) + ($tempValue & 0xF) + (($core->FCarry) ? 1 : 0) > 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x8F. + * + * ADC A, A + * + * @param Core $core + */ + private static function opcode143(Core $core) + { + $dirtySum = ($core->registerA * 2) + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) + ($core->registerA & 0xF) + (($core->FCarry) ? 1 : 0) > 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + } + + /** + * Opcode #0x90. + * + * SUB A, B + * + * @param Core $core + */ + private static function opcode144(Core $core) + { + $dirtySum = $core->registerA - $core->registerB; + $core->FHalfCarry = ($core->registerA & 0xF) < ($core->registerB & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x91. + * + * SUB A, C + * + * @param Core $core + */ + private static function opcode145(Core $core) + { + $dirtySum = $core->registerA - $core->registerC; + $core->FHalfCarry = ($core->registerA & 0xF) < ($core->registerC & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x92. + * + * SUB A, D + * + * @param Core $core + */ + private static function opcode146(Core $core) + { + $dirtySum = $core->registerA - $core->registerD; + $core->FHalfCarry = ($core->registerA & 0xF) < ($core->registerD & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x93. + * + * SUB A, E + * + * @param Core $core + */ + private static function opcode147(Core $core) + { + $dirtySum = $core->registerA - $core->registerE; + $core->FHalfCarry = ($core->registerA & 0xF) < ($core->registerE & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x94. + * + * SUB A, H + * + * @param Core $core + */ + private static function opcode148(Core $core) + { + $temp_var = $core->registersHL >> 8; + $dirtySum = $core->registerA - $temp_var; + $core->FHalfCarry = ($core->registerA & 0xF) < ($temp_var & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x95. + * + * SUB A, L + * + * @param Core $core + */ + private static function opcode149(Core $core) + { + $dirtySum = $core->registerA - ($core->registersHL & 0xFF); + $core->FHalfCarry = ($core->registerA & 0xF) < ($core->registersHL & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x96. + * + * SUB A, (HL) + * + * @param Core $core + */ + private static function opcode150(Core $core) + { + $temp_var = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $dirtySum = $core->registerA - $temp_var; + $core->FHalfCarry = ($core->registerA & 0xF) < ($temp_var & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x97. + * + * SUB A, A + * + * @param Core $core + */ + private static function opcode151(Core $core) + { + //number - same number == 0 + $core->registerA = 0; + $core->FHalfCarry = $core->FCarry = false; + $core->FZero = $core->FSubtract = true; + } + + /** + * Opcode #0x98. + * + * SBC A, B + * + * @param Core $core + */ + private static function opcode152(Core $core) + { + $dirtySum = $core->registerA - $core->registerB - (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) - ($core->registerB & 0xF) - (($core->FCarry) ? 1 : 0) < 0); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x99. + * + * SBC A, C + * + * @param Core $core + */ + private static function opcode153(Core $core) + { + $dirtySum = $core->registerA - $core->registerC - (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) - ($core->registerC & 0xF) - (($core->FCarry) ? 1 : 0) < 0); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x9A. + * + * SBC A, D + * + * @param Core $core + */ + private static function opcode154(Core $core) + { + $dirtySum = $core->registerA - $core->registerD - (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) - ($core->registerD & 0xF) - (($core->FCarry) ? 1 : 0) < 0); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x9B. + * + * SBC A, E + * + * @param Core $core + */ + private static function opcode155(Core $core) + { + $dirtySum = $core->registerA - $core->registerE - (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) - ($core->registerE & 0xF) - (($core->FCarry) ? 1 : 0) < 0); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x9C. + * + * SBC A, H + * + * @param Core $core + */ + private static function opcode156(Core $core) + { + $temp_var = $core->registersHL >> 8; + $dirtySum = $core->registerA - $temp_var - (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) - ($temp_var & 0xF) - (($core->FCarry) ? 1 : 0) < 0); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x9D. + * + * SBC A, L + * + * @param Core $core + */ + private static function opcode157(Core $core) + { + $dirtySum = $core->registerA - ($core->registersHL & 0xFF) - (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) - ($core->registersHL & 0xF) - (($core->FCarry) ? 1 : 0) < 0); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x9E. + * + * SBC A, (HL) + * + * @param Core $core + */ + private static function opcode158(Core $core) + { + $temp_var = $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $dirtySum = $core->registerA - $temp_var - (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) - ($temp_var & 0xF) - (($core->FCarry) ? 1 : 0) < 0); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0x9F. + * + * SBC A, A + * + * @param Core $core + */ + private static function opcode159(Core $core) + { + //Optimized SBC A: + if ($core->FCarry) { + $core->FZero = false; + $core->FSubtract = $core->FHalfCarry = $core->FCarry = true; + $core->registerA = 0xFF; + } else { + $core->FHalfCarry = $core->FCarry = false; + $core->FSubtract = $core->FZero = true; + $core->registerA = 0; + } + } + + /** + * Opcode #0xA0. + * + * AND B + * + * @param Core $core + */ + private static function opcode160(Core $core) + { + $core->registerA &= $core->registerB; + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = true; + $core->FSubtract = $core->FCarry = false; + } + + /** + * Opcode #0xA1. + * + * AND C + * + * @param Core $core + */ + private static function opcode161(Core $core) + { + $core->registerA &= $core->registerC; + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = true; + $core->FSubtract = $core->FCarry = false; + } + + /** + * Opcode #0xA2. + * + * AND D + * + * @param Core $core + */ + private static function opcode162(Core $core) + { + $core->registerA &= $core->registerD; + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = true; + $core->FSubtract = $core->FCarry = false; + } + + /** + * Opcode #0xA3. + * + * AND E + * + * @param Core $core + */ + private static function opcode163(Core $core) + { + $core->registerA &= $core->registerE; + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = true; + $core->FSubtract = $core->FCarry = false; + } + + /** + * Opcode #0xA4. + * + * AND H + * + * @param Core $core + */ + private static function opcode164(Core $core) + { + $core->registerA &= ($core->registersHL >> 8); + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = true; + $core->FSubtract = $core->FCarry = false; + } + + /** + * Opcode #0xA5. + * + * AND L + * + * @param Core $core + */ + private static function opcode165(Core $core) + { + $core->registerA &= ($core->registersHL & 0xFF); + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = true; + $core->FSubtract = $core->FCarry = false; + } + + /** + * Opcode #0xA6. + * + * AND (HL) + * + * @param Core $core + */ + private static function opcode166(Core $core) + { + $core->registerA &= $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = true; + $core->FSubtract = $core->FCarry = false; + } + + /** + * Opcode #0xA7. + * + * AND A + * + * @param Core $core + */ + private static function opcode167(Core $core) + { + //number & same number = same number + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = true; + $core->FSubtract = $core->FCarry = false; + } + + /** + * Opcode #0xA8. + * + * XOR B + * + * @param Core $core + */ + private static function opcode168(Core $core) + { + $core->registerA ^= $core->registerB; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FHalfCarry = $core->FCarry = false; + } + + /** + * Opcode #0xA9. + * + * XOR C + * + * @param Core $core + */ + private static function opcode169(Core $core) + { + $core->registerA ^= $core->registerC; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FHalfCarry = $core->FCarry = false; + } + + /** + * Opcode #0xAA. + * + * XOR D + * + * @param Core $core + */ + private static function opcode170(Core $core) + { + $core->registerA ^= $core->registerD; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FHalfCarry = $core->FCarry = false; + } + + /** + * Opcode #0xAB. + * + * XOR E + * + * @param Core $core + */ + private static function opcode171(Core $core) + { + $core->registerA ^= $core->registerE; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FHalfCarry = $core->FCarry = false; + } + + /** + * Opcode #0xAC. + * + * XOR H + * + * @param Core $core + */ + private static function opcode172(Core $core) + { + $core->registerA ^= ($core->registersHL >> 8); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FHalfCarry = $core->FCarry = false; + } + + /** + * Opcode #0xAD. + * + * XOR L + * + * @param Core $core + */ + private static function opcode173(Core $core) + { + $core->registerA ^= ($core->registersHL & 0xFF); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FHalfCarry = $core->FCarry = false; + } + + /** + * Opcode #0xAE. + * + * XOR (HL) + * + * @param Core $core + */ + private static function opcode174(Core $core) + { + $core->registerA ^= $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FHalfCarry = $core->FCarry = false; + } + + /** + * Opcode #0xAF. + * + * XOR A + * + * @param Core $core + */ + private static function opcode175(Core $core) + { + //number ^ same number == 0 + $core->registerA = 0; + $core->FZero = true; + $core->FSubtract = $core->FHalfCarry = $core->FCarry = false; + } + + /** + * Opcode #0xB0. + * + * OR B + * + * @param Core $core + */ + private static function opcode176(Core $core) + { + $core->registerA |= $core->registerB; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FCarry = $core->FHalfCarry = false; + } + + /** + * Opcode #0xB1. + * + * OR C + * + * @param Core $core + */ + private static function opcode177(Core $core) + { + $core->registerA |= $core->registerC; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FCarry = $core->FHalfCarry = false; + } + + /** + * Opcode #0xB2. + * + * OR D + * + * @param Core $core + */ + private static function opcode178(Core $core) + { + $core->registerA |= $core->registerD; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FCarry = $core->FHalfCarry = false; + } + + /** + * Opcode #0xB3. + * + * OR E + * + * @param Core $core + */ + private static function opcode179(Core $core) + { + $core->registerA |= $core->registerE; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FCarry = $core->FHalfCarry = false; + } + + /** + * Opcode #0xB4. + * + * OR H + * + * @param Core $core + */ + private static function opcode180(Core $core) + { + $core->registerA |= ($core->registersHL >> 8); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FCarry = $core->FHalfCarry = false; + } + + /** + * Opcode #0xB5. + * + * OR L + * + * @param Core $core + */ + private static function opcode181(Core $core) + { + $core->registerA |= ($core->registersHL & 0xFF); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FCarry = $core->FHalfCarry = false; + } + + /** + * Opcode #0xB6. + * + * OR (HL) + * + * @param Core $core + */ + private static function opcode182(Core $core) + { + $core->registerA |= $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FCarry = $core->FHalfCarry = false; + } + + /** + * Opcode #0xB7. + * + * OR A + * + * @param Core $core + */ + private static function opcode183(Core $core) + { + //number | same number == same number + $core->FZero = ($core->registerA == 0); + $core->FSubtract = $core->FCarry = $core->FHalfCarry = false; + } + + /** + * Opcode #0xB8. + * + * CP B + * + * @param Core $core + */ + private static function opcode184(Core $core) + { + $dirtySum = $core->registerA - $core->registerB; + $core->FHalfCarry = ($core->unsbtub($dirtySum) & 0xF) > ($core->registerA & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->FZero = ($dirtySum == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0xB9. + * + * CP C + * + * @param Core $core + */ + private static function opcode185(Core $core) + { + $dirtySum = $core->registerA - $core->registerC; + $core->FHalfCarry = ($core->unsbtub($dirtySum) & 0xF) > ($core->registerA & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->FZero = ($dirtySum == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0xBA. + * + * CP D + * + * @param Core $core + */ + private static function opcode186(Core $core) + { + $dirtySum = $core->registerA - $core->registerD; + $core->FHalfCarry = ($core->unsbtub($dirtySum) & 0xF) > ($core->registerA & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->FZero = ($dirtySum == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0xBB. + * + * CP E + * + * @param Core $core + */ + private static function opcode187(Core $core) + { + $dirtySum = $core->registerA - $core->registerE; + $core->FHalfCarry = ($core->unsbtub($dirtySum) & 0xF) > ($core->registerA & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->FZero = ($dirtySum == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0xBC. + * + * CP H + * + * @param Core $core + */ + private static function opcode188(Core $core) + { + $dirtySum = $core->registerA - ($core->registersHL >> 8); + $core->FHalfCarry = ($core->unsbtub($dirtySum) & 0xF) > ($core->registerA & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->FZero = ($dirtySum == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0xBD. + * + * CP L + * + * @param Core $core + */ + private static function opcode189(Core $core) + { + $dirtySum = $core->registerA - ($core->registersHL & 0xFF); + $core->FHalfCarry = ($core->unsbtub($dirtySum) & 0xF) > ($core->registerA & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->FZero = ($dirtySum == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0xBE. + * + * CP (HL) + * + * @param Core $core + */ + private static function opcode190(Core $core) + { + $dirtySum = $core->registerA - $core->memoryReader[$core->registersHL]($core, $core->registersHL); + $core->FHalfCarry = ($core->unsbtub($dirtySum) & 0xF) > ($core->registerA & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->FZero = ($dirtySum == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0xBF. + * + * CP A + * + * @param Core $core + */ + private static function opcode191(Core $core) + { + $core->FHalfCarry = $core->FCarry = false; + $core->FZero = $core->FSubtract = true; + } + + /** + * Opcode #0xC0. + * + * RET !FZ + * + * @param Core $core + */ + private static function opcode192(Core $core) + { + if (!$core->FZero) { + $core->programCounter = ($core->memoryRead(($core->stackPointer + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->stackPointer]($core, $core->stackPointer); + $core->stackPointer = ($core->stackPointer + 2) & 0xFFFF; + $core->CPUTicks += 3; + } + } + + /** + * Opcode #0xC1. + * + * POP BC + * + * @param Core $core + */ + private static function opcode193(Core $core) + { + $core->registerC = $core->memoryReader[$core->stackPointer]($core, $core->stackPointer); + $core->registerB = $core->memoryRead(($core->stackPointer + 1) & 0xFFFF); + $core->stackPointer = ($core->stackPointer + 2) & 0xFFFF; + } + + /** + * Opcode #0xC2. + * + * JP !FZ, nn + * + * @param Core $core + */ + private static function opcode194(Core $core) + { + if (!$core->FZero) { + $core->programCounter = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + ++$core->CPUTicks; + } else { + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + } + + /** + * Opcode #0xC3. + * + * JP nn + * + * @param Core $core + */ + private static function opcode195(Core $core) + { + $core->programCounter = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + } + + /** + * Opcode #0xC4. + * + * CALL !FZ, nn + * + * @param Core $core + */ + private static function opcode196(Core $core) + { + if (!$core->FZero) { + $temp_pc = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = $temp_pc; + $core->CPUTicks += 3; + } else { + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + } + + /** + * Opcode #0xC5. + * + * PUSH BC + * + * @param Core $core + */ + private static function opcode197(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->registerB); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->registerC); + } + + /** + * Opcode #0xC6. + * + * ADD, n + * + * @param Core $core + */ + private static function opcode198(Core $core) + { + $dirtySum = $core->registerA + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->FHalfCarry = ($dirtySum & 0xF) < ($core->registerA & 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0xC7. + * + * RST 0 + * + * @param Core $core + */ + private static function opcode199(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = 0; + } + + /** + * Opcode #0xC8. + * + * RET FZ + * + * @param Core $core + */ + private static function opcode200(Core $core) + { + if ($core->FZero) { + $core->programCounter = ($core->memoryRead(($core->stackPointer + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->stackPointer]($core, $core->stackPointer); + $core->stackPointer = ($core->stackPointer + 2) & 0xFFFF; + $core->CPUTicks += 3; + } + } + + /** + * Opcode #0xC9. + * + * RET + * + * @param Core $core + */ + private static function opcode201(Core $core) + { + $core->programCounter = ($core->memoryRead(($core->stackPointer + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->stackPointer]($core, $core->stackPointer); + $core->stackPointer = ($core->stackPointer + 2) & 0xFFFF; + } + + /** + * Opcode #0xCA. + * + * JP FZ, nn + * + * @param Core $core + */ + private static function opcode202(Core $core) + { + if ($core->FZero) { + $core->programCounter = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + ++$core->CPUTicks; + } else { + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + } + + /** + * Opcode #0xCB. + * + * Secondary OP Code Set: + * + * @param Core $core + */ + private static function opcode203(Core $core) + { + $opcode = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + //Increment the program counter to the next instruction: + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + //Get how many CPU cycles the current 0xCBXX op code counts for: + $core->CPUTicks = $core->SecondaryTICKTable[$opcode]; + //Execute secondary OP codes for the 0xCB OP code call. + Cbopcode::run($core, $opcode); + } + + /** + * Opcode #0xCC. + * + * CALL FZ, nn + * + * @param Core $core + */ + private static function opcode204(Core $core) + { + if ($core->FZero) { + $temp_pc = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = $temp_pc; + $core->CPUTicks += 3; + } else { + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + } + + /** + * Opcode #0xCD. + * + * CALL nn + * + * @param Core $core + */ + private static function opcode205(Core $core) + { + $temp_pc = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = $temp_pc; + } + + /** + * Opcode #0xCE. + * + * ADC A, n + * + * @param Core $core + */ + private static function opcode206(Core $core) + { + $tempValue = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $dirtySum = $core->registerA + $tempValue + (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) + ($tempValue & 0xF) + (($core->FCarry) ? 1 : 0) > 0xF); + $core->FCarry = ($dirtySum > 0xFF); + $core->registerA = $dirtySum & 0xFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = false; + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0xCF. + * + * RST 0x8 + * + * @param Core $core + */ + private static function opcode207(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = 0x8; + } + + /** + * Opcode #0xD0. + * + * RET !FC + * + * @param Core $core + */ + private static function opcode208(Core $core) + { + if (!$core->FCarry) { + $core->programCounter = ($core->memoryRead(($core->stackPointer + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->stackPointer]($core, $core->stackPointer); + $core->stackPointer = ($core->stackPointer + 2) & 0xFFFF; + $core->CPUTicks += 3; + } + } + + /** + * Opcode #0xD1. + * + * POP DE + * + * @param Core $core + */ + private static function opcode209(Core $core) + { + $core->registerE = $core->memoryReader[$core->stackPointer]($core, $core->stackPointer); + $core->registerD = $core->memoryRead(($core->stackPointer + 1) & 0xFFFF); + $core->stackPointer = ($core->stackPointer + 2) & 0xFFFF; + } + + /** + * Opcode #0xD2. + * + * JP !FC, nn + * + * @param Core $core + */ + private static function opcode210(Core $core) + { + if (!$core->FCarry) { + $core->programCounter = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + ++$core->CPUTicks; + } else { + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + } + + /** + * Opcode #0xD3. + * + * 0xD3 - Illegal + * + * @param Core $core + */ + private static function opcode211(Core $core) + { + // @TODO + // cout("Illegal op code 0xD3 called, pausing emulation.", 2); + // pause(); + } + + /** + * Opcode #0xD4. + * + * CALL !FC, nn + * + * @param Core $core + */ + private static function opcode212(Core $core) + { + if (!$core->FCarry) { + $temp_pc = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = $temp_pc; + $core->CPUTicks += 3; + } else { + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + } + + /** + * Opcode #0xD5. + * + * PUSH DE + * + * @param Core $core + */ + private static function opcode213(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->registerD); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->registerE); + } + + /** + * Opcode #0xD6. + * + * SUB A, n + * + * @param Core $core + */ + private static function opcode214(Core $core) + { + $temp_var = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $dirtySum = $core->registerA - $temp_var; + $core->FHalfCarry = ($core->registerA & 0xF) < ($temp_var & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0xD7. + * + * RST 0x10 + * + * @param Core $core + */ + private static function opcode215(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = 0x10; + } + + /** + * Opcode #0xD8. + * + * RET FC + * + * @param Core $core + */ + private static function opcode216(Core $core) + { + if ($core->FCarry) { + $core->programCounter = ($core->memoryRead(($core->stackPointer + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->stackPointer]($core, $core->stackPointer); + $core->stackPointer = ($core->stackPointer + 2) & 0xFFFF; + $core->CPUTicks += 3; + } + } + + /** + * Opcode #0xD9. + * + * RETI + * + * @param Core $core + */ + private static function opcode217(Core $core) + { + $core->programCounter = ($core->memoryRead(($core->stackPointer + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->stackPointer]($core, $core->stackPointer); + $core->stackPointer = ($core->stackPointer + 2) & 0xFFFF; + //$core->IME = true; + $core->untilEnable = 2; + } + + /** + * Opcode #0xDA. + * + * JP FC, nn + * + * @param Core $core + */ + private static function opcode218(Core $core) + { + if ($core->FCarry) { + $core->programCounter = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + ++$core->CPUTicks; + } else { + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + } + + /** + * Opcode #0xDB. + * + * 0xDB - Illegal + * + * @param Core $core + */ + private static function opcode219(Core $core) + { + echo 'Illegal op code 0xDB called, pausing emulation.'; + exit(); + } + + /** + * Opcode #0xDC. + * + * CALL FC, nn + * + * @param Core $core + */ + private static function opcode220(Core $core) + { + if ($core->FCarry) { + $temp_pc = ($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = $temp_pc; + $core->CPUTicks += 3; + } else { + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + } + + /** + * Opcode #0xDD. + * + * 0xDD - Illegal + * + * @param Core $core + */ + private static function opcode221(Core $core) + { + echo 'Illegal op code 0xDD called, pausing emulation.'; + exit(); + } + + /** + * Opcode #0xDE. + * + * SBC A, n + * + * @param Core $core + */ + private static function opcode222(Core $core) + { + $temp_var = $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $dirtySum = $core->registerA - $temp_var - (($core->FCarry) ? 1 : 0); + $core->FHalfCarry = (($core->registerA & 0xF) - ($temp_var & 0xF) - (($core->FCarry) ? 1 : 0) < 0); + $core->FCarry = ($dirtySum < 0); + $core->registerA = $core->unsbtub($dirtySum); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + $core->FZero = ($core->registerA == 0); + $core->FSubtract = true; + } + + /** + * Opcode #0xDF. + * + * RST 0x18 + * + * @param Core $core + */ + private static function opcode223(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = 0x18; + } + + /** + * Opcode #0xE0. + * + * LDH (n), A + * + * @param Core $core + */ + private static function opcode224(Core $core) + { + $core->memoryWrite(0xFF00 + $core->memoryReader[$core->programCounter]($core, $core->programCounter), $core->registerA); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0xE1. + * + * POP HL + * + * @param Core $core + */ + private static function opcode225(Core $core) + { + $core->registersHL = ($core->memoryRead(($core->stackPointer + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->stackPointer]($core, $core->stackPointer); + $core->stackPointer = ($core->stackPointer + 2) & 0xFFFF; + } + + /** + * Opcode #0xE2. + * + * LD (C), A + * + * @param Core $core + */ + private static function opcode226(Core $core) + { + $core->memoryWrite(0xFF00 + $core->registerC, $core->registerA); + } + + /** + * Opcode #0xE3. + * + * 0xE3 - Illegal + * + * @param Core $core + */ + private static function opcode227(Core $core) + { + echo 'Illegal op code 0xE3 called, pausing emulation.'; + exit(); + } + + /** + * Opcode #0xE4. + * + * 0xE4 - Illegal + * + * @param Core $core + */ + private static function opcode228(Core $core) + { + echo 'Illegal op code 0xE4 called, pausing emulation.'; + exit(); + } + + /** + * Opcode #0xE5. + * + * PUSH HL + * + * @param Core $core + */ + private static function opcode229(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->registersHL >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->registersHL & 0xFF); + } + + /** + * Opcode #0xE6. + * + * AND n + * + * @param Core $core + */ + private static function opcode230(Core $core) + { + $core->registerA &= $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + $core->FZero = ($core->registerA == 0); + $core->FHalfCarry = true; + $core->FSubtract = $core->FCarry = false; + } + + /** + * Opcode #0xE7. + * + * RST 0x20 + * + * @param Core $core + */ + private static function opcode231(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = 0x20; + } + + /** + * Opcode #0xE8. + * + * ADD SP, n + * + * @param Core $core + */ + private static function opcode232(Core $core) + { + $signedByte = $core->usbtsb($core->memoryReader[$core->programCounter]($core, $core->programCounter)); + $temp_value = $core->nswtuw($core->stackPointer + $signedByte); + $core->FCarry = ((($core->stackPointer ^ $signedByte ^ $temp_value) & 0x100) == 0x100); + $core->FHalfCarry = ((($core->stackPointer ^ $signedByte ^ $temp_value) & 0x10) == 0x10); + $core->stackPointer = $temp_value; + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + $core->FZero = $core->FSubtract = false; + } + + /** + * Opcode #0xE9. + * + * JP, (HL) + * + * @param Core $core + */ + private static function opcode233(Core $core) + { + $core->programCounter = $core->registersHL; + } + + /** + * Opcode #0xEA. + * + * LD n, A + * + * @param Core $core + */ + private static function opcode234(Core $core) + { + $core->memoryWrite(($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter), $core->registerA); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + + /** + * Opcode #0xEB. + * + * 0xEB - Illegal + * + * @param Core $core + */ + private static function opcode235(Core $core) + { + echo 'Illegal op code 0xEB called, pausing emulation.'; + exit(); + } + + /** + * Opcode #0xEC. + * + * 0xEC - Illegal + * + * @param Core $core + */ + private static function opcode236(Core $core) + { + echo 'Illegal op code 0xEC called, pausing emulation.'; + exit(); + } + + /** + * Opcode #0xED. + * + * 0xED - Illegal + * + * @param Core $core + */ + private static function opcode237(Core $core) + { + echo 'Illegal op code 0xED called, pausing emulation.'; + exit(); + } + + /** + * Opcode #0xEE. + * + * XOR n + * + * @param Core $core + */ + private static function opcode238(Core $core) + { + $core->registerA ^= $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->FZero = ($core->registerA == 0); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + $core->FSubtract = $core->FHalfCarry = $core->FCarry = false; + } + + /** + * Opcode #0xEF. + * + * RST 0x28 + * + * @param Core $core + */ + private static function opcode239(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = 0x28; + } + + /** + * Opcode #0xF0. + * + * LDH A, (n) + * + * @param Core $core + */ + private static function opcode240(Core $core) + { + $core->registerA = $core->memoryRead(0xFF00 + $core->memoryReader[$core->programCounter]($core, $core->programCounter)); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + } + + /** + * Opcode #0xF1. + * + * POP AF + * + * @param Core $core + */ + private static function opcode241(Core $core) + { + $temp_var = $core->memoryReader[$core->stackPointer]($core, $core->stackPointer); + $core->FZero = (($temp_var & 0x80) == 0x80); + $core->FSubtract = (($temp_var & 0x40) == 0x40); + $core->FHalfCarry = (($temp_var & 0x20) == 0x20); + $core->FCarry = (($temp_var & 0x10) == 0x10); + $core->registerA = $core->memoryRead(($core->stackPointer + 1) & 0xFFFF); + $core->stackPointer = ($core->stackPointer + 2) & 0xFFFF; + } + + /** + * Opcode #0xF2. + * + * LD A, (C) + * + * @param Core $core + */ + private static function opcode242(Core $core) + { + $core->registerA = $core->memoryRead(0xFF00 + $core->registerC); + } + + /** + * Opcode #0xF3. + * + * DI + * + * @param Core $core + */ + private static function opcode243(Core $core) + { + $core->IME = false; + $core->untilEnable = 0; + } + + /** + * Opcode #0xF4. + * + * 0xF4 - Illegal + * + * @param Core $core + */ + private static function opcode244(Core $core) + { + // @TODO + // cout("Illegal op code 0xF4 called, pausing emulation.", 2); + // pause(); + } + + /** + * Opcode #0xF5. + * + * PUSH AF + * + * @param Core $core + */ + private static function opcode245(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->registerA); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, (($core->FZero) ? 0x80 : 0) + (($core->FSubtract) ? 0x40 : 0) + (($core->FHalfCarry) ? 0x20 : 0) + (($core->FCarry) ? 0x10 : 0)); + } + + /** + * Opcode #0xF6. + * + * OR n + * + * @param Core $core + */ + private static function opcode246(Core $core) + { + $core->registerA |= $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->FZero = ($core->registerA == 0); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + $core->FSubtract = $core->FCarry = $core->FHalfCarry = false; + } + + /** + * Opcode #0xF7. + * + * RST 0x30 + * + * @param Core $core + */ + private static function opcode247(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = 0x30; + } + + /** + * Opcode #0xF8. + * + * LDHL SP, n + * + * @param Core $core + */ + private static function opcode248(Core $core) + { + $signedByte = $core->usbtsb($core->memoryReader[$core->programCounter]($core, $core->programCounter)); + $core->registersHL = $core->nswtuw($core->stackPointer + $signedByte); + $core->FCarry = ((($core->stackPointer ^ $signedByte ^ $core->registersHL) & 0x100) == 0x100); + $core->FHalfCarry = ((($core->stackPointer ^ $signedByte ^ $core->registersHL) & 0x10) == 0x10); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + $core->FZero = $core->FSubtract = false; + } + + /** + * Opcode #0xF9. + * + * LD SP, HL + * + * @param Core $core + */ + private static function opcode249(Core $core) + { + $core->stackPointer = $core->registersHL; + } + + /** + * Opcode #0xFA. + * + * LD A, (nn) + * + * @param Core $core + */ + private static function opcode250(Core $core) + { + $core->registerA = $core->memoryRead(($core->memoryRead(($core->programCounter + 1) & 0xFFFF) << 8) + $core->memoryReader[$core->programCounter]($core, $core->programCounter)); + $core->programCounter = ($core->programCounter + 2) & 0xFFFF; + } + + /** + * Opcode #0xFB. + * + * EI + * + * @param Core $core + */ + private static function opcode251(Core $core) + { + $core->untilEnable = 2; + } + + /** + * Opcode #0xFC. + * + * 0xFC - Illegal + * + * @param Core $core + */ + private static function opcode252(Core $core) + { + echo 'Illegal op code 0xFC called, pausing emulation.'; + exit(); + } + + /** + * Opcode #0xFD. + * + * 0xFD - Illegal + * + * @param Core $core + */ + private static function opcode253(Core $core) + { + echo 'Illegal op code 0xFD called, pausing emulation.'; + exit(); + } + + /** + * Opcode #0xFE. + * + * CP n + * + * @param Core $core + */ + private static function opcode254(Core $core) + { + $dirtySum = $core->registerA - $core->memoryReader[$core->programCounter]($core, $core->programCounter); + $core->FHalfCarry = ($core->unsbtub($dirtySum) & 0xF) > ($core->registerA & 0xF); + $core->FCarry = ($dirtySum < 0); + $core->FZero = ($dirtySum == 0); + $core->programCounter = ($core->programCounter + 1) & 0xFFFF; + $core->FSubtract = true; + } + + /** + * Opcode #0xFF. + * + * RST 0x38 + * + * @param Core $core + */ + private static function opcode255(Core $core) + { + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter >> 8); + $core->stackPointer = $core->unswtuw($core->stackPointer - 1); + $core->memoryWrite($core->stackPointer, $core->programCounter & 0xFF); + $core->programCounter = 0x38; } } |