Fix standard int types, prefix gb {C,H,N,Z}_FLAG with GB_

This commit is contained in:
Dorian Wouters 2016-07-29 09:45:38 +02:00
parent 4d3d2b7951
commit 37f0e75c45
No known key found for this signature in database
GPG Key ID: 6E9DA8063322434B
10 changed files with 298 additions and 285 deletions

View File

@ -1,6 +1,8 @@
#ifndef PORT_H
#define PORT_H
#include <cstdint>
#ifdef __CELLOS_LV2__
/* PlayStation3 */
#include <ppu_intrinsics.h>
@ -12,7 +14,7 @@
#endif
// swaps a 16-bit value
static inline uint16_t swap16(u16 v)
static inline uint16_t swap16(uint16_t v)
{
return (v << 8) | (v >> 8);
}

View File

@ -1,10 +1,10 @@
#ifndef GB_H
#define GB_H
#define C_FLAG 0x10
#define H_FLAG 0x20
#define N_FLAG 0x40
#define Z_FLAG 0x80
const int GB_C_FLAG = 0x10;
const int GB_H_FLAG = 0x20;
const int GB_N_FLAG = 0x40;
const int GB_Z_FLAG = 0x80;
typedef union {
struct {

View File

@ -17,12 +17,12 @@ break;
case 0x04:
// INC B
BC.B.B1++;
AF.B.B0 = (AF.B.B0 & C_FLAG) | ZeroTable[BC.B.B1] | (BC.B.B1 & 0x0F ? 0 : H_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | ZeroTable[BC.B.B1] | (BC.B.B1 & 0x0F ? 0 : GB_H_FLAG);
break;
case 0x05:
// DEC B
BC.B.B1--;
AF.B.B0 = N_FLAG | (AF.B.B0 & C_FLAG) | ZeroTable[BC.B.B1] | ((BC.B.B1 & 0x0F) == 0x0F ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (AF.B.B0 & GB_C_FLAG) | ZeroTable[BC.B.B1] | ((BC.B.B1 & 0x0F) == 0x0F ? GB_H_FLAG : 0);
break;
case 0x06:
// LD B, NN
@ -30,7 +30,7 @@ BC.B.B1 = gbReadOpcode(PC.W++);
break;
case 0x07:
// RLCA
tempValue = AF.B.B1 & 0x80 ? C_FLAG : 0;
tempValue = AF.B.B1 & 0x80 ? GB_C_FLAG : 0;
AF.B.B1 = (AF.B.B1 << 1) | (AF.B.B1 >> 7);
AF.B.B0 = tempValue;
break;
@ -44,7 +44,7 @@ break;
case 0x09:
// ADD HL,BC
tempRegister.W = (HL.W + BC.W) & 0xFFFF;
AF.B.B0 = (AF.B.B0 & Z_FLAG) | ((HL.W ^ BC.W ^ tempRegister.W) & 0x1000 ? H_FLAG : 0) | (((long)HL.W + (long)BC.W) & 0x10000 ? C_FLAG : 0);
AF.B.B0 = (AF.B.B0 & GB_Z_FLAG) | ((HL.W ^ BC.W ^ tempRegister.W) & 0x1000 ? GB_H_FLAG : 0) | (((long)HL.W + (long)BC.W) & 0x10000 ? GB_C_FLAG : 0);
HL.W = tempRegister.W;
break;
case 0x0a:
@ -58,12 +58,12 @@ break;
case 0x0c:
// INC C
BC.B.B0++;
AF.B.B0 = (AF.B.B0 & C_FLAG) | ZeroTable[BC.B.B0] | (BC.B.B0 & 0x0F ? 0 : H_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | ZeroTable[BC.B.B0] | (BC.B.B0 & 0x0F ? 0 : GB_H_FLAG);
break;
case 0x0d:
// DEC C
BC.B.B0--;
AF.B.B0 = N_FLAG | (AF.B.B0 & C_FLAG) | ZeroTable[BC.B.B0] | ((BC.B.B0 & 0x0F) == 0x0F ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (AF.B.B0 & GB_C_FLAG) | ZeroTable[BC.B.B0] | ((BC.B.B0 & 0x0F) == 0x0F ? GB_H_FLAG : 0);
break;
case 0x0e:
// LD C, NN
@ -106,12 +106,12 @@ break;
case 0x14:
// INC D
DE.B.B1++;
AF.B.B0 = (AF.B.B0 & C_FLAG) | ZeroTable[DE.B.B1] | (DE.B.B1 & 0x0F ? 0 : H_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | ZeroTable[DE.B.B1] | (DE.B.B1 & 0x0F ? 0 : GB_H_FLAG);
break;
case 0x15:
// DEC D
DE.B.B1--;
AF.B.B0 = N_FLAG | (AF.B.B0 & C_FLAG) | ZeroTable[DE.B.B1] | ((DE.B.B1 & 0x0F) == 0x0F ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (AF.B.B0 & GB_C_FLAG) | ZeroTable[DE.B.B1] | ((DE.B.B1 & 0x0F) == 0x0F ? GB_H_FLAG : 0);
break;
case 0x16:
// LD D,NN
@ -119,8 +119,8 @@ DE.B.B1 = gbReadOpcode(PC.W++);
break;
case 0x17:
// RLA
tempValue = AF.B.B1 & 0x80 ? C_FLAG : 0;
AF.B.B1 = (AF.B.B1 << 1) | ((AF.B.B0 & C_FLAG) >> 4);
tempValue = AF.B.B1 & 0x80 ? GB_C_FLAG : 0;
AF.B.B1 = (AF.B.B1 << 1) | ((AF.B.B0 & GB_C_FLAG) >> 4);
AF.B.B0 = tempValue;
break;
case 0x18:
@ -130,7 +130,7 @@ break;
case 0x19:
// ADD HL,DE
tempRegister.W = (HL.W + DE.W) & 0xFFFF;
AF.B.B0 = (AF.B.B0 & Z_FLAG) | ((HL.W ^ DE.W ^ tempRegister.W) & 0x1000 ? H_FLAG : 0) | (((long)HL.W + (long)DE.W) & 0x10000 ? C_FLAG : 0);
AF.B.B0 = (AF.B.B0 & GB_Z_FLAG) | ((HL.W ^ DE.W ^ tempRegister.W) & 0x1000 ? GB_H_FLAG : 0) | (((long)HL.W + (long)DE.W) & 0x10000 ? GB_C_FLAG : 0);
HL.W = tempRegister.W;
break;
case 0x1a:
@ -144,12 +144,12 @@ break;
case 0x1c:
// INC E
DE.B.B0++;
AF.B.B0 = (AF.B.B0 & C_FLAG) | ZeroTable[DE.B.B0] | (DE.B.B0 & 0x0F ? 0 : H_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | ZeroTable[DE.B.B0] | (DE.B.B0 & 0x0F ? 0 : GB_H_FLAG);
break;
case 0x1d:
// DEC E
DE.B.B0--;
AF.B.B0 = N_FLAG | (AF.B.B0 & C_FLAG) | ZeroTable[DE.B.B0] | ((DE.B.B0 & 0x0F) == 0x0F ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (AF.B.B0 & GB_C_FLAG) | ZeroTable[DE.B.B0] | ((DE.B.B0 & 0x0F) == 0x0F ? GB_H_FLAG : 0);
break;
case 0x1e:
// LD E,NN
@ -158,12 +158,12 @@ break;
case 0x1f:
// RRA
tempValue = AF.B.B1 & 0x01;
AF.B.B1 = (AF.B.B1 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
AF.B.B1 = (AF.B.B1 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = (tempValue << 4);
break;
case 0x20:
// JR NZ,NN
if (AF.B.B0 & Z_FLAG)
if (AF.B.B0 & GB_Z_FLAG)
PC.W++;
else {
PC.W += (s8)gbReadOpcode(PC.W) + 1;
@ -186,12 +186,12 @@ break;
case 0x24:
// INC H
HL.B.B1++;
AF.B.B0 = (AF.B.B0 & C_FLAG) | ZeroTable[HL.B.B1] | (HL.B.B1 & 0x0F ? 0 : H_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | ZeroTable[HL.B.B1] | (HL.B.B1 & 0x0F ? 0 : GB_H_FLAG);
break;
case 0x25:
// DEC H
HL.B.B1--;
AF.B.B0 = N_FLAG | (AF.B.B0 & C_FLAG) | ZeroTable[HL.B.B1] | ((HL.B.B1 & 0x0F) == 0x0F ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (AF.B.B0 & GB_C_FLAG) | ZeroTable[HL.B.B1] | ((HL.B.B1 & 0x0F) == 0x0F ? GB_H_FLAG : 0);
break;
case 0x26:
// LD H,NN
@ -200,12 +200,12 @@ break;
case 0x27:
// DAA
tempRegister.W = AF.B.B1;
tempRegister.W |= (AF.B.B0 & (C_FLAG | H_FLAG | N_FLAG)) << 4;
tempRegister.W |= (AF.B.B0 & (GB_C_FLAG | GB_H_FLAG | GB_N_FLAG)) << 4;
AF.W = DAATable[tempRegister.W];
break;
case 0x28:
// JR Z,NN
if (AF.B.B0 & Z_FLAG) {
if (AF.B.B0 & GB_Z_FLAG) {
PC.W += (s8)gbReadOpcode(PC.W) + 1;
clockTicks++;
} else
@ -214,7 +214,7 @@ break;
case 0x29:
// ADD HL,HL
tempRegister.W = (HL.W + HL.W) & 0xFFFF;
AF.B.B0 = (AF.B.B0 & Z_FLAG) | ((HL.W ^ HL.W ^ tempRegister.W) & 0x1000 ? H_FLAG : 0) | (((long)HL.W + (long)HL.W) & 0x10000 ? C_FLAG : 0);
AF.B.B0 = (AF.B.B0 & GB_Z_FLAG) | ((HL.W ^ HL.W ^ tempRegister.W) & 0x1000 ? GB_H_FLAG : 0) | (((long)HL.W + (long)HL.W) & 0x10000 ? GB_C_FLAG : 0);
HL.W = tempRegister.W;
break;
case 0x2a:
@ -228,12 +228,12 @@ break;
case 0x2c:
// INC L
HL.B.B0++;
AF.B.B0 = (AF.B.B0 & C_FLAG) | ZeroTable[HL.B.B0] | (HL.B.B0 & 0x0F ? 0 : H_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | ZeroTable[HL.B.B0] | (HL.B.B0 & 0x0F ? 0 : GB_H_FLAG);
break;
case 0x2d:
// DEC L
HL.B.B0--;
AF.B.B0 = N_FLAG | (AF.B.B0 & C_FLAG) | ZeroTable[HL.B.B0] | ((HL.B.B0 & 0x0F) == 0x0F ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (AF.B.B0 & GB_C_FLAG) | ZeroTable[HL.B.B0] | ((HL.B.B0 & 0x0F) == 0x0F ? GB_H_FLAG : 0);
break;
case 0x2e:
// LD L,NN
@ -242,11 +242,11 @@ break;
case 0x2f:
// CPL
AF.B.B1 ^= 255;
AF.B.B0 |= N_FLAG | H_FLAG;
AF.B.B0 |= GB_N_FLAG | GB_H_FLAG;
break;
case 0x30:
// JR NC,NN
if (AF.B.B0 & C_FLAG)
if (AF.B.B0 & GB_C_FLAG)
PC.W++;
else {
PC.W += (s8)gbReadOpcode(PC.W) + 1;
@ -269,13 +269,13 @@ break;
case 0x34:
// INC (HL)
tempValue = gbReadMemory(HL.W) + 1;
AF.B.B0 = (AF.B.B0 & C_FLAG) | ZeroTable[tempValue] | (tempValue & 0x0F ? 0 : H_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | ZeroTable[tempValue] | (tempValue & 0x0F ? 0 : GB_H_FLAG);
gbWriteMemory(HL.W, tempValue);
break;
case 0x35:
// DEC (HL)
tempValue = gbReadMemory(HL.W) - 1;
AF.B.B0 = N_FLAG | (AF.B.B0 & C_FLAG) | ZeroTable[tempValue] | ((tempValue & 0x0F) == 0x0F ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (AF.B.B0 & GB_C_FLAG) | ZeroTable[tempValue] | ((tempValue & 0x0F) == 0x0F ? GB_H_FLAG : 0);
gbWriteMemory(HL.W, tempValue);
break;
case 0x36:
@ -284,11 +284,11 @@ gbWriteMemory(HL.W, gbReadOpcode(PC.W++));
break;
case 0x37:
// SCF
AF.B.B0 = (AF.B.B0 & Z_FLAG) | C_FLAG;
AF.B.B0 = (AF.B.B0 & GB_Z_FLAG) | GB_C_FLAG;
break;
case 0x38:
// JR C,NN
if (AF.B.B0 & C_FLAG) {
if (AF.B.B0 & GB_C_FLAG) {
PC.W += (s8)gbReadOpcode(PC.W) + 1;
clockTicks++;
} else
@ -297,7 +297,7 @@ break;
case 0x39:
// ADD HL,SP
tempRegister.W = (HL.W + SP.W) & 0xFFFF;
AF.B.B0 = (AF.B.B0 & Z_FLAG) | ((HL.W ^ SP.W ^ tempRegister.W) & 0x1000 ? H_FLAG : 0) | (((long)HL.W + (long)SP.W) & 0x10000 ? C_FLAG : 0);
AF.B.B0 = (AF.B.B0 & GB_Z_FLAG) | ((HL.W ^ SP.W ^ tempRegister.W) & 0x1000 ? GB_H_FLAG : 0) | (((long)HL.W + (long)SP.W) & 0x10000 ? GB_C_FLAG : 0);
HL.W = tempRegister.W;
break;
case 0x3a:
@ -311,12 +311,12 @@ break;
case 0x3c:
// INC A
AF.B.B1++;
AF.B.B0 = (AF.B.B0 & C_FLAG) | ZeroTable[AF.B.B1] | (AF.B.B1 & 0x0F ? 0 : H_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | ZeroTable[AF.B.B1] | (AF.B.B1 & 0x0F ? 0 : GB_H_FLAG);
break;
case 0x3d:
// DEC A
AF.B.B1--;
AF.B.B0 = N_FLAG | (AF.B.B0 & C_FLAG) | ZeroTable[AF.B.B1] | ((AF.B.B1 & 0x0F) == 0x0F ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (AF.B.B0 & GB_C_FLAG) | ZeroTable[AF.B.B1] | ((AF.B.B1 & 0x0F) == 0x0F ? GB_H_FLAG : 0);
break;
case 0x3e:
// LD A,NN
@ -324,8 +324,8 @@ AF.B.B1 = gbReadOpcode(PC.W++);
break;
case 0x3f:
// CCF
AF.B.B0 ^= C_FLAG;
AF.B.B0 &= ~(N_FLAG | H_FLAG);
AF.B.B0 ^= GB_C_FLAG;
AF.B.B0 &= ~(GB_N_FLAG | GB_H_FLAG);
break;
case 0x40:
// LD B,B
@ -599,238 +599,238 @@ break;
case 0x80:
// ADD B
tempRegister.W = AF.B.B1 + BC.B.B1;
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x81:
// ADD C
tempRegister.W = AF.B.B1 + BC.B.B0;
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x82:
// ADD D
tempRegister.W = AF.B.B1 + DE.B.B1;
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x83:
// ADD E
tempRegister.W = AF.B.B1 + DE.B.B0;
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x84:
// ADD H
tempRegister.W = AF.B.B1 + HL.B.B1;
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x85:
// ADD L
tempRegister.W = AF.B.B1 + HL.B.B0;
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x86:
// ADD (HL)
tempValue = gbReadMemory(HL.W);
tempRegister.W = AF.B.B1 + tempValue;
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x87:
// ADD A
tempRegister.W = AF.B.B1 + AF.B.B1;
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ AF.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ AF.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x88:
// ADC B:
tempRegister.W = AF.B.B1 + BC.B.B1 + (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 + BC.B.B1 + (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x89:
// ADC C
tempRegister.W = AF.B.B1 + BC.B.B0 + (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 + BC.B.B0 + (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x8a:
// ADC D
tempRegister.W = AF.B.B1 + DE.B.B1 + (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 + DE.B.B1 + (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x8b:
// ADC E
tempRegister.W = AF.B.B1 + DE.B.B0 + (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 + DE.B.B0 + (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x8c:
// ADC H
tempRegister.W = AF.B.B1 + HL.B.B1 + (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 + HL.B.B1 + (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x8d:
// ADC L
tempRegister.W = AF.B.B1 + HL.B.B0 + (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 + HL.B.B0 + (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x8e:
// ADC (HL)
tempValue = gbReadMemory(HL.W);
tempRegister.W = AF.B.B1 + tempValue + (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 + tempValue + (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x8f:
// ADC A
tempRegister.W = AF.B.B1 + AF.B.B1 + (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ AF.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 + AF.B.B1 + (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ AF.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x90:
// SUB B
tempRegister.W = AF.B.B1 - BC.B.B1;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x91:
// SUB C
tempRegister.W = AF.B.B1 - BC.B.B0;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x92:
// SUB D
tempRegister.W = AF.B.B1 - DE.B.B1;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x93:
// SUB E
tempRegister.W = AF.B.B1 - DE.B.B0;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x94:
// SUB H
tempRegister.W = AF.B.B1 - HL.B.B1;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x95:
// SUB L
tempRegister.W = AF.B.B1 - HL.B.B0;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x96:
// SUB (HL)
tempValue = gbReadMemory(HL.W);
tempRegister.W = AF.B.B1 - tempValue;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x97:
// SUB A
AF.B.B1 = 0;
AF.B.B0 = N_FLAG | Z_FLAG;
AF.B.B0 = GB_N_FLAG | GB_Z_FLAG;
break;
case 0x98:
// SBC B
tempRegister.W = AF.B.B1 - BC.B.B1 - (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 - BC.B.B1 - (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x99:
// SBC C
tempRegister.W = AF.B.B1 - BC.B.B0 - (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 - BC.B.B0 - (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x9a:
// SBC D
tempRegister.W = AF.B.B1 - DE.B.B1 - (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 - DE.B.B1 - (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x9b:
// SBC E
tempRegister.W = AF.B.B1 - DE.B.B0 - (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 - DE.B.B0 - (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x9c:
// SBC H
tempRegister.W = AF.B.B1 - HL.B.B1 - (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 - HL.B.B1 - (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x9d:
// SBC L
tempRegister.W = AF.B.B1 - HL.B.B0 - (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 - HL.B.B0 - (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x9e:
// SBC (HL)
tempValue = gbReadMemory(HL.W);
tempRegister.W = AF.B.B1 - tempValue - (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 - tempValue - (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0x9f:
// SBC A
tempRegister.W = AF.B.B1 - AF.B.B1 - (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ AF.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 - AF.B.B1 - (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ AF.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0xa0:
// AND B
AF.B.B1 &= BC.B.B1;
AF.B.B0 = H_FLAG | ZeroTable[AF.B.B1];
AF.B.B0 = GB_H_FLAG | ZeroTable[AF.B.B1];
break;
case 0xa1:
// AND C
AF.B.B1 &= BC.B.B0;
AF.B.B0 = H_FLAG | ZeroTable[AF.B.B1];
AF.B.B0 = GB_H_FLAG | ZeroTable[AF.B.B1];
break;
case 0xa2:
// AND_D
AF.B.B1 &= DE.B.B1;
AF.B.B0 = H_FLAG | ZeroTable[AF.B.B1];
AF.B.B0 = GB_H_FLAG | ZeroTable[AF.B.B1];
break;
case 0xa3:
// AND E
AF.B.B1 &= DE.B.B0;
AF.B.B0 = H_FLAG | ZeroTable[AF.B.B1];
AF.B.B0 = GB_H_FLAG | ZeroTable[AF.B.B1];
break;
case 0xa4:
// AND H
AF.B.B1 &= HL.B.B1;
AF.B.B0 = H_FLAG | ZeroTable[AF.B.B1];
AF.B.B0 = GB_H_FLAG | ZeroTable[AF.B.B1];
break;
case 0xa5:
// AND L
AF.B.B1 &= HL.B.B0;
AF.B.B0 = H_FLAG | ZeroTable[AF.B.B1];
AF.B.B0 = GB_H_FLAG | ZeroTable[AF.B.B1];
break;
case 0xa6:
// AND (HL)
tempValue = gbReadMemory(HL.W);
AF.B.B1 &= tempValue;
AF.B.B0 = H_FLAG | ZeroTable[AF.B.B1];
AF.B.B0 = GB_H_FLAG | ZeroTable[AF.B.B1];
break;
case 0xa7:
// AND A
AF.B.B1 &= AF.B.B1;
AF.B.B0 = H_FLAG | ZeroTable[AF.B.B1];
AF.B.B0 = GB_H_FLAG | ZeroTable[AF.B.B1];
break;
case 0xa8:
// XOR B
@ -871,7 +871,7 @@ break;
case 0xaf:
// XOR A
AF.B.B1 = 0;
AF.B.B0 = Z_FLAG;
AF.B.B0 = GB_Z_FLAG;
break;
case 0xb0:
// OR B
@ -917,46 +917,46 @@ break;
case 0xb8:
// CP B:
tempRegister.W = AF.B.B1 - BC.B.B1;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
break;
case 0xb9:
// CP C
tempRegister.W = AF.B.B1 - BC.B.B0;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ BC.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
break;
case 0xba:
// CP D
tempRegister.W = AF.B.B1 - DE.B.B1;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
break;
case 0xbb:
// CP E
tempRegister.W = AF.B.B1 - DE.B.B0;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ DE.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
break;
case 0xbc:
// CP H
tempRegister.W = AF.B.B1 - HL.B.B1;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B1 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B1 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
break;
case 0xbd:
// CP L
tempRegister.W = AF.B.B1 - HL.B.B0;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B0 ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ HL.B.B0 ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
break;
case 0xbe:
// CP (HL)
tempValue = gbReadMemory(HL.W);
tempRegister.W = AF.B.B1 - tempValue;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
break;
case 0xbf:
// CP A
AF.B.B0 = N_FLAG | Z_FLAG;
AF.B.B0 = GB_N_FLAG | GB_Z_FLAG;
break;
case 0xc0:
// RET NZ
if (!(AF.B.B0 & Z_FLAG)) {
if (!(AF.B.B0 & GB_Z_FLAG)) {
PC.B.B0 = gbReadMemory(SP.W++);
PC.B.B1 = gbReadMemory(SP.W++);
clockTicks += 3;
@ -969,7 +969,7 @@ BC.B.B1 = gbReadMemory(SP.W++);
break;
case 0xc2:
// JP NZ,NNNN
if (AF.B.B0 & Z_FLAG)
if (AF.B.B0 & GB_Z_FLAG)
PC.W += 2;
else {
tempRegister.B.B0 = gbReadOpcode(PC.W++);
@ -986,7 +986,7 @@ PC.W = tempRegister.W;
break;
case 0xc4:
// CALL NZ,NNNN
if (AF.B.B0 & Z_FLAG)
if (AF.B.B0 & GB_Z_FLAG)
PC.W += 2;
else {
tempRegister.B.B0 = gbReadOpcode(PC.W++);
@ -1006,7 +1006,7 @@ case 0xc6:
// ADD NN
tempValue = gbReadOpcode(PC.W++);
tempRegister.W = AF.B.B1 + tempValue;
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0xc7:
@ -1017,7 +1017,7 @@ PC.W = 0x0000;
break;
case 0xc8:
// RET Z
if (AF.B.B0 & Z_FLAG) {
if (AF.B.B0 & GB_Z_FLAG) {
PC.B.B0 = gbReadMemory(SP.W++);
PC.B.B1 = gbReadMemory(SP.W++);
clockTicks += 3;
@ -1030,7 +1030,7 @@ PC.B.B1 = gbReadMemory(SP.W++);
break;
case 0xca:
// JP Z,NNNN
if (AF.B.B0 & Z_FLAG) {
if (AF.B.B0 & GB_Z_FLAG) {
tempRegister.B.B0 = gbReadOpcode(PC.W++);
tempRegister.B.B1 = gbReadOpcode(PC.W);
PC.W = tempRegister.W;
@ -1041,7 +1041,7 @@ break;
// CB done outside
case 0xcc:
// CALL Z,NNNN
if (AF.B.B0 & Z_FLAG) {
if (AF.B.B0 & GB_Z_FLAG) {
tempRegister.B.B0 = gbReadOpcode(PC.W++);
tempRegister.B.B1 = gbReadOpcode(PC.W++);
gbWriteMemory(--SP.W, PC.B.B1);
@ -1062,8 +1062,8 @@ break;
case 0xce:
// ADC NN
tempValue = gbReadOpcode(PC.W++);
tempRegister.W = AF.B.B1 + tempValue + (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 + tempValue + (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0xcf:
@ -1074,7 +1074,7 @@ PC.W = 0x0008;
break;
case 0xd0:
// RET NC
if (!(AF.B.B0 & C_FLAG)) {
if (!(AF.B.B0 & GB_C_FLAG)) {
PC.B.B0 = gbReadMemory(SP.W++);
PC.B.B1 = gbReadMemory(SP.W++);
clockTicks += 3;
@ -1087,7 +1087,7 @@ DE.B.B1 = gbReadMemory(SP.W++);
break;
case 0xd2:
// JP NC,NNNN
if (AF.B.B0 & C_FLAG)
if (AF.B.B0 & GB_C_FLAG)
PC.W += 2;
else {
tempRegister.B.B0 = gbReadOpcode(PC.W++);
@ -1103,7 +1103,7 @@ IFF = 0;
break;
case 0xd4:
// CALL NC,NNNN
if (AF.B.B0 & C_FLAG)
if (AF.B.B0 & GB_C_FLAG)
PC.W += 2;
else {
tempRegister.B.B0 = gbReadOpcode(PC.W++);
@ -1123,7 +1123,7 @@ case 0xd6:
// SUB NN
tempValue = gbReadOpcode(PC.W++);
tempRegister.W = AF.B.B1 - tempValue;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0xd7:
@ -1134,7 +1134,7 @@ PC.W = 0x0010;
break;
case 0xd8:
// RET C
if (AF.B.B0 & C_FLAG) {
if (AF.B.B0 & GB_C_FLAG) {
PC.B.B0 = gbReadMemory(SP.W++);
PC.B.B1 = gbReadMemory(SP.W++);
clockTicks += 3;
@ -1148,7 +1148,7 @@ IFF |= 0x01;
break;
case 0xda:
// JP C,NNNN
if (AF.B.B0 & C_FLAG) {
if (AF.B.B0 & GB_C_FLAG) {
tempRegister.B.B0 = gbReadOpcode(PC.W++);
tempRegister.B.B1 = gbReadOpcode(PC.W);
PC.W = tempRegister.W;
@ -1163,7 +1163,7 @@ IFF = 0;
break;
case 0xdc:
// CALL C,NNNN
if (AF.B.B0 & C_FLAG) {
if (AF.B.B0 & GB_C_FLAG) {
tempRegister.B.B0 = gbReadOpcode(PC.W++);
tempRegister.B.B1 = gbReadOpcode(PC.W++);
gbWriteMemory(--SP.W, PC.B.B1);
@ -1181,8 +1181,8 @@ break;
case 0xde:
// SBC NN
tempValue = gbReadOpcode(PC.W++);
tempRegister.W = AF.B.B1 - tempValue - (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
tempRegister.W = AF.B.B1 - tempValue - (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
AF.B.B1 = tempRegister.B.B0;
break;
case 0xdf:
@ -1220,7 +1220,7 @@ case 0xe6:
// AND NN
tempValue = gbReadOpcode(PC.W++);
AF.B.B1 &= tempValue;
AF.B.B0 = H_FLAG | ZeroTable[AF.B.B1];
AF.B.B0 = GB_H_FLAG | ZeroTable[AF.B.B1];
break;
case 0xe7:
// RST 20
@ -1232,7 +1232,7 @@ case 0xe8:
// ADD SP,NN
offset = (s8)gbReadOpcode(PC.W++);
tempRegister.W = SP.W + offset;
AF.B.B0 = ((SP.W ^ offset ^ tempRegister.W) & 0x100 ? C_FLAG : 0) | ((SP.W ^ offset ^ tempRegister.W) & 0x10 ? H_FLAG : 0);
AF.B.B0 = ((SP.W ^ offset ^ tempRegister.W) & 0x100 ? GB_C_FLAG : 0) | ((SP.W ^ offset ^ tempRegister.W) & 0x10 ? GB_H_FLAG : 0);
SP.W = tempRegister.W;
break;
case 0xe9:
@ -1310,7 +1310,7 @@ case 0xf8:
// LD HL,SP+NN
offset = (s8)gbReadOpcode(PC.W++);
tempRegister.W = SP.W + offset;
AF.B.B0 = ((SP.W ^ offset ^ tempRegister.W) & 0x100 ? C_FLAG : 0) | ((SP.W ^ offset ^ tempRegister.W) & 0x10 ? H_FLAG : 0);
AF.B.B0 = ((SP.W ^ offset ^ tempRegister.W) & 0x100 ? GB_C_FLAG : 0) | ((SP.W ^ offset ^ tempRegister.W) & 0x10 ? GB_H_FLAG : 0);
HL.W = tempRegister.W;
break;
case 0xf9:
@ -1346,7 +1346,7 @@ case 0xfe:
// CP NN
tempValue = gbReadOpcode(PC.W++);
tempRegister.W = AF.B.B1 - tempValue;
AF.B.B0 = N_FLAG | (tempRegister.B.B1 ? C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? H_FLAG : 0);
AF.B.B0 = GB_N_FLAG | (tempRegister.B.B1 ? GB_C_FLAG : 0) | ZeroTable[tempRegister.B.B0] | ((AF.B.B1 ^ tempValue ^ tempRegister.B.B0) & 0x10 ? GB_H_FLAG : 0);
break;
case 0xff:
// RST 38

View File

@ -1,160 +1,160 @@
case 0x00:
// RLC B
AF.B.B0 = (BC.B.B1 & 0x80) ? C_FLAG : 0;
AF.B.B0 = (BC.B.B1 & 0x80) ? GB_C_FLAG : 0;
BC.B.B1 = (BC.B.B1 << 1) | (BC.B.B1 >> 7);
AF.B.B0 |= ZeroTable[BC.B.B1];
break;
case 0x01:
// RLC C
AF.B.B0 = (BC.B.B0 & 0x80) ? C_FLAG : 0;
AF.B.B0 = (BC.B.B0 & 0x80) ? GB_C_FLAG : 0;
BC.B.B0 = (BC.B.B0 << 1) | (BC.B.B0 >> 7);
AF.B.B0 |= ZeroTable[BC.B.B0];
break;
case 0x02:
// RLC D
AF.B.B0 = (DE.B.B1 & 0x80) ? C_FLAG : 0;
AF.B.B0 = (DE.B.B1 & 0x80) ? GB_C_FLAG : 0;
DE.B.B1 = (DE.B.B1 << 1) | (DE.B.B1 >> 7);
AF.B.B0 |= ZeroTable[DE.B.B1];
break;
case 0x03:
// RLC E
AF.B.B0 = (DE.B.B0 & 0x80) ? C_FLAG : 0;
AF.B.B0 = (DE.B.B0 & 0x80) ? GB_C_FLAG : 0;
DE.B.B0 = (DE.B.B0 << 1) | (DE.B.B0 >> 7);
AF.B.B0 |= ZeroTable[DE.B.B0];
break;
case 0x04:
// RLC H
AF.B.B0 = (HL.B.B1 & 0x80) ? C_FLAG : 0;
AF.B.B0 = (HL.B.B1 & 0x80) ? GB_C_FLAG : 0;
HL.B.B1 = (HL.B.B1 << 1) | (HL.B.B1 >> 7);
AF.B.B0 |= ZeroTable[HL.B.B1];
break;
case 0x05:
// RLC L
AF.B.B0 = (HL.B.B0 & 0x80) ? C_FLAG : 0;
AF.B.B0 = (HL.B.B0 & 0x80) ? GB_C_FLAG : 0;
HL.B.B0 = (HL.B.B0 << 1) | (HL.B.B0 >> 7);
AF.B.B0 |= ZeroTable[HL.B.B0];
break;
case 0x06:
// RLC (HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (tempValue & 0x80) ? C_FLAG : 0;
AF.B.B0 = (tempValue & 0x80) ? GB_C_FLAG : 0;
tempValue = (tempValue << 1) | (tempValue >> 7);
AF.B.B0 |= ZeroTable[tempValue];
gbWriteMemory(HL.W, tempValue);
break;
case 0x07:
// RLC A
AF.B.B0 = (AF.B.B1 & 0x80) ? C_FLAG : 0;
AF.B.B0 = (AF.B.B1 & 0x80) ? GB_C_FLAG : 0;
AF.B.B1 = (AF.B.B1 << 1) | (AF.B.B1 >> 7);
AF.B.B0 |= ZeroTable[AF.B.B1];
break;
case 0x08:
// RRC B
AF.B.B0 = (BC.B.B1 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (BC.B.B1 & 0x01 ? GB_C_FLAG : 0);
BC.B.B1 = (BC.B.B1 >> 1) | (BC.B.B1 << 7);
AF.B.B0 |= ZeroTable[BC.B.B1];
break;
case 0x09:
// RRC C
AF.B.B0 = (BC.B.B0 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (BC.B.B0 & 0x01 ? GB_C_FLAG : 0);
BC.B.B0 = (BC.B.B0 >> 1) | (BC.B.B0 << 7);
AF.B.B0 |= ZeroTable[BC.B.B0];
break;
case 0x0a:
// RRC D
AF.B.B0 = (DE.B.B1 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (DE.B.B1 & 0x01 ? GB_C_FLAG : 0);
DE.B.B1 = (DE.B.B1 >> 1) | (DE.B.B1 << 7);
AF.B.B0 |= ZeroTable[DE.B.B1];
break;
case 0x0b:
// RRC E
AF.B.B0 = (DE.B.B0 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (DE.B.B0 & 0x01 ? GB_C_FLAG : 0);
DE.B.B0 = (DE.B.B0 >> 1) | (DE.B.B0 << 7);
AF.B.B0 |= ZeroTable[DE.B.B0];
break;
case 0x0c:
// RRC H
AF.B.B0 = (HL.B.B1 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (HL.B.B1 & 0x01 ? GB_C_FLAG : 0);
HL.B.B1 = (HL.B.B1 >> 1) | (HL.B.B1 << 7);
AF.B.B0 |= ZeroTable[HL.B.B1];
break;
case 0x0d:
// RRC L
AF.B.B0 = (HL.B.B0 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (HL.B.B0 & 0x01 ? GB_C_FLAG : 0);
HL.B.B0 = (HL.B.B0 >> 1) | (HL.B.B0 << 7);
AF.B.B0 |= ZeroTable[HL.B.B0];
break;
case 0x0e:
// RRC (HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (tempValue & 0x01 ? C_FLAG : 0);
AF.B.B0 = (tempValue & 0x01 ? GB_C_FLAG : 0);
tempValue = (tempValue >> 1) | (tempValue << 7);
AF.B.B0 |= ZeroTable[tempValue];
gbWriteMemory(HL.W, tempValue);
break;
case 0x0f:
// RRC A
AF.B.B0 = (AF.B.B1 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (AF.B.B1 & 0x01 ? GB_C_FLAG : 0);
AF.B.B1 = (AF.B.B1 >> 1) | (AF.B.B1 << 7);
AF.B.B0 |= ZeroTable[AF.B.B1];
break;
case 0x10:
// RL B
if (BC.B.B1 & 0x80) {
BC.B.B1 = (BC.B.B1 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[BC.B.B1] | C_FLAG;
BC.B.B1 = (BC.B.B1 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[BC.B.B1] | GB_C_FLAG;
} else {
BC.B.B1 = (BC.B.B1 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
BC.B.B1 = (BC.B.B1 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[BC.B.B1];
}
break;
case 0x11:
// RL C
if (BC.B.B0 & 0x80) {
BC.B.B0 = (BC.B.B0 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[BC.B.B0] | C_FLAG;
BC.B.B0 = (BC.B.B0 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[BC.B.B0] | GB_C_FLAG;
} else {
BC.B.B0 = (BC.B.B0 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
BC.B.B0 = (BC.B.B0 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[BC.B.B0];
}
break;
case 0x12:
// RL D
if (DE.B.B1 & 0x80) {
DE.B.B1 = (DE.B.B1 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[DE.B.B1] | C_FLAG;
DE.B.B1 = (DE.B.B1 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[DE.B.B1] | GB_C_FLAG;
} else {
DE.B.B1 = (DE.B.B1 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
DE.B.B1 = (DE.B.B1 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[DE.B.B1];
}
break;
case 0x13:
// RL E
if (DE.B.B0 & 0x80) {
DE.B.B0 = (DE.B.B0 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[DE.B.B0] | C_FLAG;
DE.B.B0 = (DE.B.B0 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[DE.B.B0] | GB_C_FLAG;
} else {
DE.B.B0 = (DE.B.B0 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
DE.B.B0 = (DE.B.B0 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[DE.B.B0];
}
break;
case 0x14:
// RL H
if (HL.B.B1 & 0x80) {
HL.B.B1 = (HL.B.B1 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[HL.B.B1] | C_FLAG;
HL.B.B1 = (HL.B.B1 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[HL.B.B1] | GB_C_FLAG;
} else {
HL.B.B1 = (HL.B.B1 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
HL.B.B1 = (HL.B.B1 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[HL.B.B1];
}
break;
case 0x15:
// RL L
if (HL.B.B0 & 0x80) {
HL.B.B0 = (HL.B.B0 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[HL.B.B0] | C_FLAG;
HL.B.B0 = (HL.B.B0 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[HL.B.B0] | GB_C_FLAG;
} else {
HL.B.B0 = (HL.B.B0 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
HL.B.B0 = (HL.B.B0 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[HL.B.B0];
}
break;
@ -162,10 +162,10 @@ case 0x16:
// RL (HL)
tempValue = gbReadMemory(HL.W);
if (tempValue & 0x80) {
tempValue = (tempValue << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[tempValue] | C_FLAG;
tempValue = (tempValue << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[tempValue] | GB_C_FLAG;
} else {
tempValue = (tempValue << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
tempValue = (tempValue << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[tempValue];
}
gbWriteMemory(HL.W, tempValue);
@ -173,70 +173,70 @@ break;
case 0x17:
// RL A
if (AF.B.B1 & 0x80) {
AF.B.B1 = (AF.B.B1 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[AF.B.B1] | C_FLAG;
AF.B.B1 = (AF.B.B1 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[AF.B.B1] | GB_C_FLAG;
} else {
AF.B.B1 = (AF.B.B1 << 1) | (AF.B.B0 & C_FLAG ? 1 : 0);
AF.B.B1 = (AF.B.B1 << 1) | (AF.B.B0 & GB_C_FLAG ? 1 : 0);
AF.B.B0 = ZeroTable[AF.B.B1];
}
break;
case 0x18:
// RR B
if (BC.B.B1 & 0x01) {
BC.B.B1 = (BC.B.B1 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[BC.B.B1] | C_FLAG;
BC.B.B1 = (BC.B.B1 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[BC.B.B1] | GB_C_FLAG;
} else {
BC.B.B1 = (BC.B.B1 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
BC.B.B1 = (BC.B.B1 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[BC.B.B1];
}
break;
case 0x19:
// RR C
if (BC.B.B0 & 0x01) {
BC.B.B0 = (BC.B.B0 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[BC.B.B0] | C_FLAG;
BC.B.B0 = (BC.B.B0 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[BC.B.B0] | GB_C_FLAG;
} else {
BC.B.B0 = (BC.B.B0 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
BC.B.B0 = (BC.B.B0 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[BC.B.B0];
}
break;
case 0x1a:
// RR D
if (DE.B.B1 & 0x01) {
DE.B.B1 = (DE.B.B1 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[DE.B.B1] | C_FLAG;
DE.B.B1 = (DE.B.B1 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[DE.B.B1] | GB_C_FLAG;
} else {
DE.B.B1 = (DE.B.B1 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
DE.B.B1 = (DE.B.B1 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[DE.B.B1];
}
break;
case 0x1b:
// RR E
if (DE.B.B0 & 0x01) {
DE.B.B0 = (DE.B.B0 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[DE.B.B0] | C_FLAG;
DE.B.B0 = (DE.B.B0 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[DE.B.B0] | GB_C_FLAG;
} else {
DE.B.B0 = (DE.B.B0 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
DE.B.B0 = (DE.B.B0 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[DE.B.B0];
}
break;
case 0x1c:
// RR H
if (HL.B.B1 & 0x01) {
HL.B.B1 = (HL.B.B1 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[HL.B.B1] | C_FLAG;
HL.B.B1 = (HL.B.B1 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[HL.B.B1] | GB_C_FLAG;
} else {
HL.B.B1 = (HL.B.B1 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
HL.B.B1 = (HL.B.B1 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[HL.B.B1];
}
break;
case 0x1d:
// RR L
if (HL.B.B0 & 0x01) {
HL.B.B0 = (HL.B.B0 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[HL.B.B0] | C_FLAG;
HL.B.B0 = (HL.B.B0 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[HL.B.B0] | GB_C_FLAG;
} else {
HL.B.B0 = (HL.B.B0 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
HL.B.B0 = (HL.B.B0 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[HL.B.B0];
}
break;
@ -244,10 +244,10 @@ case 0x1e:
// RR (HL)
tempValue = gbReadMemory(HL.W);
if (tempValue & 0x01) {
tempValue = (tempValue >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[tempValue] | C_FLAG;
tempValue = (tempValue >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[tempValue] | GB_C_FLAG;
} else {
tempValue = (tempValue >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
tempValue = (tempValue >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[tempValue];
}
gbWriteMemory(HL.W, tempValue);
@ -255,110 +255,110 @@ break;
case 0x1f:
// RR A
if (AF.B.B1 & 0x01) {
AF.B.B1 = (AF.B.B1 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[AF.B.B1] | C_FLAG;
AF.B.B1 = (AF.B.B1 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[AF.B.B1] | GB_C_FLAG;
} else {
AF.B.B1 = (AF.B.B1 >> 1) | (AF.B.B0 & C_FLAG ? 0x80 : 0);
AF.B.B1 = (AF.B.B1 >> 1) | (AF.B.B0 & GB_C_FLAG ? 0x80 : 0);
AF.B.B0 = ZeroTable[AF.B.B1];
}
break;
case 0x20:
// SLA B
AF.B.B0 = (BC.B.B1 & 0x80 ? C_FLAG : 0);
AF.B.B0 = (BC.B.B1 & 0x80 ? GB_C_FLAG : 0);
BC.B.B1 <<= 1;
AF.B.B0 |= ZeroTable[BC.B.B1];
break;
case 0x21:
// SLA C
AF.B.B0 = (BC.B.B0 & 0x80 ? C_FLAG : 0);
AF.B.B0 = (BC.B.B0 & 0x80 ? GB_C_FLAG : 0);
BC.B.B0 <<= 1;
AF.B.B0 |= ZeroTable[BC.B.B0];
break;
case 0x22:
// SLA D
AF.B.B0 = (DE.B.B1 & 0x80 ? C_FLAG : 0);
AF.B.B0 = (DE.B.B1 & 0x80 ? GB_C_FLAG : 0);
DE.B.B1 <<= 1;
AF.B.B0 |= ZeroTable[DE.B.B1];
break;
case 0x23:
// SLA E
AF.B.B0 = (DE.B.B0 & 0x80 ? C_FLAG : 0);
AF.B.B0 = (DE.B.B0 & 0x80 ? GB_C_FLAG : 0);
DE.B.B0 <<= 1;
AF.B.B0 |= ZeroTable[DE.B.B0];
break;
case 0x24:
// SLA H
AF.B.B0 = (HL.B.B1 & 0x80 ? C_FLAG : 0);
AF.B.B0 = (HL.B.B1 & 0x80 ? GB_C_FLAG : 0);
HL.B.B1 <<= 1;
AF.B.B0 |= ZeroTable[HL.B.B1];
break;
case 0x25:
// SLA L
AF.B.B0 = (HL.B.B0 & 0x80 ? C_FLAG : 0);
AF.B.B0 = (HL.B.B0 & 0x80 ? GB_C_FLAG : 0);
HL.B.B0 <<= 1;
AF.B.B0 |= ZeroTable[HL.B.B0];
break;
case 0x26:
// SLA (HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (tempValue & 0x80 ? C_FLAG : 0);
AF.B.B0 = (tempValue & 0x80 ? GB_C_FLAG : 0);
tempValue <<= 1;
AF.B.B0 |= ZeroTable[tempValue];
gbWriteMemory(HL.W, tempValue);
break;
case 0x27:
// SLA A
AF.B.B0 = (AF.B.B1 & 0x80 ? C_FLAG : 0);
AF.B.B0 = (AF.B.B1 & 0x80 ? GB_C_FLAG : 0);
AF.B.B1 <<= 1;
AF.B.B0 |= ZeroTable[AF.B.B1];
break;
case 0x28:
// SRA B
AF.B.B0 = (BC.B.B1 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (BC.B.B1 & 0x01 ? GB_C_FLAG : 0);
BC.B.B1 = (BC.B.B1 >> 1) | (BC.B.B1 & 0x80);
AF.B.B0 |= ZeroTable[BC.B.B1];
break;
case 0x29:
// SRA C
AF.B.B0 = (BC.B.B0 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (BC.B.B0 & 0x01 ? GB_C_FLAG : 0);
BC.B.B0 = (BC.B.B0 >> 1) | (BC.B.B0 & 0x80);
AF.B.B0 |= ZeroTable[BC.B.B0];
break;
case 0x2a:
// SRA D
AF.B.B0 = (DE.B.B1 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (DE.B.B1 & 0x01 ? GB_C_FLAG : 0);
DE.B.B1 = (DE.B.B1 >> 1) | (DE.B.B1 & 0x80);
AF.B.B0 |= ZeroTable[DE.B.B1];
break;
case 0x2b:
// SRA E
AF.B.B0 = (DE.B.B0 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (DE.B.B0 & 0x01 ? GB_C_FLAG : 0);
DE.B.B0 = (DE.B.B0 >> 1) | (DE.B.B0 & 0x80);
AF.B.B0 |= ZeroTable[DE.B.B0];
break;
case 0x2c:
// SRA H
AF.B.B0 = (HL.B.B1 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (HL.B.B1 & 0x01 ? GB_C_FLAG : 0);
HL.B.B1 = (HL.B.B1 >> 1) | (HL.B.B1 & 0x80);
AF.B.B0 |= ZeroTable[HL.B.B1];
break;
case 0x2d:
// SRA L
AF.B.B0 = (HL.B.B0 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (HL.B.B0 & 0x01 ? GB_C_FLAG : 0);
HL.B.B0 = (HL.B.B0 >> 1) | (HL.B.B0 & 0x80);
AF.B.B0 |= ZeroTable[HL.B.B0];
break;
case 0x2e:
// SRA (HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (tempValue & 0x01 ? C_FLAG : 0);
AF.B.B0 = (tempValue & 0x01 ? GB_C_FLAG : 0);
tempValue = (tempValue >> 1) | (tempValue & 0x80);
AF.B.B0 |= ZeroTable[tempValue];
gbWriteMemory(HL.W, tempValue);
break;
case 0x2f:
// SRA A
AF.B.B0 = (AF.B.B1 & 0x01 ? C_FLAG : 0);
AF.B.B0 = (AF.B.B1 & 0x01 ? GB_C_FLAG : 0);
AF.B.B1 = (AF.B.B1 >> 1) | (AF.B.B1 & 0x80);
AF.B.B0 |= ZeroTable[AF.B.B1];
break;
@ -406,317 +406,317 @@ AF.B.B0 = ZeroTable[AF.B.B1];
break;
case 0x38:
// SRL B
AF.B.B0 = (BC.B.B1 & 0x01) ? C_FLAG : 0;
AF.B.B0 = (BC.B.B1 & 0x01) ? GB_C_FLAG : 0;
BC.B.B1 >>= 1;
AF.B.B0 |= ZeroTable[BC.B.B1];
break;
case 0x39:
// SRL C
AF.B.B0 = (BC.B.B0 & 0x01) ? C_FLAG : 0;
AF.B.B0 = (BC.B.B0 & 0x01) ? GB_C_FLAG : 0;
BC.B.B0 >>= 1;
AF.B.B0 |= ZeroTable[BC.B.B0];
break;
case 0x3a:
// SRL D
AF.B.B0 = (DE.B.B1 & 0x01) ? C_FLAG : 0;
AF.B.B0 = (DE.B.B1 & 0x01) ? GB_C_FLAG : 0;
DE.B.B1 >>= 1;
AF.B.B0 |= ZeroTable[DE.B.B1];
break;
case 0x3b:
// SRL E
AF.B.B0 = (DE.B.B0 & 0x01) ? C_FLAG : 0;
AF.B.B0 = (DE.B.B0 & 0x01) ? GB_C_FLAG : 0;
DE.B.B0 >>= 1;
AF.B.B0 |= ZeroTable[DE.B.B0];
break;
case 0x3c:
// SRL H
AF.B.B0 = (HL.B.B1 & 0x01) ? C_FLAG : 0;
AF.B.B0 = (HL.B.B1 & 0x01) ? GB_C_FLAG : 0;
HL.B.B1 >>= 1;
AF.B.B0 |= ZeroTable[HL.B.B1];
break;
case 0x3d:
// SRL L
AF.B.B0 = (HL.B.B0 & 0x01) ? C_FLAG : 0;
AF.B.B0 = (HL.B.B0 & 0x01) ? GB_C_FLAG : 0;
HL.B.B0 >>= 1;
AF.B.B0 |= ZeroTable[HL.B.B0];
break;
case 0x3e:
// SRL (HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (tempValue & 0x01) ? C_FLAG : 0;
AF.B.B0 = (tempValue & 0x01) ? GB_C_FLAG : 0;
tempValue >>= 1;
AF.B.B0 |= ZeroTable[tempValue];
gbWriteMemory(HL.W, tempValue);
break;
case 0x3f:
// SRL A
AF.B.B0 = (AF.B.B1 & 0x01) ? C_FLAG : 0;
AF.B.B0 = (AF.B.B1 & 0x01) ? GB_C_FLAG : 0;
AF.B.B1 >>= 1;
AF.B.B0 |= ZeroTable[AF.B.B1];
break;
case 0x40:
// BIT 0,B
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B1 & (1 << 0) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B1 & (1 << 0) ? 0 : GB_Z_FLAG);
break;
case 0x41:
// BIT 0,C
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B0 & (1 << 0) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B0 & (1 << 0) ? 0 : GB_Z_FLAG);
break;
case 0x42:
// BIT 0,D
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B1 & (1 << 0) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B1 & (1 << 0) ? 0 : GB_Z_FLAG);
break;
case 0x43:
// BIT 0,E
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B0 & (1 << 0) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B0 & (1 << 0) ? 0 : GB_Z_FLAG);
break;
case 0x44:
// BIT 0,H
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B1 & (1 << 0) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B1 & (1 << 0) ? 0 : GB_Z_FLAG);
break;
case 0x45:
// BIT 0,L
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B0 & (1 << 0) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B0 & (1 << 0) ? 0 : GB_Z_FLAG);
break;
case 0x46:
// BIT 0,(HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (tempValue & (1 << 0) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (tempValue & (1 << 0) ? 0 : GB_Z_FLAG);
break;
case 0x47:
// BIT 0,A
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (AF.B.B1 & (1 << 0) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (AF.B.B1 & (1 << 0) ? 0 : GB_Z_FLAG);
break;
case 0x48:
// BIT 1,B
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B1 & (1 << 1) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B1 & (1 << 1) ? 0 : GB_Z_FLAG);
break;
case 0x49:
// BIT 1,C
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B0 & (1 << 1) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B0 & (1 << 1) ? 0 : GB_Z_FLAG);
break;
case 0x4a:
// BIT 1,D
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B1 & (1 << 1) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B1 & (1 << 1) ? 0 : GB_Z_FLAG);
break;
case 0x4b:
// BIT 1,E
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B0 & (1 << 1) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B0 & (1 << 1) ? 0 : GB_Z_FLAG);
break;
case 0x4c:
// BIT 1,H
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B1 & (1 << 1) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B1 & (1 << 1) ? 0 : GB_Z_FLAG);
break;
case 0x4d:
// BIT 1,L
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B0 & (1 << 1) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B0 & (1 << 1) ? 0 : GB_Z_FLAG);
break;
case 0x4e:
// BIT 1,(HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (tempValue & (1 << 1) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (tempValue & (1 << 1) ? 0 : GB_Z_FLAG);
break;
case 0x4f:
// BIT 1,A
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (AF.B.B1 & (1 << 1) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (AF.B.B1 & (1 << 1) ? 0 : GB_Z_FLAG);
break;
case 0x50:
// BIT 2,B
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B1 & (1 << 2) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B1 & (1 << 2) ? 0 : GB_Z_FLAG);
break;
case 0x51:
// BIT 2,C
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B0 & (1 << 2) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B0 & (1 << 2) ? 0 : GB_Z_FLAG);
break;
case 0x52:
// BIT 2,D
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B1 & (1 << 2) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B1 & (1 << 2) ? 0 : GB_Z_FLAG);
break;
case 0x53:
// BIT 2,E
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B0 & (1 << 2) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B0 & (1 << 2) ? 0 : GB_Z_FLAG);
break;
case 0x54:
// BIT 2,H
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B1 & (1 << 2) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B1 & (1 << 2) ? 0 : GB_Z_FLAG);
break;
case 0x55:
// BIT 2,L
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B0 & (1 << 2) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B0 & (1 << 2) ? 0 : GB_Z_FLAG);
break;
case 0x56:
// BIT 2,(HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (tempValue & (1 << 2) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (tempValue & (1 << 2) ? 0 : GB_Z_FLAG);
break;
case 0x57:
// BIT 2,A
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (AF.B.B1 & (1 << 2) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (AF.B.B1 & (1 << 2) ? 0 : GB_Z_FLAG);
break;
case 0x58:
// BIT 3,B
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B1 & (1 << 3) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B1 & (1 << 3) ? 0 : GB_Z_FLAG);
break;
case 0x59:
// BIT 3,C
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B0 & (1 << 3) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B0 & (1 << 3) ? 0 : GB_Z_FLAG);
break;
case 0x5a:
// BIT 3,D
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B1 & (1 << 3) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B1 & (1 << 3) ? 0 : GB_Z_FLAG);
break;
case 0x5b:
// BIT 3,E
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B0 & (1 << 3) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B0 & (1 << 3) ? 0 : GB_Z_FLAG);
break;
case 0x5c:
// BIT 3,H
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B1 & (1 << 3) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B1 & (1 << 3) ? 0 : GB_Z_FLAG);
break;
case 0x5d:
// BIT 3,L
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B0 & (1 << 3) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B0 & (1 << 3) ? 0 : GB_Z_FLAG);
break;
case 0x5e:
// BIT 3,(HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (tempValue & (1 << 3) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (tempValue & (1 << 3) ? 0 : GB_Z_FLAG);
break;
case 0x5f:
// BIT 3,A
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (AF.B.B1 & (1 << 3) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (AF.B.B1 & (1 << 3) ? 0 : GB_Z_FLAG);
break;
case 0x60:
// BIT 4,B
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B1 & (1 << 4) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B1 & (1 << 4) ? 0 : GB_Z_FLAG);
break;
case 0x61:
// BIT 4,C
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B0 & (1 << 4) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B0 & (1 << 4) ? 0 : GB_Z_FLAG);
break;
case 0x62:
// BIT 4,D
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B1 & (1 << 4) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B1 & (1 << 4) ? 0 : GB_Z_FLAG);
break;
case 0x63:
// BIT 4,E
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B0 & (1 << 4) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B0 & (1 << 4) ? 0 : GB_Z_FLAG);
break;
case 0x64:
// BIT 4,H
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B1 & (1 << 4) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B1 & (1 << 4) ? 0 : GB_Z_FLAG);
break;
case 0x65:
// BIT 4,L
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B0 & (1 << 4) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B0 & (1 << 4) ? 0 : GB_Z_FLAG);
break;
case 0x66:
// BIT 4,(HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (tempValue & (1 << 4) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (tempValue & (1 << 4) ? 0 : GB_Z_FLAG);
break;
case 0x67:
// BIT 4,A
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (AF.B.B1 & (1 << 4) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (AF.B.B1 & (1 << 4) ? 0 : GB_Z_FLAG);
break;
case 0x68:
// BIT 5,B
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B1 & (1 << 5) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B1 & (1 << 5) ? 0 : GB_Z_FLAG);
break;
case 0x69:
// BIT 5,C
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B0 & (1 << 5) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B0 & (1 << 5) ? 0 : GB_Z_FLAG);
break;
case 0x6a:
// BIT 5,D
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B1 & (1 << 5) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B1 & (1 << 5) ? 0 : GB_Z_FLAG);
break;
case 0x6b:
// BIT 5,E
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B0 & (1 << 5) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B0 & (1 << 5) ? 0 : GB_Z_FLAG);
break;
case 0x6c:
// BIT 5,H
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B1 & (1 << 5) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B1 & (1 << 5) ? 0 : GB_Z_FLAG);
break;
case 0x6d:
// BIT 5,L
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B0 & (1 << 5) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B0 & (1 << 5) ? 0 : GB_Z_FLAG);
break;
case 0x6e:
// BIT 5,(HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (tempValue & (1 << 5) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (tempValue & (1 << 5) ? 0 : GB_Z_FLAG);
break;
case 0x6f:
// BIT 5,A
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (AF.B.B1 & (1 << 5) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (AF.B.B1 & (1 << 5) ? 0 : GB_Z_FLAG);
break;
case 0x70:
// BIT 6,B
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B1 & (1 << 6) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B1 & (1 << 6) ? 0 : GB_Z_FLAG);
break;
case 0x71:
// BIT 6,C
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B0 & (1 << 6) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B0 & (1 << 6) ? 0 : GB_Z_FLAG);
break;
case 0x72:
// BIT 6,D
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B1 & (1 << 6) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B1 & (1 << 6) ? 0 : GB_Z_FLAG);
break;
case 0x73:
// BIT 6,E
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B0 & (1 << 6) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B0 & (1 << 6) ? 0 : GB_Z_FLAG);
break;
case 0x74:
// BIT 6,H
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B1 & (1 << 6) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B1 & (1 << 6) ? 0 : GB_Z_FLAG);
break;
case 0x75:
// BIT 6,L
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B0 & (1 << 6) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B0 & (1 << 6) ? 0 : GB_Z_FLAG);
break;
case 0x76:
// BIT 6,(HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (tempValue & (1 << 6) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (tempValue & (1 << 6) ? 0 : GB_Z_FLAG);
break;
case 0x77:
// BIT 6,A
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (AF.B.B1 & (1 << 6) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (AF.B.B1 & (1 << 6) ? 0 : GB_Z_FLAG);
break;
case 0x78:
// BIT 7,B
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B1 & (1 << 7) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B1 & (1 << 7) ? 0 : GB_Z_FLAG);
break;
case 0x79:
// BIT 7,C
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (BC.B.B0 & (1 << 7) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (BC.B.B0 & (1 << 7) ? 0 : GB_Z_FLAG);
break;
case 0x7a:
// BIT 7,D
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B1 & (1 << 7) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B1 & (1 << 7) ? 0 : GB_Z_FLAG);
break;
case 0x7b:
// BIT 7,E
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (DE.B.B0 & (1 << 7) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (DE.B.B0 & (1 << 7) ? 0 : GB_Z_FLAG);
break;
case 0x7c:
// BIT 7,H
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B1 & (1 << 7) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B1 & (1 << 7) ? 0 : GB_Z_FLAG);
break;
case 0x7d:
// BIT 7,L
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (HL.B.B0 & (1 << 7) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (HL.B.B0 & (1 << 7) ? 0 : GB_Z_FLAG);
break;
case 0x7e:
// BIT 7,(HL)
tempValue = gbReadMemory(HL.W);
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (tempValue & (1 << 7) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (tempValue & (1 << 7) ? 0 : GB_Z_FLAG);
break;
case 0x7f:
// BIT 7,A
AF.B.B0 = (AF.B.B0 & C_FLAG) | H_FLAG | (AF.B.B1 & (1 << 7) ? 0 : Z_FLAG);
AF.B.B0 = (AF.B.B0 & GB_C_FLAG) | GB_H_FLAG | (AF.B.B1 & (1 << 7) ? 0 : GB_Z_FLAG);
break;
case 0x80:
// RES 0,B

View File

@ -1,6 +1,7 @@
#ifndef GBMEMORY_H
#define GBMEMORY_H
#include <cstdint>
#include <time.h>
struct mapperMBC1 {

View File

@ -1,6 +1,8 @@
#ifndef VBA_BKS_H
#define VBA_BKS_H
#include <cstdint>
#define readWord(addr) \
((map[(addr) >> 24].address[(addr)&map[(addr) >> 24].mask]) + ((map[(addr + 1) >> 24].address[(addr + 1) & map[(addr + 1) >> 24].mask]) << 8) + ((map[(addr + 2) >> 24].address[(addr + 2) & map[(addr + 2) >> 24].mask]) << 16) + ((map[(addr + 3) >> 24].address[(addr + 3) & map[(addr + 3) >> 24].mask]) << 24))
@ -61,4 +63,4 @@ bool doBreak(struct ConditionalBreak* toTest);
// uint8_t printConditionalsFromAddress(uint32_t address);
// void printAllFlagConditionals(uint8_t flag, bool orMode);
// void printAllFlagConditionalsWithAddress(uint32_t address, uint8_t flag, bool orMode);
#endif
#endif

View File

@ -1,6 +1,9 @@
#ifndef EEPROM_H
#define EEPROM_H
#include <cstdint>
#include <zlib.h>
#ifdef __LIBRETRO__
extern void eepromSaveGame(uint8_t*& data);
extern void eepromReadGame(const uint8_t*& data, int version);

View File

@ -1,6 +1,9 @@
#ifndef FLASH_H
#define FLASH_H
#include <cstdint>
#include <zlib.h>
#define FLASH_128K_SZ 0x20000
#ifdef __LIBRETRO__

View File

@ -1,8 +1,10 @@
#ifndef SRAM_H
#define SRAM_H
u8 sramRead(u32 address);
void sramWrite(u32 address, u8 byte);
void sramDelayedWrite(u32 address, u8 byte);
#include <cstdint>
uint8_t sramRead(uint32_t address);
void sramWrite(uint32_t address, uint8_t byte);
void sramDelayedWrite(uint32_t address, uint8_t byte);
#endif // SRAM_H

View File

@ -250,10 +250,10 @@ public:
}
void UpdateDis()
{
Z->SetValue(AF.B.B0 & Z_FLAG);
N->SetValue(AF.B.B0 & N_FLAG);
H->SetValue(AF.B.B0 & H_FLAG);
C->SetValue(AF.B.B0 & C_FLAG);
Z->SetValue(AF.B.B0 & GB_Z_FLAG);
N->SetValue(AF.B.B0 & GB_N_FLAG);
H->SetValue(AF.B.B0 & GB_H_FLAG);
C->SetValue(AF.B.B0 & GB_C_FLAG);
#define grv16(n, val) \
do { \
wxString s; \