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 #ifndef PORT_H
#define PORT_H #define PORT_H
#include <cstdint>
#ifdef __CELLOS_LV2__ #ifdef __CELLOS_LV2__
/* PlayStation3 */ /* PlayStation3 */
#include <ppu_intrinsics.h> #include <ppu_intrinsics.h>
@ -12,7 +14,7 @@
#endif #endif
// swaps a 16-bit value // 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); return (v << 8) | (v >> 8);
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,8 @@
#ifndef VBA_BKS_H #ifndef VBA_BKS_H
#define VBA_BKS_H #define VBA_BKS_H
#include <cstdint>
#define readWord(addr) \ #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)) ((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))

View File

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

View File

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

View File

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

View File

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