summaryrefslogtreecommitdiffstats
path: root/src/GameBoy/Opcode.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/GameBoy/Opcode.php')
-rw-r--r--src/GameBoy/Opcode.php81
1 files changed, 33 insertions, 48 deletions
diff --git a/src/GameBoy/Opcode.php b/src/GameBoy/Opcode.php
index 80c82a7..6bed77e 100644
--- a/src/GameBoy/Opcode.php
+++ b/src/GameBoy/Opcode.php
@@ -3,7 +3,7 @@ namespace GameBoy;
class Opcode
{
- public $functionsArray = [];
+ public $functionsArray = [];
public function __construct()
{
@@ -124,23 +124,22 @@ class Opcode
$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.
- */
- if (($parentObj->memory[0xFF4D] & 0x01) == 0x01) { //Speed change requested.
- if (($parentObj->memory[0xFF4D] & 0x80) == 0x80) { //Go back to single speed mode.
+ 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.
+ */
+ if (($parentObj->memory[0xFF4D] & 0x01) == 0x01) { //Speed change requested.
+ if (($parentObj->memory[0xFF4D] & 0x80) == 0x80) { //Go back to single speed mode.
// 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.
- }
- else { //Go to double speed mode.
+ $parentObj->multiplier = 1; //TODO: Move this into the delay done code.
+ $parentObj->memory[0xFF4D] &= 0x7F; //Clear the double speed mode flag.
+ } else { //Go to double speed mode.
// 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->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.
+ $parentObj->memory[0xFF4D] &= 0xFE; //Reset the request bit.
}
}
};
@@ -256,8 +255,7 @@ class Opcode
if (!$parentObj->FZero) {
$parentObj->programCounter = $parentObj->nswtuw($parentObj->programCounter + $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)) + 1);
$parentObj->CPUTicks++;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF;
}
};
@@ -327,8 +325,7 @@ class Opcode
if ($parentObj->FZero) {
$parentObj->programCounter = $parentObj->nswtuw($parentObj->programCounter + $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)) + 1);
$parentObj->CPUTicks++;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF;
}
};
@@ -387,8 +384,7 @@ class Opcode
if (!$parentObj->FCarry) {
$parentObj->programCounter = $parentObj->nswtuw($parentObj->programCounter + $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)) + 1);
$parentObj->CPUTicks++;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF;
}
};
@@ -445,8 +441,7 @@ class Opcode
if ($parentObj->FCarry) {
$parentObj->programCounter = $parentObj->nswtuw($parentObj->programCounter + $parentObj->usbtsb($parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter)) + 1);
$parentObj->CPUTicks++;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 1) & 0xFFFF;
}
};
@@ -776,8 +771,7 @@ class Opcode
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 {
+ } else {
if (!$parentObj->halt && !$parentObj->IME && !$parentObj->cGBC && !$parentObj->usedBootROM && ($parentObj->memory[0xFF0F] & $parentObj->memory[0xFFFF] & 0x1F) > 0) {
$parentObj->skipPCIncrement = true;
}
@@ -791,12 +785,12 @@ class Opcode
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.
+ $parentObj->halt = false; //Get out of halt state if in halt state.
+ return; //Let the main interrupt handler compute the interrupt.
}
$testbit = 1 << ++$bitShift;
}
- $parentObj->CPUTicks = 1; //1 machine cycle under HALT...
+ $parentObj->CPUTicks = 1; //1 machine cycle under HALT...
//Timing:
$parentObj->updateCore();
}
@@ -1173,8 +1167,7 @@ class Opcode
$parentObj->FZero = false;
$parentObj->FSubtract = $parentObj->FHalfCarry = $parentObj->FCarry = true;
$parentObj->registerA = 0xFF;
- }
- else {
+ } else {
$parentObj->FHalfCarry = $parentObj->FCarry = false;
$parentObj->FSubtract = $parentObj->FZero = true;
$parentObj->registerA = 0;
@@ -1448,8 +1441,7 @@ class Opcode
if (!$parentObj->FZero) {
$parentObj->programCounter = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter);
$parentObj->CPUTicks++;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF;
}
};
@@ -1470,8 +1462,7 @@ class Opcode
$parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF);
$parentObj->programCounter = $temp_pc;
$parentObj->CPUTicks += 3;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF;
}
};
@@ -1515,7 +1506,7 @@ class Opcode
//RET
//#0xC9:
$this->functionsArray[] = function ($parentObj) {
- $parentObj->programCounter = ($parentObj->memoryRead(($parentObj->stackPointer + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->stackPointer]($parentObj, $parentObj->stackPointer);
+ $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
@@ -1524,8 +1515,7 @@ class Opcode
if ($parentObj->FZero) {
$parentObj->programCounter = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter);
$parentObj->CPUTicks++;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF;
}
};
@@ -1552,8 +1542,7 @@ class Opcode
$parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF);
$parentObj->programCounter = $temp_pc;
$parentObj->CPUTicks += 3;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF;
}
};
@@ -1611,8 +1600,7 @@ class Opcode
if (!$parentObj->FCarry) {
$parentObj->programCounter = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter);
$parentObj->CPUTicks++;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF;
}
};
@@ -1635,8 +1623,7 @@ class Opcode
$parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF);
$parentObj->programCounter = $temp_pc;
$parentObj->CPUTicks += 3;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF;
}
};
@@ -1692,8 +1679,7 @@ class Opcode
if ($parentObj->FCarry) {
$parentObj->programCounter = ($parentObj->memoryRead(($parentObj->programCounter + 1) & 0xFFFF) << 8) + $parentObj->memoryReader[$parentObj->programCounter]($parentObj, $parentObj->programCounter);
$parentObj->CPUTicks++;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF;
}
};
@@ -1715,8 +1701,7 @@ class Opcode
$parentObj->memoryWrite($parentObj->stackPointer, $parentObj->programCounter & 0xFF);
$parentObj->programCounter = $temp_pc;
$parentObj->CPUTicks += 3;
- }
- else {
+ } else {
$parentObj->programCounter = ($parentObj->programCounter + 2) & 0xFFFF;
}
};
@@ -1982,4 +1967,4 @@ class Opcode
{
return $this->functionsArray;
}
-} \ No newline at end of file
+}